@snack-uikit/chips 0.24.1 → 0.24.2-preview-08c7f775.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.
Files changed (76) hide show
  1. package/README.md +28 -8
  2. package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.d.ts +3 -7
  3. package/dist/cjs/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.js +3 -4
  4. package/dist/cjs/components/ChipChoice/components/ChipChoiceCustom.d.ts +1 -1
  5. package/dist/cjs/components/ChipChoice/components/ChipChoiceCustom.js +9 -9
  6. package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.d.ts +1 -1
  7. package/dist/cjs/components/ChipChoice/components/ChipChoiceDate.js +9 -6
  8. package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.d.ts +1 -1
  9. package/dist/cjs/components/ChipChoice/components/ChipChoiceDateRange.js +8 -6
  10. package/dist/cjs/components/ChipChoice/components/ChipChoiceMultiple.d.ts +1 -1
  11. package/dist/cjs/components/ChipChoice/components/ChipChoiceMultiple.js +8 -10
  12. package/dist/cjs/components/ChipChoice/components/ChipChoiceSingle.d.ts +1 -1
  13. package/dist/cjs/components/ChipChoice/components/ChipChoiceSingle.js +9 -9
  14. package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.d.ts +1 -1
  15. package/dist/cjs/components/ChipChoice/components/ChipChoiceTime.js +9 -6
  16. package/dist/cjs/components/ChipChoice/constants.d.ts +1 -0
  17. package/dist/cjs/components/ChipChoice/constants.js +1 -0
  18. package/dist/cjs/components/ChipChoice/types.d.ts +7 -3
  19. package/dist/cjs/components/ChipChoiceRow/ChipChoiceRow.d.ts +12 -6
  20. package/dist/cjs/components/ChipChoiceRow/ChipChoiceRow.js +123 -24
  21. package/dist/cjs/components/ChipChoiceRow/components/constants.d.ts +1 -0
  22. package/dist/cjs/components/ChipChoiceRow/components/constants.js +1 -0
  23. package/dist/cjs/components/ChipChoiceRow/helpers.d.ts +5 -0
  24. package/dist/cjs/components/ChipChoiceRow/helpers.js +19 -0
  25. package/dist/cjs/components/ChipChoiceRow/index.d.ts +1 -0
  26. package/dist/cjs/components/ChipChoiceRow/index.js +2 -1
  27. package/dist/cjs/components/ChipChoiceRow/styles.module.css +21 -0
  28. package/dist/cjs/components/ChipChoiceRow/types.d.ts +5 -5
  29. package/dist/cjs/constants.d.ts +4 -1
  30. package/dist/cjs/constants.js +4 -1
  31. package/dist/esm/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.d.ts +3 -7
  32. package/dist/esm/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.js +2 -2
  33. package/dist/esm/components/ChipChoice/components/ChipChoiceCustom.d.ts +1 -1
  34. package/dist/esm/components/ChipChoice/components/ChipChoiceCustom.js +6 -9
  35. package/dist/esm/components/ChipChoice/components/ChipChoiceDate.d.ts +1 -1
  36. package/dist/esm/components/ChipChoice/components/ChipChoiceDate.js +6 -6
  37. package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.d.ts +1 -1
  38. package/dist/esm/components/ChipChoice/components/ChipChoiceDateRange.js +5 -6
  39. package/dist/esm/components/ChipChoice/components/ChipChoiceMultiple.d.ts +1 -1
  40. package/dist/esm/components/ChipChoice/components/ChipChoiceMultiple.js +4 -7
  41. package/dist/esm/components/ChipChoice/components/ChipChoiceSingle.d.ts +1 -1
  42. package/dist/esm/components/ChipChoice/components/ChipChoiceSingle.js +5 -8
  43. package/dist/esm/components/ChipChoice/components/ChipChoiceTime.d.ts +1 -1
  44. package/dist/esm/components/ChipChoice/components/ChipChoiceTime.js +6 -6
  45. package/dist/esm/components/ChipChoice/constants.d.ts +1 -0
  46. package/dist/esm/components/ChipChoice/constants.js +1 -0
  47. package/dist/esm/components/ChipChoice/types.d.ts +7 -3
  48. package/dist/esm/components/ChipChoiceRow/ChipChoiceRow.d.ts +12 -6
  49. package/dist/esm/components/ChipChoiceRow/ChipChoiceRow.js +69 -13
  50. package/dist/esm/components/ChipChoiceRow/components/constants.d.ts +1 -0
  51. package/dist/esm/components/ChipChoiceRow/components/constants.js +1 -0
  52. package/dist/esm/components/ChipChoiceRow/helpers.d.ts +5 -0
  53. package/dist/esm/components/ChipChoiceRow/helpers.js +13 -0
  54. package/dist/esm/components/ChipChoiceRow/index.d.ts +1 -0
  55. package/dist/esm/components/ChipChoiceRow/index.js +1 -0
  56. package/dist/esm/components/ChipChoiceRow/styles.module.css +21 -0
  57. package/dist/esm/components/ChipChoiceRow/types.d.ts +5 -5
  58. package/dist/esm/constants.d.ts +4 -1
  59. package/dist/esm/constants.js +4 -1
  60. package/package.json +7 -5
  61. package/src/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.tsx +2 -7
  62. package/src/components/ChipChoice/components/ChipChoiceCustom.tsx +8 -9
  63. package/src/components/ChipChoice/components/ChipChoiceDate.tsx +8 -6
  64. package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +7 -7
  65. package/src/components/ChipChoice/components/ChipChoiceMultiple.tsx +6 -8
  66. package/src/components/ChipChoice/components/ChipChoiceSingle.tsx +7 -7
  67. package/src/components/ChipChoice/components/ChipChoiceTime.tsx +8 -6
  68. package/src/components/ChipChoice/constants.ts +1 -0
  69. package/src/components/ChipChoice/types.ts +7 -2
  70. package/src/components/ChipChoiceRow/ChipChoiceRow.tsx +174 -30
  71. package/src/components/ChipChoiceRow/components/constants.ts +1 -0
  72. package/src/components/ChipChoiceRow/helpers.ts +15 -0
  73. package/src/components/ChipChoiceRow/index.ts +1 -0
  74. package/src/components/ChipChoiceRow/styles.module.scss +27 -2
  75. package/src/components/ChipChoiceRow/types.ts +13 -4
  76. package/src/constants.ts +4 -1
