import * as React from 'react'; import { CustomRender } from '../../commonTypes'; import { COMPONENTS_NAMESPACES } from '../../constants'; import { GlobalDefaultTheme, PartialGlobalDefaultTheme } from '../../utils/useTheme'; import { SuggestionElementProps, SuggestionItemProps } from '../../src/SuggestionList/types'; import { DropDownSelectProps } from '../DropDownSelect/types'; export interface ChangeEvent { component: { value: number; }; } export interface PageSizeChangeEvent { component: { value: number; }; } export interface PaginationProps { /** Классы переданные через _ */ [x: string]: unknown; /** Номер текущей страницы */ currentPage?: number; /** Начальное количество элементов на странице при передаче pageSizeOptions. По умолчанию - первый элемент массива */ defaultPageSize?: number; /** Состояние загрузки, на это время блокируются все клики */ isLoading?: boolean; /** Кастомизация информации о пагинации */ itemsInfoRender?: CustomRender; /** Кастомизация текста "1-10 из 124" */ itemsRangeInfoRender?: CustomRender; /** Кастомизация текста "Отображено записей 124" */ itemsTotalInfoRender?: CustomRender; /** Обработчик изменения страницы */ onChange?: (event: ChangeEvent) => void; /** Обработчик изменения количества отображаемых элементов */ onPageSizeChange?: (event: PageSizeChangeEvent) => void; /** Количество элементов на странице */ pageSize?: number; /** Кастомизация поля ввода выпадающего списка с выбором количества записей на странице */ pageSizeInputRender?: CustomRender, {}, React.InputHTMLAttributes>; /** Кастомизация элементов выпадающего списка с выбором количества записей на странице */ pageSizeItemRender?: CustomRender; /** Выбор вариантов количества элементов на странице, если передан, то появляется выпадающий список */ pageSizeOptions?: number[]; /** Кастомизация выпадающего списка с выбором количества записей на странице */ pagesDropDownRender?: CustomRender; /** Reference */ ref?: React.Ref; /** Тема компонента */ theme?: PartialGlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.pagination]; /** Общее количество записей */ totalItems: number; } export interface PaginationState { currentPage: number; pageSize: number; } export interface PagesDropDownProps { /** Обработка выбора занчений в выпадающем списке */ handlePageSizeChange: (event: PageSizeChangeEvent) => void; /** Возможно ли изменение числа элементов на странице */ isPageSizeChangeable: boolean; /** Количество элементов на странице */ pageSize: number; /** Кастомизация поля ввода выпадающего списка с выбором количества записей на странице */ pageSizeInputRender: PaginationProps['pageSizeInputRender']; /** Кастомизация элементов выпадающего списка с выбором количества записей на странице */ pageSizeItemRender: PaginationProps['pageSizeItemRender']; /** Варианты количества элементов на странице */ pageSizeOptions?: number[]; /** Тема компонента */ theme: GlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.pagination]; } export interface PaginationInfoProps { /** Вложенные компоненты */ children?: React.ReactNode; /** Тема компонента */ theme: GlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.pagination]; } export interface PaginationRangeInfoProps { /** Конец диапазона числа элементов на странице */ endingItemNumber: number; /** Начало диапазона числа элементов на странице */ startingItemNumber: number; /** Общее количество элементов на странице */ totalItemsNumber: number; } export interface PaginationTotalInfoProps { /** Общее количество элементов на странице */ totalItemsNumber: number; } export interface PaginationControlProps { /** Дочерние элементы */ children?: React.ReactNode; /** Классы для компонента */ className?: string; /** Контрол с номером страницы */ isPageNumber?: boolean; /** Обработчик клика */ onClick: PageChangeHandler; /** Номер страницы, на которую будет осуществлен переход */ page: number; /** Всплывающая подсказка */ title?: string; } export interface PageChangeHandler { (pageNumber: number): void; } export interface PagesListProps { currentPage: number; onClick: PageChangeHandler; pageNumbers: number[]; theme: GlobalDefaultTheme[typeof COMPONENTS_NAMESPACES.pagination]; } export interface PaginationRefCurrent { wrapper: HTMLDivElement | null; } export interface CustomElements { ItemsInfo: React.FC; ItemsRangeInfo: React.FC; ItemsTotalInfo: React.FC; PagesDropDown: React.FC; }