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;