@snack-uikit/chips 0.24.3 → 0.25.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/CHANGELOG.md +16 -0
- package/README.md +28 -8
- package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.d.ts +3 -7
- package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.js +3 -4
- package/dist/cjs/components/ChipChoice/components/ChipChoiceCustom.d.ts +1 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceCustom.js +9 -9
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.d.ts +1 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.js +9 -6
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.d.ts +1 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.js +8 -6
- package/dist/cjs/components/ChipChoice/components/ChipChoiceMultiple.d.ts +1 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceMultiple.js +8 -10
- package/dist/cjs/components/ChipChoice/components/ChipChoiceSingle.d.ts +1 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceSingle.js +9 -9
- package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.d.ts +1 -1
- package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.js +9 -6
- package/dist/cjs/components/ChipChoice/constants.d.ts +1 -0
- package/dist/cjs/components/ChipChoice/constants.js +1 -0
- package/dist/cjs/components/ChipChoice/types.d.ts +7 -3
- package/dist/cjs/components/ChipChoiceRow/ChipChoiceRow.d.ts +12 -6
- package/dist/cjs/components/ChipChoiceRow/ChipChoiceRow.js +145 -24
- package/dist/cjs/components/ChipChoiceRow/components/constants.d.ts +1 -0
- package/dist/cjs/components/ChipChoiceRow/components/constants.js +1 -0
- package/dist/cjs/components/ChipChoiceRow/helpers.d.ts +5 -0
- package/dist/cjs/components/ChipChoiceRow/helpers.js +19 -0
- package/dist/cjs/components/ChipChoiceRow/index.d.ts +1 -0
- package/dist/cjs/components/ChipChoiceRow/index.js +2 -1
- package/dist/cjs/components/ChipChoiceRow/styles.module.css +21 -0
- package/dist/cjs/components/ChipChoiceRow/types.d.ts +5 -5
- package/dist/cjs/constants.d.ts +4 -1
- package/dist/cjs/constants.js +4 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.d.ts +3 -7
- package/dist/esm/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.js +2 -2
- package/dist/esm/components/ChipChoice/components/ChipChoiceCustom.d.ts +1 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceCustom.js +6 -9
- package/dist/esm/components/ChipChoice/components/ChipChoiceDate.d.ts +1 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceDate.js +6 -6
- package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.d.ts +1 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.js +5 -6
- package/dist/esm/components/ChipChoice/components/ChipChoiceMultiple.d.ts +1 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceMultiple.js +4 -7
- package/dist/esm/components/ChipChoice/components/ChipChoiceSingle.d.ts +1 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceSingle.js +5 -8
- package/dist/esm/components/ChipChoice/components/ChipChoiceTime.d.ts +1 -1
- package/dist/esm/components/ChipChoice/components/ChipChoiceTime.js +6 -6
- package/dist/esm/components/ChipChoice/constants.d.ts +1 -0
- package/dist/esm/components/ChipChoice/constants.js +1 -0
- package/dist/esm/components/ChipChoice/types.d.ts +7 -3
- package/dist/esm/components/ChipChoiceRow/ChipChoiceRow.d.ts +12 -6
- package/dist/esm/components/ChipChoiceRow/ChipChoiceRow.js +82 -13
- package/dist/esm/components/ChipChoiceRow/components/constants.d.ts +1 -0
- package/dist/esm/components/ChipChoiceRow/components/constants.js +1 -0
- package/dist/esm/components/ChipChoiceRow/helpers.d.ts +5 -0
- package/dist/esm/components/ChipChoiceRow/helpers.js +13 -0
- package/dist/esm/components/ChipChoiceRow/index.d.ts +1 -0
- package/dist/esm/components/ChipChoiceRow/index.js +1 -0
- package/dist/esm/components/ChipChoiceRow/styles.module.css +21 -0
- package/dist/esm/components/ChipChoiceRow/types.d.ts +5 -5
- package/dist/esm/constants.d.ts +4 -1
- package/dist/esm/constants.js +4 -1
- package/package.json +7 -5
- package/src/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.tsx +2 -7
- package/src/components/ChipChoice/components/ChipChoiceCustom.tsx +8 -9
- package/src/components/ChipChoice/components/ChipChoiceDate.tsx +8 -6
- package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +7 -7
- package/src/components/ChipChoice/components/ChipChoiceMultiple.tsx +6 -8
- package/src/components/ChipChoice/components/ChipChoiceSingle.tsx +7 -7
- package/src/components/ChipChoice/components/ChipChoiceTime.tsx +8 -6
- package/src/components/ChipChoice/constants.ts +1 -0
- package/src/components/ChipChoice/types.ts +7 -2
- package/src/components/ChipChoiceRow/ChipChoiceRow.tsx +203 -30
- package/src/components/ChipChoiceRow/components/constants.ts +1 -0
- package/src/components/ChipChoiceRow/helpers.ts +15 -0
- package/src/components/ChipChoiceRow/index.ts +1 -0
- package/src/components/ChipChoiceRow/styles.module.scss +25 -2
- package/src/components/ChipChoiceRow/types.ts +13 -4
- package/src/constants.ts +4 -1
|
@@ -11,6 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
14
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
14
15
|
import { Droplist } from '@snack-uikit/list';
|
|
15
16
|
import { useLocale } from '@snack-uikit/locale';
|
|
16
17
|
import { useValueControl } from '@snack-uikit/utils';
|
|
@@ -31,7 +32,7 @@ const defaultMultiValueLabelFormatter = ({ value, total, allLabel }) => {
|
|
|
31
32
|
return `${len.toString()}/${total}`;
|
|
32
33
|
};
|
|
33
34
|
export function ChipChoiceMultiple(_a) {
|
|
34
|
-
var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName,
|
|
35
|
+
var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, onClearButtonClick, autoApply = true, disableFuzzySearch = false, onApprove, onCancel, open: openProp, onOpenChange } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "onClearButtonClick", "autoApply", "disableFuzzySearch", "onApprove", "onCancel", "open", "onOpenChange"]);
|
|
35
36
|
const [value, setValue] = useValueControl({
|
|
36
37
|
value: valueProp,
|
|
37
38
|
defaultValue,
|
|
@@ -46,7 +47,7 @@ export function ChipChoiceMultiple(_a) {
|
|
|
46
47
|
}, [options]);
|
|
47
48
|
const [searchValue = '', setSearchValue] = useState('');
|
|
48
49
|
const { t } = useLocale('Chips');
|
|
49
|
-
const [open, setOpen] =
|
|
50
|
+
const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
|
|
50
51
|
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
51
52
|
const flatMapOptions = useMemo(() => Object.values(flattenOptions), [flattenOptions]);
|
|
52
53
|
const dropListSelection = useMemo(() => (autoApply ? value : deferredValue), [autoApply, deferredValue, value]);
|
|
@@ -61,10 +62,6 @@ export function ChipChoiceMultiple(_a) {
|
|
|
61
62
|
const optionSearch = useOptionSearch({ options, flatMapOptions, disableFuzzySearch });
|
|
62
63
|
const result = useMemo(() => (!searchable || valueToRender === searchValue ? options : optionSearch(searchValue)), [optionSearch, options, searchValue, searchable, valueToRender]);
|
|
63
64
|
const items = useMemo(() => transformOptionsToItems(result, contentRender), [contentRender, result]);
|
|
64
|
-
const clearValue = () => {
|
|
65
|
-
setValue([]);
|
|
66
|
-
setDeferredValue([]);
|
|
67
|
-
};
|
|
68
65
|
const chipRef = useRef(null);
|
|
69
66
|
const listRef = useRef(null);
|
|
70
67
|
const handleSelectionChange = useCallback((newValue) => {
|
|
@@ -121,5 +118,5 @@ export function ChipChoiceMultiple(_a) {
|
|
|
121
118
|
value: searchValue,
|
|
122
119
|
onChange: setSearchValue,
|
|
123
120
|
}
|
|
124
|
-
: undefined, pinBottom: renderFooter(), children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: chipRef, onClearButtonClick:
|
|
121
|
+
: undefined, pinBottom: renderFooter(), children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: chipRef, onClearButtonClick: onClearButtonClick, value: value, valueToRender: valueToRender, label: label, loading: rest.loading, size: size, onKeyDown: handleOnKeyDown() })) })));
|
|
125
122
|
}
|
|
@@ -5,4 +5,4 @@ export type ChipChoiceSingleValueFormatterProps = {
|
|
|
5
5
|
allLabel?: string;
|
|
6
6
|
};
|
|
7
7
|
export declare function defaultSingleValueFormatter({ label, allLabel }: ChipChoiceSingleValueFormatterProps): ItemId | undefined;
|
|
8
|
-
export declare function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, disableFuzzySearch, autoApply, onApprove, onCancel, ...rest }: ChipChoiceSingleProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function ChipChoiceSingle<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, disableFuzzySearch, autoApply, onApprove, onCancel, onClearButtonClick, open: openProp, onOpenChange, ...rest }: ChipChoiceSingleProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,6 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
13
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
14
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
14
15
|
import { Droplist } from '@snack-uikit/list';
|
|
15
16
|
import { useLocale } from '@snack-uikit/locale';
|
|
16
17
|
import { useValueControl } from '@snack-uikit/utils';
|
|
@@ -24,7 +25,7 @@ export function defaultSingleValueFormatter({ label, allLabel }) {
|
|
|
24
25
|
return label !== null && label !== void 0 ? label : allLabel;
|
|
25
26
|
}
|
|
26
27
|
export function ChipChoiceSingle(_a) {
|
|
27
|
-
var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, disableFuzzySearch, autoApply = true, onApprove, onCancel } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "disableFuzzySearch", "autoApply", "onApprove", "onCancel"]);
|
|
28
|
+
var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, disableFuzzySearch, autoApply = true, onApprove, onCancel, onClearButtonClick, open: openProp, onOpenChange } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "disableFuzzySearch", "autoApply", "onApprove", "onCancel", "onClearButtonClick", "open", "onOpenChange"]);
|
|
28
29
|
const [value, setValue] = useValueControl({
|
|
29
30
|
value: valueProp,
|
|
30
31
|
defaultValue,
|
|
@@ -38,7 +39,7 @@ export function ChipChoiceSingle(_a) {
|
|
|
38
39
|
return flattenOptions;
|
|
39
40
|
}, [options]);
|
|
40
41
|
const { t } = useLocale('Chips');
|
|
41
|
-
const [open, setOpen] =
|
|
42
|
+
const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
|
|
42
43
|
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
43
44
|
const flatMapOptions = useMemo(() => Object.values(flattenOptions), [flattenOptions]);
|
|
44
45
|
const dropListSelection = useMemo(() => (autoApply ? value : deferredValue), [autoApply, deferredValue, value]);
|
|
@@ -50,10 +51,6 @@ export function ChipChoiceSingle(_a) {
|
|
|
50
51
|
const optionSearch = useOptionSearch({ options, flatMapOptions, disableFuzzySearch });
|
|
51
52
|
const result = useMemo(() => (!searchable || valueToRender === searchValue ? options : optionSearch(searchValue)), [optionSearch, options, searchValue, searchable, valueToRender]);
|
|
52
53
|
const items = useMemo(() => transformOptionsToItems(result, contentRender), [contentRender, result]);
|
|
53
|
-
const clearValue = () => {
|
|
54
|
-
setValue(undefined);
|
|
55
|
-
setDeferredValue(undefined);
|
|
56
|
-
};
|
|
57
54
|
const chipRef = useRef(null);
|
|
58
55
|
const handleSelectionChange = useCallback((newValue) => {
|
|
59
56
|
var _a;
|
|
@@ -68,7 +65,7 @@ export function ChipChoiceSingle(_a) {
|
|
|
68
65
|
setDeferredValue(newValue);
|
|
69
66
|
}
|
|
70
67
|
}
|
|
71
|
-
}, [autoApply, setValue, setDeferredValue]);
|
|
68
|
+
}, [autoApply, setOpen, setValue, setDeferredValue]);
|
|
72
69
|
const handleOnCancelClick = () => {
|
|
73
70
|
onCancel && onCancel();
|
|
74
71
|
setDeferredValue(value);
|
|
@@ -109,5 +106,5 @@ export function ChipChoiceSingle(_a) {
|
|
|
109
106
|
value: searchValue,
|
|
110
107
|
onChange: setSearchValue,
|
|
111
108
|
}
|
|
112
|
-
: undefined, pinBottom: renderFooter(), children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: chipRef, onClearButtonClick:
|
|
109
|
+
: undefined, pinBottom: renderFooter(), children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: chipRef, onClearButtonClick: onClearButtonClick, value: value, valueToRender: valueToRender, label: label, loading: rest.loading, size: size, onKeyDown: handleOnKeyDown() })) })));
|
|
113
110
|
}
|
|
@@ -8,5 +8,5 @@ export type ChipChoiceTimeProps = Omit<ChipChoiceCommonProps, 'widthStrategy'> &
|
|
|
8
8
|
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
9
9
|
valueRender?(value?: TimeValue): ReactNode;
|
|
10
10
|
};
|
|
11
|
-
export declare function ChipChoiceTime({ size, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds, placement, ...rest }: ChipChoiceTimeProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function ChipChoiceTime({ size, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds, placement, onClearButtonClick, open: openProp, onOpenChange, ...rest }: ChipChoiceTimeProps): import("react/jsx-runtime").JSX.Element;
|
|
12
12
|
export {};
|
|
@@ -10,7 +10,8 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
10
10
|
return t;
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
-
import { useCallback, useMemo, useRef
|
|
13
|
+
import { useCallback, useMemo, useRef } from 'react';
|
|
14
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
14
15
|
import { TimePicker } from '@snack-uikit/calendar';
|
|
15
16
|
import { Dropdown } from '@snack-uikit/dropdown';
|
|
16
17
|
import { useLocale } from '@snack-uikit/locale';
|
|
@@ -35,15 +36,15 @@ const getStringTimeValue = (time, { showSeconds, locale }) => {
|
|
|
35
36
|
});
|
|
36
37
|
};
|
|
37
38
|
export function ChipChoiceTime(_a) {
|
|
38
|
-
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds = true, placement } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "showSeconds", "placement"]);
|
|
39
|
+
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, showSeconds = true, placement, onClearButtonClick, open: openProp, onOpenChange } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "showSeconds", "placement", "onClearButtonClick", "open", "onOpenChange"]);
|
|
39
40
|
const [selectedValue, setSelectedValue] = useValueControl({ value, defaultValue, onChange });
|
|
40
41
|
const localRef = useRef(null);
|
|
41
|
-
const [open, setOpen] =
|
|
42
|
+
const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
|
|
42
43
|
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
43
44
|
const closeDroplist = useCallback(() => {
|
|
44
45
|
setOpen(false);
|
|
45
46
|
setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
46
|
-
}, []);
|
|
47
|
+
}, [setOpen]);
|
|
47
48
|
const { t } = useLocale('Chips');
|
|
48
49
|
const valueToRender = useMemo(() => {
|
|
49
50
|
if (valueRender) {
|
|
@@ -53,12 +54,11 @@ export function ChipChoiceTime(_a) {
|
|
|
53
54
|
return t('allLabel');
|
|
54
55
|
return getStringTimeValue(selectedValue, { showSeconds, locale: DEFAULT_LOCALE });
|
|
55
56
|
}, [selectedValue, showSeconds, t, valueRender]);
|
|
56
|
-
const clearValue = () => setSelectedValue(undefined);
|
|
57
57
|
const handleChangeValue = useCallback((value) => {
|
|
58
58
|
setSelectedValue(value);
|
|
59
59
|
closeDroplist();
|
|
60
60
|
}, [closeDroplist, setSelectedValue]);
|
|
61
61
|
const navigationStartRef = useRef(null);
|
|
62
62
|
const focusNavigationStartItem = () => setTimeout(() => { var _a; return (_a = navigationStartRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
63
|
-
return (_jsx(Dropdown, { content: _jsx(TimePicker, { size: TIME_PICKER_SIZE_MAP[size], value: selectedValue, fitToContainer: false, onChangeValue: handleChangeValue, navigationStartRef: navigationStartRef, onFocusLeave: closeDroplist, showSeconds: showSeconds }), placement: placement, widthStrategy: 'auto', outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, className: dropDownClassName, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick:
|
|
63
|
+
return (_jsx(Dropdown, { content: _jsx(TimePicker, { size: TIME_PICKER_SIZE_MAP[size], value: selectedValue, fitToContainer: false, onChangeValue: handleChangeValue, navigationStartRef: navigationStartRef, onFocusLeave: closeDroplist, showSeconds: showSeconds }), placement: placement, widthStrategy: 'auto', outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, className: dropDownClassName, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: onClearButtonClick, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown(focusNavigationStartItem) })) }));
|
|
64
64
|
}
|
|
@@ -37,8 +37,8 @@ export type ChipChoiceCommonProps = WithSupportProps<Partial<BaseChipProps> & {
|
|
|
37
37
|
* @default false
|
|
38
38
|
*/
|
|
39
39
|
disableFuzzySearch?: boolean;
|
|
40
|
-
/**
|
|
41
|
-
|
|
40
|
+
/** Колбек для клика по кнопке очистки */
|
|
41
|
+
onClearButtonClick?: MouseEventHandler<HTMLButtonElement>;
|
|
42
42
|
/** Расположение выпадающего меню */
|
|
43
43
|
placement?: DropdownProps['placement'];
|
|
44
44
|
/**
|
|
@@ -50,6 +50,10 @@ export type ChipChoiceCommonProps = WithSupportProps<Partial<BaseChipProps> & {
|
|
|
50
50
|
*/
|
|
51
51
|
widthStrategy?: DropdownProps['widthStrategy'];
|
|
52
52
|
dropDownClassName?: string;
|
|
53
|
+
/** Управляет состоянием показан/не показан. */
|
|
54
|
+
open?: boolean;
|
|
55
|
+
/** Колбек отображения компонента. Срабатывает при изменении состояния open. */
|
|
56
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
53
57
|
}>;
|
|
54
58
|
export type ChipChoiceSelectCommonProps<T extends ContentRenderProps = ContentRenderProps> = ChipChoiceCommonProps & {
|
|
55
59
|
options: FilterOption<T>[];
|
|
@@ -70,7 +74,7 @@ export type ChipChoiceSelectCommonProps<T extends ContentRenderProps = ContentRe
|
|
|
70
74
|
onApprove?: () => void;
|
|
71
75
|
/** Колбек кнопки отмены */
|
|
72
76
|
onCancel?: () => void;
|
|
73
|
-
} & Pick<DroplistProps, 'selection' | 'scrollRef' | 'scrollContainerRef' | 'noDataState' | 'footer' | 'footerActiveElementsRefs' | 'dataError' | 'errorDataState' | 'dataFiltered' | 'noResultsState' | 'loading' | 'scrollToSelectedItem'>;
|
|
77
|
+
} & Pick<DroplistProps, 'selection' | 'scrollRef' | 'scrollContainerRef' | 'noDataState' | 'footer' | 'footerActiveElementsRefs' | 'dataError' | 'errorDataState' | 'dataFiltered' | 'noResultsState' | 'loading' | 'scrollToSelectedItem' | 'virtualized'>;
|
|
74
78
|
export type ChipChoiceSingleProps<T extends ContentRenderProps = ContentRenderProps> = ChipChoiceSelectCommonProps<T> & Omit<SelectionSingleState, 'mode'> & {
|
|
75
79
|
/** Массив опций */
|
|
76
80
|
options: FilterOption<T>[];
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { WithSupportProps } from '@snack-uikit/utils';
|
|
2
2
|
import { ChipChoiceProps, ChipChoiceRowSize, OmitBetter } from './types';
|
|
3
3
|
export type FiltersState = Record<string, unknown>;
|
|
4
|
-
export type ChipChoiceRowFilter = OmitBetter<ChipChoiceProps, 'onChange' | 'value' | 'size' | 'defaultValue'
|
|
4
|
+
export type ChipChoiceRowFilter = OmitBetter<ChipChoiceProps, 'onChange' | 'value' | 'size' | 'defaultValue'> & {
|
|
5
|
+
pinned?: boolean;
|
|
6
|
+
};
|
|
5
7
|
export type ChipChoiceRowProps<TState extends FiltersState> = WithSupportProps<{
|
|
6
8
|
/** Состояние фильтров */
|
|
7
9
|
value?: TState;
|
|
@@ -15,9 +17,13 @@ export type ChipChoiceRowProps<TState extends FiltersState> = WithSupportProps<{
|
|
|
15
17
|
size?: ChipChoiceRowSize;
|
|
16
18
|
/** CSS-класс */
|
|
17
19
|
className?: string;
|
|
18
|
-
/** Скрыть/показать кнопку очиски @default true */
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
|
|
20
|
+
/** Скрыть/показать кнопку очиски фильтров @default true */
|
|
21
|
+
showClearButton?: boolean;
|
|
22
|
+
/** Скрыть/показать кнопку добавления фильров @default true */
|
|
23
|
+
showAddButton?: boolean;
|
|
24
|
+
/** Состояние для видимых фильтров */
|
|
25
|
+
visibleFilters?: string[];
|
|
26
|
+
/** Коллбек на изменение видимых фильтров */
|
|
27
|
+
onVisibleFiltersChange?(value: string[]): void;
|
|
22
28
|
}>;
|
|
23
|
-
export declare function ChipChoiceRow<TState extends FiltersState>({ filters, onChange,
|
|
29
|
+
export declare function ChipChoiceRow<TState extends FiltersState>({ filters, onChange, showClearButton, showAddButton, className, value, defaultValue: defaultValueProp, size, visibleFilters: visibleFiltersProp, onVisibleFiltersChange, ...rest }: ChipChoiceRowProps<TState>): import("react/jsx-runtime").JSX.Element;
|
|
@@ -11,37 +11,106 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
};
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
13
|
import cn from 'classnames';
|
|
14
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
14
15
|
import { useUncontrolledProp } from 'uncontrollable';
|
|
15
16
|
import { ButtonFunction } from '@snack-uikit/button';
|
|
16
|
-
import {
|
|
17
|
+
import { Divider } from '@snack-uikit/divider';
|
|
18
|
+
import { CrossSVG, PlusSVG } from '@snack-uikit/icons';
|
|
19
|
+
import { Droplist } from '@snack-uikit/list';
|
|
17
20
|
import { useLocale } from '@snack-uikit/locale';
|
|
21
|
+
import { Tooltip } from '@snack-uikit/tooltip';
|
|
18
22
|
import { extractSupportProps } from '@snack-uikit/utils';
|
|
19
23
|
import { CHIP_CHOICE_ROW_IDS } from '../../constants';
|
|
20
24
|
import { ForwardedChipChoice } from './components';
|
|
21
25
|
import { CHIP_CHOICE_ROW_SIZE, MAP_ROW_SIZE_TO_BUTTON_SIZE, MAP_ROW_SIZE_TO_CHOICE_SIZE } from './constants';
|
|
22
26
|
import styles from './styles.module.css';
|
|
23
27
|
export function ChipChoiceRow(_a) {
|
|
24
|
-
var { filters, onChange,
|
|
28
|
+
var { filters, onChange, showClearButton = true, showAddButton = true, className, value, defaultValue: defaultValueProp, size = CHIP_CHOICE_ROW_SIZE.S, visibleFilters: visibleFiltersProp, onVisibleFiltersChange } = _a, rest = __rest(_a, ["filters", "onChange", "showClearButton", "showAddButton", "className", "value", "defaultValue", "size", "visibleFilters", "onVisibleFiltersChange"]);
|
|
25
29
|
const { t } = useLocale('Chips');
|
|
26
|
-
const
|
|
27
|
-
const [state, setState] = useUncontrolledProp(value,
|
|
30
|
+
const defaultValue = useMemo(() => (defaultValueProp !== null && defaultValueProp !== void 0 ? defaultValueProp : {}), [defaultValueProp]);
|
|
31
|
+
const [state, setState] = useUncontrolledProp(value, defaultValue, newState => {
|
|
28
32
|
const result = typeof newState === 'function' ? newState(state) : newState;
|
|
29
33
|
onChange === null || onChange === void 0 ? void 0 : onChange(result);
|
|
30
34
|
});
|
|
35
|
+
const [addListValue, setAddListValue] = useUncontrolledProp(visibleFiltersProp, Object.keys(state), newState => {
|
|
36
|
+
const result = typeof newState === 'function' ? newState(addListValue) : newState;
|
|
37
|
+
onVisibleFiltersChange === null || onVisibleFiltersChange === void 0 ? void 0 : onVisibleFiltersChange(result);
|
|
38
|
+
});
|
|
39
|
+
const [openedChip, setOpenedChip] = useState('');
|
|
40
|
+
const [addListOpen, setAddListOpen] = useState(false);
|
|
31
41
|
const handleChange = (fieldId, value) => {
|
|
32
42
|
setState((state) => (Object.assign(Object.assign({}, state), { [fieldId]: value })));
|
|
33
43
|
};
|
|
44
|
+
const handleChipOpen = useCallback((filterId) => (isOpen) => {
|
|
45
|
+
setOpenedChip(isOpen ? filterId : '');
|
|
46
|
+
}, []);
|
|
34
47
|
const handleFiltersClear = () => {
|
|
35
|
-
|
|
48
|
+
const defaultState = filters.reduce((res, filter) => {
|
|
49
|
+
if (filter.pinned) {
|
|
50
|
+
return Object.assign(Object.assign({}, res), { [filter.id]: defaultValue[filter.id] });
|
|
51
|
+
}
|
|
52
|
+
return res;
|
|
53
|
+
}, {});
|
|
54
|
+
setState(defaultState);
|
|
55
|
+
setAddListValue([]);
|
|
36
56
|
};
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
|
|
57
|
+
const { pinnedFilters, nonPinnedFilters } = useMemo(() => filters.reduce((res, filter) => {
|
|
58
|
+
if (filter.pinned) {
|
|
59
|
+
res.pinnedFilters.push(filter);
|
|
40
60
|
}
|
|
41
|
-
|
|
42
|
-
|
|
61
|
+
else {
|
|
62
|
+
res.nonPinnedFilters.push(filter);
|
|
43
63
|
}
|
|
44
|
-
return
|
|
45
|
-
});
|
|
46
|
-
|
|
64
|
+
return res;
|
|
65
|
+
}, { pinnedFilters: [], nonPinnedFilters: [] }), [filters]);
|
|
66
|
+
const visibleFilters = useMemo(() => addListValue.reduce((res, filterId) => {
|
|
67
|
+
const filter = nonPinnedFilters.find(filter => filter.id === filterId);
|
|
68
|
+
if (filter) {
|
|
69
|
+
res.push(filter);
|
|
70
|
+
}
|
|
71
|
+
return res;
|
|
72
|
+
}, []), [addListValue, nonPinnedFilters]);
|
|
73
|
+
const hasAnyFilter = useMemo(() => visibleFilters.length > 0 || pinnedFilters.some(filter => state[filter.id] !== defaultValue[filter.id]), [defaultValue, pinnedFilters, state, visibleFilters.length]);
|
|
74
|
+
const handleClearPinnedFilter = (filterId) => {
|
|
75
|
+
const defaultFilterValue = defaultValue[filterId];
|
|
76
|
+
if (state[filterId] === defaultFilterValue) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
return () => setState((prevState) => (Object.assign(Object.assign({}, prevState), { [filterId]: defaultFilterValue })));
|
|
80
|
+
};
|
|
81
|
+
const handleRemoveVisibleFilter = (filterId) => () => {
|
|
82
|
+
setAddListValue((prev) => prev === null || prev === void 0 ? void 0 : prev.filter(item => filterId !== item));
|
|
83
|
+
setState((prevState) => (Object.assign(Object.assign({}, prevState), { [filterId]: undefined })));
|
|
84
|
+
};
|
|
85
|
+
const addSelectorOptions = useMemo(() => nonPinnedFilters.reduce((res, filter, index) => {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
if (addListValue.includes(filter.id)) {
|
|
88
|
+
return res;
|
|
89
|
+
}
|
|
90
|
+
res.push({
|
|
91
|
+
id: filter.id,
|
|
92
|
+
content: { option: (_a = filter.label) !== null && _a !== void 0 ? _a : filter.id },
|
|
93
|
+
onClick: () => {
|
|
94
|
+
setAddListValue(function (prevValue) {
|
|
95
|
+
return [...(prevValue !== null && prevValue !== void 0 ? prevValue : []), filter.id];
|
|
96
|
+
});
|
|
97
|
+
setAddListOpen(false);
|
|
98
|
+
},
|
|
99
|
+
'data-test-id': `${CHIP_CHOICE_ROW_IDS.addButtonOption}-${(_b = filter['data-test-id']) !== null && _b !== void 0 ? _b : index}`,
|
|
100
|
+
});
|
|
101
|
+
return res;
|
|
102
|
+
}, []), [addListValue, nonPinnedFilters, setAddListValue]);
|
|
103
|
+
const canAddChips = addSelectorOptions.length > 0;
|
|
104
|
+
const addListPrevValue = useRef(addListValue);
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
const prevValue = addListPrevValue.current;
|
|
107
|
+
if (addListValue.length > prevValue.length) {
|
|
108
|
+
const newItem = addListValue.find(item => !prevValue.includes(item));
|
|
109
|
+
if (newItem) {
|
|
110
|
+
handleChipOpen(newItem)(true);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
addListPrevValue.current = addListValue;
|
|
114
|
+
}, [addListValue, handleChipOpen]);
|
|
115
|
+
return (_jsxs("div", Object.assign({ className: cn(styles.chipChoiceRow, className) }, extractSupportProps(rest), { children: [pinnedFilters.length > 0 && (_jsxs("div", { className: styles.pinnedItems, children: [pinnedFilters.map(filter => (_jsx(ForwardedChipChoice, Object.assign({}, filter, { value: state[filter.id], size: MAP_ROW_SIZE_TO_CHOICE_SIZE[size], onChange: (value) => handleChange(filter.id, value), onClearButtonClick: handleClearPinnedFilter(filter.id) }), filter.id))), _jsx(Divider, { orientation: 'vertical', className: styles.divider })] })), visibleFilters.map(filter => (_jsx(ForwardedChipChoice, Object.assign({}, filter, { value: state[filter.id], size: MAP_ROW_SIZE_TO_CHOICE_SIZE[size], onChange: (value) => handleChange(filter.id, value), onClearButtonClick: handleRemoveVisibleFilter(filter.id), open: openedChip === filter.id, onOpenChange: handleChipOpen(filter.id) }), filter.id))), _jsxs("div", { className: styles.controlWrapper, children: [showAddButton && (_jsx(Tooltip, { tip: t('addButtonDisabledTip'), open: canAddChips ? false : undefined, placement: 'bottom', "data-test-id": CHIP_CHOICE_ROW_IDS.addButtonTooltip, children: _jsx(Droplist, { open: canAddChips && addListOpen, onOpenChange: setAddListOpen, items: addSelectorOptions, triggerClassName: styles.addButtonWrapper, trigger: 'clickAndFocusVisible', children: _jsx(ButtonFunction, { disabled: !canAddChips, label: t('add'), icon: _jsx(PlusSVG, {}), iconPosition: 'before', size: MAP_ROW_SIZE_TO_BUTTON_SIZE[size], "data-test-id": CHIP_CHOICE_ROW_IDS.addButton }) }) })), showClearButton && hasAnyFilter && (_jsx(ButtonFunction, { onClick: handleFiltersClear, label: t('clear'), icon: _jsx(CrossSVG, {}), iconPosition: 'before', size: MAP_ROW_SIZE_TO_BUTTON_SIZE[size], "data-test-id": CHIP_CHOICE_ROW_IDS.clearButton }))] })] })));
|
|
47
116
|
}
|
|
@@ -3,6 +3,7 @@ export declare const MAP_CHIP_TYPE_TO_COMPONENT: {
|
|
|
3
3
|
multiple: typeof import("../../ChipChoice/components").ChipChoiceMultiple;
|
|
4
4
|
date: typeof import("../../ChipChoice/components").ChipChoiceDate;
|
|
5
5
|
"date-time": typeof import("../../ChipChoice/components").ChipChoiceDate;
|
|
6
|
+
time: typeof import("../../ChipChoice/components").ChipChoiceTime;
|
|
6
7
|
"date-range": typeof import("../../ChipChoice/components").ChipChoiceDateRange;
|
|
7
8
|
custom: typeof import("../../ChipChoice/components").ChipChoiceCustom;
|
|
8
9
|
};
|
|
@@ -5,6 +5,7 @@ export const MAP_CHIP_TYPE_TO_COMPONENT = {
|
|
|
5
5
|
[CHIP_CHOICE_TYPE.Multiple]: ChipChoice.Multiple,
|
|
6
6
|
[CHIP_CHOICE_TYPE.Date]: ChipChoice.Date,
|
|
7
7
|
[CHIP_CHOICE_TYPE.DateTime]: ChipChoice.Date,
|
|
8
|
+
[CHIP_CHOICE_TYPE.Time]: ChipChoice.Time,
|
|
8
9
|
[CHIP_CHOICE_TYPE.DateRange]: ChipChoice.DateRange,
|
|
9
10
|
[CHIP_CHOICE_TYPE.Custom]: ChipChoice.Custom,
|
|
10
11
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* функция проверки заполненности фильтра
|
|
3
|
+
* @function hasFilterBeenApplied
|
|
4
|
+
*/
|
|
5
|
+
export function hasFilterBeenApplied(filter) {
|
|
6
|
+
if (Array.isArray(filter)) {
|
|
7
|
+
return filter.length > 0 && Object.values(filter).some(Boolean);
|
|
8
|
+
}
|
|
9
|
+
if (filter && typeof filter === 'object') {
|
|
10
|
+
return Object.values(filter).some(Boolean) || filter instanceof Date;
|
|
11
|
+
}
|
|
12
|
+
return Boolean(filter);
|
|
13
|
+
}
|
|
@@ -3,4 +3,25 @@
|
|
|
3
3
|
gap:var(--space-chips-filter-row-gap, 4px);
|
|
4
4
|
display:flex;
|
|
5
5
|
flex-wrap:wrap;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.pinnedItems{
|
|
9
|
+
gap:var(--space-chips-filter-row-gap, 4px);
|
|
10
|
+
display:flex;
|
|
11
|
+
flex-wrap:wrap;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.controlWrapper{
|
|
15
|
+
gap:var(--space-chips-choice-row-control-wrapper-gap, 8px);
|
|
16
|
+
display:flex;
|
|
17
|
+
flex-wrap:nowrap;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.divider{
|
|
21
|
+
align-self:stretch;
|
|
22
|
+
height:auto;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.addButtonWrapper{
|
|
26
|
+
display:inline-flex;
|
|
6
27
|
}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { ValueOf } from '@snack-uikit/utils';
|
|
2
|
-
import { ChipChoiceCustomProps } from '../ChipChoice
|
|
3
|
-
import { ChipChoiceDateProps } from '../ChipChoice/components/ChipChoiceDate';
|
|
4
|
-
import { ChipChoiceDateRangeProps } from '../ChipChoice/components/ChipChoiceDateRange';
|
|
2
|
+
import { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, ChipChoiceMultipleProps, ChipChoiceSingleProps, ChipChoiceTimeProps } from '../ChipChoice';
|
|
5
3
|
import { CHIP_CHOICE_TYPE } from '../ChipChoice/constants';
|
|
6
|
-
import { ChipChoiceMultipleProps, ChipChoiceSingleProps } from '../ChipChoice/types';
|
|
7
4
|
import { CHIP_CHOICE_ROW_SIZE } from './constants';
|
|
8
5
|
export type ChipChoiceRowSize = ValueOf<typeof CHIP_CHOICE_ROW_SIZE>;
|
|
9
6
|
type ChipChoiceMultipleType = {
|
|
@@ -21,6 +18,9 @@ type ChipChoiceDateTimeType = {
|
|
|
21
18
|
mode: 'date-time';
|
|
22
19
|
showSeconds?: boolean;
|
|
23
20
|
};
|
|
21
|
+
type ChipChoiceTimeType = {
|
|
22
|
+
type: typeof CHIP_CHOICE_TYPE.Time;
|
|
23
|
+
} & ChipChoiceTimeProps;
|
|
24
24
|
type ChipChoiceDateRangeType = {
|
|
25
25
|
type: typeof CHIP_CHOICE_TYPE.DateRange;
|
|
26
26
|
} & ChipChoiceDateRangeProps;
|
|
@@ -29,7 +29,7 @@ type ChipChoiceCustomType = {
|
|
|
29
29
|
} & ChipChoiceCustomProps;
|
|
30
30
|
export type ChipChoiceProps = {
|
|
31
31
|
id: string;
|
|
32
|
-
} & (ChipChoiceMultipleType | ChipChoiceSingleType | ChipChoiceDateType | ChipChoiceDateTimeType | ChipChoiceDateRangeType | ChipChoiceCustomType);
|
|
32
|
+
} & (ChipChoiceMultipleType | ChipChoiceSingleType | ChipChoiceDateType | ChipChoiceDateTimeType | ChipChoiceTimeType | ChipChoiceDateRangeType | ChipChoiceCustomType);
|
|
33
33
|
export type OmitBetter<T, K extends keyof any> = T extends any ? Pick<T, Exclude<keyof T, K>> : never;
|
|
34
34
|
export type FilterValue = Parameters<ChipChoiceProps['onChange']>[number];
|
|
35
35
|
export {};
|
package/dist/esm/constants.d.ts
CHANGED
|
@@ -29,7 +29,10 @@ export declare const CHIP_CHOICE_TEST_IDS: {
|
|
|
29
29
|
approveButton: string;
|
|
30
30
|
};
|
|
31
31
|
export declare const CHIP_CHOICE_ROW_IDS: {
|
|
32
|
-
|
|
32
|
+
clearButton: string;
|
|
33
|
+
addButton: string;
|
|
34
|
+
addButtonTooltip: string;
|
|
35
|
+
addButtonOption: string;
|
|
33
36
|
};
|
|
34
37
|
export declare const CHIP_TOGGLE_TEST_IDS: {
|
|
35
38
|
input: string;
|
package/dist/esm/constants.js
CHANGED
|
@@ -29,7 +29,10 @@ export const CHIP_CHOICE_TEST_IDS = {
|
|
|
29
29
|
approveButton: 'chip-choice__approve-button',
|
|
30
30
|
};
|
|
31
31
|
export const CHIP_CHOICE_ROW_IDS = {
|
|
32
|
-
|
|
32
|
+
clearButton: 'chip-choice-row__clear-button',
|
|
33
|
+
addButton: 'chip-choice-row__add-button',
|
|
34
|
+
addButtonTooltip: 'chip-choice-row__add-button-tooltip',
|
|
35
|
+
addButtonOption: 'chip-choice-row__add-button-option',
|
|
33
36
|
};
|
|
34
37
|
export const CHIP_TOGGLE_TEST_IDS = {
|
|
35
38
|
input: 'chip-toggle__input',
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"title": "Chips",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.25.0",
|
|
8
8
|
"sideEffects": [
|
|
9
9
|
"*.css",
|
|
10
10
|
"*.woff",
|
|
@@ -36,12 +36,14 @@
|
|
|
36
36
|
"license": "Apache-2.0",
|
|
37
37
|
"scripts": {},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@snack-uikit/button": "0.19.
|
|
40
|
-
"@snack-uikit/calendar": "0.11.
|
|
39
|
+
"@snack-uikit/button": "0.19.7",
|
|
40
|
+
"@snack-uikit/calendar": "0.11.20",
|
|
41
|
+
"@snack-uikit/divider": "3.2.3",
|
|
41
42
|
"@snack-uikit/dropdown": "0.4.3",
|
|
42
43
|
"@snack-uikit/icons": "0.24.2",
|
|
43
|
-
"@snack-uikit/list": "0.24.
|
|
44
|
+
"@snack-uikit/list": "0.24.2",
|
|
44
45
|
"@snack-uikit/loaders": "0.9.1",
|
|
46
|
+
"@snack-uikit/tooltip": "0.16.0",
|
|
45
47
|
"@snack-uikit/utils": "3.7.0",
|
|
46
48
|
"classnames": "2.5.1",
|
|
47
49
|
"fuzzy-search": "3.2.1",
|
|
@@ -54,5 +56,5 @@
|
|
|
54
56
|
"peerDependencies": {
|
|
55
57
|
"@snack-uikit/locale": "*"
|
|
56
58
|
},
|
|
57
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "70bed6c518009afe4292cb9d12baf08a16700781"
|
|
58
60
|
}
|
|
@@ -13,15 +13,13 @@ import styles from './styles.module.scss';
|
|
|
13
13
|
|
|
14
14
|
export type ChipChoiceBaseProps = Pick<
|
|
15
15
|
ChipChoiceCommonProps,
|
|
16
|
-
'loading' | 'tabIndex' | '
|
|
16
|
+
'loading' | 'tabIndex' | 'onClearButtonClick' | 'disabled' | 'icon' | 'label' | 'size' | 'onClick' | 'className'
|
|
17
17
|
> & {
|
|
18
18
|
/** Отображаемое значение */
|
|
19
19
|
valueToRender?: ReactNode;
|
|
20
20
|
/** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
|
|
21
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
22
|
value?: any;
|
|
23
|
-
/** Колбек для клика по кнопке очистки */
|
|
24
|
-
onClearButtonClick?: MouseEventHandler<HTMLButtonElement>;
|
|
25
23
|
onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
|
|
26
24
|
};
|
|
27
25
|
|
|
@@ -40,7 +38,6 @@ export const ChipChoiceBase = forwardRef<HTMLDivElement, ChipChoiceBaseProps>(
|
|
|
40
38
|
tabIndex = 0,
|
|
41
39
|
onClearButtonClick,
|
|
42
40
|
onKeyDown,
|
|
43
|
-
showClearButton: showClearButtonProp = true,
|
|
44
41
|
...rest
|
|
45
42
|
},
|
|
46
43
|
ref,
|
|
@@ -51,6 +48,7 @@ export const ChipChoiceBase = forwardRef<HTMLDivElement, ChipChoiceBaseProps>(
|
|
|
51
48
|
const localRef = useRef<HTMLDivElement>(null);
|
|
52
49
|
|
|
53
50
|
const clearButtonRef = useRef<HTMLButtonElement>(null);
|
|
51
|
+
const showClearButton = Boolean(onClearButtonClick);
|
|
54
52
|
|
|
55
53
|
const [isDroplistOpened, setIsDroplistOpened] = useState(false);
|
|
56
54
|
|
|
@@ -93,8 +91,6 @@ export const ChipChoiceBase = forwardRef<HTMLDivElement, ChipChoiceBaseProps>(
|
|
|
93
91
|
}
|
|
94
92
|
};
|
|
95
93
|
|
|
96
|
-
const showClearButton = showClearButtonProp && (value instanceof Date || Boolean(value));
|
|
97
|
-
|
|
98
94
|
return (
|
|
99
95
|
<div
|
|
100
96
|
{...extractSupportProps(rest)}
|
|
@@ -104,7 +100,6 @@ export const ChipChoiceBase = forwardRef<HTMLDivElement, ChipChoiceBaseProps>(
|
|
|
104
100
|
data-size={size}
|
|
105
101
|
data-variant={variant}
|
|
106
102
|
data-loading={loading || undefined}
|
|
107
|
-
// data-test-id={testId || undefined}
|
|
108
103
|
data-disabled={(!loading && disabled) || undefined}
|
|
109
104
|
onClick={handleChipClick}
|
|
110
105
|
onKeyDown={handleChipKeyDown}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ReactNode, useCallback, useRef
|
|
1
|
+
import { ReactNode, useCallback, useRef } from 'react';
|
|
2
|
+
import { useUncontrolledProp } from 'uncontrollable';
|
|
2
3
|
|
|
3
4
|
import { Dropdown } from '@snack-uikit/dropdown';
|
|
4
5
|
import { useValueControl } from '@snack-uikit/utils';
|
|
@@ -41,6 +42,9 @@ export function ChipChoiceCustom({
|
|
|
41
42
|
widthStrategy = 'gte',
|
|
42
43
|
content,
|
|
43
44
|
valueRender,
|
|
45
|
+
onClearButtonClick,
|
|
46
|
+
open: openProp,
|
|
47
|
+
onOpenChange,
|
|
44
48
|
...rest
|
|
45
49
|
}: ChipChoiceCustomProps) {
|
|
46
50
|
const localRef = useRef<HTMLDivElement>(null);
|
|
@@ -50,18 +54,13 @@ export function ChipChoiceCustom({
|
|
|
50
54
|
onChange: onChangeProp,
|
|
51
55
|
});
|
|
52
56
|
|
|
53
|
-
const [open, setOpen] =
|
|
57
|
+
const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
|
|
54
58
|
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
55
59
|
|
|
56
60
|
const closeDroplist = useCallback(() => {
|
|
57
61
|
setOpen(false);
|
|
58
62
|
setTimeout(() => localRef.current?.focus(), 0);
|
|
59
|
-
}, []);
|
|
60
|
-
|
|
61
|
-
const clearValue = () => {
|
|
62
|
-
setValue?.(undefined);
|
|
63
|
-
closeDroplist();
|
|
64
|
-
};
|
|
63
|
+
}, [setOpen]);
|
|
65
64
|
|
|
66
65
|
return (
|
|
67
66
|
<Dropdown
|
|
@@ -78,7 +77,7 @@ export function ChipChoiceCustom({
|
|
|
78
77
|
<ChipChoiceBase
|
|
79
78
|
{...rest}
|
|
80
79
|
valueToRender={valueRender?.(value) ?? value}
|
|
81
|
-
onClearButtonClick={
|
|
80
|
+
onClearButtonClick={onClearButtonClick}
|
|
82
81
|
ref={localRef}
|
|
83
82
|
value={value}
|
|
84
83
|
size={size}
|