@antscorp/antsomi-ui 2.0.8 → 2.0.10
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/MatchAnySelect/MatchesAnySelect.js +35 -25
- package/es/components/molecules/MatchAnySelect/utils.js +4 -1
- package/es/locales/en/translation.json +3 -0
- package/es/locales/i18n.d.ts +6 -0
- package/es/locales/translations.d.ts +3 -0
- package/es/locales/vi/translation.json +3 -0
- package/package.json +1 -1
|
@@ -9,13 +9,14 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
9
9
|
}
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
|
+
/* eslint-disable react/no-danger */
|
|
12
13
|
/* eslint-disable react/function-component-definition */
|
|
13
14
|
/* eslint-disable react/destructuring-assignment */
|
|
14
15
|
// Libraries
|
|
15
16
|
import { ConfigProvider } from 'antd';
|
|
16
17
|
import clsx from 'clsx';
|
|
17
18
|
import { isEmpty, uniqBy } from 'lodash';
|
|
18
|
-
import React, { useCallback,
|
|
19
|
+
import React, { useCallback, useRef, useState } from 'react';
|
|
19
20
|
// Components
|
|
20
21
|
import { Button, Flex, Icon, Input, Popover, Spin, Tooltip, Typography, } from '@antscorp/antsomi-ui/es/components/atoms';
|
|
21
22
|
import { EmptyData, PopoverSelect, Select } from '@antscorp/antsomi-ui/es/components/molecules';
|
|
@@ -34,7 +35,7 @@ import { useDeepCompareEffect, useDeepCompareMemo, useIntersectionObserver, } fr
|
|
|
34
35
|
import { flatTree, recursiveSearchItems } from '@antscorp/antsomi-ui/es/utils';
|
|
35
36
|
import { getSelectedTreeData } from './utils';
|
|
36
37
|
// Icons
|
|
37
|
-
import { DataIcon, WarningIcon } from '../../icons';
|
|
38
|
+
import { DataIcon, LongerIcon, WarningIcon } from '../../icons';
|
|
38
39
|
const initialState = {
|
|
39
40
|
isOpenPopover: false,
|
|
40
41
|
searchValue: '',
|
|
@@ -54,7 +55,7 @@ export function MatchesAny(props) {
|
|
|
54
55
|
const [state, setState] = useState(matchesAnyInitialState);
|
|
55
56
|
// Variables
|
|
56
57
|
const { selectedItems, selectedTreeData, isShowLoadMoreEl } = state;
|
|
57
|
-
const _a = listEmptyProps || {}, { icon: listEmptyIcon, description: listEmptyDescription = t(translations.
|
|
58
|
+
const _a = listEmptyProps || {}, { icon: listEmptyIcon = React.createElement(LongerIcon, null), description: listEmptyDescription = (React.createElement("div", { dangerouslySetInnerHTML: { __html: t(translations.matchesAnySelect.noData) } })) } = _a, restListEmptyProps = __rest(_a, ["icon", "description"]);
|
|
58
59
|
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"]);
|
|
59
60
|
// Refs
|
|
60
61
|
const { ref: loadMoreRef } = useIntersectionObserver({
|
|
@@ -66,6 +67,7 @@ export function MatchesAny(props) {
|
|
|
66
67
|
}
|
|
67
68
|
},
|
|
68
69
|
});
|
|
70
|
+
const searchInputRef = useRef(null);
|
|
69
71
|
// Effects
|
|
70
72
|
/**
|
|
71
73
|
* Updates the `selectedItems` state when the `selectedItems` prop changes.
|
|
@@ -73,17 +75,29 @@ export function MatchesAny(props) {
|
|
|
73
75
|
useDeepCompareEffect(() => {
|
|
74
76
|
setState(prev => (Object.assign(Object.assign({}, prev), { selectedItems: selectedItemsProp })));
|
|
75
77
|
}, [selectedItemsProp]);
|
|
76
|
-
|
|
78
|
+
useDeepCompareEffect(() => {
|
|
79
|
+
var _a;
|
|
80
|
+
(_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
77
81
|
// Delay for show load more el
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
if (!isEmpty(items)) {
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { isShowLoadMoreEl: true })));
|
|
85
|
+
}, 500);
|
|
86
|
+
}
|
|
87
|
+
}, [items]);
|
|
82
88
|
useDeepCompareEffect(() => {
|
|
89
|
+
// If `selectedTreeData` prop is not empty, update the `selectedTreeData` state directly.
|
|
83
90
|
if (!isEmpty(selectedTreeDataProp)) {
|
|
84
91
|
setState(prev => (Object.assign(Object.assign({}, prev), { selectedTreeData: selectedTreeDataProp })));
|
|
85
92
|
}
|
|
86
|
-
|
|
93
|
+
// If `selectedTreeData` prop is empty and `selectedItems` prop is not empty,
|
|
94
|
+
// calculate the `selectedTreeData` from the `selectedItems` prop and update the state.
|
|
95
|
+
else if (!isEmpty(selectedItemsProp)) {
|
|
96
|
+
const newSelectedTreeData = getSelectedTreeData(items || [], selectedItemsProp || []);
|
|
97
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { selectedTreeData: newSelectedTreeData })));
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
100
|
+
}, [selectedTreeDataProp, selectedItemsProp]);
|
|
87
101
|
// Handlers
|
|
88
102
|
const onSelectItem = (item) => {
|
|
89
103
|
let newSelectedItems = [...(selectedItems || [])];
|
|
@@ -235,7 +249,7 @@ export function MatchesAny(props) {
|
|
|
235
249
|
":"),
|
|
236
250
|
`${((_a = groupSelectProps === null || groupSelectProps === void 0 ? void 0 : groupSelectProps.selected) === null || _a === void 0 ? void 0 : _a.length) || 0} ${t(translations.global.selected)}`))),
|
|
237
251
|
React.createElement("div", { style: { width: '100%' } },
|
|
238
|
-
React.createElement(Input.CustomSearch, { value: searchValue, placeholder: `${(_b = t(translations.global.search)) === null || _b === void 0 ? void 0 : _b.toString()}...`, onAfterChange: searchValue => {
|
|
252
|
+
React.createElement(Input.CustomSearch, { ref: searchInputRef, autoFocus: true, value: searchValue, placeholder: `${(_b = t(translations.global.search)) === null || _b === void 0 ? void 0 : _b.toString()}...`, onAfterChange: searchValue => {
|
|
239
253
|
if (onChangeSearch) {
|
|
240
254
|
onChangeSearch(searchValue);
|
|
241
255
|
}
|
|
@@ -246,17 +260,15 @@ export function MatchesAny(props) {
|
|
|
246
260
|
React.createElement(Flex, { align: "center", gap: 10 },
|
|
247
261
|
renderExtraValueLabels(),
|
|
248
262
|
React.createElement(TextButton, { disabled: isDisableSelectAll, onClick: onSelectAll }, t(translations.global.selectAll).toString()))),
|
|
249
|
-
React.createElement(Spin, { spinning: loading }, (treeData === null || treeData === void 0 ? void 0 : treeData.length) > 1 ? (React.createElement(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
:
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
})), height: 396 }),
|
|
259
|
-
isShowLoadMoreEl && React.createElement("div", { ref: loadMoreRef }))) : (React.createElement(EmptyData, Object.assign({ icon: listEmptyIcon, showIcon: !!listEmptyIcon, description: listEmptyDescription }, restListEmptyProps)))))));
|
|
263
|
+
React.createElement(Spin, { spinning: loading }, (treeData === null || treeData === void 0 ? void 0 : treeData.length) > 1 ? (React.createElement(StyledTree, { key: searchValue, defaultExpandedKeys: (matchedParents === null || matchedParents === void 0 ? void 0 : matchedParents.length)
|
|
264
|
+
? matchedParents.map(item => item.key)
|
|
265
|
+
: 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: {
|
|
266
|
+
transform: props.expanded ? 'rotate(0)' : 'rotate(-90deg)',
|
|
267
|
+
transition: 'transform 0.3s ease',
|
|
268
|
+
}, color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.bw8 })), titleRender: (item) => isShowLoadMoreEl && item.isLoadMore ? (React.createElement("div", { ref: loadMoreRef })) : (renderItemNodeTitle({
|
|
269
|
+
item,
|
|
270
|
+
onSelectItem,
|
|
271
|
+
})), height: 396 })) : (React.createElement(EmptyData, Object.assign({ icon: listEmptyIcon, showIcon: !!listEmptyIcon, description: listEmptyDescription }, restListEmptyProps)))))));
|
|
260
272
|
};
|
|
261
273
|
const renderSelectedList = () => (React.createElement("div", { className: "matches-any__section" },
|
|
262
274
|
React.createElement(Flex, { className: "matches-any__header", justify: "space-between" },
|
|
@@ -313,10 +325,8 @@ export function MatchesAnySelect(props) {
|
|
|
313
325
|
: undefined;
|
|
314
326
|
// Effects
|
|
315
327
|
useDeepCompareEffect(() => {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
}
|
|
319
|
-
}, [props.searchValue, state.searchValue]);
|
|
328
|
+
setState(prev => (Object.assign(Object.assign({}, prev), { searchValue: props.searchValue || '' })));
|
|
329
|
+
}, [props.searchValue]);
|
|
320
330
|
// Handlers
|
|
321
331
|
const onApplyMatchesAny = (selectedItems, selectedTreeData) => {
|
|
322
332
|
onChange(selectedItems, selectedTreeData);
|
|
@@ -16,6 +16,9 @@ const customMergeTreeData = (key) => (target, source) => {
|
|
|
16
16
|
export const getSelectedTreeData = (items, selectedItems, selectedTreeData = []) => {
|
|
17
17
|
const notExtendValueSelectedItems = (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(item => !item.isExtendValue)) || [];
|
|
18
18
|
const extendValueSelectedItems = (selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.filter(item => item.isExtendValue)) || [];
|
|
19
|
+
const notFoundItems = !(selectedTreeData === null || selectedTreeData === void 0 ? void 0 : selectedTreeData.length)
|
|
20
|
+
? notExtendValueSelectedItems === null || notExtendValueSelectedItems === void 0 ? void 0 : notExtendValueSelectedItems.filter(item => !(items === null || items === void 0 ? void 0 : items.some(i => i.key === item.key)))
|
|
21
|
+
: [];
|
|
19
22
|
const serializeTreeData = (list) => {
|
|
20
23
|
var _a;
|
|
21
24
|
return ((_a = list
|
|
@@ -38,5 +41,5 @@ export const getSelectedTreeData = (items, selectedItems, selectedTreeData = [])
|
|
|
38
41
|
const mergeItems = deepmerge(selectedTreeData || [], items || [], {
|
|
39
42
|
arrayMerge: customMergeTreeData('key'),
|
|
40
43
|
});
|
|
41
|
-
return serializeTreeData(mergeItems).concat(extendValueSelectedItems);
|
|
44
|
+
return serializeTreeData(mergeItems).concat([...notFoundItems, ...extendValueSelectedItems]);
|
|
42
45
|
};
|
|
@@ -209,6 +209,9 @@
|
|
|
209
209
|
"addDynamicContent": "Add dynamic content"
|
|
210
210
|
}
|
|
211
211
|
},
|
|
212
|
+
"matchesAnySelect": {
|
|
213
|
+
"noData": "You don't have any value <br /> Click Extend Value to add value"
|
|
214
|
+
},
|
|
212
215
|
"linear": "Linear",
|
|
213
216
|
"radial": "Radial",
|
|
214
217
|
"gradientStyle": "Gradient Style",
|
package/es/locales/i18n.d.ts
CHANGED
|
@@ -211,6 +211,9 @@ export declare const translationsJson: {
|
|
|
211
211
|
addDynamicContent: string;
|
|
212
212
|
};
|
|
213
213
|
};
|
|
214
|
+
matchesAnySelect: {
|
|
215
|
+
noData: string;
|
|
216
|
+
};
|
|
214
217
|
linear: string;
|
|
215
218
|
radial: string;
|
|
216
219
|
gradientStyle: string;
|
|
@@ -832,6 +835,9 @@ export declare const translationsJson: {
|
|
|
832
835
|
title: string;
|
|
833
836
|
placeholder: string;
|
|
834
837
|
};
|
|
838
|
+
matchesAnySelect: {
|
|
839
|
+
noData: string;
|
|
840
|
+
};
|
|
835
841
|
leftMenu: {
|
|
836
842
|
pageTitle: {
|
|
837
843
|
recommendation: string;
|
|
@@ -146,6 +146,9 @@
|
|
|
146
146
|
"title": "Mở rộng giá trị",
|
|
147
147
|
"placeholder": "Nhập hoặc dán nhiều giá trị cách nhau bằng Enter"
|
|
148
148
|
},
|
|
149
|
+
"matchesAnySelect": {
|
|
150
|
+
"noData": "Bạn không có giá trị nào <br /> Bấm vào Extend Value để thêm giá trị"
|
|
151
|
+
},
|
|
149
152
|
"leftMenu": {
|
|
150
153
|
"pageTitle": {
|
|
151
154
|
"recommendation": "Gợi ý",
|