@astral/ui 4.87.0 → 4.87.1

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.
@@ -34,7 +34,7 @@ const SelectInner = ({ required, getOptionLabel, placeholder, helperText, hideHe
34
34
  const renderValue = (selectedOptions) => {
35
35
  // Массив с выбранными опциями
36
36
  if (Array.isArray(selectedOptions) && selectedOptions.length) {
37
- return (_jsx(TagsList, { data: selectedOptions, keyId: "value", getOptionLabel: getOptionLabel || ((optionLabel) => optionLabel), onChange: handleChangeArrayValue, onClick: openSelect }));
37
+ return (_jsx(TagsList, { data: selectedOptions, getOptionLabel: getOptionLabel || ((optionLabel) => optionLabel), onChange: handleChangeArrayValue, onClick: openSelect }));
38
38
  }
39
39
  // Пустой массив или пустая строка
40
40
  if ((Array.isArray(selectedOptions) || typeof selectedOptions === 'string') &&
@@ -13,7 +13,7 @@ export declare const useLogic: <TValue>({ value, onChange, children, open: exter
13
13
  isSelectedAll: boolean | undefined;
14
14
  isIndeterminate: boolean | undefined;
15
15
  optionsLength: number | null;
16
- handleChangeArrayValue: (inputValue: TValue[] | undefined) => void | undefined;
16
+ handleChangeArrayValue: (inputValue: unknown[] | undefined) => void | undefined;
17
17
  selectAllClassName: string | undefined;
18
18
  findMenuItemsLabel: (nodes: ReactNode, selectedValue: TValue) => ReactNode;
19
19
  isShowingPlaceholder: boolean;
@@ -1,5 +1,5 @@
1
1
  import { type MouseEvent, type RefObject } from 'react';
2
- export type TagValue = string | Record<string, unknown>;
2
+ export type TagValue = string | number | Record<string, unknown>;
3
3
  export type TagsListProps<TData extends TagValue = TagValue> = {
4
4
  /**
5
5
  * Название класса, применяется к корневому компоненту
@@ -17,7 +17,7 @@ export type TagsListProps<TData extends TagValue = TagValue> = {
17
17
  * Поле, используемое в качестве ключа списка.
18
18
  * Если не передано, для генерации ключа будет использоваться getOptionLabel
19
19
  */
20
- keyId?: TData extends string ? never : keyof TData;
20
+ keyId?: TData extends object ? keyof TData : never;
21
21
  /**
22
22
  * Используется для определения строкового значения опции
23
23
  */
@@ -79,19 +79,25 @@ export const useLogic = ({ data = [], keyId, getOptionLabel, onChange, inputCont
79
79
  resizeObserver.disconnect();
80
80
  };
81
81
  }, [data]);
82
+ /**
83
+ * Возвращает значение, по которому определяется идентичность тегов.
84
+ * Для примитивов сравнение идет по самому значению, keyId применим только к объектам
85
+ */
86
+ const getComparableValue = (option) => {
87
+ if (typeof option !== 'object' || option === null) {
88
+ return option;
89
+ }
90
+ if (keyId) {
91
+ return option[keyId];
92
+ }
93
+ return getOptionLabel(option);
94
+ };
82
95
  const getTagProps = (option) => {
83
96
  const label = getOptionLabel(option);
84
97
  const onDelete = () => {
85
- const newValue = data.filter((value) => {
86
- if (typeof value === 'string') {
87
- return value !== option;
88
- }
89
- if (keyId) {
90
- return value[keyId] !== option[keyId];
91
- }
92
- return getOptionLabel(value) !== getOptionLabel(option);
93
- });
94
- onChange(newValue.length ? newValue : []);
98
+ const deletedValue = getComparableValue(option);
99
+ const newValue = data.filter((value) => getComparableValue(value) !== deletedValue);
100
+ onChange(newValue);
95
101
  };
96
102
  return { label, shrinks: false, onDelete };
97
103
  };
@@ -1,10 +1,10 @@
1
1
  export const getKey = (option, keyId, getOptionLabel) => {
2
- if (typeof option === 'string') {
3
- return option;
2
+ const isObjectOption = typeof option === 'object' && option !== null;
3
+ if (!isObjectOption) {
4
+ return String(option);
4
5
  }
5
6
  if (keyId) {
6
- const key = option[keyId];
7
- return typeof key === 'number' ? key.toString() : key;
7
+ return String(option[keyId]);
8
8
  }
9
9
  return getOptionLabel(option).toString();
10
10
  };
@@ -40,7 +40,7 @@ const SelectInner = ({ required, getOptionLabel, placeholder, helperText, hideHe
40
40
  const renderValue = (selectedOptions) => {
41
41
  // Массив с выбранными опциями
42
42
  if (Array.isArray(selectedOptions) && selectedOptions.length) {
43
- return ((0, jsx_runtime_1.jsx)(TagsList_1.TagsList, { data: selectedOptions, keyId: "value", getOptionLabel: getOptionLabel || ((optionLabel) => optionLabel), onChange: handleChangeArrayValue, onClick: openSelect }));
43
+ return ((0, jsx_runtime_1.jsx)(TagsList_1.TagsList, { data: selectedOptions, getOptionLabel: getOptionLabel || ((optionLabel) => optionLabel), onChange: handleChangeArrayValue, onClick: openSelect }));
44
44
  }
45
45
  // Пустой массив или пустая строка
46
46
  if ((Array.isArray(selectedOptions) || typeof selectedOptions === 'string') &&
@@ -13,7 +13,7 @@ export declare const useLogic: <TValue>({ value, onChange, children, open: exter
13
13
  isSelectedAll: boolean | undefined;
14
14
  isIndeterminate: boolean | undefined;
15
15
  optionsLength: number | null;
16
- handleChangeArrayValue: (inputValue: TValue[] | undefined) => void | undefined;
16
+ handleChangeArrayValue: (inputValue: unknown[] | undefined) => void | undefined;
17
17
  selectAllClassName: string | undefined;
18
18
  findMenuItemsLabel: (nodes: ReactNode, selectedValue: TValue) => ReactNode;
19
19
  isShowingPlaceholder: boolean;
@@ -1,5 +1,5 @@
1
1
  import { type MouseEvent, type RefObject } from 'react';
2
- export type TagValue = string | Record<string, unknown>;
2
+ export type TagValue = string | number | Record<string, unknown>;
3
3
  export type TagsListProps<TData extends TagValue = TagValue> = {
4
4
  /**
5
5
  * Название класса, применяется к корневому компоненту
@@ -17,7 +17,7 @@ export type TagsListProps<TData extends TagValue = TagValue> = {
17
17
  * Поле, используемое в качестве ключа списка.
18
18
  * Если не передано, для генерации ключа будет использоваться getOptionLabel
19
19
  */
20
- keyId?: TData extends string ? never : keyof TData;
20
+ keyId?: TData extends object ? keyof TData : never;
21
21
  /**
22
22
  * Используется для определения строкового значения опции
23
23
  */
@@ -82,19 +82,25 @@ const useLogic = ({ data = [], keyId, getOptionLabel, onChange, inputContainerRe
82
82
  resizeObserver.disconnect();
83
83
  };
84
84
  }, [data]);
85
+ /**
86
+ * Возвращает значение, по которому определяется идентичность тегов.
87
+ * Для примитивов сравнение идет по самому значению, keyId применим только к объектам
88
+ */
89
+ const getComparableValue = (option) => {
90
+ if (typeof option !== 'object' || option === null) {
91
+ return option;
92
+ }
93
+ if (keyId) {
94
+ return option[keyId];
95
+ }
96
+ return getOptionLabel(option);
97
+ };
85
98
  const getTagProps = (option) => {
86
99
  const label = getOptionLabel(option);
87
100
  const onDelete = () => {
88
- const newValue = data.filter((value) => {
89
- if (typeof value === 'string') {
90
- return value !== option;
91
- }
92
- if (keyId) {
93
- return value[keyId] !== option[keyId];
94
- }
95
- return getOptionLabel(value) !== getOptionLabel(option);
96
- });
97
- onChange(newValue.length ? newValue : []);
101
+ const deletedValue = getComparableValue(option);
102
+ const newValue = data.filter((value) => getComparableValue(value) !== deletedValue);
103
+ onChange(newValue);
98
104
  };
99
105
  return { label, shrinks: false, onDelete };
100
106
  };
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getKey = void 0;
4
4
  const getKey = (option, keyId, getOptionLabel) => {
5
- if (typeof option === 'string') {
6
- return option;
5
+ const isObjectOption = typeof option === 'object' && option !== null;
6
+ if (!isObjectOption) {
7
+ return String(option);
7
8
  }
8
9
  if (keyId) {
9
- const key = option[keyId];
10
- return typeof key === 'number' ? key.toString() : key;
10
+ return String(option[keyId]);
11
11
  }
12
12
  return getOptionLabel(option).toString();
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/ui",
3
- "version": "4.87.0",
3
+ "version": "4.87.1",
4
4
  "browser": "./index.js",
5
5
  "main": "./node/index.js",
6
6
  "dependencies": {