import * as React from "react" import { ChevronFirstIcon, ChevronLastIcon, ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon, } from "lucide-react" import { Button } from "@/components/ui/button" import { cn } from "@/lib/utils" export type PaginationItem = number | "ellipsis" export type PaginationLabels = { first?: string previous?: string next?: string last?: string page?: (page: number) => string } export type PaginationProps = Omit, "onChange"> & { page: number pageCount: number onPageChange: (page: number) => void siblingCount?: number showEdges?: boolean disabled?: boolean labels?: PaginationLabels compact?: boolean totalCount?: number pageSize?: number pageSizeOptions?: number[] onPageSizeChange?: (pageSize: number) => void showSummary?: boolean } function range(start: number, end: number) { const length = Math.max(end - start + 1, 0) return Array.from({ length }, (_, index) => index + start) } function getPaginationItems( page: number, pageCount: number, siblingCount = 1 ): PaginationItem[] { const totalPageNumbers = siblingCount * 2 + 5 if (pageCount <= totalPageNumbers) { return range(1, pageCount) } const leftSiblingIndex = Math.max(page - siblingCount, 1) const rightSiblingIndex = Math.min(page + siblingCount, pageCount) const shouldShowLeftEllipsis = leftSiblingIndex > 2 const shouldShowRightEllipsis = rightSiblingIndex < pageCount - 1 if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) { const leftItemCount = siblingCount * 2 + 3 return [...range(1, leftItemCount), "ellipsis", pageCount] } if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) { const rightItemCount = siblingCount * 2 + 3 return [1, "ellipsis", ...range(pageCount - rightItemCount + 1, pageCount)] } return [1, "ellipsis", ...range(leftSiblingIndex, rightSiblingIndex), "ellipsis", pageCount] } function Pagination({ className, page, pageCount, onPageChange, siblingCount = 1, showEdges = true, disabled = false, labels, compact = false, totalCount, pageSize, pageSizeOptions, onPageSizeChange, showSummary = false, ...props }: PaginationProps) { const safePageCount = Math.max(pageCount, 1) const currentPage = Math.min(Math.max(page, 1), safePageCount) const items = getPaginationItems(currentPage, safePageCount, siblingCount) const goToPage = (nextPage: number) => { const clampedPage = Math.min(Math.max(nextPage, 1), safePageCount) if (clampedPage !== currentPage) { onPageChange(clampedPage) } } return ( ) } export { Pagination, getPaginationItems }