@@ -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
- showClearAllButton?: boolean;
20
- /** Текст кнопки очистки @default 'Clear all' */
21
- clearAllButtonLabel?: string;
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, showClearAllButton, clearAllButtonLabel: clearAllButtonLabelProp, className, value, defaultValue, size, ...rest }: ChipChoiceRowProps<TState>): import("react/jsx-runtime").JSX.Element;
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;
@@ -19,10 +19,14 @@ Object.defineProperty(exports, "__esModule", {
19
19
  exports.ChipChoiceRow = ChipChoiceRow;
20
20
  const jsx_runtime_1 = require("react/jsx-runtime");
21
21
  const classnames_1 = __importDefault(require("classnames"));
22
+ const react_1 = require("react");
22
23
  const uncontrollable_1 = require("uncontrollable");
23
24
  const button_1 = require("@snack-uikit/button");
25
+ const divider_1 = require("@snack-uikit/divider");
24
26
  const icons_1 = require("@snack-uikit/icons");
27
+ const list_1 = require("@snack-uikit/list");
25
28
  const locale_1 = require("@snack-uikit/locale");
29
+ const tooltip_1 = require("@snack-uikit/tooltip");
26
30
  const utils_1 = require("@snack-uikit/utils");
27
31
  const constants_1 = require("../../constants");
28
32
  const components_1 = require("./components");
@@ -32,53 +36,148 @@ function ChipChoiceRow(_a) {
32
36
  var {
33
37
  filters,
34
38
  onChange,
35
- showClearAllButton = true,
36
- clearAllButtonLabel: clearAllButtonLabelProp,
39
+ showClearButton = true,
40
+ showAddButton = true,
37
41
  className,
38
42
  value,
39
- defaultValue,
40
- size = constants_2.CHIP_CHOICE_ROW_SIZE.S
43
+ defaultValue: defaultValueProp,
44
+ size = constants_2.CHIP_CHOICE_ROW_SIZE.S,
45
+ visibleFilters: visibleFiltersProp,
46
+ onVisibleFiltersChange
41
47
  } = _a,
42
- rest = __rest(_a, ["filters", "onChange", "showClearAllButton", "clearAllButtonLabel", "className", "value", "defaultValue", "size"]);
48
+ rest = __rest(_a, ["filters", "onChange", "showClearButton", "showAddButton", "className", "value", "defaultValue", "size", "visibleFilters", "onVisibleFiltersChange"]);
43
49
  const {
44
50
  t
45
51
  } = (0, locale_1.useLocale)('Chips');
46
- const clearAllButtonLabel = clearAllButtonLabelProp !== null && clearAllButtonLabelProp !== void 0 ? clearAllButtonLabelProp : t('clearAllButton');
47
- const [state, setState] = (0, uncontrollable_1.useUncontrolledProp)(value, defaultValue !== null && defaultValue !== void 0 ? defaultValue : {}, newState => {
52
+ const defaultValue = (0, react_1.useMemo)(() => defaultValueProp !== null && defaultValueProp !== void 0 ? defaultValueProp : {}, [defaultValueProp]);
53
+ const [state, setState] = (0, uncontrollable_1.useUncontrolledProp)(value, defaultValue, newState => {
48
54
  const result = typeof newState === 'function' ? newState(state) : newState;
49
55
  onChange === null || onChange === void 0 ? void 0 : onChange(result);
50
56
  });
57
+ const [addListValue, setAddListValue] = (0, uncontrollable_1.useUncontrolledProp)(visibleFiltersProp, Object.keys(state), newState => {
58
+ const result = typeof newState === 'function' ? newState(addListValue) : newState;
59
+ onVisibleFiltersChange === null || onVisibleFiltersChange === void 0 ? void 0 : onVisibleFiltersChange(result);
60
+ });
61
+ const [openedChip, setOpenedChip] = (0, react_1.useState)('');
62
+ const [addListOpen, setAddListOpen] = (0, react_1.useState)(false);
51
63
  const handleChange = (fieldId, value) => {
52
64
  setState(state => Object.assign(Object.assign({}, state), {
53
65
  [fieldId]: value
54
66
  }));
55
67
  };
68
+ const handleChipOpen = (0, react_1.useCallback)(filterId => isOpen => {
69
+ setOpenedChip(isOpen ? filterId : '');
70
+ }, []);
56
71
  const handleFiltersClear = () => {
57
- setState({});
72
+ const defaultState = filters.reduce((res, filter) => {
73
+ if (filter.pinned) {
74
+ return Object.assign(Object.assign({}, res), {
75
+ [filter.id]: defaultValue[filter.id]
76
+ });
77
+ }
78
+ return res;
79
+ }, {});
80
+ setState(defaultState);
81
+ setAddListValue([]);
58
82
  };
59
- const hasAnyFilter = Object.values(state).some(filter => {
60
- if (Array.isArray(filter)) {
61
- return filter.length > 0 && Object.values(filter).some(Boolean);
83
+ const pinnedFilters = (0, react_1.useMemo)(() => filters.filter(filter => filter.pinned), [filters]);
84
+ const nonPinnedFilters = (0, react_1.useMemo)(() => filters.filter(filter => !filter.pinned), [filters]);
85
+ const visibleFilters = (0, react_1.useMemo)(() => addListValue.map(filterId => nonPinnedFilters.find(filter => filter.id === filterId)).filter(item => Boolean(item)), [addListValue, nonPinnedFilters]);
86
+ const hasAnyFilter = (0, react_1.useMemo)(() => visibleFilters.length > 0 || pinnedFilters.some(filter => state[filter.id] !== defaultValue[filter.id]), [defaultValue, pinnedFilters, state, visibleFilters.length]);
87
+ const handleClearPinnedFilter = filterId => {
88
+ const defaultFilterValue = defaultValue[filterId];
89
+ if (state[filterId] === defaultFilterValue) {
90
+ return;
62
91
  }
63
- if (filter && typeof filter === 'object') {
64
- return Object.values(filter).some(Boolean) || filter instanceof Date;
92
+ return () => setState(prevState => Object.assign(Object.assign({}, prevState), {
93
+ [filterId]: defaultFilterValue
94
+ }));
95
+ };
96
+ const handleRemoveVisibleFilter = filterId => () => {
97
+ setAddListValue(prev => prev === null || prev === void 0 ? void 0 : prev.filter(item => filterId !== item));
98
+ setState(prevState => Object.assign(Object.assign({}, prevState), {
99
+ [filterId]: undefined
100
+ }));
101
+ };
102
+ const addSelectorOptions = (0, react_1.useMemo)(() => nonPinnedFilters.filter(filter => !addListValue.includes(filter.id)).map((filter, index) => {
103
+ var _a, _b;
104
+ return {
105
+ id: filter.id,
106
+ content: {
107
+ option: (_a = filter.label) !== null && _a !== void 0 ? _a : filter.id
108
+ },
109
+ onClick: () => {
110
+ setAddListValue(function (prevValue) {
111
+ return [...(prevValue !== null && prevValue !== void 0 ? prevValue : []), filter.id];
112
+ });
113
+ setAddListOpen(false);
114
+ },
115
+ 'data-test-id': `${constants_1.CHIP_CHOICE_ROW_IDS.addButtonOption}-${(_b = filter['data-test-id']) !== null && _b !== void 0 ? _b : index}`
116
+ };
117
+ }), [addListValue, nonPinnedFilters, setAddListValue]);
118
+ const canAddChips = addSelectorOptions.length > 0;
119
+ const addListPrevValue = (0, react_1.useRef)(addListValue);
120
+ (0, react_1.useEffect)(() => {
121
+ const prevValue = addListPrevValue.current;
122
+ if (addListValue.length > prevValue.length) {
123
+ const newItem = addListValue.find(item => !prevValue.includes(item));
124
+ if (newItem) {
125
+ handleChipOpen(newItem)(true);
126
+ }
65
127
  }
66
- return Boolean(filter);
67
- });
128
+ addListPrevValue.current = addListValue;
129
+ }, [addListValue, handleChipOpen]);
68
130
  return (0, jsx_runtime_1.jsxs)("div", Object.assign({
69
131
  className: (0, classnames_1.default)(styles_module_scss_1.default.chipChoiceRow, className)
70
132
  }, (0, utils_1.extractSupportProps)(rest), {
71
- children: [filters.map(filter => (0, jsx_runtime_1.jsx)(components_1.ForwardedChipChoice, Object.assign({}, filter, {
133
+ children: [pinnedFilters.length > 0 && (0, jsx_runtime_1.jsxs)("div", {
134
+ className: styles_module_scss_1.default.pinnedItems,
135
+ children: [pinnedFilters.map(filter => (0, jsx_runtime_1.jsx)(components_1.ForwardedChipChoice, Object.assign({}, filter, {
136
+ value: state[filter.id],
137
+ size: constants_2.MAP_ROW_SIZE_TO_CHOICE_SIZE[size],
138
+ onChange: value => handleChange(filter.id, value),
139
+ onClearButtonClick: handleClearPinnedFilter(filter.id)
140
+ }), filter.id)), (0, jsx_runtime_1.jsx)(divider_1.Divider, {
141
+ orientation: 'vertical',
142
+ className: styles_module_scss_1.default.divider
143
+ })]
144
+ }), visibleFilters.map(filter => (0, jsx_runtime_1.jsx)(components_1.ForwardedChipChoice, Object.assign({}, filter, {
72
145
  value: state[filter.id],
73
146
  size: constants_2.MAP_ROW_SIZE_TO_CHOICE_SIZE[size],
74
- onChange: value => handleChange(filter.id, value)
75
- }), filter.id)), showClearAllButton && hasAnyFilter && (0, jsx_runtime_1.jsx)(button_1.ButtonFunction, {
76
- onClick: handleFiltersClear,
77
- label: clearAllButtonLabel,
78
- icon: (0, jsx_runtime_1.jsx)(icons_1.CrossSVG, {}),
79
- iconPosition: 'before',
80
- size: constants_2.MAP_ROW_SIZE_TO_BUTTON_SIZE[size],
81
- "data-test-id": constants_1.CHIP_CHOICE_ROW_IDS.clearAllButton
147
+ onChange: value => handleChange(filter.id, value),
148
+ onClearButtonClick: handleRemoveVisibleFilter(filter.id),
149
+ open: openedChip === filter.id,
150
+ onOpenChange: handleChipOpen(filter.id)
151
+ }), filter.id)), (0, jsx_runtime_1.jsxs)("div", {
152
+ className: styles_module_scss_1.default.controlWrapper,
153
+ children: [showAddButton && (0, jsx_runtime_1.jsx)(tooltip_1.Tooltip, {
154
+ tip: t('addButtonDisabledTip'),
155
+ open: canAddChips ? false : undefined,
156
+ placement: 'bottom',
157
+ "data-test-id": constants_1.CHIP_CHOICE_ROW_IDS.addButtonTooltip,
158
+ children: (0, jsx_runtime_1.jsx)(list_1.Droplist, {
159
+ open: canAddChips && addListOpen,
160
+ onOpenChange: setAddListOpen,
161
+ items: addSelectorOptions,
162
+ triggerClassName: styles_module_scss_1.default.addButtonWrapper,
163
+ trigger: 'clickAndFocusVisible',
164
+ children: (0, jsx_runtime_1.jsx)(button_1.ButtonFunction, {
165
+ disabled: !canAddChips,
166
+ label: t('add'),
167
+ icon: (0, jsx_runtime_1.jsx)(icons_1.PlusSVG, {}),
168
+ iconPosition: 'before',
169
+ size: constants_2.MAP_ROW_SIZE_TO_BUTTON_SIZE[size],
170
+ "data-test-id": constants_1.CHIP_CHOICE_ROW_IDS.addButton
171
+ })
172
+ })
173
+ }), showClearButton && hasAnyFilter && (0, jsx_runtime_1.jsx)(button_1.ButtonFunction, {
174
+ onClick: handleFiltersClear,
175
+ label: t('clear'),
176
+ icon: (0, jsx_runtime_1.jsx)(icons_1.CrossSVG, {}),
177
+ iconPosition: 'before',
178
+ size: constants_2.MAP_ROW_SIZE_TO_BUTTON_SIZE[size],
179
+ "data-test-id": constants_1.CHIP_CHOICE_ROW_IDS.clearButton
180
+ })]
82
181
  })]
83
182
  }));
84
183
  }
@@ -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
  };
@@ -11,6 +11,7 @@ exports.MAP_CHIP_TYPE_TO_COMPONENT = {
11
11
  [constants_1.CHIP_CHOICE_TYPE.Multiple]: ChipChoice_1.ChipChoice.Multiple,
12
12
  [constants_1.CHIP_CHOICE_TYPE.Date]: ChipChoice_1.ChipChoice.Date,
13
13
  [constants_1.CHIP_CHOICE_TYPE.DateTime]: ChipChoice_1.ChipChoice.Date,
14
+ [constants_1.CHIP_CHOICE_TYPE.Time]: ChipChoice_1.ChipChoice.Time,
14
15
  [constants_1.CHIP_CHOICE_TYPE.DateRange]: ChipChoice_1.ChipChoice.DateRange,
15
16
  [constants_1.CHIP_CHOICE_TYPE.Custom]: ChipChoice_1.ChipChoice.Custom
16
17
  };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * функция проверки заполненности фильтра
3
+ * @function hasFilterBeenApplied
4
+ */
5
+ export declare function hasFilterBeenApplied(filter: unknown): boolean;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.hasFilterBeenApplied = hasFilterBeenApplied;
7
+ /**
8
+ * функция проверки заполненности фильтра
9
+ * @function hasFilterBeenApplied
10
+ */
11
+ function hasFilterBeenApplied(filter) {
12
+ if (Array.isArray(filter)) {
13
+ return filter.length > 0 && Object.values(filter).some(Boolean);
14
+ }
15
+ if (filter && typeof filter === 'object') {
16
+ return Object.values(filter).some(Boolean) || filter instanceof Date;
17
+ }
18
+ return Boolean(filter);
19
+ }
@@ -1 +1,2 @@
1
1
  export * from './ChipChoiceRow';
2
+ export * from './helpers';
@@ -22,4 +22,5 @@ var __exportStar = void 0 && (void 0).__exportStar || function (m, exports) {
22
22
  Object.defineProperty(exports, "__esModule", {
23
23
  value: true
24
24
  });
25
- __exportStar(require("./ChipChoiceRow"), exports);
25
+ __exportStar(require("./ChipChoiceRow"), exports);
26
+ __exportStar(require("./helpers"), exports);
@@ -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/components';
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 {};
@@ -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
- clearAllButton: string;
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;
@@ -35,7 +35,10 @@ exports.CHIP_CHOICE_TEST_IDS = {
35
35
  approveButton: 'chip-choice__approve-button'
36
36
  };
37
37
  exports.CHIP_CHOICE_ROW_IDS = {
38
- clearAllButton: 'chip-choice-row__clear-all-button'
38
+ clearButton: 'chip-choice-row__clear-button',
39
+ addButton: 'chip-choice-row__add-button',
40
+ addButtonTooltip: 'chip-choice-row__add-button-tooltip',
41
+ addButtonOption: 'chip-choice-row__add-button-option'
39
42
  };
40
43
  exports.CHIP_TOGGLE_TEST_IDS = {
41
44
  input: 'chip-toggle__input',
@@ -1,20 +1,16 @@
1
- import { KeyboardEvent, MouseEventHandler, ReactNode } from 'react';
1
+ import { KeyboardEvent, ReactNode } from 'react';
2
2
  import { ChipChoiceCommonProps } from '../../types';
3
- export type ChipChoiceBaseProps = Pick<ChipChoiceCommonProps, 'loading' | 'tabIndex' | 'showClearButton' | 'disabled' | 'icon' | 'label' | 'size' | 'onClick' | 'className'> & {
3
+ export type ChipChoiceBaseProps = Pick<ChipChoiceCommonProps, 'loading' | 'tabIndex' | 'onClearButtonClick' | 'disabled' | 'icon' | 'label' | 'size' | 'onClick' | 'className'> & {
4
4
  /** Отображаемое значение */
5
5
  valueToRender?: ReactNode;
6
6
  /** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
7
7
  value?: any;
8
- /** Колбек для клика по кнопке очистки */
9
- onClearButtonClick?: MouseEventHandler<HTMLButtonElement>;
10
8
  onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
11
9
  };
12
- export declare const ChipChoiceBase: import("react").ForwardRefExoticComponent<Pick<ChipChoiceCommonProps, "icon" | "size" | "label" | "disabled" | "loading" | "onClick" | "className" | "tabIndex" | "showClearButton"> & {
10
+ export declare const ChipChoiceBase: import("react").ForwardRefExoticComponent<Pick<ChipChoiceCommonProps, "icon" | "size" | "label" | "disabled" | "loading" | "onClick" | "className" | "tabIndex" | "onClearButtonClick"> & {
13
11
  /** Отображаемое значение */
14
12
  valueToRender?: ReactNode;
15
13
  /** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
16
14
  value?: any;
17
- /** Колбек для клика по кнопке очистки */
18
- onClearButtonClick?: MouseEventHandler<HTMLButtonElement>;
19
15
  onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
20
16
  } & import("react").RefAttributes<HTMLDivElement>>;
@@ -20,11 +20,12 @@ import { ButtonClearValue } from '../../../../helperComponents';
20
20
  import { BUTTON_CLEAR_VALUE_SIZE_MAP } from '../../constants';
21
21
  import styles from './styles.module.css';
22
22
  export const ChipChoiceBase = forwardRef((_a, ref) => {
23
- var { size = SIZE.S, disabled, loading, icon, label, valueToRender, value, onClick, className, tabIndex = 0, onClearButtonClick, onKeyDown, showClearButton: showClearButtonProp = true } = _a, rest = __rest(_a, ["size", "disabled", "loading", "icon", "label", "valueToRender", "value", "onClick", "className", "tabIndex", "onClearButtonClick", "onKeyDown", "showClearButton"]);
23
+ var { size = SIZE.S, disabled, loading, icon, label, valueToRender, value, onClick, className, tabIndex = 0, onClearButtonClick, onKeyDown } = _a, rest = __rest(_a, ["size", "disabled", "loading", "icon", "label", "valueToRender", "value", "onClick", "className", "tabIndex", "onClearButtonClick", "onKeyDown"]);
24
24
  const variant = icon && size !== SIZE.Xs ? VARIANT.IconBefore : VARIANT.LabelOnly;
25
25
  const spinnerSize = size === SIZE.Xs ? 'xs' : 's';
26
26
  const localRef = useRef(null);
27
27
  const clearButtonRef = useRef(null);
28
+ const showClearButton = Boolean(onClearButtonClick);
28
29
  const [isDroplistOpened, setIsDroplistOpened] = useState(false);
29
30
  const handleChipClick = e => {
30
31
  if (loading || disabled)
@@ -60,6 +61,5 @@ export const ChipChoiceBase = forwardRef((_a, ref) => {
60
61
  break;
61
62
  }
62
63
  };
63
- const showClearButton = showClearButtonProp && (value instanceof Date || Boolean(value));
64
64
  return (_jsxs("div", Object.assign({}, extractSupportProps(rest), { role: 'button', ref: mergeRefs(localRef, ref), className: cn(styles.choiceChip, className), "data-size": size, "data-variant": variant, "data-loading": loading || undefined, "data-disabled": (!loading && disabled) || undefined, onClick: handleChipClick, onKeyDown: handleChipKeyDown, tabIndex: tabIndex, children: [variant === VARIANT.IconBefore && (_jsx("span", { className: styles.icon, "data-test-id": CHIP_CHOICE_TEST_IDS.icon, children: icon })), _jsxs("span", { className: styles.labelLayout, children: [label && (_jsx("span", { className: styles.label, "data-test-id": CHIP_CHOICE_TEST_IDS.label, children: label + ': ' })), loading ? (_jsx("span", { className: styles.spinner, "data-test-id": CHIP_CHOICE_TEST_IDS.spinner, children: _jsx(Sun, { size: spinnerSize }) })) : (_jsx("span", { className: styles.value, "data-test-id": CHIP_CHOICE_TEST_IDS.value, children: valueToRender !== null && valueToRender !== void 0 ? valueToRender : value }))] }), !disabled && !loading && showClearButton && (_jsx(ButtonClearValue, { size: BUTTON_CLEAR_VALUE_SIZE_MAP[size], onClick: handleClearButtonClick, "data-test-id": CHIP_CHOICE_TEST_IDS.clearButton, onKeyDown: handleClearButtonKeyDown, ref: clearButtonRef }))] })));
65
65
  });
@@ -21,5 +21,5 @@ export type ChipChoiceCustomProps = ChipChoiceCommonProps & {
21
21
  */
22
22
  content?: (props: CustomContentRenderProps) => ReactNode;
23
23
  };
24
- export declare function ChipChoiceCustom({ size, value: valueProp, onChange: onChangeProp, placement, widthStrategy, content, valueRender, ...rest }: ChipChoiceCustomProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function ChipChoiceCustom({ size, value: valueProp, onChange: onChangeProp, placement, widthStrategy, content, valueRender, onClearButtonClick, open: openProp, onOpenChange, ...rest }: ChipChoiceCustomProps): import("react/jsx-runtime").JSX.Element;
25
25
  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, useRef, useState } from 'react';
13
+ import { useCallback, useRef } from 'react';
14
+ import { useUncontrolledProp } from 'uncontrollable';
14
15
  import { Dropdown } from '@snack-uikit/dropdown';
15
16
  import { useValueControl } from '@snack-uikit/utils';
16
17
  import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
@@ -18,21 +19,17 @@ import { useHandleOnKeyDown } from '../hooks';
18
19
  import { ChipChoiceBase } from './ChipChoiceBase';
19
20
  export function ChipChoiceCustom(_a) {
20
21
  var _b;
21
- var { size = SIZE.S, value: valueProp, onChange: onChangeProp, placement = 'bottom-start', widthStrategy = 'gte', content, valueRender } = _a, rest = __rest(_a, ["size", "value", "onChange", "placement", "widthStrategy", "content", "valueRender"]);
22
+ var { size = SIZE.S, value: valueProp, onChange: onChangeProp, placement = 'bottom-start', widthStrategy = 'gte', content, valueRender, onClearButtonClick, open: openProp, onOpenChange } = _a, rest = __rest(_a, ["size", "value", "onChange", "placement", "widthStrategy", "content", "valueRender", "onClearButtonClick", "open", "onOpenChange"]);
22
23
  const localRef = useRef(null);
23
24
  const [value, setValue] = useValueControl({
24
25
  value: valueProp,
25
26
  onChange: onChangeProp,
26
27
  });
27
- const [open, setOpen] = useState(false);
28
+ const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
28
29
  const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
29
30
  const closeDroplist = useCallback(() => {
30
31
  setOpen(false);
31
32
  setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
32
- }, []);
33
- const clearValue = () => {
34
- setValue === null || setValue === void 0 ? void 0 : setValue(undefined);
35
- closeDroplist();
36
- };
37
- return (_jsx(Dropdown, { trigger: 'click', widthStrategy: widthStrategy, placement: placement, outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, content: typeof content === 'function' ? content({ closeDroplist, value, onChange: setValue }) : content, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { valueToRender: (_b = valueRender === null || valueRender === void 0 ? void 0 : valueRender(value)) !== null && _b !== void 0 ? _b : value, onClearButtonClick: clearValue, ref: localRef, value: value, size: size, onKeyDown: handleOnKeyDown() })) }));
33
+ }, [setOpen]);
34
+ return (_jsx(Dropdown, { trigger: 'click', widthStrategy: widthStrategy, placement: placement, outsideClick: true, triggerRef: localRef, open: open, onOpenChange: setOpen, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, content: typeof content === 'function' ? content({ closeDroplist, value, onChange: setValue }) : content, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { valueToRender: (_b = valueRender === null || valueRender === void 0 ? void 0 : valueRender(value)) !== null && _b !== void 0 ? _b : value, onClearButtonClick: onClearButtonClick, ref: localRef, value: value, size: size, onKeyDown: handleOnKeyDown() })) }));
38
35
  }
@@ -20,5 +20,5 @@ export type ChipChoiceDateProps = ChipChoiceCommonProps & {
20
20
  } & (ChipChoiceDateWithSeconds | {
21
21
  mode?: 'date' | 'month';
22
22
  });
23
- export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueRender, dropDownClassName, mode, placement, widthStrategy, buildCalendarCellProps, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
23
+ export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueRender, dropDownClassName, mode, placement, widthStrategy, buildCalendarCellProps, onClearButtonClick, open: openProp, onOpenChange, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
24
24
  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, useState } from 'react';
13
+ import { useCallback, useMemo, useRef } from 'react';
14
+ import { useUncontrolledProp } from 'uncontrollable';
14
15
  import { Calendar } from '@snack-uikit/calendar';
15
16
  import { Dropdown } from '@snack-uikit/dropdown';
16
17
  import { useLocale } from '@snack-uikit/locale';
@@ -21,16 +22,16 @@ import { useHandleOnKeyDown } from '../hooks';
21
22
  import { ChipChoiceBase } from './ChipChoiceBase';
22
23
  export function ChipChoiceDate(_a) {
23
24
  var _b;
24
- var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, mode = 'date', placement, widthStrategy, buildCalendarCellProps } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "mode", "placement", "widthStrategy", "buildCalendarCellProps"]);
25
+ var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, mode = 'date', placement, widthStrategy, buildCalendarCellProps, onClearButtonClick, open: openProp, onOpenChange } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "mode", "placement", "widthStrategy", "buildCalendarCellProps", "onClearButtonClick", "open", "onOpenChange"]);
25
26
  const [selectedValue, setSelectedValue] = useValueControl({ value, defaultValue, onChange });
26
27
  const showSeconds = mode === 'date-time' ? ((_b = rest.showSeconds) !== null && _b !== void 0 ? _b : true) : undefined;
27
28
  const localRef = useRef(null);
28
- const [open, setOpen] = useState(false);
29
+ const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
29
30
  const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
30
31
  const closeDroplist = useCallback(() => {
31
32
  setOpen(false);
32
33
  setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
33
- }, []);
34
+ }, [setOpen]);
34
35
  const { t } = useLocale('Chips');
