@antscorp/antsomi-ui 1.3.5-beta.700 → 1.3.5-beta.703
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/es/components/molecules/DatePicker/components/AdvancedPicker/AdvancedPicker.d.ts +18 -8
- package/es/components/molecules/DatePicker/components/AdvancedPicker/AdvancedPicker.js +5 -5
- package/es/components/molecules/MatchAnySelect/MatchesAnySelect.js +51 -86
- package/es/components/molecules/MatchAnySelect/types.d.ts +1 -3
- package/es/components/molecules/MatchAnySelect/utils.js +13 -5
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { Dayjs } from 'dayjs';
|
|
2
3
|
import { TAdvancedType, TCalculationType, TOperatorKey, TOption, TShowCalculationTypeCondition, ValueTypes } from './types';
|
|
3
4
|
export interface AdvancedPickerProps {
|
|
4
5
|
label?: string;
|
|
@@ -24,16 +25,25 @@ export interface AdvancedPickerProps {
|
|
|
24
25
|
isViewMode?: boolean;
|
|
25
26
|
/**
|
|
26
27
|
*
|
|
27
|
-
* @example const disabledTime = {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
* @example const disabledTime = (date?: Dayjs) => {
|
|
29
|
+
if (date?.get('date') !== 31)
|
|
30
|
+
return {
|
|
31
|
+
disabledHours: () => [],
|
|
32
|
+
disabledMinutes: () => [],
|
|
33
|
+
disabledSeconds: () => [],
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
disabledHours: () => range(0, 24).splice(4, 20),
|
|
38
|
+
disabledMinutes: () => range(30, 60),
|
|
39
|
+
disabledSeconds: () => [55, 56],
|
|
40
|
+
};
|
|
31
41
|
};
|
|
32
42
|
*/
|
|
33
|
-
disabledTime?: {
|
|
34
|
-
disabledHours: number[];
|
|
35
|
-
disabledMinutes: number[];
|
|
36
|
-
disabledSeconds: number[];
|
|
43
|
+
disabledTime?: (date?: Dayjs) => {
|
|
44
|
+
disabledHours: () => number[];
|
|
45
|
+
disabledMinutes: () => number[];
|
|
46
|
+
disabledSeconds: () => number[];
|
|
37
47
|
};
|
|
38
48
|
/**
|
|
39
49
|
* Only show fixed calendar (hide dynamic and )
|
|
@@ -24,12 +24,12 @@ import { DatePickerCustomInput, DatePickerHeader, DropdownContent, DropdownHeade
|
|
|
24
24
|
import { CALCULATION_DATES, CALCULATION_TYPES, DATE_TYPES, DEFAULT_DATE_FORMAT, VALUE_TYPES, ADVANCED_PICKER_TYPE, WEEK_ARR, QUARTER_PLACEHOLDER, WEEK_PLACEHOLDER, DAY_LABEL_SHORT, MONTH_LABEL_FULL, DAY_OF_MONTH, ANCHOR_LEAP_YEAR, GRANULARITY_MAPPING, } from './constants';
|
|
25
25
|
import { globalToken, THEME } from '@antscorp/antsomi-ui/es/constants';
|
|
26
26
|
import { useOutsideClick } from '@antscorp/antsomi-ui/es/hooks/useOutsideClick';
|
|
27
|
-
const isDisabledSpecificTime = (current, info, disabledTime) => {
|
|
27
|
+
const isDisabledSpecificTime = (current, info, disabledTime, date) => {
|
|
28
28
|
if (info.type !== 'time' || typeof current !== 'number' || !disabledTime)
|
|
29
29
|
return false;
|
|
30
|
-
const isDisabledHour = info.subType === 'hour' && disabledTime.disabledHours.includes(current);
|
|
31
|
-
const isDisabledMinute = info.subType === 'minute' && disabledTime.disabledMinutes.includes(current);
|
|
32
|
-
const isDisabledSecond = info.subType === 'second' && disabledTime.disabledSeconds.includes(current);
|
|
30
|
+
const isDisabledHour = info.subType === 'hour' && disabledTime(date).disabledHours().includes(current);
|
|
31
|
+
const isDisabledMinute = info.subType === 'minute' && disabledTime(date).disabledMinutes().includes(current);
|
|
32
|
+
const isDisabledSecond = info.subType === 'second' && disabledTime(date).disabledSeconds().includes(current);
|
|
33
33
|
return isDisabledHour || isDisabledMinute || isDisabledSecond;
|
|
34
34
|
};
|
|
35
35
|
const PATH = '@antscorp/antsomi-ui/es/components/molecules/DatePicker/components/Advanced/DatePickerAdvanced.tsx';
|
|
@@ -351,7 +351,7 @@ export const AdvancedPicker = props => {
|
|
|
351
351
|
renderDropdownFooter()));
|
|
352
352
|
};
|
|
353
353
|
const cellRender = useCallback((current, info) => {
|
|
354
|
-
const isDisabledTime = isDisabledSpecificTime(current, info, disabledTime);
|
|
354
|
+
const isDisabledTime = isDisabledSpecificTime(current, info, disabledTime, dayjs(date));
|
|
355
355
|
return (React.createElement("div", { className: "antsomi-picker-cell-inner", style: Object.assign({ pointerEvents: 'all', width: '100%' }, (isDisabledTime
|
|
356
356
|
? {
|
|
357
357
|
color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.colorTextDisabled,
|
|
@@ -15,8 +15,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
15
15
|
import { ConfigProvider } from 'antd';
|
|
16
16
|
import clsx from 'clsx';
|
|
17
17
|
import { isEmpty, uniqBy } from 'lodash';
|
|
18
|
-
import React, { useEffect, useState } from 'react';
|
|
19
|
-
import deepmerge from 'deepmerge';
|
|
18
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
20
19
|
// Components
|
|
21
20
|
import { Button, Flex, Icon, Input, Popover, Spin, Tooltip, Typography, } from '@antscorp/antsomi-ui/es/components/atoms';
|
|
22
21
|
import { EmptyData, PopoverSelect, Select } from '@antscorp/antsomi-ui/es/components/molecules';
|
|
@@ -42,17 +41,18 @@ const initialState = {
|
|
|
42
41
|
const matchesAnyInitialState = {
|
|
43
42
|
searchValue: '',
|
|
44
43
|
selectedItems: [],
|
|
44
|
+
selectedTreeData: [],
|
|
45
45
|
isShowLoadMoreEl: false,
|
|
46
46
|
};
|
|
47
47
|
const { t } = i18nInstance;
|
|
48
48
|
const { Text } = Typography;
|
|
49
49
|
export function MatchesAny(props) {
|
|
50
50
|
// Props
|
|
51
|
-
const { objectName, loading = false, showExtendValue = true, items, groupSelectProps, renderExtraValues, customItemRenders, listEmptyProps, selectedListEmptyProps, selectedTreeData: selectedTreeDataProp,
|
|
51
|
+
const { objectName, loading = false, showExtendValue = true, selectedItems: selectedItemsProp, items, groupSelectProps, renderExtraValues, customItemRenders, listEmptyProps, selectedListEmptyProps, selectedTreeData: selectedTreeDataProp, onApply = () => { }, onCancel = () => { }, onLoadMore = () => { }, onChangeSearch } = props, restOfProps = __rest(props, ["objectName", "loading", "showExtendValue", "selectedItems", "items", "groupSelectProps", "renderExtraValues", "customItemRenders", "listEmptyProps", "selectedListEmptyProps", "selectedTreeData", "onApply", "onCancel", "onLoadMore", "onChangeSearch"]);
|
|
52
52
|
// State
|
|
53
53
|
const [state, setState] = useState(matchesAnyInitialState);
|
|
54
54
|
// Variables
|
|
55
|
-
const { searchValue, selectedItems, isShowLoadMoreEl } = state;
|
|
55
|
+
const { searchValue, selectedItems, selectedTreeData, isShowLoadMoreEl } = state;
|
|
56
56
|
const _a = listEmptyProps || {}, { icon: listEmptyIcon, description: listEmptyDescription = t(translations.global.noResultsMatchesKeyWord).toString() } = _a, restListEmptyProps = __rest(_a, ["icon", "description"]);
|
|
57
57
|
const _b = selectedListEmptyProps || {}, { description: selectedListEmptyDescription = t(translations.global.selectItemsFromList).toString(), icon: selectedListEmptyIcon = React.createElement(DataIcon, { color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.bw5, size: 48 }) } = _b, restSelectedListEmptyProps = __rest(_b, ["description", "icon"]);
|
|
58
58
|
// Refs
|
|
@@ -70,8 +70,8 @@ export function MatchesAny(props) {
|
|
|
70
70
|
* Updates the `selectedItems` state when the `selectedItems` prop changes.
|
|
71
71
|
*/
|
|
72
72
|
useDeepCompareEffect(() => {
|
|
73
|
-
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems:
|
|
74
|
-
}, [
|
|
73
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: selectedItemsProp })));
|
|
74
|
+
}, [selectedItemsProp]);
|
|
75
75
|
useEffect(() => {
|
|
76
76
|
// Delay for show load more el
|
|
77
77
|
setTimeout(() => {
|
|
@@ -79,23 +79,11 @@ export function MatchesAny(props) {
|
|
|
79
79
|
}, 500);
|
|
80
80
|
}, []);
|
|
81
81
|
useDeepCompareEffect(() => {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
onSelectedTreeDataChange(selectedTreeData);
|
|
82
|
+
if (!isEmpty(selectedTreeDataProp)) {
|
|
83
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedTreeData: selectedTreeDataProp })));
|
|
85
84
|
}
|
|
86
|
-
|
|
87
|
-
}, [items, selectedItems]);
|
|
85
|
+
}, [selectedTreeDataProp]);
|
|
88
86
|
// Handlers
|
|
89
|
-
/**
|
|
90
|
-
* Adds an item and, if applicable, its leaf descendants to the list of selected items.
|
|
91
|
-
*
|
|
92
|
-
* If the item has children, the function flattens the tree structure and adds only the leaf nodes
|
|
93
|
-
* (nodes without children) to the selected items list. If the item does not have children, it adds
|
|
94
|
-
* the item directly to the selected items list.
|
|
95
|
-
*
|
|
96
|
-
* @param {MatchesAnyItem} item - The item to be added to the selected items list.
|
|
97
|
-
* This item can have children.
|
|
98
|
-
*/
|
|
99
87
|
const onSelectItem = (item) => {
|
|
100
88
|
let newSelectedItems = [...(selectedItems || [])];
|
|
101
89
|
if (item.children) {
|
|
@@ -105,7 +93,8 @@ export function MatchesAny(props) {
|
|
|
105
93
|
else {
|
|
106
94
|
newSelectedItems = newSelectedItems.concat(item);
|
|
107
95
|
}
|
|
108
|
-
|
|
96
|
+
const newSelectedTreeData = getSelectedTreeData(items || [], newSelectedItems || [], selectedTreeData || []);
|
|
97
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: newSelectedItems, selectedTreeData: newSelectedTreeData })));
|
|
109
98
|
};
|
|
110
99
|
/**
|
|
111
100
|
* Removes an item and its descendants from the list of selected items.
|
|
@@ -115,38 +104,38 @@ export function MatchesAny(props) {
|
|
|
115
104
|
*
|
|
116
105
|
*/
|
|
117
106
|
const onRemoveItem = (item) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
126
|
-
return selectedItem.key !== item.key;
|
|
127
|
-
}) }));
|
|
107
|
+
const newSelectedItems = selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(selectedItem => {
|
|
108
|
+
if (item.children) {
|
|
109
|
+
const flattenChild = flatTree(item.children, 'children');
|
|
110
|
+
return (selectedItem.key !== item.key &&
|
|
111
|
+
!(flattenChild === null || flattenChild === void 0 ? void 0 : flattenChild.some(item => item.key === selectedItem.key)));
|
|
112
|
+
}
|
|
113
|
+
return selectedItem.key !== item.key;
|
|
128
114
|
});
|
|
115
|
+
const newSelectedTreeData = getSelectedTreeData(items || [], newSelectedItems || [], selectedTreeData || []);
|
|
116
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: newSelectedItems, selectedTreeData: newSelectedTreeData })));
|
|
129
117
|
};
|
|
130
118
|
const onSelectAll = () => {
|
|
131
119
|
const flattenTreeData = flatTree(items, 'children').filter(item => !item.children &&
|
|
132
120
|
!(selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.some(selectedItem => selectedItem.key === item.key || selectedItem.title === item.title)));
|
|
133
|
-
|
|
121
|
+
const newSelectedItems = uniqBy([...(state.selectedItems || []), ...flattenTreeData], 'key');
|
|
122
|
+
const newSelectedTreeData = getSelectedTreeData(items || [], newSelectedItems || [], selectedTreeData);
|
|
123
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: newSelectedItems, selectedTreeData: newSelectedTreeData })));
|
|
134
124
|
};
|
|
135
125
|
const onRemoveAll = () => {
|
|
136
|
-
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: [] })));
|
|
126
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: [], selectedTreeData: [] })));
|
|
137
127
|
};
|
|
138
128
|
const onClickApply = () => {
|
|
139
|
-
|
|
140
|
-
onApply(selectedItems || [], selectedTreeData);
|
|
129
|
+
onApply(selectedItems || [], selectedTreeData || []);
|
|
141
130
|
};
|
|
142
|
-
const renderItemError = (item) => {
|
|
131
|
+
const renderItemError = useCallback((item) => {
|
|
143
132
|
if (customItemRenders === null || customItemRenders === void 0 ? void 0 : customItemRenders.error) {
|
|
144
133
|
return customItemRenders === null || customItemRenders === void 0 ? void 0 : customItemRenders.error(item);
|
|
145
134
|
}
|
|
146
135
|
return item.error ? (React.createElement(Tooltip, { title: item.error },
|
|
147
136
|
React.createElement(WarningIcon, { size: 16 }))) : null;
|
|
148
|
-
};
|
|
149
|
-
const renderItemNodeTitle = ({ item, mode = 'unselect', onSelectItem, onRemoveItem, }) => {
|
|
137
|
+
}, [customItemRenders]);
|
|
138
|
+
const renderItemNodeTitle = useCallback(({ item, mode = 'unselect', onSelectItem, onRemoveItem, }) => {
|
|
150
139
|
var _a, _b;
|
|
151
140
|
const { isExtendValue, title, subTitle } = item; // Destructure properties from item
|
|
152
141
|
return (React.createElement(React.Fragment, null,
|
|
@@ -176,7 +165,7 @@ export function MatchesAny(props) {
|
|
|
176
165
|
}
|
|
177
166
|
} },
|
|
178
167
|
React.createElement(Icon, { type: `icon-ants-${onSelectItem ? 'double-arrow-up' : 'remove-slim'}`, size: 11 })))));
|
|
179
|
-
};
|
|
168
|
+
}, [customItemRenders, renderExtraValues, renderItemError]);
|
|
180
169
|
// Memos
|
|
181
170
|
const { treeData, matchedParents } = useDeepCompareMemo(() => {
|
|
182
171
|
var _a;
|
|
@@ -201,10 +190,7 @@ export function MatchesAny(props) {
|
|
|
201
190
|
(selectedItem.isExtendValue && selectedItem.title === item.title)))
|
|
202
191
|
: selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.some(selectedItem => selectedItem.key === item.key ||
|
|
203
192
|
(selectedItem.isExtendValue && selectedItem.title === item.title));
|
|
204
|
-
return Object.assign(Object.assign(Object.assign({}, item), {
|
|
205
|
-
item,
|
|
206
|
-
onSelectItem,
|
|
207
|
-
}), disabled: isSelected }), (item.children && {
|
|
193
|
+
return Object.assign(Object.assign(Object.assign({}, item), { disabled: isSelected }), (item.children && {
|
|
208
194
|
children: serializeTreeData(item.children),
|
|
209
195
|
}));
|
|
210
196
|
});
|
|
@@ -216,38 +202,6 @@ export function MatchesAny(props) {
|
|
|
216
202
|
return { treeData, matchedParents };
|
|
217
203
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
218
204
|
}, [items, searchValue, selectedItems, groupSelectProps, onChangeSearch]);
|
|
219
|
-
// const selectedTreeData = useDeepCompareMemo(() => [], [items, selectedItems]);
|
|
220
|
-
const selectedTreeData = useDeepCompareMemo(() => {
|
|
221
|
-
var _a;
|
|
222
|
-
const notExtendValueSelectedItems = (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(item => !item.isExtendValue)) || [];
|
|
223
|
-
const extendValueSelectedItems = (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(item => item.isExtendValue)) || [];
|
|
224
|
-
const serializeTreeData = (list) => {
|
|
225
|
-
var _a;
|
|
226
|
-
return ((_a = list
|
|
227
|
-
.filter(item => {
|
|
228
|
-
/**
|
|
229
|
-
* Checks if the given item or any of its descendants are selected.
|
|
230
|
-
*
|
|
231
|
-
* If the item has children, it flattens the children tree structure and checks if any node is selected.
|
|
232
|
-
* If the item does not have children, it directly checks if the item is in the selected items list.
|
|
233
|
-
*
|
|
234
|
-
*/
|
|
235
|
-
const isSelected = item.children
|
|
236
|
-
? flatTree(item.children, 'children').some(item => notExtendValueSelectedItems === null || notExtendValueSelectedItems === void 0 ? void 0 : notExtendValueSelectedItems.some(selectedItem => selectedItem.key === item.key))
|
|
237
|
-
: notExtendValueSelectedItems === null || notExtendValueSelectedItems === void 0 ? void 0 : notExtendValueSelectedItems.some(selectedItem => selectedItem.key === item.key);
|
|
238
|
-
return isSelected;
|
|
239
|
-
})) === null || _a === void 0 ? void 0 : _a.map(item => (Object.assign(Object.assign(Object.assign(Object.assign({}, item), { title: renderItemNodeTitle({ item, mode: 'select', onRemoveItem }) }), (item.children && {
|
|
240
|
-
children: serializeTreeData(item.children),
|
|
241
|
-
})), (!!item.error && { className: 'error-node' }))))) || [];
|
|
242
|
-
};
|
|
243
|
-
const mergeItems = deepmerge(selectedTreeDataProp || [], items || [], {
|
|
244
|
-
arrayMerge(target, source) {
|
|
245
|
-
return uniqBy([...target, ...source], 'key');
|
|
246
|
-
},
|
|
247
|
-
});
|
|
248
|
-
return serializeTreeData(mergeItems).concat(((_a = [...extendValueSelectedItems]) === null || _a === void 0 ? void 0 : _a.map(item => (Object.assign(Object.assign({}, item), { title: renderItemNodeTitle({ item, mode: 'select', onRemoveItem }) })))) || []);
|
|
249
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
250
|
-
}, [items, selectedItems, selectedTreeDataProp]);
|
|
251
205
|
const isDisableRemoveAll = useDeepCompareMemo(() => !(selectedTreeData === null || selectedTreeData === void 0 ? void 0 : selectedTreeData.length), [selectedTreeData]);
|
|
252
206
|
const isDisableSelectAll = useDeepCompareMemo(() => {
|
|
253
207
|
const flattenTreeData = flatTree(treeData, 'children');
|
|
@@ -290,14 +244,21 @@ export function MatchesAny(props) {
|
|
|
290
244
|
: items === null || items === void 0 ? void 0 : items.map(item => item.key), selectable: false, treeData: treeData, switcherIcon: props => (React.createElement(Icon, { type: "icon-ants-caret-down", style: {
|
|
291
245
|
transform: props.expanded ? 'rotate(0)' : 'rotate(-90deg)',
|
|
292
246
|
transition: 'transform 0.3s ease',
|
|
293
|
-
}, color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.bw8 })),
|
|
247
|
+
}, color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.bw8 })), titleRender: item => renderItemNodeTitle({
|
|
248
|
+
item: item,
|
|
249
|
+
onSelectItem,
|
|
250
|
+
}), height: 396 }),
|
|
294
251
|
isShowLoadMoreEl && React.createElement("div", { ref: loadMoreRef }))) : (React.createElement(EmptyData, Object.assign({ icon: listEmptyIcon, showIcon: !!listEmptyIcon, description: listEmptyDescription }, restListEmptyProps)))))));
|
|
295
252
|
};
|
|
296
253
|
const renderSelectedList = () => (React.createElement("div", { className: "matches-any__section" },
|
|
297
254
|
React.createElement(Flex, { className: "matches-any__header", justify: "space-between" },
|
|
298
255
|
React.createElement(Text, { strong: true }, `${t(translations.global.selected)} (${(selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) || 0})`),
|
|
299
256
|
React.createElement(TextButton, { disabled: isDisableRemoveAll, onClick: onRemoveAll }, t(translations.global.removeAll).toString())),
|
|
300
|
-
React.createElement("div", { className: "matches-any__body" }, !(selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) ? (React.createElement(EmptyData, Object.assign({ icon: selectedListEmptyIcon, description: selectedListEmptyDescription }, restSelectedListEmptyProps))) : (React.createElement(StyledTree, { defaultExpandedKeys: selectedTreeData === null || selectedTreeData === void 0 ? void 0 : selectedTreeData.map(item => item.key), selectable: false, treeData: selectedTreeData,
|
|
257
|
+
React.createElement("div", { className: "matches-any__body" }, !(selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length) ? (React.createElement(EmptyData, Object.assign({ icon: selectedListEmptyIcon, description: selectedListEmptyDescription }, restSelectedListEmptyProps))) : (React.createElement(StyledTree, { defaultExpandedKeys: selectedTreeData === null || selectedTreeData === void 0 ? void 0 : selectedTreeData.map(item => item.key), selectable: false, treeData: selectedTreeData, titleRender: item => renderItemNodeTitle({
|
|
258
|
+
item: item,
|
|
259
|
+
mode: 'select',
|
|
260
|
+
onRemoveItem,
|
|
261
|
+
}), height: 420, switcherIcon: props => (React.createElement(Icon, { type: "icon-ants-caret-down", style: {
|
|
301
262
|
transform: props.expanded ? 'rotate(0)' : 'rotate(-90deg)',
|
|
302
263
|
transition: 'transform 0.3s ease',
|
|
303
264
|
}, color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.bw8 })) })))));
|
|
@@ -308,12 +269,16 @@ export function MatchesAny(props) {
|
|
|
308
269
|
// If there are available values to add
|
|
309
270
|
if (availableExtendValues) {
|
|
310
271
|
// Create new items in the format required (MatchesAnyItem)
|
|
311
|
-
const newSelectedItems =
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
272
|
+
const newSelectedItems = [
|
|
273
|
+
...(selectedItems || []),
|
|
274
|
+
...availableExtendValues.map(value => ({
|
|
275
|
+
key: value,
|
|
276
|
+
title: value,
|
|
277
|
+
isExtendValue: true, // Flag to indicate that this item is an extend value
|
|
278
|
+
})),
|
|
279
|
+
];
|
|
280
|
+
const newSelectedTreeData = getSelectedTreeData(items || [], newSelectedItems || [], selectedTreeData || []);
|
|
281
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: newSelectedItems, selectedTreeData: newSelectedTreeData })));
|
|
317
282
|
}
|
|
318
283
|
};
|
|
319
284
|
return (React.createElement(ConfigProvider, { theme: MATCHES_ANY_THEME },
|
|
@@ -330,7 +295,7 @@ export function MatchesAny(props) {
|
|
|
330
295
|
}
|
|
331
296
|
export function MatchesAnySelect(props) {
|
|
332
297
|
var _a, _b, _c;
|
|
333
|
-
const { placeholder = 'Select an item', dropdownStyle, objectName, selectedItems, items, loading, popupClassName, groupSelectProps, renderExtraValues, customItemRenders, popoverProps, listEmptyProps, selectedListEmptyProps, selectedTreeData, onChangeSearch, onChange = () => { },
|
|
298
|
+
const { placeholder = 'Select an item', dropdownStyle, objectName, selectedItems, items, loading, popupClassName, groupSelectProps, renderExtraValues, customItemRenders, popoverProps, listEmptyProps, selectedListEmptyProps, selectedTreeData, onChangeSearch, onChange = () => { }, onLoadMore } = props, restProps = __rest(props, ["placeholder", "dropdownStyle", "objectName", "selectedItems", "items", "loading", "popupClassName", "groupSelectProps", "renderExtraValues", "customItemRenders", "popoverProps", "listEmptyProps", "selectedListEmptyProps", "selectedTreeData", "onChangeSearch", "onChange", "onLoadMore"]);
|
|
334
299
|
// State
|
|
335
300
|
const [state, setState] = useState(initialState);
|
|
336
301
|
// Variables
|
|
@@ -343,7 +308,7 @@ export function MatchesAnySelect(props) {
|
|
|
343
308
|
onChange(selectedItems, selectedTreeData);
|
|
344
309
|
setState(prev => (Object.assign(Object.assign({}, prev), { isOpenPopover: false })));
|
|
345
310
|
};
|
|
346
|
-
return (React.createElement(Popover, Object.assign({ open: isOpenPopover, arrow: false, placement: "bottomLeft", content: React.createElement(MatchesAny, { className: popupClassName, items: items, selectedItems: selectedItems, loading: loading, objectName: objectName, groupSelectProps: groupSelectProps, renderExtraValues: renderExtraValues, customItemRenders: customItemRenders, listEmptyProps: listEmptyProps, selectedListEmptyProps: selectedListEmptyProps, selectedTreeData: selectedTreeData, onChangeSearch: onChangeSearch, onApply: onApplyMatchesAny, onCancel: () => setState(prev => (Object.assign(Object.assign({}, prev), { isOpenPopover: false }))), onLoadMore: onLoadMore
|
|
311
|
+
return (React.createElement(Popover, Object.assign({ open: isOpenPopover, arrow: false, placement: "bottomLeft", content: React.createElement(MatchesAny, { className: popupClassName, items: items, selectedItems: selectedItems, loading: loading, objectName: objectName, groupSelectProps: groupSelectProps, renderExtraValues: renderExtraValues, customItemRenders: customItemRenders, listEmptyProps: listEmptyProps, selectedListEmptyProps: selectedListEmptyProps, selectedTreeData: selectedTreeData, onChangeSearch: onChangeSearch, onApply: onApplyMatchesAny, onCancel: () => setState(prev => (Object.assign(Object.assign({}, prev), { isOpenPopover: false }))), onLoadMore: onLoadMore }), align: {
|
|
347
312
|
overflow: {
|
|
348
313
|
shiftY: 0,
|
|
349
314
|
shiftX: 0,
|
|
@@ -50,8 +50,6 @@ export interface MatchesAnySelectProps<TItem = any> extends Omit<SelectProps, 'o
|
|
|
50
50
|
listEmptyProps?: EmptyDataProps;
|
|
51
51
|
/** Empty UI for selected list items */
|
|
52
52
|
selectedListEmptyProps?: EmptyDataProps;
|
|
53
|
-
/** Callback function when selectedTreeData change */
|
|
54
|
-
onSelectedTreeDataChange?: (selectedTreeData: MatchesAnyItem<TItem>[]) => void;
|
|
55
53
|
/** Callback function that is called when the selected items change. */
|
|
56
54
|
onChange?: (selectedItems: MatchesAnyItem<TItem>[], selectedTreeData?: MatchesAnyItem<TItem>[]) => void;
|
|
57
55
|
/** Callback function that is called when the search value changes */
|
|
@@ -59,7 +57,7 @@ export interface MatchesAnySelectProps<TItem = any> extends Omit<SelectProps, 'o
|
|
|
59
57
|
/** Callback function that is called when the user scroll */
|
|
60
58
|
onLoadMore?: () => void;
|
|
61
59
|
}
|
|
62
|
-
export interface MatchesAnyProps<TItem = any> extends Omit<FlexProps, 'children'>, Pick<MatchesAnySelectProps<TItem>, 'objectName' | 'loading' | 'showExtendValue' | 'items' | 'selectedItems' | 'onLoadMore' | 'groupSelectProps' | 'onChangeSearch' | 'renderExtraValues' | 'customItemRenders' | 'listEmptyProps' | 'selectedListEmptyProps' | 'selectedTreeData'
|
|
60
|
+
export interface MatchesAnyProps<TItem = any> extends Omit<FlexProps, 'children'>, Pick<MatchesAnySelectProps<TItem>, 'objectName' | 'loading' | 'showExtendValue' | 'items' | 'selectedItems' | 'onLoadMore' | 'groupSelectProps' | 'onChangeSearch' | 'renderExtraValues' | 'customItemRenders' | 'listEmptyProps' | 'selectedListEmptyProps' | 'selectedTreeData'> {
|
|
63
61
|
/**
|
|
64
62
|
* Callback function that is called when the apply action is triggered.
|
|
65
63
|
*
|
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Libraries
|
|
2
2
|
import deepmerge from 'deepmerge';
|
|
3
3
|
// Utils
|
|
4
4
|
import { flatTree } from '@antscorp/antsomi-ui/es/utils';
|
|
5
|
-
|
|
5
|
+
const customMergeTreeData = (key) => (target, source) => {
|
|
6
|
+
const merged = target.map(item => {
|
|
7
|
+
const found = source.find(s => s[key] === item[key]);
|
|
8
|
+
if (found) {
|
|
9
|
+
return deepmerge(found, item, { arrayMerge: customMergeTreeData(key) });
|
|
10
|
+
}
|
|
11
|
+
return item;
|
|
12
|
+
});
|
|
13
|
+
const newItems = source.filter(s => !target.some(t => t[key] === s[key]));
|
|
14
|
+
return [...merged, ...newItems];
|
|
15
|
+
};
|
|
6
16
|
export const getSelectedTreeData = (items, selectedItems, selectedTreeData = []) => {
|
|
7
17
|
const notExtendValueSelectedItems = (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(item => !item.isExtendValue)) || [];
|
|
8
18
|
const extendValueSelectedItems = (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(item => item.isExtendValue)) || [];
|
|
@@ -26,9 +36,7 @@ export const getSelectedTreeData = (items, selectedItems, selectedTreeData = [])
|
|
|
26
36
|
}))))) || [];
|
|
27
37
|
};
|
|
28
38
|
const mergeItems = deepmerge(selectedTreeData || [], items || [], {
|
|
29
|
-
arrayMerge(
|
|
30
|
-
return uniqBy([...target, ...source], 'key');
|
|
31
|
-
},
|
|
39
|
+
arrayMerge: customMergeTreeData('key'),
|
|
32
40
|
});
|
|
33
41
|
return serializeTreeData(mergeItems).concat(extendValueSelectedItems);
|
|
34
42
|
};
|