import type { ReactNode } from "react"; import { cn } from "../../lib/cn"; import { Select } from "../inputs"; function getVisiblePages(currentPage: number, totalPages: number, maxVisiblePages: number) { if (totalPages <= maxVisiblePages) { return Array.from({ length: totalPages }, (_, index) => index + 1); } const siblingCount = Math.max(1, Math.floor((maxVisiblePages - 3) / 2)); const start = Math.max(2, currentPage - siblingCount); const end = Math.min(totalPages - 1, currentPage + siblingCount); const visiblePages: Array = [1]; if (start > 2) { visiblePages.push("ellipsis-left"); } for (let page = start; page <= end; page += 1) { visiblePages.push(page); } if (end < totalPages - 1) { visiblePages.push("ellipsis-right"); } visiblePages.push(totalPages); return visiblePages; } function TextSummary({ children }: { children: ReactNode }) { return {children}; } export function Pagination({ className, currentPage, itemCount, maxVisiblePages = 5, totalPages, pageSize, pageSizeOptions = [10, 25, 50, 100], onPageChange, onPageSizeChange, }: { className?: string; currentPage: number; itemCount?: number; maxVisiblePages?: number; pageSize?: number; pageSizeOptions?: number[]; totalPages?: number; onPageChange?: (page: number) => void; onPageSizeChange?: (pageSize: number) => void; }) { const resolvedTotalPages = itemCount !== undefined && pageSize ? Math.max(1, Math.ceil(itemCount / pageSize)) : Math.max(1, totalPages ?? 1); const safeCurrentPage = Math.min(Math.max(1, currentPage), resolvedTotalPages); const pages = getVisiblePages(safeCurrentPage, resolvedTotalPages, maxVisiblePages); const startItem = itemCount && pageSize ? (safeCurrentPage - 1) * pageSize + 1 : undefined; const endItem = itemCount && pageSize ? Math.min(itemCount, safeCurrentPage * pageSize) : undefined; return (
{pages.map((page) => typeof page === "number" ? ( ) : ( ... ), )}
{startItem && endItem && itemCount ? ( Showing {startItem}-{endItem} of {itemCount} ) : null}
{onPageSizeChange ? (