35
36
  const valueToRender = useMemo(() => {
36
37
  if (valueRender) {
@@ -55,12 +56,11 @@ export function ChipChoiceDate(_a) {
55
56
  day: mode === 'date' ? 'numeric' : undefined,
56
57
  });
57
58
  }, [mode, selectedValue, showSeconds, t, valueRender]);
58
- const clearValue = () => setSelectedValue(undefined);
59
59
  const handleChangeValue = useCallback((value) => {
60
60
  setSelectedValue(value);
61
61
  closeDroplist();
62
62
  }, [closeDroplist, setSelectedValue]);
63
63
  const navigationStartRef = useRef(null);
64
64
  const focusNavigationStartItem = () => setTimeout(() => { var _a; return (_a = navigationStartRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
65
- return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: mode, size: CALENDAR_SIZE_MAP[size], value: selectedValue, fitToContainer: false, onChangeValue: handleChangeValue, navigationStartRef: navigationStartRef, onFocusLeave: closeDroplist, showSeconds: showSeconds, locale: DEFAULT_LOCALE, buildCellProps: buildCalendarCellProps }), placement: placement, widthStrategy: widthStrategy, 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: clearValue, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown(focusNavigationStartItem) })) }));
65
+ return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: mode, size: CALENDAR_SIZE_MAP[size], value: selectedValue, fitToContainer: false, onChangeValue: handleChangeValue, navigationStartRef: navigationStartRef, onFocusLeave: closeDroplist, showSeconds: showSeconds, locale: DEFAULT_LOCALE, buildCellProps: buildCalendarCellProps }), placement: placement, widthStrategy: widthStrategy, 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) })) }));
66
66
  }
