@cloud-ru/ds-fields 1.0.8-preview-13225cc1.0 → 1.0.8-preview-4074f7f8.0
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/README.md +2 -2
- package/dist/cjs/components/FieldSelect/FieldSelect.js +23 -2
- package/dist/cjs/components/FieldSelect/types.d.ts +2 -2
- package/dist/esm/components/FieldSelect/FieldSelect.js +23 -2
- package/dist/esm/components/FieldSelect/types.d.ts +2 -2
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +13 -13
- package/src/components/FieldSelect/FieldSelect.tsx +32 -5
- package/src/components/FieldSelect/types.ts +2 -2
package/README.md
CHANGED
|
@@ -447,7 +447,7 @@ export function Select() {
|
|
|
447
447
|
| `data-test-id` | `string` | — | Тестовый id корня |
|
|
448
448
|
| `dataError` | `DroplistProps` | — | Флаг «ошибка загрузки данных» — при `true` дроплист рендерит `errorDataState` <br/> вместо списка (для асинхронной подгрузки с провалившимся запросом). |
|
|
449
449
|
| `dataFiltered` | `DroplistProps` | — | Флаг «список отфильтрован» — при `true` и пустом результате дроплист рендерит <br/> `noResultsState`. По умолчанию выводится из строки поиска (`searchable` + ввод). |
|
|
450
|
-
| `defaultValue` | `ItemId` | — | Неуправляемое значение по
|
|
450
|
+
| `defaultValue` | `ItemId` | — | Неуправляемое значение по умолчанию. Пустая строка трактуется как «значение не выбрано». <br/> Неуправляемые значения по умолчанию |
|
|
451
451
|
| `disabled` | `boolean` | — | Поле выключено <br/> Деактивировано |
|
|
452
452
|
| `enableFuzzySearch` | `boolean` | `true` | Включить нечёткий поиск: символы запроса должны встречаться в лейбле в том же порядке <br/> (например, `lge` найдёт `Large`). Если `false` — простой substring-match. |
|
|
453
453
|
| `error` | `string` | — | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
|
|
@@ -499,7 +499,7 @@ export function Select() {
|
|
|
499
499
|
| `size` | `"l"` \| `"m"` \| `"s"` | — | Размер |
|
|
500
500
|
| `untouchableScrollbars` | `boolean` | — | Отключает возможность взаимодействовать со скролбарами мышью. |
|
|
501
501
|
| `validationState` | `"default"` \| `"error"` \| `"success"` \| `"warning"` | — | Состояние валидации |
|
|
502
|
-
| `value` | `ItemId` | — | Управляемое
|
|
502
|
+
| `value` | `ItemId` | — | Управляемое значение. Пустая строка трактуется как «значение не выбрано». <br/> Управляемые значения |
|
|
503
503
|
| `virtualized` | `boolean` | — | Включить виртуализацию элементов списка. Рекомендуется при количестве элементов от 1000. |
|
|
504
504
|
| `widthStrategy` | `"auto"` \| `"eq"` \| `"gte"` | `'eq' — равна ширине триггера` | Стратегия ширины дроплиста. |
|
|
505
505
|
|
|
@@ -52,12 +52,33 @@ exports.FieldSelect = (0, react_1.forwardRef)(function FieldSelect(props, ref) {
|
|
|
52
52
|
// но «расхлябанный» вызов (например, Storybook-spread, где single-default остаётся
|
|
53
53
|
// строкой при переключении selection) не должен ронять компонент на `.map` строки.
|
|
54
54
|
multiple && Array.isArray(props.defaultValue) ? props.defaultValue : []);
|
|
55
|
-
|
|
55
|
+
// Controlled-режим «залипает»: как только потребитель прислал `value`, локальный стейт больше
|
|
56
|
+
// не читается. Иначе очистка (потребитель ставит `undefined`) откатывалась бы на устаревший
|
|
57
|
+
// локальный выбор и воскрешала прошлое значение.
|
|
58
|
+
const singleControlled = (0, react_1.useRef)(false);
|
|
59
|
+
const multipleControlled = (0, react_1.useRef)(false);
|
|
60
|
+
if (!multiple && props.value !== undefined) {
|
|
61
|
+
singleControlled.current = true;
|
|
62
|
+
}
|
|
63
|
+
if (multiple && Array.isArray(props.value)) {
|
|
64
|
+
multipleControlled.current = true;
|
|
65
|
+
}
|
|
66
|
+
const singleValue = (0, react_1.useMemo)(() => {
|
|
67
|
+
if (multiple) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const raw = singleControlled.current ? props.value : singleLocal;
|
|
71
|
+
// `''` = «значение не выбрано»: формы отдают пустое значение строкой.
|
|
72
|
+
return raw === '' ? undefined : raw;
|
|
73
|
+
}, [multiple, props.value, singleLocal]);
|
|
56
74
|
const multipleValue = (0, react_1.useMemo)(() => {
|
|
57
75
|
if (!multiple) {
|
|
58
76
|
return [];
|
|
59
77
|
}
|
|
60
|
-
|
|
78
|
+
if (multipleControlled.current) {
|
|
79
|
+
return Array.isArray(props.value) ? props.value : [];
|
|
80
|
+
}
|
|
81
|
+
return multipleLocal;
|
|
61
82
|
}, [multiple, props.value, multipleLocal]);
|
|
62
83
|
const effectiveValidationState = (0, react_1.useMemo)(() => (error ? field_decorator_1.VALIDATION_STATE.Error : validationState), [error, validationState]);
|
|
63
84
|
const allItems = (0, react_1.useMemo)(() => [...(pinTop ?? []), ...items, ...(pinBottom ?? [])], [items, pinTop, pinBottom]);
|
|
@@ -146,9 +146,9 @@ type CommonSelectProps = FieldSelectDecoratorProps & DroplistPassthrough & {
|
|
|
146
146
|
export type FieldSelectSingleProps = CommonSelectProps & {
|
|
147
147
|
/** Режим выбора. По умолчанию `'single'`. */
|
|
148
148
|
selection?: typeof SELECTION_MODE.Single;
|
|
149
|
-
/** Управляемое
|
|
149
|
+
/** Управляемое значение. Пустая строка трактуется как «значение не выбрано». */
|
|
150
150
|
value?: ItemId;
|
|
151
|
-
/** Неуправляемое значение по
|
|
151
|
+
/** Неуправляемое значение по умолчанию. Пустая строка трактуется как «значение не выбрано». */
|
|
152
152
|
defaultValue?: ItemId;
|
|
153
153
|
/** Колбек смены значения */
|
|
154
154
|
onChange?(value: ItemId | undefined): void;
|
|
@@ -46,12 +46,33 @@ export const FieldSelect = forwardRef(function FieldSelect(props, ref) {
|
|
|
46
46
|
// но «расхлябанный» вызов (например, Storybook-spread, где single-default остаётся
|
|
47
47
|
// строкой при переключении selection) не должен ронять компонент на `.map` строки.
|
|
48
48
|
multiple && Array.isArray(props.defaultValue) ? props.defaultValue : []);
|
|
49
|
-
|
|
49
|
+
// Controlled-режим «залипает»: как только потребитель прислал `value`, локальный стейт больше
|
|
50
|
+
// не читается. Иначе очистка (потребитель ставит `undefined`) откатывалась бы на устаревший
|
|
51
|
+
// локальный выбор и воскрешала прошлое значение.
|
|
52
|
+
const singleControlled = useRef(false);
|
|
53
|
+
const multipleControlled = useRef(false);
|
|
54
|
+
if (!multiple && props.value !== undefined) {
|
|
55
|
+
singleControlled.current = true;
|
|
56
|
+
}
|
|
57
|
+
if (multiple && Array.isArray(props.value)) {
|
|
58
|
+
multipleControlled.current = true;
|
|
59
|
+
}
|
|
60
|
+
const singleValue = useMemo(() => {
|
|
61
|
+
if (multiple) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const raw = singleControlled.current ? props.value : singleLocal;
|
|
65
|
+
// `''` = «значение не выбрано»: формы отдают пустое значение строкой.
|
|
66
|
+
return raw === '' ? undefined : raw;
|
|
67
|
+
}, [multiple, props.value, singleLocal]);
|
|
50
68
|
const multipleValue = useMemo(() => {
|
|
51
69
|
if (!multiple) {
|
|
52
70
|
return [];
|
|
53
71
|
}
|
|
54
|
-
|
|
72
|
+
if (multipleControlled.current) {
|
|
73
|
+
return Array.isArray(props.value) ? props.value : [];
|
|
74
|
+
}
|
|
75
|
+
return multipleLocal;
|
|
55
76
|
}, [multiple, props.value, multipleLocal]);
|
|
56
77
|
const effectiveValidationState = useMemo(() => (error ? VALIDATION_STATE.Error : validationState), [error, validationState]);
|
|
57
78
|
const allItems = useMemo(() => [...(pinTop ?? []), ...items, ...(pinBottom ?? [])], [items, pinTop, pinBottom]);
|
|
@@ -146,9 +146,9 @@ type CommonSelectProps = FieldSelectDecoratorProps & DroplistPassthrough & {
|
|
|
146
146
|
export type FieldSelectSingleProps = CommonSelectProps & {
|
|
147
147
|
/** Режим выбора. По умолчанию `'single'`. */
|
|
148
148
|
selection?: typeof SELECTION_MODE.Single;
|
|
149
|
-
/** Управляемое
|
|
149
|
+
/** Управляемое значение. Пустая строка трактуется как «значение не выбрано». */
|
|
150
150
|
value?: ItemId;
|
|
151
|
-
/** Неуправляемое значение по
|
|
151
|
+
/** Неуправляемое значение по умолчанию. Пустая строка трактуется как «значение не выбрано». */
|
|
152
152
|
defaultValue?: ItemId;
|
|
153
153
|
/** Колбек смены значения */
|
|
154
154
|
onChange?(value: ItemId | undefined): void;
|