@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.
@@ -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
- disabledHours: range(0, 24).splice(4, 20),
29
- disabledMinutes: range(30, 60),
30
- disabledSeconds: [55, 56],
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, onSelectedTreeDataChange = () => { }, onApply = () => { }, onCancel = () => { }, onLoadMore = () => { }, onChangeSearch } = props, restOfProps = __rest(props, ["objectName", "loading", "showExtendValue", "items", "groupSelectProps", "renderExtraValues", "customItemRenders", "listEmptyProps", "selectedListEmptyProps", "selectedTreeData", "onSelectedTreeDataChange", "onApply", "onCancel", "onLoadMore", "onChangeSearch"]);
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: props.selectedItems })));
74
- }, [props.selectedItems]);
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
- const selectedTreeData = getSelectedTreeData(items || [], selectedItems || [], selectedTreeDataProp || []);
83
- if (!isEmpty(selectedTreeData)) {
84
- onSelectedTreeDataChange(selectedTreeData);
82
+ if (!isEmpty(selectedTreeDataProp)) {
83
+ setState(prev => (Object.assign(Object.assign({}, prev), { selectedTreeData: selectedTreeDataProp })));
85
84
  }
86
- // eslint-disable-next-line react-hooks/exhaustive-deps
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
- setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: newSelectedItems })));
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
- setState(prev => {
119
- var _a;
120
- return (Object.assign(Object.assign({}, prev), { selectedItems: (_a = prev.selectedItems) === null || _a === void 0 ? void 0 : _a.filter(selectedItem => {
121
- if (item.children) {
122
- const flattenChild = flatTree(item.children, 'children');
123
- return (selectedItem.key !== item.key &&
124
- !(flattenChild === null || flattenChild === void 0 ? void 0 : flattenChild.some(item => item.key === selectedItem.key)));
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
- setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: uniqBy([...(prev.selectedItems || []), ...flattenTreeData], 'key') })));
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
- const selectedTreeData = getSelectedTreeData(items || [], selectedItems || [], selectedTreeDataProp || []);
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), { title: renderItemNodeTitle({
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 })), height: 396 }),
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, height: 420, switcherIcon: props => (React.createElement(Icon, { type: "icon-ants-caret-down", style: {
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 = availableExtendValues.map(value => ({
312
- key: value,
313
- title: value,
314
- isExtendValue: true, // Flag to indicate that this item is an extend value
315
- }));
316
- setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: [...(selectedItems || []), ...newSelectedItems] })));
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 = () => { }, onSelectedTreeDataChange, onLoadMore } = props, restProps = __rest(props, ["placeholder", "dropdownStyle", "objectName", "selectedItems", "items", "loading", "popupClassName", "groupSelectProps", "renderExtraValues", "customItemRenders", "popoverProps", "listEmptyProps", "selectedListEmptyProps", "selectedTreeData", "onChangeSearch", "onChange", "onSelectedTreeDataChange", "onLoadMore"]);
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, onSelectedTreeDataChange: onSelectedTreeDataChange }), align: {
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' | 'onSelectedTreeDataChange'> {
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
- // Types
1
+ // Libraries
2
2
  import deepmerge from 'deepmerge';
3
3
  // Utils
4
4
  import { flatTree } from '@antscorp/antsomi-ui/es/utils';
5
- import { uniqBy } from 'lodash';
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(target, source) {
30
- return uniqBy([...target, ...source], 'key');
31
- },
39
+ arrayMerge: customMergeTreeData('key'),
32
40
  });
33
41
  return serializeTreeData(mergeItems).concat(extendValueSelectedItems);
34
42
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antscorp/antsomi-ui",
3
- "version": "1.3.5-beta.700",
3
+ "version": "1.3.5-beta.703",
4
4
  "description": "An enterprise-class UI design language and React UI library.",
5
5
  "sideEffects": [
6
6
  "dist/*",