@snack-uikit/chips 0.12.9 → 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 +31 -0
- package/README.md +71 -20
- package/dist/components/ChipAssist/ChipAssist.js +1 -1
- package/dist/components/ChipAssist/styles.module.css +1 -1
- package/dist/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.d.ts +20 -0
- package/dist/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.js +65 -0
- package/dist/components/ChipChoice/components/ChipChoiceBase/index.d.ts +1 -0
- package/dist/components/ChipChoice/components/ChipChoiceBase/index.js +1 -0
- package/dist/components/ChipChoice/components/{ChipChoiceCustom → ChipChoiceBase}/styles.module.css +18 -10
- package/dist/components/ChipChoice/components/ChipChoiceCustom.d.ts +25 -0
- package/dist/components/ChipChoice/components/ChipChoiceCustom.js +38 -0
- package/dist/components/ChipChoice/components/ChipChoiceDate.d.ts +3 -2
- package/dist/components/ChipChoice/components/ChipChoiceDate.js +19 -9
- package/dist/components/ChipChoice/components/ChipChoiceDateRange.d.ts +3 -2
- package/dist/components/ChipChoice/components/ChipChoiceDateRange.js +18 -8
- package/dist/components/ChipChoice/components/ChipChoiceMultiple.d.ts +8 -0
- package/dist/components/ChipChoice/components/ChipChoiceMultiple.js +88 -0
- package/dist/components/ChipChoice/components/ChipChoiceSingle.d.ts +7 -13
- package/dist/components/ChipChoice/components/ChipChoiceSingle.js +64 -22
- package/dist/components/ChipChoice/components/index.d.ts +1 -1
- package/dist/components/ChipChoice/components/index.js +1 -1
- package/dist/components/ChipChoice/constants.d.ts +3 -2
- package/dist/components/ChipChoice/constants.js +2 -1
- package/dist/components/ChipChoice/hooks.d.ts +11 -0
- package/dist/components/ChipChoice/hooks.js +35 -0
- package/dist/components/ChipChoice/index.d.ts +5 -4
- package/dist/components/ChipChoice/index.js +3 -2
- package/dist/components/ChipChoice/styles.module.css +9 -5
- package/dist/components/ChipChoice/types.d.ts +55 -7
- package/dist/components/ChipChoice/utils/index.d.ts +2 -0
- package/dist/components/ChipChoice/utils/index.js +2 -0
- package/dist/components/ChipChoice/utils/options.d.ts +9 -0
- package/dist/components/ChipChoice/utils/options.js +32 -0
- package/dist/components/ChipChoice/utils/typeGuards.d.ts +6 -0
- package/dist/components/ChipChoice/utils/typeGuards.js +15 -0
- package/dist/components/ChipChoice/utils/utils.d.ts +18 -0
- package/dist/components/ChipChoice/utils/utils.js +29 -0
- package/dist/components/ChipChoiceRow/components/constants.d.ts +2 -1
- package/dist/components/ChipChoiceRow/components/constants.js +2 -1
- package/dist/components/ChipChoiceRow/types.d.ts +11 -5
- package/dist/components/ChipToggle/styles.module.css +1 -1
- package/package.json +13 -7
- package/src/components/ChipAssist/ChipAssist.tsx +1 -0
- package/src/components/ChipChoice/components/ChipChoiceBase/ChipChoiceBase.tsx +149 -0
- package/src/components/ChipChoice/components/ChipChoiceBase/index.ts +1 -0
- package/src/components/ChipChoice/components/{ChipChoiceCustom → ChipChoiceBase}/styles.module.scss +11 -5
- package/src/components/ChipChoice/components/ChipChoiceCustom.tsx +89 -0
- package/src/components/ChipChoice/components/ChipChoiceDate.tsx +42 -18
- package/src/components/ChipChoice/components/ChipChoiceDateRange.tsx +43 -18
- package/src/components/ChipChoice/components/ChipChoiceMultiple.tsx +157 -0
- package/src/components/ChipChoice/components/ChipChoiceSingle.tsx +123 -62
- package/src/components/ChipChoice/components/index.ts +1 -1
- package/src/components/ChipChoice/constants.ts +3 -2
- package/src/components/ChipChoice/hooks.ts +61 -0
- package/src/components/ChipChoice/index.ts +7 -13
- package/src/components/ChipChoice/styles.module.scss +11 -5
- package/src/components/ChipChoice/types.ts +105 -7
- package/src/components/ChipChoice/utils/index.ts +3 -0
- package/src/components/ChipChoice/utils/options.tsx +58 -0
- package/src/components/ChipChoice/utils/typeGuards.ts +35 -0
- package/src/components/ChipChoice/utils/utils.ts +60 -0
- package/src/components/ChipChoiceRow/components/constants.ts +2 -1
- package/src/components/ChipChoiceRow/types.ts +18 -10
- package/dist/components/ChipChoice/components/ChipChoiceCustom/ChipChoiceCustom.d.ts +0 -23
- package/dist/components/ChipChoice/components/ChipChoiceCustom/ChipChoiceCustom.js +0 -75
- package/dist/components/ChipChoice/components/ChipChoiceCustom/index.d.ts +0 -1
- package/dist/components/ChipChoice/components/ChipChoiceCustom/index.js +0 -1
- package/dist/components/ChipChoice/components/ChipChoiceMulti.d.ts +0 -14
- package/dist/components/ChipChoice/components/ChipChoiceMulti.js +0 -44
- package/dist/components/ChipChoice/utils.d.ts +0 -14
- package/dist/components/ChipChoice/utils.js +0 -26
- package/src/components/ChipChoice/components/ChipChoiceCustom/ChipChoiceCustom.tsx +0 -188
- package/src/components/ChipChoice/components/ChipChoiceCustom/index.ts +0 -1
- package/src/components/ChipChoice/components/ChipChoiceMulti.tsx +0 -90
- package/src/components/ChipChoice/utils.ts +0 -48
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,37 @@
|
|
|
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
|
+
|
|
19
|
+
# 0.13.0 (2024-04-23)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* **FF-01:** fix pseudo background ([ee468df](https://github.com/cloud-ru-tech/snack-uikit/commit/ee468df9494a81c7948fb20a647a87bdd0b1e980))
|
|
25
|
+
* **PDS-59:** multi-value formatter ([f606ef2](https://github.com/cloud-ru-tech/snack-uikit/commit/f606ef2d3866dfc0f2630302732825cb9e5fb83c))
|
|
26
|
+
* **PDS-59:** upd tests ([df72712](https://github.com/cloud-ru-tech/snack-uikit/commit/df7271268ac1621316dbb98b274e3d6602515b23))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### BREAKING CHANGES
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
* **PDS-59:** change droplist -> list package ([f63f48a](https://github.com/cloud-ru-tech/snack-uikit/commit/f63f48a394470243a7410933d5e97aaa50317154))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
6
37
|
## 0.12.9 (2024-04-22)
|
|
7
38
|
|
|
8
39
|
### Only dependencies have been changed
|
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Chips
|
|
2
2
|
|
|
3
3
|
## Installation
|
|
4
|
+
|
|
4
5
|
`npm i @snack-uikit/chips`
|
|
5
6
|
|
|
6
7
|
[Changelog](./CHANGELOG.md)
|
|
@@ -126,18 +127,19 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
126
127
|
| showClearButton | `boolean` | true | Отображение кнопки очистки значения |
|
|
127
128
|
| placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
|
|
128
129
|
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
|
|
129
|
-
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
|
|
|
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>: Метод для закрытия выпадающего меню |
|
|
133
135
|
## ChipChoice.Single
|
|
134
136
|
### Props
|
|
135
137
|
| name | type | default value | description |
|
|
136
138
|
|------|------|---------------|-------------|
|
|
137
|
-
| options* | `FilterOption[]` | - | Массив опций |
|
|
139
|
+
| options* | `FilterOption<T>[]` | - | Массив опций |
|
|
138
140
|
| label | `string` | - | Лейбл |
|
|
139
141
|
| disabled | `boolean` | - | Деактивирован ли компонент |
|
|
140
|
-
| loading | `boolean` | - | Состояние загрузки |
|
|
142
|
+
| loading | `boolean` | - | Состояние загрузки Флаг, отвещающий за состояние загрузки списка |
|
|
141
143
|
| icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
|
|
142
144
|
| className | `string` | - | CSS-класс |
|
|
143
145
|
| tabIndex | `number` | - | HTML tab index |
|
|
@@ -146,18 +148,32 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
146
148
|
| showClearButton | `boolean` | true | Отображение кнопки очистки значения |
|
|
147
149
|
| placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
|
|
148
150
|
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
|
|
149
|
-
|
|
|
150
|
-
|
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
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 |
|
|
169
|
+
## ChipChoice.Multiple
|
|
154
170
|
### Props
|
|
155
171
|
| name | type | default value | description |
|
|
156
172
|
|------|------|---------------|-------------|
|
|
157
|
-
| options* | `FilterOption[]` | - | Массив опций |
|
|
173
|
+
| options* | `FilterOption<T>[]` | - | Массив опций |
|
|
158
174
|
| label | `string` | - | Лейбл |
|
|
159
175
|
| disabled | `boolean` | - | Деактивирован ли компонент |
|
|
160
|
-
| loading | `boolean` | - | Состояние загрузки |
|
|
176
|
+
| loading | `boolean` | - | Состояние загрузки Флаг, отвещающий за состояние загрузки списка |
|
|
161
177
|
| icon | `ReactElement<any, string \| JSXElementConstructor<any>>` | - | Иконка |
|
|
162
178
|
| className | `string` | - | CSS-класс |
|
|
163
179
|
| tabIndex | `number` | - | HTML tab index |
|
|
@@ -166,10 +182,24 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
166
182
|
| showClearButton | `boolean` | true | Отображение кнопки очистки значения |
|
|
167
183
|
| placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
|
|
168
184
|
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
|
|
169
|
-
|
|
|
170
|
-
|
|
|
171
|
-
|
|
|
172
|
-
|
|
|
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 |
|
|
173
203
|
## ChipChoice.Date
|
|
174
204
|
### Props
|
|
175
205
|
| name | type | default value | description |
|
|
@@ -185,10 +215,11 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
185
215
|
| showClearButton | `boolean` | true | Отображение кнопки очистки значения |
|
|
186
216
|
| placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
|
|
187
217
|
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
|
|
218
|
+
| dropDownClassName | `string` | - | |
|
|
188
219
|
| value | `Date` | - | Значение компонента |
|
|
189
220
|
| defaultValue | `Date` | - | Значение компонента по-умолчанию |
|
|
190
221
|
| onChange | `(value: Date) => void` | - | Колбек смены значения |
|
|
191
|
-
|
|
|
222
|
+
| valueRender | `(value?: Date) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение |
|
|
192
223
|
## ChipChoice.DateRange
|
|
193
224
|
### Props
|
|
194
225
|
| name | type | default value | description |
|
|
@@ -204,10 +235,31 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
204
235
|
| showClearButton | `boolean` | true | Отображение кнопки очистки значения |
|
|
205
236
|
| placement | enum Placement: `"left"`, `"left-start"`, `"left-end"`, `"right"`, `"right-start"`, `"right-end"`, `"top"`, `"top-start"`, `"top-end"`, `"bottom"`, `"bottom-start"`, `"bottom-end"` | - | Расположение выпадающего меню |
|
|
206
237
|
| widthStrategy | enum PopoverWidthStrategy: `"auto"`, `"gte"`, `"eq"` | gte | Стратегия управления шириной контейнера поповера <br> - `auto` - соответствует ширине контента, <br> - `gte` - Great Than or Equal, равен ширине таргета или больше ее, если контент в поповере шире, <br> - `eq` - Equal, строго равен ширине таргета. |
|
|
238
|
+
| dropDownClassName | `string` | - | |
|
|
207
239
|
| value | `Range` | - | Значение компонента |
|
|
208
240
|
| defaultValue | `Range` | - | Значение компонента по умолчанию |
|
|
209
241
|
| onChange | `(value: Range) => void` | - | Колбек смены значения |
|
|
210
|
-
|
|
|
242
|
+
| valueRender | `(value?: Range) => ReactNode` | - | Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений |
|
|
243
|
+
## isAccordionOption
|
|
244
|
+
### Props
|
|
245
|
+
| name | type | default value | description |
|
|
246
|
+
|------|------|---------------|-------------|
|
|
247
|
+
## isBaseOption
|
|
248
|
+
### Props
|
|
249
|
+
| name | type | default value | description |
|
|
250
|
+
|------|------|---------------|-------------|
|
|
251
|
+
## isGroupOption
|
|
252
|
+
### Props
|
|
253
|
+
| name | type | default value | description |
|
|
254
|
+
|------|------|---------------|-------------|
|
|
255
|
+
## isGroupSelectOption
|
|
256
|
+
### Props
|
|
257
|
+
| name | type | default value | description |
|
|
258
|
+
|------|------|---------------|-------------|
|
|
259
|
+
## isNextListOption
|
|
260
|
+
### Props
|
|
261
|
+
| name | type | default value | description |
|
|
262
|
+
|------|------|---------------|-------------|
|
|
211
263
|
## ChipChoiceRow
|
|
212
264
|
### Props
|
|
213
265
|
| name | type | default value | description |
|
|
@@ -223,4 +275,3 @@ import { PlaceholderSVG } from '@snack-uikit/icons';
|
|
|
223
275
|
|
|
224
276
|
|
|
225
277
|
[//]: DOCUMENTATION_SECTION_END
|
|
226
|
-
|
|
@@ -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
|
}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
outline:0;
|
|
17
17
|
outline-offset:0;
|
|
18
18
|
color:var(--sys-neutral-text-support, #656771);
|
|
19
|
-
background-color:var(--sys-neutral-background1-level, #
|
|
19
|
+
background-color:var(--sys-neutral-background1-level, #fdfdff);
|
|
20
20
|
border-color:var(--sys-neutral-decor-default, #dfe2ec);
|
|
21
21
|
}
|
|
22
22
|
.assistChip .spinner{
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { KeyboardEvent, MouseEventHandler, ReactNode } from 'react';
|
|
2
|
+
import { ChipChoiceCommonProps } from '../../types';
|
|
3
|
+
export type ChipChoiceBaseProps = Pick<ChipChoiceCommonProps, 'loading' | 'tabIndex' | 'showClearButton' | 'disabled' | 'icon' | 'label' | 'size' | 'onClick' | 'className'> & {
|
|
4
|
+
/** Отображаемое значение */
|
|
5
|
+
valueToRender?: ReactNode;
|
|
6
|
+
/** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
|
|
7
|
+
value?: any;
|
|
8
|
+
/** Колбек для клика по кнопке очистки */
|
|
9
|
+
onClearButtonClick?: MouseEventHandler<HTMLButtonElement>;
|
|
10
|
+
onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
|
|
11
|
+
};
|
|
12
|
+
export declare const ChipChoiceBase: import("react").ForwardRefExoticComponent<Pick<ChipChoiceCommonProps, "icon" | "size" | "label" | "disabled" | "loading" | "onClick" | "className" | "tabIndex" | "showClearButton"> & {
|
|
13
|
+
/** Отображаемое значение */
|
|
14
|
+
valueToRender?: ReactNode;
|
|
15
|
+
/** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
|
|
16
|
+
value?: any;
|
|
17
|
+
/** Колбек для клика по кнопке очистки */
|
|
18
|
+
onClearButtonClick?: MouseEventHandler<HTMLButtonElement> | undefined;
|
|
19
|
+
onKeyDown?(e: KeyboardEvent<HTMLDivElement>): void;
|
|
20
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
import cn from 'classnames';
|
|
14
|
+
import mergeRefs from 'merge-refs';
|
|
15
|
+
import { forwardRef, useRef, useState } from 'react';
|
|
16
|
+
import { Sun } from '@snack-uikit/loaders';
|
|
17
|
+
import { extractSupportProps } from '@snack-uikit/utils';
|
|
18
|
+
import { CHIP_CHOICE_TEST_IDS, SIZE, VARIANT } from '../../../../constants';
|
|
19
|
+
import { ButtonClearValue } from '../../../../helperComponents';
|
|
20
|
+
import { BUTTON_CLEAR_VALUE_SIZE_MAP } from '../../constants';
|
|
21
|
+
import styles from './styles.module.css';
|
|
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"]);
|
|
24
|
+
const variant = icon && size !== SIZE.Xs ? VARIANT.IconBefore : VARIANT.LabelOnly;
|
|
25
|
+
const spinnerSize = size === SIZE.Xs ? 'xs' : 's';
|
|
26
|
+
const localRef = useRef(null);
|
|
27
|
+
const clearButtonRef = useRef(null);
|
|
28
|
+
const [isDroplistOpened, setIsDroplistOpened] = useState(false);
|
|
29
|
+
const handleChipClick = e => {
|
|
30
|
+
if (loading || disabled)
|
|
31
|
+
return;
|
|
32
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(e);
|
|
33
|
+
!isDroplistOpened && setIsDroplistOpened(true);
|
|
34
|
+
};
|
|
35
|
+
const handleChipKeyDown = e => {
|
|
36
|
+
var _a;
|
|
37
|
+
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
|
|
38
|
+
if (e.key === 'ArrowRight') {
|
|
39
|
+
(_a = clearButtonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
40
|
+
e.stopPropagation();
|
|
41
|
+
e.preventDefault();
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const handleClearButtonClick = e => {
|
|
45
|
+
onClearButtonClick === null || onClearButtonClick === void 0 ? void 0 : onClearButtonClick(e);
|
|
46
|
+
};
|
|
47
|
+
const handleClearButtonKeyDown = e => {
|
|
48
|
+
var _a;
|
|
49
|
+
switch (e.key) {
|
|
50
|
+
case 'ArrowLeft': {
|
|
51
|
+
(_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
case 'Enter':
|
|
55
|
+
case ' ': {
|
|
56
|
+
e.stopPropagation();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
default:
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const showClearButton = showClearButtonProp && (value instanceof Date || Boolean(value));
|
|
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
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ChipChoiceBase';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ChipChoiceBase';
|
package/dist/components/ChipChoice/components/{ChipChoiceCustom → ChipChoiceBase}/styles.module.css
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
.label,
|
|
1
|
+
.label,
|
|
2
|
+
.value{
|
|
2
3
|
display:inline-flex;
|
|
3
4
|
align-items:center;
|
|
4
5
|
}
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
border-style:solid;
|
|
21
22
|
outline:0;
|
|
22
23
|
outline-offset:0;
|
|
23
|
-
background-color:var(--sys-neutral-background1-level, #
|
|
24
|
+
background-color:var(--sys-neutral-background1-level, #fdfdff);
|
|
24
25
|
border-color:var(--sys-neutral-decor-default, #dfe2ec);
|
|
25
26
|
}
|
|
26
27
|
.choiceChip .spinner{
|
|
@@ -117,7 +118,8 @@
|
|
|
117
118
|
padding-right:var(--space-chips-label-layout-padding-l, 12px);
|
|
118
119
|
gap:var(--space-chips-label-layout-gap, 2px);
|
|
119
120
|
}
|
|
120
|
-
.choiceChip .label,
|
|
121
|
+
.choiceChip .label,
|
|
122
|
+
.choiceChip .value{
|
|
121
123
|
color:var(--sys-neutral-text-support, #656771);
|
|
122
124
|
}
|
|
123
125
|
.choiceChip .icon{
|
|
@@ -177,7 +179,8 @@
|
|
|
177
179
|
background-color:var(--sys-neutral-background, #f1f2f6);
|
|
178
180
|
border-color:var(--sys-neutral-decor-disabled, #e8eaf1);
|
|
179
181
|
}
|
|
180
|
-
.choiceChip[data-disabled] .label,
|
|
182
|
+
.choiceChip[data-disabled] .label,
|
|
183
|
+
.choiceChip[data-disabled] .value{
|
|
181
184
|
color:var(--sys-neutral-text-light, #868892);
|
|
182
185
|
}
|
|
183
186
|
.choiceChip[data-loading]{
|
|
@@ -190,7 +193,8 @@
|
|
|
190
193
|
align-items:center;
|
|
191
194
|
justify-content:center;
|
|
192
195
|
}
|
|
193
|
-
.choiceChip[data-loading] .label,
|
|
196
|
+
.choiceChip[data-loading] .label,
|
|
197
|
+
.choiceChip[data-loading] .value{
|
|
194
198
|
color:var(--sys-neutral-text-support, #656771);
|
|
195
199
|
}
|
|
196
200
|
|
|
@@ -198,7 +202,8 @@
|
|
|
198
202
|
--offset:var(--space-drop-list-drop-offset, 4px);
|
|
199
203
|
}
|
|
200
204
|
|
|
201
|
-
.label,
|
|
205
|
+
.label,
|
|
206
|
+
.value{
|
|
202
207
|
display:inline-flex;
|
|
203
208
|
align-items:center;
|
|
204
209
|
}
|
|
@@ -220,7 +225,7 @@
|
|
|
220
225
|
border-style:solid;
|
|
221
226
|
outline:0;
|
|
222
227
|
outline-offset:0;
|
|
223
|
-
background-color:var(--sys-neutral-background1-level, #
|
|
228
|
+
background-color:var(--sys-neutral-background1-level, #fdfdff);
|
|
224
229
|
border-color:var(--sys-neutral-decor-default, #dfe2ec);
|
|
225
230
|
}
|
|
226
231
|
.choiceChip .spinner{
|
|
@@ -317,7 +322,8 @@
|
|
|
317
322
|
padding-right:var(--space-chips-label-layout-padding-l, 12px);
|
|
318
323
|
gap:var(--space-chips-label-layout-gap, 2px);
|
|
319
324
|
}
|
|
320
|
-
.choiceChip .label,
|
|
325
|
+
.choiceChip .label,
|
|
326
|
+
.choiceChip .value{
|
|
321
327
|
color:var(--sys-neutral-text-support, #656771);
|
|
322
328
|
}
|
|
323
329
|
.choiceChip .icon{
|
|
@@ -377,7 +383,8 @@
|
|
|
377
383
|
background-color:var(--sys-neutral-background, #f1f2f6);
|
|
378
384
|
border-color:var(--sys-neutral-decor-disabled, #e8eaf1);
|
|
379
385
|
}
|
|
380
|
-
.choiceChip[data-disabled] .label,
|
|
386
|
+
.choiceChip[data-disabled] .label,
|
|
387
|
+
.choiceChip[data-disabled] .value{
|
|
381
388
|
color:var(--sys-neutral-text-light, #868892);
|
|
382
389
|
}
|
|
383
390
|
.choiceChip[data-loading]{
|
|
@@ -393,7 +400,8 @@
|
|
|
393
400
|
align-items:center;
|
|
394
401
|
justify-content:center;
|
|
395
402
|
}
|
|
396
|
-
.choiceChip[data-loading] .label,
|
|
403
|
+
.choiceChip[data-loading] .label,
|
|
404
|
+
.choiceChip[data-loading] .value{
|
|
397
405
|
color:var(--sys-neutral-text-support, #656771);
|
|
398
406
|
}
|
|
399
407
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ChipChoiceCommonProps } from '../types';
|
|
3
|
+
type AnyType = any;
|
|
4
|
+
export type CustomContentRenderProps<T = AnyType> = {
|
|
5
|
+
closeDroplist(): void;
|
|
6
|
+
value: T;
|
|
7
|
+
onChange?(value: T): void;
|
|
8
|
+
};
|
|
9
|
+
export type ChipChoiceCustomProps = ChipChoiceCommonProps & {
|
|
10
|
+
/** Отображаемое значение */
|
|
11
|
+
valueRender?(value: AnyType): ReactNode;
|
|
12
|
+
/** Фактическое значение. Используется для отображения кнопки очистки, если свойство <strong>showClearButton=true</strong> */
|
|
13
|
+
value?: AnyType;
|
|
14
|
+
onChange?(value: AnyType): void;
|
|
15
|
+
/** Контент выпадающего меню
|
|
16
|
+
<br>
|
|
17
|
+
<br> Принимает <strong>ReactNode</strong>
|
|
18
|
+
<br> Или функцию с аргументами:
|
|
19
|
+
<br> <strong>handleDroplistItemKeyDown</strong>: Обработчик нажатия клавиши на элемент выпадающего меню
|
|
20
|
+
<br> <strong>closeDroplist</strong>: Метод для закрытия выпадающего меню
|
|
21
|
+
*/
|
|
22
|
+
content?: (props: CustomContentRenderProps) => ReactNode;
|
|
23
|
+
};
|
|
24
|
+
export declare function ChipChoiceCustom({ size, value: valueProp, onChange: onChangeProp, placement, widthStrategy, content, valueRender, ...rest }: ChipChoiceCustomProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
import { useCallback, useRef, useState } from 'react';
|
|
14
|
+
import { Dropdown } from '@snack-uikit/dropdown';
|
|
15
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
16
|
+
import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
|
|
17
|
+
import { useHandleOnKeyDown } from '../hooks';
|
|
18
|
+
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
19
|
+
export function ChipChoiceCustom(_a) {
|
|
20
|
+
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
|
+
const localRef = useRef(null);
|
|
23
|
+
const [value, setValue] = useValueControl({
|
|
24
|
+
value: valueProp,
|
|
25
|
+
onChange: onChangeProp,
|
|
26
|
+
});
|
|
27
|
+
const [open, setOpen] = useState(false);
|
|
28
|
+
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
29
|
+
const closeDroplist = useCallback(() => {
|
|
30
|
+
setOpen(false);
|
|
31
|
+
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() })) }));
|
|
38
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
1
2
|
import { ChipChoiceCommonProps } from '../types';
|
|
2
3
|
export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
3
4
|
/** Значение компонента */
|
|
@@ -7,6 +8,6 @@ export type ChipChoiceDateProps = ChipChoiceCommonProps & {
|
|
|
7
8
|
/** Колбек смены значения */
|
|
8
9
|
onChange?(value: Date): void;
|
|
9
10
|
/** Колбек формирующий строковое представление выбранного значения. Принимает выбранное значение */
|
|
10
|
-
|
|
11
|
+
valueRender?(value?: Date): ReactNode;
|
|
11
12
|
};
|
|
12
|
-
export declare function ChipChoiceDate({ size, value, defaultValue, onChange,
|
|
13
|
+
export declare function ChipChoiceDate({ size, value, defaultValue, onChange, valueRender, dropDownClassName, ...rest }: ChipChoiceDateProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -10,22 +10,32 @@ 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 {
|
|
13
|
+
import { useCallback, useRef, useState } from 'react';
|
|
14
14
|
import { Calendar } from '@snack-uikit/calendar';
|
|
15
|
+
import { Dropdown } from '@snack-uikit/dropdown';
|
|
15
16
|
import { useLocale } from '@snack-uikit/locale';
|
|
16
|
-
import {
|
|
17
|
+
import { useValueControl } from '@snack-uikit/utils';
|
|
18
|
+
import { CHIP_CHOICE_TEST_IDS, SIZE } from '../../../constants';
|
|
17
19
|
import { CALENDAR_SIZE_MAP } from '../constants';
|
|
18
|
-
import {
|
|
20
|
+
import { useHandleOnKeyDown } from '../hooks';
|
|
21
|
+
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
19
22
|
export function ChipChoiceDate(_a) {
|
|
20
|
-
var { size = SIZE.S, value, defaultValue, onChange,
|
|
21
|
-
const [selectedValue, setSelectedValue] =
|
|
23
|
+
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName"]);
|
|
24
|
+
const [selectedValue, setSelectedValue] = useValueControl({ value, defaultValue, onChange });
|
|
25
|
+
const localRef = useRef(null);
|
|
26
|
+
const [open, setOpen] = useState(false);
|
|
27
|
+
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
28
|
+
const closeDroplist = useCallback(() => {
|
|
29
|
+
setOpen(false);
|
|
30
|
+
setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
31
|
+
}, []);
|
|
22
32
|
const { t } = useLocale('Chips');
|
|
23
|
-
const valueToRender =
|
|
24
|
-
?
|
|
33
|
+
const valueToRender = valueRender
|
|
34
|
+
? valueRender(selectedValue)
|
|
25
35
|
: (selectedValue && new Date(selectedValue).toLocaleDateString()) || t('allLabel');
|
|
26
36
|
const clearValue = () => setSelectedValue(undefined);
|
|
27
|
-
return (_jsx(
|
|
37
|
+
return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: 'date', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
|
|
28
38
|
setSelectedValue(value);
|
|
29
39
|
closeDroplist();
|
|
30
|
-
}, navigationStartRef: element => element === null || element === void 0 ? void 0 : element.focus(), onFocusLeave: closeDroplist })) })));
|
|
40
|
+
}, navigationStartRef: element => element === null || element === void 0 ? void 0 : element.focus(), onFocusLeave: closeDroplist }), 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() })) }));
|
|
31
41
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
1
2
|
import { ChipChoiceCommonProps } from '../types';
|
|
2
3
|
type Range = [Date, Date];
|
|
3
4
|
export type ChipChoiceDateRangeProps = ChipChoiceCommonProps & {
|
|
@@ -8,7 +9,7 @@ export type ChipChoiceDateRangeProps = ChipChoiceCommonProps & {
|
|
|
8
9
|
/** Колбек смены значения */
|
|
9
10
|
onChange?(value: Range): void;
|
|
10
11
|
/** Колбек формирующий строковое представление выбранного значения. Принимает массив выбранных значений */
|
|
11
|
-
|
|
12
|
+
valueRender?(value?: Range): ReactNode;
|
|
12
13
|
};
|
|
13
|
-
export declare function ChipChoiceDateRange({ size, value, defaultValue, onChange,
|
|
14
|
+
export declare function ChipChoiceDateRange({ size, value, defaultValue, onChange, valueRender, dropDownClassName, ...rest }: ChipChoiceDateRangeProps): import("react/jsx-runtime").JSX.Element;
|
|
14
15
|
export {};
|
|
@@ -10,12 +10,15 @@ 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
14
|
import { useUncontrolledProp } from 'uncontrollable';
|
|
14
15
|
import { Calendar } from '@snack-uikit/calendar';
|
|
16
|
+
import { Dropdown } from '@snack-uikit/dropdown';
|
|
15
17
|
import { useLocale } from '@snack-uikit/locale';
|
|
16
|
-
import { DEFAULT_EMPTY_VALUE, SIZE } from '../../../constants';
|
|
18
|
+
import { CHIP_CHOICE_TEST_IDS, DEFAULT_EMPTY_VALUE, SIZE } from '../../../constants';
|
|
17
19
|
import { CALENDAR_SIZE_MAP } from '../constants';
|
|
18
|
-
import {
|
|
20
|
+
import { useHandleOnKeyDown } from '../hooks';
|
|
21
|
+
import { ChipChoiceBase } from './ChipChoiceBase';
|
|
19
22
|
function defaultRangeFormatter({ value, allLabel }) {
|
|
20
23
|
if (!value || !value.length)
|
|
21
24
|
return allLabel;
|
|
@@ -23,18 +26,25 @@ function defaultRangeFormatter({ value, allLabel }) {
|
|
|
23
26
|
return `${from.toLocaleDateString()} ${DEFAULT_EMPTY_VALUE} ${to.toLocaleDateString()}`;
|
|
24
27
|
}
|
|
25
28
|
export function ChipChoiceDateRange(_a) {
|
|
26
|
-
var { size = SIZE.S, value, defaultValue, onChange,
|
|
29
|
+
var { size = SIZE.S, value, defaultValue, onChange, valueRender, dropDownClassName } = _a, rest = __rest(_a, ["size", "value", "defaultValue", "onChange", "valueRender", "dropDownClassName"]);
|
|
27
30
|
const [selectedValue, setSelectedValue] = useUncontrolledProp(value, defaultValue, onChange);
|
|
28
31
|
const { t } = useLocale('Chips');
|
|
29
|
-
const valueToRender =
|
|
30
|
-
?
|
|
32
|
+
const valueToRender = valueRender
|
|
33
|
+
? valueRender(selectedValue)
|
|
31
34
|
: defaultRangeFormatter({ value: selectedValue, allLabel: t('allLabel') });
|
|
32
35
|
const clearValue = () => setSelectedValue(undefined);
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
const localRef = useRef(null);
|
|
37
|
+
const [open, setOpen] = useState(false);
|
|
38
|
+
const closeDroplist = useCallback(() => {
|
|
39
|
+
setOpen(false);
|
|
40
|
+
setTimeout(() => { var _a; return (_a = localRef.current) === null || _a === void 0 ? void 0 : _a.focus(); }, 0);
|
|
41
|
+
}, []);
|
|
42
|
+
const handleOnKeyDown = useHandleOnKeyDown({ setOpen });
|
|
43
|
+
return (_jsx(Dropdown, { content: _jsx(Calendar, { mode: 'range', size: CALENDAR_SIZE_MAP[size], value: selectedValue, onChangeValue: value => {
|
|
44
|
+
setSelectedValue(value);
|
|
35
45
|
closeDroplist();
|
|
36
46
|
},
|
|
37
47
|
// bug with focus
|
|
38
48
|
// navigationStartRef={element => element?.focus()}
|
|
39
|
-
onFocusLeave: closeDroplist })) })));
|
|
49
|
+
onFocusLeave: closeDroplist }), 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() })) }));
|
|
40
50
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ChipChoiceMultipleProps, ContentRenderProps } from '../types';
|
|
2
|
+
import { FlattenOption } from '../utils';
|
|
3
|
+
export type ChipChoiceMultipleValueFormatterProps<T extends ContentRenderProps = ContentRenderProps> = {
|
|
4
|
+
value: FlattenOption<T>[];
|
|
5
|
+
total: number;
|
|
6
|
+
allLabel: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function ChipChoiceMultiple<T extends ContentRenderProps = ContentRenderProps>({ value: valueProp, defaultValue, options, onChange: onChangeProp, valueRender, size, label, searchable, contentRender, dropDownClassName, showClearButton, ...rest }: ChipChoiceMultipleProps<T>): import("react/jsx-runtime").JSX.Element;
|