@salutejs/plasma-new-hope 0.321.1-canary.1931.14570122322.0 → 0.321.1-canary.1937.14653374486.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/Autocomplete/Autocomplete.css +22 -22
- package/cjs/components/Combobox/ComboboxNew/Combobox.css +22 -22
- package/cjs/components/DatePicker/RangeDate/RangeDate.css +22 -22
- package/cjs/components/DatePicker/RangeDate/RangeDatePopover/RangeDatePopover.css +22 -22
- package/cjs/components/DatePicker/SingleDate/SingleDate.css +22 -22
- package/cjs/components/Pagination/Pagination.css +22 -22
- package/cjs/components/Pagination/ui/PaginationSelectPerPage/PaginationSelectPerPage.css +22 -22
- package/cjs/components/Range/Range.css +22 -22
- package/cjs/components/Select/Select.css +22 -22
- package/cjs/components/Select/ui/Target/Target.css +22 -22
- package/cjs/components/Select/ui/Target/ui/Textfield/Textfield.css +22 -22
- package/cjs/components/Slider/Slider.css +22 -22
- package/cjs/components/Slider/components/DoubleUncontrolled/DoubleUncontrolled.css +22 -22
- package/cjs/components/Table/Table.css +22 -22
- package/cjs/components/Table/ui/Cell/Cell.css +22 -22
- package/cjs/components/Table/ui/EditableCell/EditableCell.css +22 -22
- package/cjs/components/Table/ui/HeadCell/HeadCell.css +22 -22
- package/cjs/components/Table/ui/HeadCell/ui/Filter/Filter.css +22 -22
- package/cjs/components/TextField/TextField.styles.js +17 -17
- package/cjs/components/TextField/TextField.styles.js.map +1 -1
- package/cjs/components/TextField/{TextField.styles_1cdp5eg.css → TextField.styles_1895ept.css} +1 -1
- package/cjs/components/TextField/ui/Hint/Hint.css +20 -20
- package/cjs/index.css +22 -22
- package/emotion/cjs/components/Accordion/Accordion.template-doc.mdx +71 -99
- package/emotion/cjs/components/Autocomplete/Autocomplete.template-doc.mdx +454 -523
- package/emotion/cjs/components/Checkbox/Checkbox.template-doc.mdx +3 -3
- package/emotion/cjs/components/Combobox/Combobox.template-doc.mdx +27 -58
- package/emotion/cjs/components/DatePicker/DatePicker.template-doc.mdx +0 -5
- package/emotion/cjs/components/Dropdown/Dropdown.template-doc.mdx +10 -10
- package/emotion/cjs/components/Flow/Flow.template-doc.mdx +2 -2
- package/emotion/cjs/components/Notification/Notification.template-doc.mdx +1 -10
- package/emotion/cjs/components/NumberFormat/NumberFormat.template-doc.mdx +4 -4
- package/emotion/cjs/components/Radiobox/Radiobox.template-doc.mdx +11 -10
- package/emotion/cjs/components/Range/Range.template-doc.mdx +1 -5
- package/emotion/cjs/components/Segment/Segment.template-doc.mdx +3 -3
- package/emotion/cjs/components/Select/Select.template-doc.mdx +27 -27
- package/emotion/cjs/components/Slider/Slider.template-doc.mdx +2 -2
- package/emotion/cjs/components/Switch/Switch.template-doc.mdx +3 -3
- package/emotion/cjs/components/Table/Table.template-doc.mdx +2 -2
- package/emotion/cjs/components/Tabs/Tabs.template-doc.mdx +7 -11
- package/emotion/cjs/components/TextArea/TextArea.template-doc.mdx +2 -9
- package/emotion/cjs/components/TextField/TextField.styles.js +23 -30
- package/emotion/cjs/components/TextField/TextField.template-doc.mdx +32 -117
- package/emotion/cjs/components/Toast/Toast.template-doc.mdx +2 -48
- package/emotion/cjs/components/Tooltip/Tooltip.template-doc.mdx +4 -19
- package/emotion/cjs/components/Tree/Tree.template-doc.mdx +1 -0
- package/emotion/es/components/Accordion/Accordion.template-doc.mdx +71 -99
- package/emotion/es/components/Autocomplete/Autocomplete.template-doc.mdx +454 -523
- package/emotion/es/components/Checkbox/Checkbox.template-doc.mdx +3 -3
- package/emotion/es/components/Combobox/Combobox.template-doc.mdx +27 -58
- package/emotion/es/components/DatePicker/DatePicker.template-doc.mdx +0 -5
- package/emotion/es/components/Dropdown/Dropdown.template-doc.mdx +10 -10
- package/emotion/es/components/Flow/Flow.template-doc.mdx +2 -2
- package/emotion/es/components/Notification/Notification.template-doc.mdx +1 -10
- package/emotion/es/components/NumberFormat/NumberFormat.template-doc.mdx +4 -4
- package/emotion/es/components/Radiobox/Radiobox.template-doc.mdx +11 -10
- package/emotion/es/components/Range/Range.template-doc.mdx +1 -5
- package/emotion/es/components/Segment/Segment.template-doc.mdx +3 -3
- package/emotion/es/components/Select/Select.template-doc.mdx +27 -27
- package/emotion/es/components/Slider/Slider.template-doc.mdx +2 -2
- package/emotion/es/components/Switch/Switch.template-doc.mdx +3 -3
- package/emotion/es/components/Table/Table.template-doc.mdx +2 -2
- package/emotion/es/components/Tabs/Tabs.template-doc.mdx +7 -11
- package/emotion/es/components/TextArea/TextArea.template-doc.mdx +2 -9
- package/emotion/es/components/TextField/TextField.styles.js +23 -30
- package/emotion/es/components/TextField/TextField.template-doc.mdx +32 -117
- package/emotion/es/components/Toast/Toast.template-doc.mdx +2 -48
- package/emotion/es/components/Tooltip/Tooltip.template-doc.mdx +4 -19
- package/emotion/es/components/Tree/Tree.template-doc.mdx +1 -0
- package/es/components/Autocomplete/Autocomplete.css +22 -22
- package/es/components/Combobox/ComboboxNew/Combobox.css +22 -22
- package/es/components/DatePicker/RangeDate/RangeDate.css +22 -22
- package/es/components/DatePicker/RangeDate/RangeDatePopover/RangeDatePopover.css +22 -22
- package/es/components/DatePicker/SingleDate/SingleDate.css +22 -22
- package/es/components/Pagination/Pagination.css +22 -22
- package/es/components/Pagination/ui/PaginationSelectPerPage/PaginationSelectPerPage.css +22 -22
- package/es/components/Range/Range.css +22 -22
- package/es/components/Select/Select.css +22 -22
- package/es/components/Select/ui/Target/Target.css +22 -22
- package/es/components/Select/ui/Target/ui/Textfield/Textfield.css +22 -22
- package/es/components/Slider/Slider.css +22 -22
- package/es/components/Slider/components/DoubleUncontrolled/DoubleUncontrolled.css +22 -22
- package/es/components/Table/Table.css +22 -22
- package/es/components/Table/ui/Cell/Cell.css +22 -22
- package/es/components/Table/ui/EditableCell/EditableCell.css +22 -22
- package/es/components/Table/ui/HeadCell/HeadCell.css +22 -22
- package/es/components/Table/ui/HeadCell/ui/Filter/Filter.css +22 -22
- package/es/components/TextField/TextField.styles.js +17 -17
- package/es/components/TextField/TextField.styles.js.map +1 -1
- package/es/components/TextField/{TextField.styles_1cdp5eg.css → TextField.styles_1895ept.css} +1 -1
- package/es/components/TextField/ui/Hint/Hint.css +20 -20
- package/es/index.css +22 -22
- package/package.json +4 -4
- package/styled-components/cjs/components/Accordion/Accordion.template-doc.mdx +71 -99
- package/styled-components/cjs/components/Autocomplete/Autocomplete.template-doc.mdx +454 -523
- package/styled-components/cjs/components/Checkbox/Checkbox.template-doc.mdx +3 -3
- package/styled-components/cjs/components/Combobox/Combobox.template-doc.mdx +27 -58
- package/styled-components/cjs/components/DatePicker/DatePicker.template-doc.mdx +0 -5
- package/styled-components/cjs/components/Dropdown/Dropdown.template-doc.mdx +10 -10
- package/styled-components/cjs/components/Flow/Flow.template-doc.mdx +2 -2
- package/styled-components/cjs/components/Notification/Notification.template-doc.mdx +1 -10
- package/styled-components/cjs/components/NumberFormat/NumberFormat.template-doc.mdx +4 -4
- package/styled-components/cjs/components/Radiobox/Radiobox.template-doc.mdx +11 -10
- package/styled-components/cjs/components/Range/Range.template-doc.mdx +1 -5
- package/styled-components/cjs/components/Segment/Segment.template-doc.mdx +3 -3
- package/styled-components/cjs/components/Select/Select.template-doc.mdx +27 -27
- package/styled-components/cjs/components/Slider/Slider.template-doc.mdx +2 -2
- package/styled-components/cjs/components/Switch/Switch.template-doc.mdx +3 -3
- package/styled-components/cjs/components/Table/Table.template-doc.mdx +2 -2
- package/styled-components/cjs/components/Tabs/Tabs.template-doc.mdx +7 -11
- package/styled-components/cjs/components/TextArea/TextArea.template-doc.mdx +2 -9
- package/styled-components/cjs/components/TextField/TextField.styles.js +2 -1
- package/styled-components/cjs/components/TextField/TextField.template-doc.mdx +32 -117
- package/styled-components/cjs/components/Toast/Toast.template-doc.mdx +2 -48
- package/styled-components/cjs/components/Tooltip/Tooltip.template-doc.mdx +4 -19
- package/styled-components/cjs/components/Tree/Tree.template-doc.mdx +1 -0
- package/styled-components/es/components/Accordion/Accordion.template-doc.mdx +71 -99
- package/styled-components/es/components/Autocomplete/Autocomplete.template-doc.mdx +454 -523
- package/styled-components/es/components/Checkbox/Checkbox.template-doc.mdx +3 -3
- package/styled-components/es/components/Combobox/Combobox.template-doc.mdx +27 -58
- package/styled-components/es/components/DatePicker/DatePicker.template-doc.mdx +0 -5
- package/styled-components/es/components/Dropdown/Dropdown.template-doc.mdx +10 -10
- package/styled-components/es/components/Flow/Flow.template-doc.mdx +2 -2
- package/styled-components/es/components/Notification/Notification.template-doc.mdx +1 -10
- package/styled-components/es/components/NumberFormat/NumberFormat.template-doc.mdx +4 -4
- package/styled-components/es/components/Radiobox/Radiobox.template-doc.mdx +11 -10
- package/styled-components/es/components/Range/Range.template-doc.mdx +1 -5
- package/styled-components/es/components/Segment/Segment.template-doc.mdx +3 -3
- package/styled-components/es/components/Select/Select.template-doc.mdx +27 -27
- package/styled-components/es/components/Slider/Slider.template-doc.mdx +2 -2
- package/styled-components/es/components/Switch/Switch.template-doc.mdx +3 -3
- package/styled-components/es/components/Table/Table.template-doc.mdx +2 -2
- package/styled-components/es/components/Tabs/Tabs.template-doc.mdx +7 -11
- package/styled-components/es/components/TextArea/TextArea.template-doc.mdx +2 -9
- package/styled-components/es/components/TextField/TextField.styles.js +2 -1
- package/styled-components/es/components/TextField/TextField.template-doc.mdx +32 -117
- package/styled-components/es/components/Toast/Toast.template-doc.mdx +2 -48
- package/styled-components/es/components/Tooltip/Tooltip.template-doc.mdx +4 -19
- package/styled-components/es/components/Tree/Tree.template-doc.mdx +1 -0
- package/types/components/TextField/TextField.styles.d.ts.map +1 -1
- /package/emotion/cjs/components/Combobox/ComboboxOld/{Combobox.doc.mdx → Combobox.template-doc.mdx} +0 -0
- /package/emotion/es/components/Combobox/ComboboxOld/{Combobox.doc.mdx → Combobox.template-doc.mdx} +0 -0
- /package/styled-components/cjs/components/Combobox/ComboboxOld/{Combobox.doc.mdx → Combobox.template-doc.mdx} +0 -0
- /package/styled-components/es/components/Combobox/ComboboxOld/{Combobox.doc.mdx → Combobox.template-doc.mdx} +0 -0
@@ -14,8 +14,10 @@ import TabItem from '@theme/TabItem';
|
|
14
14
|
<PropsTable name="Autocomplete" />
|
15
15
|
|
16
16
|
## Использование
|
17
|
-
Расширенная версия компонента `TextField`.
|
18
|
-
|
17
|
+
Расширенная версия компонента `TextField`.
|
18
|
+
|
19
|
+
Добавилась возможность использования выпадающего списка с подсказками.\
|
20
|
+
По умолчанию подсказки фильтруются вне зависимости от регистра. Но это можно изменить, прокинув свой callback `filter`.\
|
19
21
|
Все пропсы, которые поддерживает компонент `TextField` также поддерживаются и здесь.
|
20
22
|
Формат подсказок `suggestions` следующий:
|
21
23
|
|
@@ -45,534 +47,463 @@ type SuggestionItem = {
|
|
45
47
|
import { Autocomplete } from '@salutejs/{{ package }}';
|
46
48
|
|
47
49
|
export function App() {
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
</TabItem>
|
109
|
-
<TabItem value="controlled" label="Controlled">
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
export function App() {
|
115
|
-
const mockData = [
|
116
|
-
{ label: 'Алексей Смирнов' },
|
117
|
-
{ label: 'Екатерина Иванова' },
|
118
|
-
{ label: 'Дмитрий Петров' },
|
119
|
-
{ label: 'Ольга Васильева' },
|
120
|
-
{ label: 'Сергей Сидоров' },
|
121
|
-
{ label: 'Мария Кузнецова' },
|
122
|
-
{ label: 'Андрей Попов' },
|
123
|
-
{ label: 'Анна Николаева' },
|
124
|
-
{ label: 'Иван Федоров' },
|
125
|
-
{ label: 'Наталья Морозова' },
|
126
|
-
{ label: 'Михаил Павлов' },
|
127
|
-
{ label: 'Елена Романова' },
|
128
|
-
{ label: 'Владимир Киселев' },
|
129
|
-
{ label: 'Татьяна Захарова' },
|
130
|
-
{ label: 'Николай Семенов' },
|
131
|
-
{ label: 'Юлия Белова' },
|
132
|
-
{ label: 'Александр Гусев' },
|
133
|
-
{ label: 'Оксана Яковлева' },
|
134
|
-
{ label: 'Игорь Егорова' },
|
135
|
-
{ label: 'Вера Тихомирова' },
|
136
|
-
{ label: 'Артем Григорьев' },
|
137
|
-
{ label: 'Евгения Козлова' },
|
138
|
-
{ label: 'Максим Лебедев' },
|
139
|
-
{ label: 'Виктория Калашникова' },
|
140
|
-
{ label: 'Константин Абрамов' },
|
141
|
-
{ label: 'Светлана Новикова' },
|
142
|
-
{ label: 'Юрий Волков' },
|
143
|
-
{ label: 'Валентина Воробьева' },
|
144
|
-
{ label: 'Павел Сергеев' },
|
145
|
-
{ label: 'Людмила Виноградова' },
|
146
|
-
{ label: 'Антон Соловьев' },
|
147
|
-
{ label: 'Маргарита Цветкова' },
|
148
|
-
{ label: 'Роман Трофимов' },
|
149
|
-
{ label: 'Лариса Зайцева' },
|
150
|
-
{ label: 'Евгений Никитин' },
|
151
|
-
{ label: 'Галина Михайлова' },
|
152
|
-
{ label: 'Владислав Антонов' },
|
153
|
-
{ label: 'Дарья Филатова' },
|
154
|
-
{ label: 'Олег Буров' },
|
155
|
-
{ label: 'Инна Медведева' },
|
156
|
-
{ label: 'Вячеслав Крылов' },
|
157
|
-
{ label: 'Тамара Беляева' },
|
158
|
-
{ label: 'Кирилл Марков' },
|
159
|
-
{ label: 'Марина Пономарева' },
|
160
|
-
{ label: 'Борис Захаров' },
|
161
|
-
{ label: 'Жанна Савельева' },
|
162
|
-
{ label: 'Федор Жуков' },
|
163
|
-
{ label: 'Елизавета Логинова' },
|
164
|
-
{ label: 'Виктор Рыбаков' },
|
165
|
-
{ label: 'Лилия Макарова' },
|
166
|
-
];
|
167
|
-
|
168
|
-
const [value, setValue] = useState('')
|
169
|
-
|
170
|
-
return (
|
171
|
-
<div style=\{{ display: 'block', height:"400px" }}>
|
172
|
-
<Autocomplete value={value} onChange={(e) => setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
|
173
|
-
</div>
|
174
|
-
);
|
175
|
-
}
|
176
|
-
```
|
177
|
-
</TabItem>
|
178
|
-
<TabItem value="infinite" label="Infinite Loading">
|
179
|
-
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе).
|
180
|
-
|
181
|
-
```tsx live
|
182
|
-
import React from 'react';
|
183
|
-
import { Autocomplete, Cell, Spinner } from '@salutejs/{{ package }}';
|
184
|
-
|
185
|
-
export function App() {
|
186
|
-
const mockData = [
|
187
|
-
{ label: 'Алексей Смирнов' },
|
188
|
-
{ label: 'Екатерина Иванова' },
|
189
|
-
{ label: 'Дмитрий Петров' },
|
190
|
-
{ label: 'Ольга Васильева' },
|
191
|
-
{ label: 'Сергей Сидоров' },
|
192
|
-
{ label: 'Мария Кузнецова' },
|
193
|
-
{ label: 'Андрей Попов' },
|
194
|
-
{ label: 'Анна Николаева' },
|
195
|
-
{ label: 'Иван Федоров' },
|
196
|
-
{ label: 'Наталья Морозова' },
|
197
|
-
{ label: 'Михаил Павлов' },
|
198
|
-
{ label: 'Елена Романова' },
|
199
|
-
{ label: 'Владимир Киселев' },
|
200
|
-
{ label: 'Татьяна Захарова' },
|
201
|
-
{ label: 'Николай Семенов' },
|
202
|
-
{ label: 'Юлия Белова' },
|
203
|
-
{ label: 'Александр Гусев' },
|
204
|
-
{ label: 'Оксана Яковлева' },
|
205
|
-
{ label: 'Игорь Егорова' },
|
206
|
-
{ label: 'Вера Тихомирова' },
|
207
|
-
{ label: 'Артем Григорьев' },
|
208
|
-
{ label: 'Евгения Козлова' },
|
209
|
-
{ label: 'Максим Лебедев' },
|
210
|
-
{ label: 'Виктория Калашникова' },
|
211
|
-
{ label: 'Константин Абрамов' },
|
212
|
-
{ label: 'Светлана Новикова' },
|
213
|
-
{ label: 'Юрий Волков' },
|
214
|
-
{ label: 'Валентина Воробьева' },
|
215
|
-
{ label: 'Павел Сергеев' },
|
216
|
-
{ label: 'Людмила Виноградова' },
|
217
|
-
{ label: 'Антон Соловьев' },
|
218
|
-
{ label: 'Маргарита Цветкова' },
|
219
|
-
{ label: 'Роман Трофимов' },
|
220
|
-
{ label: 'Лариса Зайцева' },
|
221
|
-
{ label: 'Евгений Никитин' },
|
222
|
-
{ label: 'Галина Михайлова' },
|
223
|
-
{ label: 'Владислав Антонов' },
|
224
|
-
{ label: 'Дарья Филатова' },
|
225
|
-
{ label: 'Олег Буров' },
|
226
|
-
{ label: 'Инна Медведева' },
|
227
|
-
{ label: 'Вячеслав Крылов' },
|
228
|
-
{ label: 'Тамара Беляева' },
|
229
|
-
{ label: 'Кирилл Марков' },
|
230
|
-
{ label: 'Марина Пономарева' },
|
231
|
-
{ label: 'Борис Захаров' },
|
232
|
-
{ label: 'Жанна Савельева' },
|
233
|
-
{ label: 'Федор Жуков' },
|
234
|
-
{ label: 'Елизавета Логинова' },
|
235
|
-
{ label: 'Виктор Рыбаков' },
|
236
|
-
{ label: 'Лилия Макарова' },
|
237
|
-
];
|
238
|
-
|
239
|
-
const getData = async (data, page, pageSize = 10) => {
|
240
|
-
return new Promise((resolve) => {
|
241
|
-
setTimeout(() => {
|
242
|
-
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
|
243
|
-
}, 1500)
|
244
|
-
})
|
245
|
-
}
|
246
|
-
|
247
|
-
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
|
248
|
-
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
|
249
|
-
|
250
|
-
const onScroll = async (e) => {
|
251
|
-
if (isInfiniteLoading) return
|
252
|
-
|
253
|
-
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
|
254
|
-
setIsInfiniteLoading(true)
|
255
|
-
|
256
|
-
const res = await getData(mockData, suggestions.page + 1, 10)
|
257
|
-
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
|
258
|
-
|
259
|
-
setIsInfiniteLoading(false)
|
260
|
-
}
|
261
|
-
};
|
50
|
+
const mockData = [
|
51
|
+
{ label: 'Алексей Смирнов' },
|
52
|
+
{ label: 'Екатерина Иванова' },
|
53
|
+
{ label: 'Дмитрий Петров' },
|
54
|
+
{ label: 'Ольга Васильева' },
|
55
|
+
{ label: 'Сергей Сидоров' },
|
56
|
+
{ label: 'Мария Кузнецова' },
|
57
|
+
{ label: 'Андрей Попов' },
|
58
|
+
{ label: 'Анна Николаева' },
|
59
|
+
{ label: 'Иван Федоров' },
|
60
|
+
{ label: 'Наталья Морозова' },
|
61
|
+
{ label: 'Михаил Павлов' },
|
62
|
+
{ label: 'Елена Романова' },
|
63
|
+
{ label: 'Владимир Киселев' },
|
64
|
+
{ label: 'Татьяна Захарова' },
|
65
|
+
{ label: 'Николай Семенов' },
|
66
|
+
{ label: 'Юлия Белова' },
|
67
|
+
{ label: 'Александр Гусев' },
|
68
|
+
{ label: 'Оксана Яковлева' },
|
69
|
+
{ label: 'Игорь Егорова' },
|
70
|
+
{ label: 'Вера Тихомирова' },
|
71
|
+
{ label: 'Артем Григорьев' },
|
72
|
+
{ label: 'Евгения Козлова' },
|
73
|
+
{ label: 'Максим Лебедев' },
|
74
|
+
{ label: 'Виктория Калашникова' },
|
75
|
+
{ label: 'Константин Абрамов' },
|
76
|
+
{ label: 'Светлана Новикова' },
|
77
|
+
{ label: 'Юрий Волков' },
|
78
|
+
{ label: 'Валентина Воробьева' },
|
79
|
+
{ label: 'Павел Сергеев' },
|
80
|
+
{ label: 'Людмила Виноградова' },
|
81
|
+
{ label: 'Антон Соловьев' },
|
82
|
+
{ label: 'Маргарита Цветкова' },
|
83
|
+
{ label: 'Роман Трофимов' },
|
84
|
+
{ label: 'Лариса Зайцева' },
|
85
|
+
{ label: 'Евгений Никитин' },
|
86
|
+
{ label: 'Галина Михайлова' },
|
87
|
+
{ label: 'Владислав Антонов' },
|
88
|
+
{ label: 'Дарья Филатова' },
|
89
|
+
{ label: 'Олег Буров' },
|
90
|
+
{ label: 'Инна Медведева' },
|
91
|
+
{ label: 'Вячеслав Крылов' },
|
92
|
+
{ label: 'Тамара Беляева' },
|
93
|
+
{ label: 'Кирилл Марков' },
|
94
|
+
{ label: 'Марина Пономарева' },
|
95
|
+
{ label: 'Борис Захаров' },
|
96
|
+
{ label: 'Жанна Савельева' },
|
97
|
+
{ label: 'Федор Жуков' },
|
98
|
+
{ label: 'Елизавета Логинова' },
|
99
|
+
{ label: 'Виктор Рыбаков' },
|
100
|
+
{ label: 'Лилия Макарова' },
|
101
|
+
];
|
102
|
+
|
103
|
+
return (
|
104
|
+
<div style={{ display: 'block', height:"400px" }}>
|
105
|
+
<Autocomplete suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
|
106
|
+
</div>
|
107
|
+
);
|
108
|
+
}
|
109
|
+
```
|
110
|
+
</TabItem>
|
111
|
+
<TabItem value="controlled" label="Controlled">
|
112
|
+
```tsx live
|
113
|
+
import React from 'react';
|
114
|
+
import { Autocomplete } from '@salutejs/{{ package }}';
|
262
115
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
}
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
{ label: '
|
290
|
-
{ label: '
|
291
|
-
{ label: '
|
292
|
-
{ label: '
|
293
|
-
{ label: '
|
294
|
-
{ label: '
|
295
|
-
{ label: '
|
296
|
-
{ label: '
|
297
|
-
{ label: '
|
298
|
-
{ label: '
|
299
|
-
{ label: '
|
300
|
-
{ label: '
|
301
|
-
{ label: '
|
302
|
-
{ label: '
|
303
|
-
{ label: '
|
304
|
-
{ label: '
|
305
|
-
{ label: '
|
306
|
-
{ label: '
|
307
|
-
{ label: '
|
308
|
-
{ label: '
|
309
|
-
{ label: '
|
310
|
-
{ label: '
|
311
|
-
{ label: '
|
312
|
-
{ label: '
|
313
|
-
{ label: '
|
314
|
-
{ label: '
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
{
|
321
|
-
{ label
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
{
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
{ label: '
|
337
|
-
{ label: '
|
338
|
-
{ label: '
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
},
|
350
|
-
}
|
351
|
-
}
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
},
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
}
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
{ label: '
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
{
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
{
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
{
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
{
|
414
|
-
|
415
|
-
{
|
416
|
-
|
417
|
-
{
|
418
|
-
{
|
419
|
-
{
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
{
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
},
|
442
|
-
}
|
443
|
-
}
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
}
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
}
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
{ label
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
{
|
508
|
-
|
509
|
-
{
|
510
|
-
{
|
511
|
-
{ label
|
512
|
-
{
|
513
|
-
|
514
|
-
{
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
{
|
530
|
-
{
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
{ label: '
|
535
|
-
{ label: '
|
536
|
-
{ label: '
|
537
|
-
{ label: '
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
}
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
}
|
567
|
-
|
568
|
-
|
116
|
+
export function App() {
|
117
|
+
const mockData = [
|
118
|
+
{ label: 'Алексей Смирнов' },
|
119
|
+
{ label: 'Екатерина Иванова' },
|
120
|
+
{ label: 'Дмитрий Петров' },
|
121
|
+
{ label: 'Ольга Васильева' },
|
122
|
+
{ label: 'Сергей Сидоров' },
|
123
|
+
{ label: 'Мария Кузнецова' },
|
124
|
+
{ label: 'Андрей Попов' },
|
125
|
+
{ label: 'Анна Николаева' },
|
126
|
+
{ label: 'Иван Федоров' },
|
127
|
+
{ label: 'Наталья Морозова' },
|
128
|
+
{ label: 'Михаил Павлов' },
|
129
|
+
{ label: 'Елена Романова' },
|
130
|
+
{ label: 'Владимир Киселев' },
|
131
|
+
{ label: 'Татьяна Захарова' },
|
132
|
+
{ label: 'Николай Семенов' },
|
133
|
+
{ label: 'Юлия Белова' },
|
134
|
+
{ label: 'Александр Гусев' },
|
135
|
+
{ label: 'Оксана Яковлева' },
|
136
|
+
{ label: 'Игорь Егорова' },
|
137
|
+
{ label: 'Вера Тихомирова' },
|
138
|
+
{ label: 'Артем Григорьев' },
|
139
|
+
{ label: 'Евгения Козлова' },
|
140
|
+
{ label: 'Максим Лебедев' },
|
141
|
+
{ label: 'Виктория Калашникова' },
|
142
|
+
{ label: 'Константин Абрамов' },
|
143
|
+
{ label: 'Светлана Новикова' },
|
144
|
+
{ label: 'Юрий Волков' },
|
145
|
+
{ label: 'Валентина Воробьева' },
|
146
|
+
{ label: 'Павел Сергеев' },
|
147
|
+
{ label: 'Людмила Виноградова' },
|
148
|
+
{ label: 'Антон Соловьев' },
|
149
|
+
{ label: 'Маргарита Цветкова' },
|
150
|
+
{ label: 'Роман Трофимов' },
|
151
|
+
{ label: 'Лариса Зайцева' },
|
152
|
+
{ label: 'Евгений Никитин' },
|
153
|
+
{ label: 'Галина Михайлова' },
|
154
|
+
{ label: 'Владислав Антонов' },
|
155
|
+
{ label: 'Дарья Филатова' },
|
156
|
+
{ label: 'Олег Буров' },
|
157
|
+
{ label: 'Инна Медведева' },
|
158
|
+
{ label: 'Вячеслав Крылов' },
|
159
|
+
{ label: 'Тамара Беляева' },
|
160
|
+
{ label: 'Кирилл Марков' },
|
161
|
+
{ label: 'Марина Пономарева' },
|
162
|
+
{ label: 'Борис Захаров' },
|
163
|
+
{ label: 'Жанна Савельева' },
|
164
|
+
{ label: 'Федор Жуков' },
|
165
|
+
{ label: 'Елизавета Логинова' },
|
166
|
+
{ label: 'Виктор Рыбаков' },
|
167
|
+
{ label: 'Лилия Макарова' },
|
168
|
+
];
|
169
|
+
|
170
|
+
const [value, setValue] = useState('')
|
171
|
+
|
172
|
+
return (
|
173
|
+
<div style={{ display: 'block', height:"400px" }}>
|
174
|
+
<Autocomplete value={value} onChange={(e) => setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
|
175
|
+
</div>
|
176
|
+
);
|
177
|
+
}
|
178
|
+
```
|
179
|
+
</TabItem>
|
180
|
+
<TabItem value="infinite" label="Infinite Loading">
|
181
|
+
Это пример с бесконечным loading подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе).
|
182
|
+
|
183
|
+
```tsx live
|
184
|
+
import React from 'react';
|
185
|
+
import { Autocomplete, Cell, Spinner } from '@salutejs/{{ package }}';
|
186
|
+
|
187
|
+
export function App() {
|
188
|
+
const mockData = [
|
189
|
+
{ label: 'Алексей Смирнов' },
|
190
|
+
{ label: 'Екатерина Иванова' },
|
191
|
+
{ label: 'Дмитрий Петров' },
|
192
|
+
{ label: 'Ольга Васильева' },
|
193
|
+
{ label: 'Сергей Сидоров' },
|
194
|
+
{ label: 'Мария Кузнецова' },
|
195
|
+
{ label: 'Андрей Попов' },
|
196
|
+
{ label: 'Анна Николаева' },
|
197
|
+
{ label: 'Иван Федоров' },
|
198
|
+
{ label: 'Наталья Морозова' },
|
199
|
+
{ label: 'Михаил Павлов' },
|
200
|
+
{ label: 'Елена Романова' },
|
201
|
+
{ label: 'Владимир Киселев' },
|
202
|
+
{ label: 'Татьяна Захарова' },
|
203
|
+
{ label: 'Николай Семенов' },
|
204
|
+
{ label: 'Юлия Белова' },
|
205
|
+
{ label: 'Александр Гусев' },
|
206
|
+
{ label: 'Оксана Яковлева' },
|
207
|
+
{ label: 'Игорь Егорова' },
|
208
|
+
{ label: 'Вера Тихомирова' },
|
209
|
+
{ label: 'Артем Григорьев' },
|
210
|
+
{ label: 'Евгения Козлова' },
|
211
|
+
{ label: 'Максим Лебедев' },
|
212
|
+
{ label: 'Виктория Калашникова' },
|
213
|
+
{ label: 'Константин Абрамов' },
|
214
|
+
{ label: 'Светлана Новикова' },
|
215
|
+
{ label: 'Юрий Волков' },
|
216
|
+
{ label: 'Валентина Воробьева' },
|
217
|
+
{ label: 'Павел Сергеев' },
|
218
|
+
{ label: 'Людмила Виноградова' },
|
219
|
+
{ label: 'Антон Соловьев' },
|
220
|
+
{ label: 'Маргарита Цветкова' },
|
221
|
+
{ label: 'Роман Трофимов' },
|
222
|
+
{ label: 'Лариса Зайцева' },
|
223
|
+
{ label: 'Евгений Никитин' },
|
224
|
+
{ label: 'Галина Михайлова' },
|
225
|
+
{ label: 'Владислав Антонов' },
|
226
|
+
{ label: 'Дарья Филатова' },
|
227
|
+
{ label: 'Олег Буров' },
|
228
|
+
{ label: 'Инна Медведева' },
|
229
|
+
{ label: 'Вячеслав Крылов' },
|
230
|
+
{ label: 'Тамара Беляева' },
|
231
|
+
{ label: 'Кирилл Марков' },
|
232
|
+
{ label: 'Марина Пономарева' },
|
233
|
+
{ label: 'Борис Захаров' },
|
234
|
+
{ label: 'Жанна Савельева' },
|
235
|
+
{ label: 'Федор Жуков' },
|
236
|
+
{ label: 'Елизавета Логинова' },
|
237
|
+
{ label: 'Виктор Рыбаков' },
|
238
|
+
{ label: 'Лилия Макарова' },
|
239
|
+
];
|
240
|
+
|
241
|
+
const getData = async (data, page, pageSize = 10) => {
|
242
|
+
return new Promise((resolve) => {
|
243
|
+
setTimeout(() => {
|
244
|
+
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
|
245
|
+
}, 1500)
|
246
|
+
})
|
247
|
+
}
|
248
|
+
|
249
|
+
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
|
250
|
+
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
|
251
|
+
|
252
|
+
const onScroll = async (e) => {
|
253
|
+
if (isInfiniteLoading) return
|
254
|
+
|
255
|
+
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
|
256
|
+
setIsInfiniteLoading(true)
|
257
|
+
|
258
|
+
const res = await getData(mockData, suggestions.page + 1, 10)
|
259
|
+
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
|
260
|
+
|
261
|
+
setIsInfiniteLoading(false)
|
262
|
+
}
|
263
|
+
};
|
264
|
+
|
265
|
+
return (
|
266
|
+
<div style={{ display: 'block', height:"400px" }}>
|
267
|
+
<Autocomplete
|
268
|
+
suggestions={suggestions.data}
|
269
|
+
listMaxHeight="250px"
|
270
|
+
onScroll={onScroll}
|
271
|
+
threshold={0}
|
272
|
+
renderListEnd={isInfiniteLoading ? () => <Cell contentLeft={<Spinner view="primary" />} title="Загрузка" stretching="auto" /> : undefined}
|
273
|
+
label="Label"
|
274
|
+
placeholder="Placeholder"
|
275
|
+
leftHelper="Введите имя Алексей"
|
276
|
+
/>
|
277
|
+
</div>
|
278
|
+
);
|
279
|
+
}
|
280
|
+
```
|
281
|
+
</TabItem>
|
282
|
+
<TabItem value="filter" label="Custom Filter">
|
283
|
+
Пример custom фильтрации на backend. Не забываем отключить дефолтную фильтрацию.
|
284
|
+
|
285
|
+
```tsx live
|
286
|
+
import React from 'react';
|
287
|
+
import { Autocomplete } from '@salutejs/{{ package }}';
|
288
|
+
|
289
|
+
export function App() {
|
290
|
+
const mockData = [
|
291
|
+
{ label: 'Алексей Смирнов' },
|
292
|
+
{ label: 'Екатерина Иванова' },
|
293
|
+
{ label: 'Дмитрий Петров' },
|
294
|
+
{ label: 'Ольга Васильева' },
|
295
|
+
{ label: 'Сергей Сидоров' },
|
296
|
+
{ label: 'Мария Кузнецова' },
|
297
|
+
{ label: 'Андрей Попов' },
|
298
|
+
{ label: 'Анна Николаева' },
|
299
|
+
{ label: 'Иван Федоров' },
|
300
|
+
{ label: 'Наталья Морозова' },
|
301
|
+
{ label: 'Михаил Павлов' },
|
302
|
+
{ label: 'Елена Романова' },
|
303
|
+
{ label: 'Владимир Киселев' },
|
304
|
+
{ label: 'Татьяна Захарова' },
|
305
|
+
{ label: 'Николай Семенов' },
|
306
|
+
{ label: 'Юлия Белова' },
|
307
|
+
{ label: 'Александр Гусев' },
|
308
|
+
{ label: 'Оксана Яковлева' },
|
309
|
+
{ label: 'Игорь Егорова' },
|
310
|
+
{ label: 'Вера Тихомирова' },
|
311
|
+
{ label: 'Артем Григорьев' },
|
312
|
+
{ label: 'Евгения Козлова' },
|
313
|
+
{ label: 'Максим Лебедев' },
|
314
|
+
{ label: 'Виктория Калашникова' },
|
315
|
+
{ label: 'Константин Абрамов' },
|
316
|
+
{ label: 'Светлана Новикова' },
|
317
|
+
{ label: 'Юрий Волков' },
|
318
|
+
{ label: 'Валентина Воробьева' },
|
319
|
+
{ label: 'Павел Сергеев' },
|
320
|
+
{ label: 'Людмила Виноградова' },
|
321
|
+
{ label: 'Антон Соловьев' },
|
322
|
+
{ label: 'Маргарита Цветкова' },
|
323
|
+
{ label: 'Роман Трофимов' },
|
324
|
+
{ label: 'Лариса Зайцева' },
|
325
|
+
{ label: 'Евгений Никитин' },
|
326
|
+
{ label: 'Галина Михайлова' },
|
327
|
+
{ label: 'Владислав Антонов' },
|
328
|
+
{ label: 'Дарья Филатова' },
|
329
|
+
{ label: 'Олег Буров' },
|
330
|
+
{ label: 'Инна Медведева' },
|
331
|
+
{ label: 'Вячеслав Крылов' },
|
332
|
+
{ label: 'Тамара Беляева' },
|
333
|
+
{ label: 'Кирилл Марков' },
|
334
|
+
{ label: 'Марина Пономарева' },
|
335
|
+
{ label: 'Борис Захаров' },
|
336
|
+
{ label: 'Жанна Савельева' },
|
337
|
+
{ label: 'Федор Жуков' },
|
338
|
+
{ label: 'Елизавета Логинова' },
|
339
|
+
{ label: 'Виктор Рыбаков' },
|
340
|
+
{ label: 'Лилия Макарова' },
|
341
|
+
];
|
342
|
+
|
343
|
+
const [value, setValue] = useState('')
|
344
|
+
const [suggestions, setSuggestions] = useState(mockData)
|
345
|
+
|
346
|
+
|
347
|
+
const getData = async (value) => {
|
348
|
+
return new Promise((resolve) => {
|
349
|
+
setTimeout(() => {
|
350
|
+
resolve(mockData.filter(({ label }) => label.toLowerCase().includes(value.toString().toLowerCase())))
|
351
|
+
}, 200)
|
352
|
+
})
|
353
|
+
}
|
354
|
+
|
355
|
+
useEffect(() => {
|
356
|
+
getData(value).then(setSuggestions)
|
357
|
+
}, [value])
|
358
|
+
|
359
|
+
return (
|
360
|
+
<div style={{ display: 'block', height:"400px" }}>
|
361
|
+
<Autocomplete
|
362
|
+
value={value}
|
363
|
+
onChange={(e) => setValue(e.target.value)}
|
364
|
+
onSuggestionSelect={(e) => setValue(e.label)}
|
365
|
+
suggestions={suggestions}
|
366
|
+
listMaxHeight="250px"
|
367
|
+
filter={() => true} // Отключаем дефолтную фильтрацию
|
368
|
+
label="Label"
|
369
|
+
placeholder="Placeholder"
|
370
|
+
leftHelper="Введите имя Алексей"
|
371
|
+
/>
|
372
|
+
</div>
|
373
|
+
);
|
374
|
+
}
|
375
|
+
```
|
376
|
+
</TabItem>
|
377
|
+
<TabItem value="emptyState" label="Empty State">
|
378
|
+
Если произошла ошибка, или же к примеру нужно показать некую информацию пользователю, то для этой цели можно использовать компонент `EmptyState`.
|
379
|
+
|
380
|
+
```tsx live
|
381
|
+
import React from 'react';
|
382
|
+
import { Autocomplete, EmptyState, Spinner } from '@salutejs/{{ package }}';
|
383
|
+
import { IconRefresh } from '@salutejs/plasma-icons';
|
384
|
+
|
385
|
+
export function App() {
|
386
|
+
const mockData = [
|
387
|
+
{ label: 'Алексей Смирнов' },
|
388
|
+
{ label: 'Екатерина Иванова' },
|
389
|
+
{ label: 'Дмитрий Петров' },
|
390
|
+
{ label: 'Ольга Васильева' },
|
391
|
+
{ label: 'Сергей Сидоров' },
|
392
|
+
{ label: 'Мария Кузнецова' },
|
393
|
+
{ label: 'Андрей Попов' },
|
394
|
+
{ label: 'Анна Николаева' },
|
395
|
+
{ label: 'Иван Федоров' },
|
396
|
+
{ label: 'Наталья Морозова' },
|
397
|
+
{ label: 'Михаил Павлов' },
|
398
|
+
{ label: 'Елена Романова' },
|
399
|
+
{ label: 'Владимир Киселев' },
|
400
|
+
{ label: 'Татьяна Захарова' },
|
401
|
+
{ label: 'Николай Семенов' },
|
402
|
+
{ label: 'Юлия Белова' },
|
403
|
+
{ label: 'Александр Гусев' },
|
404
|
+
{ label: 'Оксана Яковлева' },
|
405
|
+
{ label: 'Игорь Егорова' },
|
406
|
+
{ label: 'Вера Тихомирова' },
|
407
|
+
{ label: 'Артем Григорьев' },
|
408
|
+
{ label: 'Евгения Козлова' },
|
409
|
+
{ label: 'Максим Лебедев' },
|
410
|
+
{ label: 'Виктория Калашникова' },
|
411
|
+
{ label: 'Константин Абрамов' },
|
412
|
+
{ label: 'Светлана Новикова' },
|
413
|
+
{ label: 'Юрий Волков' },
|
414
|
+
{ label: 'Валентина Воробьева' },
|
415
|
+
{ label: 'Павел Сергеев' },
|
416
|
+
{ label: 'Людмила Виноградова' },
|
417
|
+
{ label: 'Антон Соловьев' },
|
418
|
+
{ label: 'Маргарита Цветкова' },
|
419
|
+
{ label: 'Роман Трофимов' },
|
420
|
+
{ label: 'Лариса Зайцева' },
|
421
|
+
{ label: 'Евгений Никитин' },
|
422
|
+
{ label: 'Галина Михайлова' },
|
423
|
+
{ label: 'Владислав Антонов' },
|
424
|
+
{ label: 'Дарья Филатова' },
|
425
|
+
{ label: 'Олег Буров' },
|
426
|
+
{ label: 'Инна Медведева' },
|
427
|
+
{ label: 'Вячеслав Крылов' },
|
428
|
+
{ label: 'Тамара Беляева' },
|
429
|
+
{ label: 'Кирилл Марков' },
|
430
|
+
{ label: 'Марина Пономарева' },
|
431
|
+
{ label: 'Борис Захаров' },
|
432
|
+
{ label: 'Жанна Савельева' },
|
433
|
+
{ label: 'Федор Жуков' },
|
434
|
+
{ label: 'Елизавета Логинова' },
|
435
|
+
{ label: 'Виктор Рыбаков' },
|
436
|
+
{ label: 'Лилия Макарова' },
|
437
|
+
];
|
438
|
+
|
439
|
+
const getData = async () => {
|
440
|
+
return new Promise((resolve) => {
|
441
|
+
setTimeout(() => {
|
442
|
+
resolve(mockData)
|
443
|
+
}, 1500)
|
444
|
+
})
|
445
|
+
}
|
446
|
+
|
447
|
+
const [isError, setIsError] = useState(true)
|
448
|
+
const [isLoading, setIsLoading] = useState(false)
|
449
|
+
const [value, setValue] = useState('')
|
450
|
+
const [suggestions, setSuggestions] = useState([])
|
451
|
+
|
452
|
+
const handleGetData = async () => {
|
453
|
+
setIsLoading(true)
|
454
|
+
|
455
|
+
const res = await getData()
|
456
|
+
|
457
|
+
setIsLoading(false)
|
458
|
+
setIsError(false)
|
459
|
+
setSuggestions(res)
|
460
|
+
}
|
461
|
+
|
462
|
+
return (
|
463
|
+
<div style={{ display: 'block', height:"400px" }}>
|
464
|
+
<Autocomplete
|
465
|
+
value={value}
|
466
|
+
onChange={(e) => setValue(e.target.value)}
|
467
|
+
onSuggestionSelect={(e) => setValue(e.label)}
|
468
|
+
suggestions={suggestions}
|
469
|
+
listMaxHeight="250px"
|
470
|
+
renderList={isError ? () => <EmptyState icon={<IconRefresh />} description="Произошла ошибка. Попробуйте обновить." buttonText="Обновить" buttonAction={handleGetData} /> : undefined}
|
471
|
+
contentRight={isLoading ? <Spinner view="primary" /> : undefined}
|
472
|
+
label="Label"
|
473
|
+
placeholder="Placeholder"
|
474
|
+
leftHelper="Введите имя Алексей"
|
475
|
+
/>
|
476
|
+
</div>
|
477
|
+
);
|
478
|
+
}
|
479
|
+
```
|
480
|
+
</TabItem>
|
481
|
+
<TabItem value="virtual" label="Virtual">
|
482
|
+
Свойство `virtual` позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство `listMaxHeight`.
|
483
|
+
Примечание: работает только при количестве отфильтрованных suggestions > 10, в противном случае виртуализация выключается автоматически.
|
484
|
+
|
485
|
+
```tsx live
|
486
|
+
import React from 'react';
|
487
|
+
import { Autocomplete } from '@salutejs/{{ package }}';
|
488
|
+
|
489
|
+
export function App() {
|
490
|
+
const items = Array(10000).fill(1).map((_, i) => ({ label: i.toString() }));
|
491
|
+
|
492
|
+
return (
|
493
|
+
<div style={{ display: 'block', height: "350px" }}>
|
494
|
+
<Autocomplete suggestions={items} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите цифры" virtual />
|
495
|
+
</div>
|
496
|
+
);
|
497
|
+
}
|
498
|
+
```
|
499
|
+
</TabItem>
|
569
500
|
</Tabs>
|
570
501
|
|
571
502
|
## Клавиатурная навигация
|
572
503
|
|
573
504
|
Данный компонент соответствует требования W3C: [Combobox](https://www.w3.org/WAI/ARIA/apg/patterns/combobox/examples/combobox-autocomplete-list/).
|
574
505
|
|
575
|
-
- `Tab, Escape` - закрывает
|
506
|
+
- `Tab, Escape` - закрывает Autocomplete. Перемещает фокус на следующий элемент на странице;
|
576
507
|
- `Enter` - выбираем подсказку из списка;
|
577
508
|
- `Home` - перемещает фокус на первый элемент;
|
578
509
|
- `End` - перемещает фокус на последний элемент;
|