import { Size } from '../../forms/helpers';
import { Props as ButtonProps } from '../../forms/button/types';
import { ListItemProps, Props as PopupProps } from '../../popup/popup/types';
import { ITEM_ID_ALL, ITEM_ID_NEW } from './utils';
export interface Props {
    /**
     * Выбранный элемент
     *
     * Массив выбранных элементов, если multiselect = true
     */
    modelValue: Item | Item[];
    /**
     * Список вариантов для выбора
     *
     * При работе с api, всегда выводится перед результатами api
     *
     * Используйте либо `items` либо `api`, либо оба параметра в зависимости от задачи
     *
     * Не указывайте одновременно `items` и `api` запрос на получение тех же `items`, в этом нет смысла
     */
    items?: Item[];
    title?: string;
    disabled?: boolean;
    icon?: string;
    /**
     * Модификатор элемента, открывающего popup
     *
     * Добавит класс: `top-selector2-{{ modificator }}`
     */
    modificator?: string;
    size?: Size;
    isError?: boolean;
    openByFocusInput?: PopupProps['openByFocusInput'];
    /**
     * Тип поиска по элементам
     *
     * - none: без поиска
     * - inline: сам Selector является полем ввода, только для `multiselect = false`
     * - popup: поиск будет в popup
     *
     * Для мобильной версии `inline` всегда заменяется на `popup`
     *
     * Константа, после установки менять нельзя
     */
    searchType?: 'none' | 'inline' | 'popup';
    /**
     * Текст для placeholder поля поиска
     */
    placeholder?: string;
    /**
     * Если указан, будет выполнена загрузка результатов через API
     *
     * Константа, после установки заменять нельзя
     *
     * @subcategory Api
     */
    api?: Api.ClientRequest<any> | Api.ClientRequestCustom<any, any, any>;
    /**
     * Функция на установку в запрос `api` параметров поиска
     *
     * Обязательно для `api`, если указан `searchType`
     *
     * Для добавления в API фильтра по полю на основе введенного значения используйте утилиту `genApiSetSearchParams()`
     *
     * @subcategory Api
     */
    apiSetSearchParams?: (api: NonNullable<Props['api']>, search: string) => void;
    /**
     * Минимальная длина для выполнения поиска
     *
     * Константа, после установки менять нельзя
     *
     * @subcategory Api
     */
    minLength?: number;
    /**
     * Использовать кэширование
     *
     * Константа, после установки менять нельзя
     *
     * @subcategory Api
     */
    useCache?: boolean;
    /**
     * Добавить в результаты `item = {id:null, name:search}`, где `search` - введенная строка в поле поиска
     *
     * При добавлении элемента будет вызван emit `appendItem(item)`
     */
    appendSearchToResult?: boolean;
    /**
     * Режим выбора нескольких вариантов
     *
     * Константа, после установки менять нельзя
     *
     * @subcategory Multiselect
     */
    multiselect?: boolean;
    /**
     * Добавить вариант: "Все"
     *
     * Можно указать имя элемента
     *
     * @subcategory Single select
     */
    useAllItem?: boolean | string;
    /**
     * Отобразить кнопку смены значения
     *
     * Работает с props.items без учета Api
     *
     * Нельзя использовать с кнопкой
     *
     * @subcategory Single select
     */
    addChanger?: boolean;
    /**
     * Настройки кнопки
     *
     * Если не указан будет использоваться стандартный стиль селектора
     *
     * @subcategory Single select
     */
    buttonProps?: ButtonProps;
    /**
     * Выводить в placeholder поля поиска выбранное значение `modelValue.name`
     *
     * Всегда включено для `searchType` = `inline`
     *
     * @subcategory Single select
     */
    selectedAsPlaceholder?: boolean;
}
export interface Slots {
    /**
     * Шаблон для генерации элементов списка результатов
     *
     * Принимает параметр item: Type
     *
     * Если шаблон не указан будет выводиться item.name
     *
     * Пример:
     *
     * ```html
     * <div :title="'id: ' + item.id">
     *     {{ item.name }}
     * </div>
     * ```
     */
    item?(props: {
        item: Item;
    }): any;
}
export type Emits = {
    /**
     * Был добавлен новый элемент через поле поиска
     *
     * @see `props.appendSearchToResult`
     */
    'appendItem': [item: Item];
};
export interface PropsItemMulti {
    id: Item['id'];
    name: Item['name'];
}
export type EmitsItemMulti = {
    /**
     * Удалить выбранный элемент
     */
    delete: [item: Item];
};
/**
 * Элемент, который можно выбрать в Selector
 */
export interface Item {
    /**
     * id объекта
     *
     * Если null - объект для добавления, не имеет свой id
     */
    id: number | typeof ITEM_ID_NEW;
    name: string;
    /**
     * Настройки вывода элемента
     */
    listItemProps?: ListItemProps;
    [propName: string]: any;
}
export type ItemAll = {
    id: typeof ITEM_ID_ALL;
    name: string;
};
export type ItemNew = {
    id: typeof ITEM_ID_NEW;
    name: string;
};
export type { Size };
