import { FC } from 'react' import { components, models, renderClassName } from 'fastui' interface Link { Display: FC ariaLabel?: string locked?: boolean active?: boolean page?: number pageQueryParam?: string } export const Pagination: FC = (props) => { const { page, pageCount, pageQueryParam } = props if (pageCount === 1) return null const links: Link[] = [ { Display: () => , ariaLabel: 'Previous', locked: page === 1, page: page - 1, pageQueryParam, }, { Display: () => <>1, locked: page === 1, active: page === 1, page: 1, pageQueryParam, }, ] if (page > 4) { links.push({ Display: () => <>..., pageQueryParam }) } for (let p = page - 2; p <= page + 2; p++) { if (p <= 1 || p >= pageCount) continue links.push({ Display: () => <>{p}, locked: page === p, active: page === p, page: p, pageQueryParam, }) } if (page < pageCount - 3) { links.push({ Display: () => <>..., pageQueryParam }) } links.push({ Display: () => <>{pageCount}, locked: page === pageCount, page: pageCount, pageQueryParam, }) links.push({ Display: () => , ariaLabel: 'Next', locked: page === pageCount, page: page + 1, pageQueryParam, }) return ( ) } const PaginationLink: FC = ({ Display, ariaLabel, locked, active, page, pageQueryParam }) => { if (!page) { return (
  • ) } const className = renderClassName({ 'page-link': true, disabled: locked && !active, active } as models.ClassName) const onClick: models.GoToEvent = { type: 'go-to', query: { [pageQueryParam !== undefined ? pageQueryParam : 'page']: page }, } return (
  • ) }