@@ -14,5 +14,5 @@ export type ChipChoiceDateRangeProps = ChipChoiceCommonProps & {
14
14
  /** Колбек свойств для управления ячейками календаря */
15
15
  buildCalendarCellProps?: CalendarProps['buildCellProps'];
16
16
  };
17
- export declare function ChipChoiceDateRange({ size, value, defaultValue, onChange, valueRender, dropDownClassName, buildCalendarCellProps, ...rest }: ChipChoiceDateRangeProps): import("react/jsx-runtime").JSX.Element;
17
+ export declare function ChipChoiceDateRange({ size, value, defaultValue, onChange, valueRender, dropDownClassName, buildCalendarCellProps, onClearButtonClick, open: openProp, onOpenChange, ...rest }: ChipChoiceDateRangeProps): import("react/jsx-runtime").JSX.Element;
18
18
  export {};
@@ -10,7 +10,7 @@ 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, useRef, useState } from 'react';
13
+ import { useCallback, useRef } from 'react';
14
14
  import { useUncontrolledProp } from 'uncontrollable';
15
15
  import { Calendar } from '@snack-uikit/calendar';
16
16
  import { Dropdown } from '@snack-uikit/dropdown';
@@ -26,19 +26,18 @@ function defaultRangeFormatter({ value, allLabel }) {
26
26
  return `${from.toLocaleDateString(DEFAULT_LOCALE)} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString(DEFAULT_LOCALE)}`;
27
27
  }
