@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.
@@ -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, useEffect, useState } from 'react';
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.global.noResultsMatchesKeyWord).toString() } = _a, restListEmptyProps = __rest(_a, ["icon", "description"]);
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
- useEffect(() => {
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
- setTimeout(() => {
79
- setState(prev => (Object.assign(Object.assign({}, prev), { isShowLoadMoreEl: true })));
80
- }, 500);
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
- }, [selectedTreeDataProp]);
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(React.Fragment, null,
250
- React.createElement(StyledTree, { key: searchValue, defaultExpandedKeys: (matchedParents === null || matchedParents === void 0 ? void 0 : matchedParents.length)
251
- ? matchedParents.map(item => item.key)
252
- : 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: {
253
- transform: props.expanded ? 'rotate(0)' : 'rotate(-90deg)',
254
- transition: 'transform 0.3s ease',
255
- }, color: globalToken === null || globalToken === void 0 ? void 0 : globalToken.bw8 })), titleRender: (item) => isShowLoadMoreEl && item.isLoadMore ? (React.createElement("div", { ref: loadMoreRef })) : (renderItemNodeTitle({
256
- item,
257
- onSelectItem,
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
- if (props.searchValue && props.searchValue !== state.searchValue) {
317
- setState(prev => (Object.assign(Object.assign({}, prev), { searchValue: props.searchValue || '' })));
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",
@@ -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;
@@ -211,6 +211,9 @@ export declare const convertLanguageJsonToObject: (json: any, objToConvertTo?: C
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;
@@ -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 ý",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antscorp/antsomi-ui",
3
- "version": "2.0.8",
3
+ "version": "2.0.10",
4
4
  "description": "An enterprise-class UI design language and React UI library.",
5
5
  "sideEffects": [
6
6
  "dist/*",