MultipleSelect

import { MultipleSelect } from '@megafon/ui-core';
Демо данные
const items = [
{ title: 'Абхазия', value: 'ABH' },
{ title: 'Армения', value: 'ARM' },
{ title: 'Беларусь', value: 'BLR' },
{ title: 'Вьетнам', value: 'VNM' },
{ title: 'Грузия', value: 'GEO' },
{ title: 'Египет', value: 'EGY' },
{ title: 'Индия', value: 'IND' },
{ title: 'Казахстан', value: 'KAZ' },
{ title: 'Китай', value: 'CHN' },
{ title: 'Мальдивы', value: 'MDV' },
{ title: 'ОАЭ', value: 'ARE' },
{ title: 'Таиланд', value: 'THA' },
{ title: 'Турция', value: 'TUR' },
{ title: 'Узбекистан', value: 'UZB' },
];

Базовое использование

Показать код
<MultipleSelect
      items={items}
      placeholder="Placeholder"
  />
  <MultipleSelect
      items={items}
      selectedItems={items.slice(0,1)}
      placeholder="Добавить маршрут"
      selectLimit={3}
      noticeText="Одновременно можно выбрать максимум 3 страны"
  />

Выключенное состояние

Показать код
<MultipleSelect
      items={items}
      placeholder="Добавить маршрут"
      noticeText="Одновременно можно выбрать максимум 3 страны"
      selectLimit={3}
      disabled
  />
  <MultipleSelect
      items={items}
      selectedItems={items.slice(0,3)}
      noticeText="Одновременно можно выбрать максимум 3 страны"
      disabled
  />

Пользовательская функция поиска

Показать код
<MultipleSelect
      items={items}
      placeholder="Код страны (например, BLR)"
      customSearchFilter={(item, query) => item.value === query}
  />

Контролируемое состояние

Показать код
<DemoMultipleSelectWrapper>
      {({ items, selectedItems, onSelect, onSearch }) => (
          <MultipleSelect
              isControlled
              items={items}
              selectedItems={selectedItems}
              placeholder="Добавить маршрут"
              selectLimit={3}
              onSelect={onSelect}
              onSearch={onSearch}
              searchDelay={250}
          />
      )}
  </DemoSelectWrapper>
Код DemoMultipleSelectWrapper
const searchItems = (items: ItemType[], query: string): ItemType[] => {
if (!query) {
return items;
}
const queryString = query.toLowerCase();
return items.filter(item => item.title?.toLowerCase().includes(queryString));
};
const DemoMultipleSelectWrapper: React.FC<ISelectWrapperProps> = ({ children }) => {
const [currentItems, setCurrentItems] = React.useState<ItemType[]>(items);
const [selectedItems, setSelectedItems] = React.useState<ItemType[]>([]);
const handleSearch = React.useCallback(
(query: string) => {
const matchesItems = searchItems(items, query);
setCurrentItems(matchesItems);
},
[],
);
const handleSelect = React.useCallback(
(items: ItemType[]) => {
setSelectedItems(items);
},
[],
);
return (
<div style={selectWrapperStyle}>
{children({
onSelect: handleSelect,
onSearch: handleSearch,
items: currentItems,
selectedItems,
})}
</div>
);
};
Prop nameTypeDefaultDescription
classNamestring | undefinedДополнительный класс корневого элемента
items*ItemType[]Элементы выпадающего списка
selectedItemsItemType[] | undefined[]Список выбранных элементов
selectLimitnumber | undefinedОграничение количества выбранных элементов
placeholderstring | undefinedТекст внутри поля по умолчанию
maxLengthnumber | undefinedМаксимальное вводимое количество символов
notFoundTextstring | undefinedНичего не нашлосьТекст при отсутствии результатов поиска
noticeTextstring | undefinedДополнительный текст под полем
disabledboolean | undefinedfalseОтключенное состояние
customSearchFilter((item: ItemType, searchQuery: string) => boolean) | undefinedПользовательская функция поиска
onSelect((items: ItemType[]) => void) | undefinedОбработчик выбора элемента селекта
onBlur((e: FocusEvent<HTMLInputElement, Element>) => void) | undefinedОбработчик выхода из фокуса
onFocus((e: FocusEvent<HTMLInputElement, Element>) => void) | undefinedОбработчик входа в фокус
onSearch((query: string) => void) | undefinedОбработчик изменения поля при поиске
searchDelaynumber | undefinedИспользование функции debounce для onSearch
isControlledboolean | undefinedПереводит компонент в контролируемое состояние
classes{ root?: string | undefined; input?: string | undefined; list?: string | undefined; listItem?: string | undefined; tag?: string | undefined; tagButton?: string | undefined; } | undefined{}Дополнительные классы для внутренних элементов
dataAttrs{ root?: Record<string, string> | undefined; input?: Record<string, string> | undefined; list?: Record<string, string> | undefined; listItem?: Record<string, string> | undefined; tag?: Record<...> | undefined; tagButton?: Record<...> | undefined; } | undefinedДополнительные data атрибуты к внутренним элементам