@snack-uikit/chips 0.13.0 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,19 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 0.13.1 (2024-04-25)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **PDS-0000:** add export type ContentRenderProps ([6ccd417](https://github.com/cloud-ru-tech/snack-uikit/commit/6ccd4179458703ebb03bc58c25300555799c1a8d))
12
+ * **PDS-0000:** fix clear button & label view in ChipMultiple ([064939f](https://github.com/cloud-ru-tech/snack-uikit/commit/064939f2ae0836ea381db8c38fac477d53b9a4ef))
13
+ * **PDS-0000:** set default button type as button ([4ec64de](https://github.com/cloud-ru-tech/snack-uikit/commit/4ec64de508826df4a1e82fd8c75448d9919e563f))
14
+
15
+
16
+
17
+
18
+
6
19
  # 0.13.0 (2024-04-23)
7
20
 
8
21
 
package/README.md CHANGED
@@ -90,31 +90,156 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
90
90
  ### Props
91
91
  | name | type | default value | description |
92
92
  |------|------|---------------|-------------|
93
+ | onClick* | `MouseEventHandler<HTMLButtonElement>` | - | Колбек обработки клика |
94
+ | label* | `string` | - | Лейбл |
95
+ | disabled | `boolean` | - | Деактивирован ли компонент |
96
+ | loading | `boolean` | - | Состояние загрузки |
97
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
98
+ | className | `string` | - | CSS-класс |
99
+ | tabIndex | `number` | - | HTML tab index |
100
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | s | Размер |
93
101
  ## ChipToggle
94
102
  Чип с состоянием выбран/не выбран
95
103
  ### Props
96
104
  | name | type | default value | description |
97
105
  |------|------|---------------|-------------|
106
+ | onChange* | `(checked: boolean, e: ChangeEvent<HTMLInputElement>) => void` | - | Колбек смены значения |
107
+ | checked* | `boolean` | - | Отмечен ли компонент |
108
+ | label* | `string` | - | Лейбл |
109
+ | disabled | `boolean` | - | Деактивирован ли компонент |
110
+ | loading | `boolean` | - | Состояние загрузки |
111
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
112
+ | className | `string` | - | CSS-класс |
113
+ | tabIndex | `number` | - | HTML tab index |
114
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | s | Размер |
98
115
  ## ChipChoice.Custom
99
116
  ### Props
100
117
  | name | type | default value | description |
101
118
  |------|------|---------------|-------------|
119
+ | label | `string` | - | Лейбл |
120
+ | disabled | `boolean` | - | Деактивирован ли компонент |
121
+ | loading | `boolean` | - | Состояние загрузки |
122
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
123
+ | className | `string` | - | CSS-класс |
124
+ | tabIndex | `number` | - | HTML tab index |
125
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
126
+ | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
127
+ | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
128
+ | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
129
+ | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
130
+ | dropDownClassName | `string` | - | |
131
+ | valueRender | `(value: any) => ReactNode` | - | Отображаемое значение |
132
+ | value | `any` | - | Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> |
133
+ | onChange | `(value: any) => void` | - | |
134
+ | content | `(props: CustomContentRenderProps<any>) => ReactNode` | - | Контент выпадающего меню <br> <br> Принимает <strong>ReactNode</strong> <br> Или функцию с аргументами: <br> <strong>handleDroplistItemKeyDown</strong>: Обработчик нажатия клавиши на элемент выпадающего меню <br> <strong>closeDroplist</strong>: Метод для закрытия выпадающего меню |
102
135
  ## ChipChoice.Single
103
136
  ### Props
104
137
  | name | type | default value | description |
105
138
  |------|------|---------------|-------------|
139
+ | options* | `FilterOption<T>[]` | - | Массив опций |
140
+ | label | `string` | - | Лейбл |
141
+ | disabled | `boolean` | - | Деактивирован ли компонент |
142
+ | loading | `boolean` | - | Состояние загрузки Флаг, отвещающий за состояние загрузки списка |
143
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
144
+ | className | `string` | - | CSS-класс |
145
+ | tabIndex | `number` | - | HTML tab index |
146
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
147
+ | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
148
+ | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
149
+ | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
150
+ | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
151
+ | dropDownClassName | `string` | - | |
152
+ | contentRender | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode` | - | |
153
+ | filterFn | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean` | - | |
154
+ | searchable | `boolean` | - | |
155
+ | footer | `ReactNode ;` | - | Кастомизируемый элемент в конце списка |
156
+ | footerActiveElementsRefs | `RefObject<HTMLElement>[]` | - | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
157
+ | selection | `SelectionSingleState \| SelectionMultipleState` | - | |
158
+ | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
159
+ | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
160
+ | dataFiltered | `boolean` | - | |
161
+ | dataError | `boolean` | - | |
162
+ | noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
163
+ | noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
164
+ | errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
165
+ | onChange | `OnChangeHandler<any>` | - | Controlled обработчик измения состояния |
166
+ | value | `ItemId` | - | Controlled состояние |
167
+ | defaultValue | `ItemId` | - | Начальное состояние |
168
+ | valueRender | `(option?: BaseOption<T>) => ReactNode` | - | Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label |
106
169
  ## ChipChoice.Multiple
107
170
  ### Props
108
171
  | name | type | default value | description |
109
172
  |------|------|---------------|-------------|
173
+ | options* | `FilterOption<T>[]` | - | Массив опций |
174
+ | label | `string` | - | Лейбл |
175
+ | disabled | `boolean` | - | Деактивирован ли компонент |
176
+ | loading | `boolean` | - | Состояние загрузки Флаг, отвещающий за состояние загрузки списка |
177
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
178
+ | className | `string` | - | CSS-класс |
179
+ | tabIndex | `number` | - | HTML tab index |
180
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
181
+ | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
182
+ | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
183
+ | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
184
+ | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
185
+ | dropDownClassName | `string` | - | |
186
+ | contentRender | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => ReactNode` | - | |
187
+ | filterFn | `(option: { label: ItemId; value?: ItemId; contentRenderProps?: T; }) => boolean` | - | |
188
+ | searchable | `boolean` | - | |
189
+ | footer | `ReactNode ;` | - | Кастомизируемый элемент в конце списка |
190
+ | footerActiveElementsRefs | `RefObject<HTMLElement>[]` | - | Список ссылок на кастомные элементы, помещенные в специальную секцию внизу списка |
191
+ | selection | `SelectionSingleState \| SelectionMultipleState` | - | |
192
+ | scrollRef | `RefObject<HTMLElement>` | - | Ссылка на элемент, обозначающий самый конец прокручиваемого списка |
193
+ | scrollContainerRef | `RefObject<HTMLElement>` | - | Ссылка на контейнер, который скроллится |
194
+ | dataFiltered | `boolean` | - | |
195
+ | dataError | `boolean` | - | |
196
+ | noDataState | `EmptyStateProps` | - | Экран при отстутствии данных |
197
+ | noResultsState | `EmptyStateProps` | - | Экран при отстутствии результатов поиска или фильтров |
198
+ | errorDataState | `EmptyStateProps` | - | Экран при ошибке запроса |
199
+ | onChange | `OnChangeHandler<any>` | - | Controlled обработчик измения состояния |
200
+ | value | `ItemId[]` | - | Controlled состояние |
201
+ | defaultValue | `ItemId[]` | - | Начальное состояние |
202
+ | valueRender | `(option?: BaseOption<T>[]) => ReactNode` | - | Колбек формирующий отображение выбранного значения. Принимает выбранное значение. По умолчанию для отображения используется FilterOption.label |
110
203
  ## ChipChoice.Date
111
204
  ### Props
112
205
  | name | type | default value | description |
113
206
  |------|------|---------------|-------------|
207
+ | label | `string` | - | Лейбл |
208
+ | disabled | `boolean` | - | Деактивирован ли компонент |
209
+ | loading | `boolean` | - | Состояние загрузки |
210
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
211
+ | className | `string` | - | CSS-класс |
212
+ | tabIndex | `number` | - | HTML tab index |
213
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
214
+ | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
215
+ | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
216
+ | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
217
+ | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
218
+ | dropDownClassName | `string` | - | |
219
+ | value | `Date` | - | Значение компонента |
220
+ | defaultValue | `Date` | - | Значение компонента по-умолчанию |
221
+ | onChange | `(value: Date) => void` | - | Колбек смены значения |
222
+ | valueRender | `(value?: Date) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение |
114
223
  ## ChipChoice.DateRange
115
224
  ### Props
116
225
  | name | type | default value | description |
117
226
  |------|------|---------------|-------------|
227
+ | label | `string` | - | Лейбл |
228
+ | disabled | `boolean` | - | Деактивирован ли компонент |
229
+ | loading | `boolean` | - | Состояние загрузки |
230
+ | icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
231
+ | className | `string` | - | CSS-класс |
232
+ | tabIndex | `number` | - | HTML tab index |
233
+ | size | enum Size: `"xs"`, `"s"`, `"m"`, `"l"` | - | Размер |
234
+ | onClick | `MouseEventHandler<HTMLButtonElement \| HTMLDivElement>` | - | Колбек обработки клика |
235
+ | showClearButton | `boolean` | true | Отображение кнопки очистки значения |
236
+ | placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
237
+ | widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
238
+ | dropDownClassName | `string` | - | |
239
+ | value | `Range` | - | Значение компонента |
240
+ | defaultValue | `Range` | - | Значение компонента по умолчанию |
241
+ | onChange | `(value: Range) => void` | - | Колбек смены значения |
242
+ | valueRender | `(value?: Range) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений |
118
243
  ## isAccordionOption
119
244
  ### Props
120
245
  | name | type | default value | description |
@@ -139,6 +264,14 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
139
264
  ### Props
140
265
  | name | type | default value | description |
141
266
  |------|------|---------------|-------------|
267
+ | filters* | `OmitBetter<ChipChoiceProps, "size" \| "onChange" \| "value" \| "defaultValue">[]` | - | Массив чипов |
268
+ | value | `FiltersState` | - | Состояние фильтров |
269
+ | defaultValue | `Partial<TState>` | - | Начальное состояние фильтров |
270
+ | onChange | `(filters: TState) => void` | - | Колбек изменения состояния фильтров |
271
+ | size | enum ChipChoiceRowSize: `"xs"`, `"s"`, `"m"` | s | Размер |
272
+ | className | `string` | - | CSS-класс |
273
+ | showClearAllButton | `boolean` | true | Скрыть/показать кнопку очиски |
274
+ | clearAllButtonLabel | `string` | 'Clear all' | Текст кнопки очистки |
142
275
 
143
276
 
144
277
  [//]: DOCUMENTATION_SECTION_END
@@ -26,5 +26,5 @@ export function ChipAssist(_a) {
26
26
  }
27
27
  onClick === null || onClick === void 0 ? void 0 : onClick(e);
28
28
  };
29
- return (_jsxs("button", Object.assign({}, extractSupportProps(rest), { tabIndex: tabIndex, "data-size": size, "data-loading": loading || undefined, "data-variant": variant, disabled: !loading && disabled, onClick: handleClick, className: cn(styles.assistChip, className), children: [variant === VARIANT.IconBefore && !loading && (_jsx("span", { className: styles.icon, "data-test-id": CHIP_ASSIST_TEST_IDS.icon, children: icon })), loading && (_jsx("span", { className: styles.spinner, "data-test-id": CHIP_ASSIST_TEST_IDS.spinner, children: _jsx(Sun, { size: spinnerSize }) })), _jsx("span", { className: cn(styles.labelLayout, styles.label), "data-test-id": CHIP_ASSIST_TEST_IDS.label, children: label })] })));
29
+ return (_jsxs("button", Object.assign({ type: 'button' }, extractSupportProps(rest), { tabIndex: tabIndex, "data-size": size, "data-loading": loading || undefined, "data-variant": variant, disabled: !loading && disabled, onClick: handleClick, className: cn(styles.assistChip, className), children: [variant === VARIANT.IconBefore && !loading && (_jsx("span", { className: styles.icon, "data-test-id": CHIP_ASSIST_TEST_IDS.icon, children: icon })), loading && (_jsx("span", { className: styles.spinner, "data-test-id": CHIP_ASSIST_TEST_IDS.spinner, children: _jsx(Sun, { size: spinnerSize }) })), _jsx("span", { className: cn(styles.labelLayout, styles.label), "data-test-id": CHIP_ASSIST_TEST_IDS.label, children: label })] })));
30
30
  }
@@ -21,16 +21,17 @@ import { kindFlattenOptions } from '../utils';
21
21
  import { transformOptionsToItems } from '../utils/options';
22
22
  import { ChipChoiceBase } from './ChipChoiceBase';
23
23
  const defaultMultiValueLabelFormatter = ({ value, total, allLabel }) => {
24
- if (value.length === 0 || value.length === total) {
24
+ const len = value.length;
25
+ if ([0, total].includes(len) && total !== len) {
25
26
  return allLabel;
26
27
  }
27
- if (value.length === 1) {
28
+ if (len === 1) {
28
29
  return value[0].label;
29
30
  }
30
- return `${value.length.toString()}/${total}`;
31
+ return `${len.toString()}/${total}`;
31
32
  };
32
33
  export function ChipChoiceMultiple(_a) {
33
- var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, showClearButton } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton"]);
34
+ var { value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size = SIZE.S, label, searchable, contentRender, dropDownClassName, showClearButton = true } = _a, rest = __rest(_a, ["value", "defaultValue", "options", "onChange", "valueRender", "size", "label", "searchable", "contentRender", "dropDownClassName", "showClearButton"]);
34
35
  const [value, setValue] = useValueControl({
35
36
  value: valueProp,
36
37
  defaultValue,
@@ -83,5 +84,5 @@ export function ChipChoiceMultiple(_a) {
83
84
  value: searchValue,
84
85
  onChange: setSearchValue,
85
86
  }
86
- : undefined, children: _jsx(ChipChoiceBase, Object.assign({}, rest, { ref: chipRef, onClearButtonClick: clearValue, value: value, showClearButton: showClearButton && !(Array.isArray(value) && [0, Object.keys(flattenOptions).length].includes(value.length)), valueToRender: valueToRender, label: label, loading: rest.loading, size: size, onKeyDown: handleOnKeyDown() })) })));
87
+ : undefined, 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() })) })));
87
88
  }
@@ -1,5 +1,5 @@
1
1
  import { ChipChoiceCustom, ChipChoiceCustomProps, ChipChoiceDate, ChipChoiceDateProps, ChipChoiceDateRange, ChipChoiceDateRangeProps, ChipChoiceMultiple, ChipChoiceSingle, CustomContentRenderProps } from './components';
2
- export type { FilterOption, ChipChoiceMultipleProps, ChipChoiceSingleProps } from './types';
2
+ export type { FilterOption, ChipChoiceMultipleProps, ChipChoiceSingleProps, ContentRenderProps } from './types';
3
3
  export type { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, CustomContentRenderProps };
4
4
  export declare namespace ChipChoice {
5
5
  const Custom: typeof ChipChoiceCustom;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "Chips",
7
- "version": "0.13.0",
7
+ "version": "0.13.1",
8
8
  "sideEffects": [
9
9
  "*.css",
10
10
  "*.woff",
@@ -33,10 +33,10 @@
33
33
  "scripts": {},
34
34
  "dependencies": {
35
35
  "@snack-uikit/button": "0.17.1",
36
- "@snack-uikit/calendar": "0.7.7",
36
+ "@snack-uikit/calendar": "0.7.8",
37
37
  "@snack-uikit/dropdown": "0.2.2",
38
38
  "@snack-uikit/icons": "0.20.1",
39
- "@snack-uikit/list": "0.11.1",
39
+ "@snack-uikit/list": "0.11.2",
40
40
  "@snack-uikit/loaders": "0.5.2",
41
41
  "@snack-uikit/utils": "3.3.0",
42
42
  "classnames": "2.3.2",
@@ -50,5 +50,5 @@
50
50
  "peerDependencies": {
51
51
  "@snack-uikit/locale": "*"
52
52
  },
53
- "gitHead": "bf1e1f3cfabccc1ee288c18722e33009bd001798"
53
+ "gitHead": "17bfcf1150776cd35c77d9cca8f45dde97472bf1"
54
54
  }
@@ -42,6 +42,7 @@ export function ChipAssist({
42
42
 
43
43
  return (
44
44
  <button
45
+ type='button'
45
46
  {...extractSupportProps(rest)}
46
47
  tabIndex={tabIndex}
47
48
  data-size={size}
@@ -19,15 +19,17 @@ export type ChipChoiceMultipleValueFormatterProps<T extends ContentRenderProps =
19
19
  };
20
20
 
21
21
  const defaultMultiValueLabelFormatter = ({ value, total, allLabel }: ChipChoiceMultipleValueFormatterProps): ItemId => {
22
- if (value.length === 0 || value.length === total) {
22
+ const len = value.length;
23
+
24
+ if ([0, total].includes(len) && total !== len) {
23
25
  return allLabel;
24
26
  }
25
27
 
26
- if (value.length === 1) {
28
+ if (len === 1) {
27
29
  return value[0].label;
28
30
  }
29
31
 
30
- return `${value.length.toString()}/${total}`;
32
+ return `${len.toString()}/${total}`;
31
33
  };
32
34
 
33
35
  export function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({
@@ -41,7 +43,7 @@ export function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderP
41
43
  searchable,
42
44
  contentRender,
43
45
  dropDownClassName,
44
- showClearButton,
46
+ showClearButton = true,
45
47
  ...rest
46
48
  }: ChipChoiceMultipleProps<T>) {
47
49
  const [value, setValue] = useValueControl<SelectionSingleValueType[]>({
@@ -143,9 +145,7 @@ export function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderP
143
145
  ref={chipRef}
144
146
  onClearButtonClick={clearValue}
145
147
  value={value}
146
- showClearButton={
147
- showClearButton && !(Array.isArray(value) && [0, Object.keys(flattenOptions).length].includes(value.length))
148
- }
148
+ showClearButton={showClearButton && !(Array.isArray(value) && [0].includes(value.length))}
149
149
  valueToRender={valueToRender}
150
150
  label={label}
151
151
  loading={rest.loading}
@@ -10,7 +10,7 @@ import {
10
10
  CustomContentRenderProps,
11
11
  } from './components';
12
12
 
13
- export type { FilterOption, ChipChoiceMultipleProps, ChipChoiceSingleProps } from './types';
13
+ export type { FilterOption, ChipChoiceMultipleProps, ChipChoiceSingleProps, ContentRenderProps } from './types';
14
14
  export type { ChipChoiceCustomProps, ChipChoiceDateProps, ChipChoiceDateRangeProps, CustomContentRenderProps };
15
15
 
16
16
  export namespace ChipChoice {