@dhis2/analytics 24.10.0 → 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.
- package/CHANGELOG.md +19 -0
- package/build/cjs/__demo__/CalculationModal.stories.js +448 -0
- package/build/cjs/api/analytics/AnalyticsRequest.js +12 -1
- package/build/cjs/api/dimensions.js +1 -1
- package/build/cjs/api/expression.js +67 -0
- package/build/cjs/assets/DimensionItemIcons/CalculationIcon.js +25 -0
- package/build/cjs/assets/FormulaIcon.js +40 -0
- package/build/cjs/components/DataDimension/Calculation/CalculationModal.js +447 -0
- package/build/cjs/components/DataDimension/Calculation/DataElementOption.js +77 -0
- package/build/cjs/components/DataDimension/Calculation/DataElementSelector.js +306 -0
- package/build/cjs/components/DataDimension/Calculation/DndContext.js +213 -0
- package/build/cjs/components/DataDimension/Calculation/DragHandleIcon.js +23 -0
- package/build/cjs/components/DataDimension/Calculation/DraggingItem.js +58 -0
- package/build/cjs/components/DataDimension/Calculation/DropZone.js +58 -0
- package/build/cjs/components/DataDimension/Calculation/FormulaField.js +121 -0
- package/build/cjs/components/DataDimension/Calculation/FormulaItem.js +232 -0
- package/build/cjs/components/DataDimension/Calculation/MathOperatorSelector.js +57 -0
- package/build/cjs/components/DataDimension/Calculation/Operator.js +81 -0
- package/build/cjs/components/DataDimension/Calculation/styles/CalculationModal.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/DataElementOption.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/DataElementSelector.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/DraggingItem.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/DropZone.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/FormulaField.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/FormulaItem.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js +13 -0
- package/build/cjs/components/DataDimension/Calculation/styles/Operator.style.js +13 -0
- package/build/cjs/components/DataDimension/DataDimension.js +22 -6
- package/build/cjs/components/DataDimension/DataTypeSelector.js +5 -3
- package/build/cjs/components/DataDimension/ItemSelector.js +111 -73
- package/build/cjs/components/TransferOption.js +13 -4
- package/build/cjs/components/styles/DimensionSelector.style.js +2 -2
- package/build/cjs/components/styles/TransferOption.style.js +2 -2
- package/build/cjs/index.js +6 -0
- package/build/cjs/locales/en/translations.json +32 -7
- package/build/cjs/modules/__tests__/expressions.spec.js +139 -0
- package/build/cjs/modules/__tests__/hash.spec.js +92 -0
- package/build/cjs/modules/__tests__/parseExpression.spec.js +46 -0
- package/build/cjs/modules/dataTypes.js +8 -1
- package/build/cjs/modules/dimensionListItem.js +82 -0
- package/build/cjs/modules/expressions.js +164 -0
- package/build/cjs/modules/hash.js +28 -0
- package/build/cjs/visualizations/config/generators/dhis/singleValue.js +2 -2
- package/build/es/__demo__/CalculationModal.stories.js +440 -0
- package/build/es/api/analytics/AnalyticsRequest.js +11 -1
- package/build/es/api/dimensions.js +1 -1
- package/build/es/api/expression.js +57 -0
- package/build/es/assets/DimensionItemIcons/CalculationIcon.js +13 -0
- package/build/es/assets/FormulaIcon.js +30 -0
- package/build/es/components/DataDimension/Calculation/CalculationModal.js +418 -0
- package/build/es/components/DataDimension/Calculation/DataElementOption.js +60 -0
- package/build/es/components/DataDimension/Calculation/DataElementSelector.js +280 -0
- package/build/es/components/DataDimension/Calculation/DndContext.js +194 -0
- package/build/es/components/DataDimension/Calculation/DragHandleIcon.js +11 -0
- package/build/es/components/DataDimension/Calculation/DraggingItem.js +40 -0
- package/build/es/components/DataDimension/Calculation/DropZone.js +43 -0
- package/build/es/components/DataDimension/Calculation/FormulaField.js +98 -0
- package/build/es/components/DataDimension/Calculation/FormulaItem.js +207 -0
- package/build/es/components/DataDimension/Calculation/MathOperatorSelector.js +41 -0
- package/build/es/components/DataDimension/Calculation/Operator.js +64 -0
- package/build/es/components/DataDimension/Calculation/styles/CalculationModal.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/DataElementOption.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/DataElementSelector.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/DraggingItem.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/DropZone.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/FormulaField.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/FormulaItem.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/MathOperatorSelector.style.js +4 -0
- package/build/es/components/DataDimension/Calculation/styles/Operator.style.js +4 -0
- package/build/es/components/DataDimension/DataDimension.js +21 -6
- package/build/es/components/DataDimension/DataTypeSelector.js +6 -4
- package/build/es/components/DataDimension/ItemSelector.js +111 -73
- package/build/es/components/TransferOption.js +14 -5
- package/build/es/components/styles/DimensionSelector.style.js +2 -2
- package/build/es/components/styles/TransferOption.style.js +2 -2
- package/build/es/index.js +1 -1
- package/build/es/locales/en/translations.json +32 -7
- package/build/es/modules/__tests__/expressions.spec.js +136 -0
- package/build/es/modules/__tests__/hash.spec.js +88 -0
- package/build/es/modules/__tests__/parseExpression.spec.js +43 -0
- package/build/es/modules/dataTypes.js +6 -0
- package/build/es/modules/dimensionListItem.js +61 -0
- package/build/es/modules/expressions.js +131 -0
- package/build/es/modules/hash.js +12 -0
- package/build/es/visualizations/config/generators/dhis/singleValue.js +2 -2
- package/package.json +6 -1
|
@@ -0,0 +1,306 @@
|
|
|
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 _sortable = require("@dnd-kit/sortable");
|
|
15
|
+
|
|
16
|
+
var _debounce = require("@react-hook/debounce");
|
|
17
|
+
|
|
18
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
19
|
+
|
|
20
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
21
|
+
|
|
22
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
23
|
+
|
|
24
|
+
var _dimensions = require("../../../api/dimensions.js");
|
|
25
|
+
|
|
26
|
+
var _index = _interopRequireDefault(require("../../../locales/index.js"));
|
|
27
|
+
|
|
28
|
+
var _dataTypes = require("../../../modules/dataTypes.js");
|
|
29
|
+
|
|
30
|
+
var _DataElementOption = _interopRequireDefault(require("./DataElementOption.js"));
|
|
31
|
+
|
|
32
|
+
var _DataElementSelectorStyle = _interopRequireDefault(require("./styles/DataElementSelector.style.js"));
|
|
33
|
+
|
|
34
|
+
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); }
|
|
35
|
+
|
|
36
|
+
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; }
|
|
37
|
+
|
|
38
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
39
|
+
|
|
40
|
+
const getOptions = () => ({
|
|
41
|
+
[_dataTypes.TOTALS]: _index.default.t('Totals only'),
|
|
42
|
+
[_dataTypes.DETAIL]: _index.default.t('Details only')
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const GroupSelector = _ref => {
|
|
46
|
+
var _dataTypes$DIMENSION_;
|
|
47
|
+
|
|
48
|
+
let {
|
|
49
|
+
currentValue,
|
|
50
|
+
onChange,
|
|
51
|
+
displayNameProp
|
|
52
|
+
} = _ref;
|
|
53
|
+
const dataEngine = (0, _appRuntime.useDataEngine)();
|
|
54
|
+
const [loading, setLoading] = (0, _react.useState)(true);
|
|
55
|
+
const [groups, setGroups] = (0, _react.useState)([]);
|
|
56
|
+
const defaultGroup = (_dataTypes$DIMENSION_ = _dataTypes.dataTypeMap[_dataTypes.DIMENSION_TYPE_DATA_ELEMENT]) === null || _dataTypes$DIMENSION_ === void 0 ? void 0 : _dataTypes$DIMENSION_.defaultGroup;
|
|
57
|
+
(0, _react.useEffect)(() => {
|
|
58
|
+
const fetchGroups = async () => {
|
|
59
|
+
setLoading(true);
|
|
60
|
+
const result = await (0, _dimensions.apiFetchGroups)(dataEngine, _dataTypes.DIMENSION_TYPE_DATA_ELEMENT, displayNameProp);
|
|
61
|
+
setGroups(result);
|
|
62
|
+
setLoading(false);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
fetchGroups();
|
|
66
|
+
}, [dataEngine, displayNameProp]);
|
|
67
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
68
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "group-select"
|
|
69
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.SingleSelectField, {
|
|
70
|
+
selected: currentValue,
|
|
71
|
+
onChange: ref => onChange(ref.selected),
|
|
72
|
+
dense: true,
|
|
73
|
+
loading: loading,
|
|
74
|
+
loadingText: _index.default.t('Loading'),
|
|
75
|
+
dataTest: 'data-element-group-select'
|
|
76
|
+
}, defaultGroup ? /*#__PURE__*/_react.default.createElement(_ui.SingleSelectOption, {
|
|
77
|
+
value: defaultGroup.id,
|
|
78
|
+
key: defaultGroup.id,
|
|
79
|
+
label: defaultGroup.getName()
|
|
80
|
+
}) : null, !loading ? groups.map(group => /*#__PURE__*/_react.default.createElement(_ui.SingleSelectOption, {
|
|
81
|
+
value: group.id,
|
|
82
|
+
key: group.id,
|
|
83
|
+
label: group.name
|
|
84
|
+
})) : null), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
85
|
+
id: _DataElementSelectorStyle.default.__hash
|
|
86
|
+
}, _DataElementSelectorStyle.default));
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
GroupSelector.propTypes = {
|
|
90
|
+
currentValue: _propTypes.default.string.isRequired,
|
|
91
|
+
displayNameProp: _propTypes.default.string.isRequired,
|
|
92
|
+
onChange: _propTypes.default.func.isRequired
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const DisaggregationSelector = _ref2 => {
|
|
96
|
+
let {
|
|
97
|
+
currentValue,
|
|
98
|
+
onChange
|
|
99
|
+
} = _ref2;
|
|
100
|
+
const options = getOptions();
|
|
101
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
102
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "group-select"
|
|
103
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.SingleSelectField, {
|
|
104
|
+
selected: currentValue,
|
|
105
|
+
onChange: ref => onChange(ref.selected),
|
|
106
|
+
dense: true,
|
|
107
|
+
dataTest: 'data-element-disaggregation-select'
|
|
108
|
+
}, Object.entries(options).map(option => /*#__PURE__*/_react.default.createElement(_ui.SingleSelectOption, {
|
|
109
|
+
value: option[0],
|
|
110
|
+
key: option[0],
|
|
111
|
+
label: option[1]
|
|
112
|
+
}))), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
113
|
+
id: _DataElementSelectorStyle.default.__hash
|
|
114
|
+
}, _DataElementSelectorStyle.default));
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
DisaggregationSelector.propTypes = {
|
|
118
|
+
currentValue: _propTypes.default.string.isRequired,
|
|
119
|
+
onChange: _propTypes.default.func.isRequired
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const DataElementSelector = _ref3 => {
|
|
123
|
+
let {
|
|
124
|
+
displayNameProp,
|
|
125
|
+
onDoubleClick
|
|
126
|
+
} = _ref3;
|
|
127
|
+
const dataEngine = (0, _appRuntime.useDataEngine)();
|
|
128
|
+
const [searchTerm, setSearchTerm] = (0, _react.useState)('');
|
|
129
|
+
const [group, setGroup] = (0, _react.useState)(_dataTypes.DIMENSION_TYPE_ALL);
|
|
130
|
+
const [subGroup, setSubGroup] = (0, _react.useState)(_dataTypes.TOTALS);
|
|
131
|
+
const [options, setOptions] = (0, _react.useState)([]);
|
|
132
|
+
const [loading, setLoading] = (0, _react.useState)(true);
|
|
133
|
+
const {
|
|
134
|
+
isSorting
|
|
135
|
+
} = (0, _sortable.useSortable)({});
|
|
136
|
+
const rootRef = (0, _react.useRef)();
|
|
137
|
+
const hasNextPageRef = (0, _react.useRef)(false);
|
|
138
|
+
const searchTermRef = (0, _react.useRef)(searchTerm);
|
|
139
|
+
const pageRef = (0, _react.useRef)(0);
|
|
140
|
+
const filterRef = (0, _react.useRef)({
|
|
141
|
+
dataType: _dataTypes.DIMENSION_TYPE_DATA_ELEMENT,
|
|
142
|
+
group,
|
|
143
|
+
subGroup
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const fetchData = async scrollToTop => {
|
|
147
|
+
try {
|
|
148
|
+
setLoading(true);
|
|
149
|
+
const result = await (0, _dimensions.apiFetchOptions)({
|
|
150
|
+
dataEngine,
|
|
151
|
+
nameProp: displayNameProp,
|
|
152
|
+
filter: filterRef.current,
|
|
153
|
+
searchTerm: searchTermRef.current,
|
|
154
|
+
page: pageRef.current
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
if (result !== null && result !== void 0 && result.dimensionItems) {
|
|
158
|
+
const newOptions = result.dimensionItems.map(item => ({
|
|
159
|
+
label: item.name,
|
|
160
|
+
value: item.id,
|
|
161
|
+
type: item.dimensionItemType,
|
|
162
|
+
expression: item.expression
|
|
163
|
+
}));
|
|
164
|
+
setOptions(prevOptions => pageRef.current > 1 ? [...prevOptions, ...newOptions] : newOptions);
|
|
165
|
+
setLoading(false);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
hasNextPageRef.current = result !== null && result !== void 0 && result.nextPage ? true : false;
|
|
169
|
+
} catch (error) {
|
|
170
|
+
// TODO handle errors
|
|
171
|
+
console.log('apiFetchOptions error: ', error);
|
|
172
|
+
} finally {
|
|
173
|
+
if (scrollToTop) {
|
|
174
|
+
rootRef.current.scrollTo({
|
|
175
|
+
top: 0
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const debouncedFetchData = (0, _debounce.useDebounceCallback)(newSearchTerm => {
|
|
182
|
+
hasNextPageRef.current = false;
|
|
183
|
+
pageRef.current = 1;
|
|
184
|
+
searchTermRef.current = newSearchTerm;
|
|
185
|
+
fetchData(true);
|
|
186
|
+
}, 500);
|
|
187
|
+
|
|
188
|
+
const onSearchChange = _ref4 => {
|
|
189
|
+
let {
|
|
190
|
+
value
|
|
191
|
+
} = _ref4;
|
|
192
|
+
const newSearchTerm = value;
|
|
193
|
+
setSearchTerm(newSearchTerm); // debounce the fetch
|
|
194
|
+
|
|
195
|
+
debouncedFetchData(newSearchTerm);
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
const onFilterChange = newFilter => {
|
|
199
|
+
if (newFilter.group) {
|
|
200
|
+
setGroup(newFilter.group);
|
|
201
|
+
filterRef.current.group = newFilter.group;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (newFilter.subGroup) {
|
|
205
|
+
setSubGroup(newFilter.subGroup);
|
|
206
|
+
filterRef.current.subGroup = newFilter.subGroup;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
hasNextPageRef.current = false;
|
|
210
|
+
pageRef.current = 1;
|
|
211
|
+
fetchData(true);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const onEndReached = _ref5 => {
|
|
215
|
+
let {
|
|
216
|
+
isIntersecting
|
|
217
|
+
} = _ref5;
|
|
218
|
+
|
|
219
|
+
if (isIntersecting) {
|
|
220
|
+
// if hasNextPage is set it means at least 1 request already happened and there is
|
|
221
|
+
// another page, fetch the next page
|
|
222
|
+
if (hasNextPageRef.current) {
|
|
223
|
+
pageRef.current += 1;
|
|
224
|
+
fetchData();
|
|
225
|
+
} else if (pageRef.current === 0) {
|
|
226
|
+
// this is for fetching the initial page
|
|
227
|
+
pageRef.current = 1;
|
|
228
|
+
fetchData();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
234
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "filter-wrapper"
|
|
235
|
+
}, /*#__PURE__*/_react.default.createElement("h4", {
|
|
236
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "sub-header"
|
|
237
|
+
}, _index.default.t('Data elements')), /*#__PURE__*/_react.default.createElement(_ui.InputField, {
|
|
238
|
+
value: searchTerm,
|
|
239
|
+
onChange: onSearchChange,
|
|
240
|
+
placeholder: _index.default.t('Search by data element name'),
|
|
241
|
+
dense: true,
|
|
242
|
+
type: 'search',
|
|
243
|
+
dataTest: 'data-element-search'
|
|
244
|
+
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
245
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "selector-wrapper"
|
|
246
|
+
}, /*#__PURE__*/_react.default.createElement(GroupSelector, {
|
|
247
|
+
currentValue: group,
|
|
248
|
+
onChange: group => onFilterChange({
|
|
249
|
+
group
|
|
250
|
+
}),
|
|
251
|
+
displayNameProp: displayNameProp
|
|
252
|
+
}), /*#__PURE__*/_react.default.createElement(DisaggregationSelector, {
|
|
253
|
+
currentValue: subGroup,
|
|
254
|
+
onChange: subGroup => onFilterChange({
|
|
255
|
+
subGroup
|
|
256
|
+
})
|
|
257
|
+
}))), /*#__PURE__*/_react.default.createElement("div", {
|
|
258
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "dimension-list-container"
|
|
259
|
+
}, loading && /*#__PURE__*/_react.default.createElement("div", {
|
|
260
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "dimension-list-overlay"
|
|
261
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.CircularLoader, null)), /*#__PURE__*/_react.default.createElement("div", {
|
|
262
|
+
ref: rootRef,
|
|
263
|
+
onScroll: () => {
|
|
264
|
+
if (isSorting) {
|
|
265
|
+
rootRef.current.scrollTo({
|
|
266
|
+
top: 0
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "dimension-list-scrollbox"
|
|
271
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
272
|
+
"data-test": "dimension-list",
|
|
273
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + ((0, _classnames.default)('dimension-list-scroller', {
|
|
274
|
+
loading
|
|
275
|
+
}) || "")
|
|
276
|
+
}, Boolean(options.length) && options.map(_ref6 => {
|
|
277
|
+
let {
|
|
278
|
+
label,
|
|
279
|
+
value
|
|
280
|
+
} = _ref6;
|
|
281
|
+
return /*#__PURE__*/_react.default.createElement(_DataElementOption.default, {
|
|
282
|
+
key: value,
|
|
283
|
+
label: label,
|
|
284
|
+
value: value,
|
|
285
|
+
onDoubleClick: onDoubleClick
|
|
286
|
+
});
|
|
287
|
+
}), !loading && !options.length && /*#__PURE__*/_react.default.createElement("div", {
|
|
288
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "empty-list"
|
|
289
|
+
}, searchTermRef.current ? _index.default.t('No data elements found for "{{- searchTerm}}"', {
|
|
290
|
+
searchTerm: searchTermRef.current
|
|
291
|
+
}) : _index.default.t('No data elements found')), /*#__PURE__*/_react.default.createElement("div", {
|
|
292
|
+
className: "jsx-".concat(_DataElementSelectorStyle.default.__hash) + " " + "scroll-detector"
|
|
293
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.IntersectionDetector, {
|
|
294
|
+
onChange: onEndReached,
|
|
295
|
+
rootRef: rootRef
|
|
296
|
+
}))))), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
297
|
+
id: _DataElementSelectorStyle.default.__hash
|
|
298
|
+
}, _DataElementSelectorStyle.default));
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
DataElementSelector.propTypes = {
|
|
302
|
+
displayNameProp: _propTypes.default.string.isRequired,
|
|
303
|
+
onDoubleClick: _propTypes.default.func.isRequired
|
|
304
|
+
};
|
|
305
|
+
var _default = DataElementSelector;
|
|
306
|
+
exports.default = _default;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.OPTIONS_PANEL = void 0;
|
|
7
|
+
|
|
8
|
+
var _core = require("@dnd-kit/core");
|
|
9
|
+
|
|
10
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
|
+
|
|
12
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
|
|
14
|
+
var _DraggingItem = _interopRequireDefault(require("./DraggingItem.js"));
|
|
15
|
+
|
|
16
|
+
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); }
|
|
17
|
+
|
|
18
|
+
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; }
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
23
|
+
|
|
24
|
+
const OPTIONS_PANEL = 'Sortable';
|
|
25
|
+
exports.OPTIONS_PANEL = OPTIONS_PANEL;
|
|
26
|
+
|
|
27
|
+
const getIntersectionRatio = (entry, target) => {
|
|
28
|
+
const top = Math.max(target.top, entry.top);
|
|
29
|
+
const left = Math.max(target.left, entry.left);
|
|
30
|
+
const right = Math.min(target.left + target.width, entry.left + entry.width);
|
|
31
|
+
const bottom = Math.min(target.top + target.height, entry.top + entry.height);
|
|
32
|
+
const width = right - left;
|
|
33
|
+
const height = bottom - top;
|
|
34
|
+
|
|
35
|
+
if (left < right && top < bottom) {
|
|
36
|
+
const targetArea = target.width * target.height;
|
|
37
|
+
const entryArea = entry.width * entry.height;
|
|
38
|
+
const intersectionArea = width * height;
|
|
39
|
+
const intersectionRatio = intersectionArea / (targetArea + entryArea - intersectionArea);
|
|
40
|
+
return Number(intersectionRatio.toFixed(4));
|
|
41
|
+
} // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
return 0;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const sortCollisionsDesc = (_ref, _ref2) => {
|
|
48
|
+
let {
|
|
49
|
+
data: {
|
|
50
|
+
value: a
|
|
51
|
+
}
|
|
52
|
+
} = _ref;
|
|
53
|
+
let {
|
|
54
|
+
data: {
|
|
55
|
+
value: b
|
|
56
|
+
}
|
|
57
|
+
} = _ref2;
|
|
58
|
+
return b - a;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const rectIntersectionCustom = _ref3 => {
|
|
62
|
+
let {
|
|
63
|
+
pointerCoordinates,
|
|
64
|
+
droppableContainers
|
|
65
|
+
} = _ref3;
|
|
66
|
+
// create a rect around the pointerCoords for calculating the intersection
|
|
67
|
+
const pointerRectWidth = 40;
|
|
68
|
+
const pointerRectHeight = 40;
|
|
69
|
+
const pointerRect = {
|
|
70
|
+
width: pointerRectWidth,
|
|
71
|
+
height: pointerRectHeight,
|
|
72
|
+
top: pointerCoordinates.y - pointerRectHeight / 2,
|
|
73
|
+
bottom: pointerCoordinates.y + pointerRectHeight / 2,
|
|
74
|
+
left: pointerCoordinates.x - pointerRectWidth / 2,
|
|
75
|
+
right: pointerCoordinates.x + pointerRectWidth / 2
|
|
76
|
+
};
|
|
77
|
+
const collisions = [];
|
|
78
|
+
|
|
79
|
+
for (const droppableContainer of droppableContainers) {
|
|
80
|
+
const {
|
|
81
|
+
id,
|
|
82
|
+
rect: {
|
|
83
|
+
current: rect
|
|
84
|
+
}
|
|
85
|
+
} = droppableContainer;
|
|
86
|
+
|
|
87
|
+
if (rect) {
|
|
88
|
+
const intersectionRatio = getIntersectionRatio(rect, pointerRect);
|
|
89
|
+
|
|
90
|
+
if (intersectionRatio > 0) {
|
|
91
|
+
collisions.push({
|
|
92
|
+
id,
|
|
93
|
+
data: {
|
|
94
|
+
droppableContainer,
|
|
95
|
+
value: intersectionRatio
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return collisions.sort(sortCollisionsDesc);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const isInteractiveElement = el => {
|
|
106
|
+
const interactiveElements = ['button', 'input', 'textarea', 'select', 'option'];
|
|
107
|
+
|
|
108
|
+
if (interactiveElements.includes(el.tagName.toLowerCase())) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return false;
|
|
113
|
+
}; // disable dragging if user is in an input
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class PointerSensor extends _core.PointerSensor {}
|
|
117
|
+
|
|
118
|
+
_defineProperty(PointerSensor, "activators", [{
|
|
119
|
+
eventName: 'onPointerDown',
|
|
120
|
+
handler: _ref7 => {
|
|
121
|
+
let {
|
|
122
|
+
nativeEvent: event
|
|
123
|
+
} = _ref7;
|
|
124
|
+
|
|
125
|
+
if (!event.isPrimary || event.button !== 0 || isInteractiveElement(event.target)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
}]);
|
|
132
|
+
|
|
133
|
+
const OuterDndContext = _ref4 => {
|
|
134
|
+
let {
|
|
135
|
+
children,
|
|
136
|
+
onDragEnd,
|
|
137
|
+
onDragStart
|
|
138
|
+
} = _ref4;
|
|
139
|
+
const [draggingItem, setDraggingItem] = (0, _react.useState)(null);
|
|
140
|
+
const sensor = (0, _core.useSensor)(PointerSensor, {
|
|
141
|
+
activationConstraint: {
|
|
142
|
+
distance: 15
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
const sensors = (0, _core.useSensors)(sensor);
|
|
146
|
+
|
|
147
|
+
const handleDragStart = _ref5 => {
|
|
148
|
+
let {
|
|
149
|
+
active
|
|
150
|
+
} = _ref5;
|
|
151
|
+
setDraggingItem(active.data.current);
|
|
152
|
+
onDragStart && onDragStart();
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const handleDragCancel = () => {
|
|
156
|
+
setDraggingItem(null);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const handleDragEnd = _ref6 => {
|
|
160
|
+
var _over$data, _over$data$current, _over$data$current$so, _over$data$current2, _over$data$current3;
|
|
161
|
+
|
|
162
|
+
let {
|
|
163
|
+
active,
|
|
164
|
+
over
|
|
165
|
+
} = _ref6;
|
|
166
|
+
|
|
167
|
+
if (!(over !== null && over !== void 0 && over.id) || (over === null || over === void 0 ? void 0 : (_over$data = over.data) === null || _over$data === void 0 ? void 0 : (_over$data$current = _over$data.current) === null || _over$data$current === void 0 ? void 0 : (_over$data$current$so = _over$data$current.sortable) === null || _over$data$current$so === void 0 ? void 0 : _over$data$current$so.containerId) === OPTIONS_PANEL || !active.data.current) {
|
|
168
|
+
// dropped over non-droppable or over options panel
|
|
169
|
+
handleDragCancel();
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const item = {
|
|
174
|
+
id: active.id,
|
|
175
|
+
sourceContainerId: active.data.current.sortable.containerId,
|
|
176
|
+
sourceIndex: active.data.current.sortable.index,
|
|
177
|
+
data: {
|
|
178
|
+
label: active.data.current.label,
|
|
179
|
+
value: active.data.current.value,
|
|
180
|
+
type: active.data.current.type
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
const destination = {
|
|
184
|
+
containerId: ((_over$data$current2 = over.data.current) === null || _over$data$current2 === void 0 ? void 0 : _over$data$current2.sortable.containerId) || over.id,
|
|
185
|
+
index: (_over$data$current3 = over.data.current) === null || _over$data$current3 === void 0 ? void 0 : _over$data$current3.sortable.index
|
|
186
|
+
};
|
|
187
|
+
onDragEnd({
|
|
188
|
+
item,
|
|
189
|
+
destination
|
|
190
|
+
});
|
|
191
|
+
setDraggingItem(null);
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
return /*#__PURE__*/_react.default.createElement(_core.DndContext, {
|
|
195
|
+
collisionDetection: rectIntersectionCustom,
|
|
196
|
+
onDragStart: handleDragStart,
|
|
197
|
+
onDragEnd: handleDragEnd,
|
|
198
|
+
onDragCancel: handleDragCancel,
|
|
199
|
+
sensors: sensors
|
|
200
|
+
}, children, /*#__PURE__*/_react.default.createElement(_core.DragOverlay, {
|
|
201
|
+
dropAnimation: null
|
|
202
|
+
}, draggingItem ? /*#__PURE__*/_react.default.createElement("span", {
|
|
203
|
+
className: "dragOverlay"
|
|
204
|
+
}, /*#__PURE__*/_react.default.createElement(_DraggingItem.default, draggingItem)) : null));
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
OuterDndContext.propTypes = {
|
|
208
|
+
onDragEnd: _propTypes.default.func.isRequired,
|
|
209
|
+
children: _propTypes.default.node,
|
|
210
|
+
onDragStart: _propTypes.default.func
|
|
211
|
+
};
|
|
212
|
+
var _default = OuterDndContext;
|
|
213
|
+
exports.default = _default;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
var _default = /*#__PURE__*/_react.default.createElement("svg", {
|
|
13
|
+
height: "16",
|
|
14
|
+
viewBox: "0 0 16 16",
|
|
15
|
+
width: "16",
|
|
16
|
+
xmlns: "http://www.w3.org/2000/svg"
|
|
17
|
+
}, /*#__PURE__*/_react.default.createElement("path", {
|
|
18
|
+
d: "M6 11a1 1 0 110 2 1 1 0 010-2zm4 0a1 1 0 110 2 1 1 0 010-2zM6 7a1 1 0 110 2 1 1 0 010-2zm4 0a1 1 0 110 2 1 1 0 010-2zM6 3a1 1 0 110 2 1 1 0 010-2zm4 0a1 1 0 110 2 1 1 0 010-2z",
|
|
19
|
+
fill: "#A0ADBA",
|
|
20
|
+
fillRule: "evenodd"
|
|
21
|
+
}));
|
|
22
|
+
|
|
23
|
+
exports.default = _default;
|
|
@@ -0,0 +1,58 @@
|
|
|
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 _classnames = _interopRequireDefault(require("classnames"));
|
|
11
|
+
|
|
12
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
+
|
|
14
|
+
var _react = _interopRequireDefault(require("react"));
|
|
15
|
+
|
|
16
|
+
var _dataTypes = require("../../../modules/dataTypes.js");
|
|
17
|
+
|
|
18
|
+
var _dimensionListItem = require("../../../modules/dimensionListItem.js");
|
|
19
|
+
|
|
20
|
+
var _expressions = require("../../../modules/expressions.js");
|
|
21
|
+
|
|
22
|
+
var _DraggingItemStyle = _interopRequireDefault(require("./styles/DraggingItem.style.js"));
|
|
23
|
+
|
|
24
|
+
var _FormulaItemStyle = _interopRequireDefault(require("./styles/FormulaItem.style.js"));
|
|
25
|
+
|
|
26
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
|
+
|
|
28
|
+
const DraggingItem = _ref => {
|
|
29
|
+
let {
|
|
30
|
+
label,
|
|
31
|
+
type,
|
|
32
|
+
value
|
|
33
|
+
} = _ref;
|
|
34
|
+
const displayLabel = type === _expressions.EXPRESSION_TYPE_NUMBER ? value || label : label;
|
|
35
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
36
|
+
className: "jsx-".concat(_DraggingItemStyle.default.__hash, " jsx-").concat(_FormulaItemStyle.default.__hash) + " " + ((0, _classnames.default)('dragging', 'content', {
|
|
37
|
+
operator: type === _expressions.EXPRESSION_TYPE_OPERATOR,
|
|
38
|
+
number: type === _expressions.EXPRESSION_TYPE_NUMBER,
|
|
39
|
+
data: type === _expressions.EXPRESSION_TYPE_DATA
|
|
40
|
+
}) || "")
|
|
41
|
+
}, type === _expressions.EXPRESSION_TYPE_DATA && /*#__PURE__*/_react.default.createElement("span", {
|
|
42
|
+
className: "jsx-".concat(_DraggingItemStyle.default.__hash, " jsx-").concat(_FormulaItemStyle.default.__hash) + " " + "icon"
|
|
43
|
+
}, (0, _dimensionListItem.getIcon)(_dataTypes.DIMENSION_TYPE_DATA_ELEMENT)), /*#__PURE__*/_react.default.createElement("span", {
|
|
44
|
+
className: "jsx-".concat(_DraggingItemStyle.default.__hash, " jsx-").concat(_FormulaItemStyle.default.__hash) + " " + "label"
|
|
45
|
+
}, displayLabel)), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
46
|
+
id: _DraggingItemStyle.default.__hash
|
|
47
|
+
}, _DraggingItemStyle.default), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
48
|
+
id: _FormulaItemStyle.default.__hash
|
|
49
|
+
}, _FormulaItemStyle.default));
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
DraggingItem.propTypes = {
|
|
53
|
+
label: _propTypes.default.string,
|
|
54
|
+
type: _propTypes.default.string,
|
|
55
|
+
value: _propTypes.default.string
|
|
56
|
+
};
|
|
57
|
+
var _default = DraggingItem;
|
|
58
|
+
exports.default = _default;
|
|
@@ -0,0 +1,58 @@
|
|
|
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 _core = require("@dnd-kit/core");
|
|
11
|
+
|
|
12
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
13
|
+
|
|
14
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
15
|
+
|
|
16
|
+
var _react = _interopRequireDefault(require("react"));
|
|
17
|
+
|
|
18
|
+
var _DropZoneStyle = _interopRequireDefault(require("./styles/DropZone.style.js"));
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
const DropZone = _ref => {
|
|
23
|
+
let {
|
|
24
|
+
firstElementId,
|
|
25
|
+
overLastDropZone
|
|
26
|
+
} = _ref;
|
|
27
|
+
const {
|
|
28
|
+
isOver,
|
|
29
|
+
setNodeRef,
|
|
30
|
+
active
|
|
31
|
+
} = (0, _core.useDroppable)({
|
|
32
|
+
id: 'firstdropzone'
|
|
33
|
+
});
|
|
34
|
+
let draggingOver = false;
|
|
35
|
+
|
|
36
|
+
if (overLastDropZone && !firstElementId) {
|
|
37
|
+
draggingOver = true;
|
|
38
|
+
} else {
|
|
39
|
+
draggingOver = firstElementId === (active === null || active === void 0 ? void 0 : active.id) ? false : isOver;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
43
|
+
ref: setNodeRef,
|
|
44
|
+
className: "jsx-".concat(_DropZoneStyle.default.__hash) + " " + ((0, _classnames.default)('first-dropzone', {
|
|
45
|
+
'dragging-over': draggingOver,
|
|
46
|
+
empty: !firstElementId
|
|
47
|
+
}) || "")
|
|
48
|
+
}), /*#__PURE__*/_react.default.createElement(_style.default, {
|
|
49
|
+
id: _DropZoneStyle.default.__hash
|
|
50
|
+
}, _DropZoneStyle.default));
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
DropZone.propTypes = {
|
|
54
|
+
firstElementId: _propTypes.default.string,
|
|
55
|
+
overLastDropZone: _propTypes.default.bool
|
|
56
|
+
};
|
|
57
|
+
var _default = DropZone;
|
|
58
|
+
exports.default = _default;
|