28
28
  export function ChipChoiceDateRange(_a) {
29
- var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, buildCalendarCellProps } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "buildCalendarCellProps"]);
29
+ var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName, buildCalendarCellProps, onClearButtonClick, open: openProp, onOpenChange } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName", "buildCalendarCellProps", "onClearButtonClick", "open", "onOpenChange"]);
30
30
  const [selectedValue, setSelectedValue] = useUncontrolledProp(value, defaultValue, onChange);
31
31
  const { t } = useLocale('Chips');
32
32
  const valueToRender = valueRender
33
33
  ? valueRender(selectedValue)
34
34
  : defaultRangeFormatter({ value: selectedValue, allLabel: t('allLabel') });
35
- const clearValue = () => setSelectedValue(undefined);
36
35
  const localRef = useRef(null);
37
- const [open, setOpen] = useState(false);
36
+ const [open, setOpen] = useUncontrolledProp(openProp, false, onOpenChange);
38
37
  const closeDroplist = useCallback(() => {
39
38
  setOpen(false);
40
39
  setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
41
- }, []);
40
+ }, [setOpen]);
42
41
  const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
43
42
  return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: 'range', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
44
43
  setSelectedValue(value);
@@ -46,5 +45,5 @@ export function ChipChoiceDateRange(_a) {
46
45
  }, locale: DEFAULT_LOCALE,
