@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.
- package/components/Select/Select.js +1 -1
- package/components/Select/useLogic/useLogic.d.ts +1 -1
- package/components/TagsList/types.d.ts +2 -2
- package/components/TagsList/useLogic/useLogic.js +16 -10
- package/components/TagsList/utils/getKey/getKey.js +4 -4
- package/node/components/Select/Select.js +1 -1
- package/node/components/Select/useLogic/useLogic.d.ts +1 -1
- package/node/components/TagsList/types.d.ts +2 -2
- package/node/components/TagsList/useLogic/useLogic.js +16 -10
- package/node/components/TagsList/utils/getKey/getKey.js +4 -4
- package/package.json +1 -1
|
@@ -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,
|
|
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:
|
|
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
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
3
|
-
|
|
2
|
+
const isObjectOption = typeof option === 'object' && option !== null;
|
|
3
|
+
if (!isObjectOption) {
|
|
4
|
+
return String(option);
|
|
4
5
|
}
|
|
5
6
|
if (keyId) {
|
|
6
|
-
|
|
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,
|
|
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:
|
|
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
|
|
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
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
6
|
-
|
|
5
|
+
const isObjectOption = typeof option === 'object' && option !== null;
|
|
6
|
+
if (!isObjectOption) {
|
|
7
|
+
return String(option);
|
|
7
8
|
}
|
|
8
9
|
if (keyId) {
|
|
9
|
-
|
|
10
|
-
return typeof key === 'number' ? key.toString() : key;
|
|
10
|
+
return String(option[keyId]);
|
|
11
11
|
}
|
|
12
12
|
return getOptionLabel(option).toString();
|
|
13
13
|
};
|