import { ReactNode } from 'react';
import { LabelComponentType, IconComponentType } from 'bloko/blocks/treeSelector/Dummy/types';
import TreeCollection from 'bloko/common/tree/treeCollection';
import { IdCollectionPredicate, TreeFilter, AdditionalDefault } from 'bloko/common/tree/types';
import { Children, FooterExtra } from 'bloko/blocks/compositeSelection/types';
interface PopupTrls {
submit: string;
cancel: string;
searchPlaceholder: string;
notFound?: string;
maxCountError?: string;
}
type WithExcluded = {
/** Можно исключать значения **/
withExcluded: true;
/** Исключенные значения */
excludedValue: string[];
exclusionWithTwoLines?: boolean;
singleChoice?: false;
leavesOnly?: false;
singleCategory?: false;
};
type WithoutExcluded = {
withExcluded?: false;
excludedValue?: never;
exclusionWithTwoLines?: never;
};
type ExcludedFunctionality = WithExcluded | WithoutExcluded;
interface CompositeSelectionProps {
/** Метод которому передаётся объект с необходимыми функциями для вывода частей компонента */
children: Children;
/** Древовидная коллекция */
collection: TreeCollection;
/** Текущее значение */
value: string[];
/** Отображать только листья дерева */
leavesOnly?: boolean;
/** Можно выбрать только один элемент */
singleChoice?: boolean;
/** Способ фильтрации дерева при поиске */
treeFilter?: TreeFilter;
/** Ограничение максимального количества выбранных элементов */
maxItems?: number;
/** Выбираемые элементы ограничены одной категорией */
singleCategory?: boolean;
/** Компонент для вывода метки у элемента дерева */
LabelComponent?: LabelComponentType;
/** Компонент для вывода иконки у элемента дерева */
IconComponent?: IconComponentType;
/** Колбэк при изменении выбора */
onChange?: (items: string[], excludedItems: string[]) => void;
/** Колбэк при снятии фокуса */
onBlur?: () => void;
/** Колбэк при фокусе */
onFocus?: () => void;
/** Заголовок попапа */
title?: string;
/** Блок между заголовком попапа и поисковым инпутом */
contentAfterTitle?: ReactNode;
/** Показывать ли список выбранных */
showSelectedList?: boolean;
/** Отображать ли крестик очистки строки поиска */
searchWithClear?: boolean;
/** Очищать ли поле поиска после выбора элемента */
clearSearchOnChange?: boolean;
/** ID моделей, которые всегда будут дополнительно предлагаться для выбора, если в поиске что-то нашлось */
constantlySuggested?: string[];
/** ID моделей, которые предлагаются для выбора, если в поиске ничего не найдено */
suggestedNotFound?: string[];
/** Подсказка под полем поиска */
searchHint?: ReactNode;
/** Раскрывать ли категории с выбранными элементами в дереве при открытии попапа */
expandTreeOnShowPopup?: boolean;
/** Переводы для попапа */
trl: PopupTrls;
/** Обработчик изменения строки contentFilterQuery.
* В аргументах получает список подходящих под запрос id и сам запрос */
onChangeFilterQuery?: (ids: string[], query: string) => void;
/** Рендер-метод дополнительной информации в футере, получает функции закрытия и сабмита попапа */
footerExtra?: FooterExtra;
/** DOM нода хоста в рамках которого нужно рендерить модальное окно, по дефолту рендер будет в body.*/
host?: HTMLElement;
/** Функция возвращает true для элементов, которые можно выбрать. При использовании
* вместе с параметром leavesOnly применяется только к элементам без потомков. */
checkSelectable?: IdCollectionPredicate;
}
declare const CompositeSelection: ({ children, collection, title, contentAfterTitle, value, excludedValue, leavesOnly, singleChoice, treeFilter, maxItems, singleCategory, LabelComponent, IconComponent, showSelectedList, searchWithClear, clearSearchOnChange, constantlySuggested, suggestedNotFound, searchHint, expandTreeOnShowPopup, onChange, onBlur, onFocus, onChangeFilterQuery, trl, footerExtra, host, checkSelectable, withExcluded, exclusionWithTwoLines, }: CompositeSelectionProps & ExcludedFunctionality) => JSX.Element;
export default CompositeSelection;