47
46
  // bug with focus
48
47
  // navigationStartRef={element => element?.focus()}
49
- onFocusLeave: closeDroplist, buildCellProps: buildCalendarCellProps }), outsideClick: true, triggerRef: localRef, open: open, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, onOpenChange: setOpen, className: dropDownClassName, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: clearValue, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown() })) }));
48
+ onFocusLeave: closeDroplist, buildCellProps: buildCalendarCellProps }), outsideClick: true, triggerRef: localRef, open: open, "data-test-id": CHIP_CHOICE_TEST_IDS.droplist, onOpenChange: setOpen, className: dropDownClassName, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: localRef, onClearButtonClick: onClearButtonClick, value: selectedValue, valueToRender: valueToRender, size: size, onKeyDown: handleOnKeyDown() })) }));
50
49
  }
@@ -5,4 +5,4 @@ export type ChipChoiceMultipleValueFormatterProps<T extends ContentRenderProps =
5
5
  total: number;
6
6
  allLabel: string;
7
7
  };
8
- export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, autoApply, disableFuzzySearch, onApprove, onCancel, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, onClearButtonClick, autoApply, disableFuzzySearch, onApprove, onCancel, open: openProp, onOpenChange, ...rest }: ChipChoiceMultipleProps<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';
@@ -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, showClearButton = true, autoApply = true, disableFuzzySearch = false, onApprove, onCancel } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton", "autoApply", "disableFuzzySearch", "onApprove", "onCancel"]);
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] = useState(false);
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: clearValue, value: value, showClearButton: showClearButton && !(Array.isArray(value) && [0].includes(value.length)), valueToRender: valueToRender, label: label, loading: rest.loading, size: size, onKeyDown: handleOnKeyDown() })) })));
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
  }