import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react"; import { cn } from "~/lib/utils"; const PAGE_SIZE_OPTIONS = [10, 15, 20, 50, 100]; type PaginationProps = { page: number; pageSize: number; total: number; onPageChange: (page: number) => void; onPageSizeChange?: (size: number) => void; className?: string; }; export function Pagination({ page, pageSize, total, onPageChange, onPageSizeChange, className }: PaginationProps) { const totalPages = Math.max(1, Math.ceil(total / pageSize)); const from = total === 0 ? 0 : (page - 1) * pageSize + 1; const to = Math.min(page * pageSize, total); const isFirst = page <= 1; const isLast = page >= totalPages; // 生成页码列表(最多显示 7 个按钮) function buildPages(): (number | "...")[] { if (totalPages <= 7) { return Array.from({ length: totalPages }, (_, i) => i + 1); } if (page <= 4) { return [1, 2, 3, 4, 5, "...", totalPages]; } if (page >= totalPages - 3) { return [1, "...", totalPages - 4, totalPages - 3, totalPages - 2, totalPages - 1, totalPages]; } return [1, "...", page - 1, page, page + 1, "...", totalPages]; } const pages = buildPages(); return (
{/* 左侧:总数 + 每页显示 */}
共 {total} 条 · 第{" "} {from} {" 至 "} {to} 条 {/* 每页条数 */} {onPageSizeChange && (
每页
)}
{/* 右侧:页码导航 */}
{/* 首页 */} onPageChange(1)} disabled={isFirst} title="第一页"> {/* 上一页 */} onPageChange(page - 1)} disabled={isFirst} title="上一页"> {/* 页码按钮 */}
{pages.map((p, i) => p === "..." ? ( ··· ) : ( ), )}
{/* 下一页 */} onPageChange(page + 1)} disabled={isLast} title="下一页"> {/* 末页 */} onPageChange(totalPages)} disabled={isLast} title="最后一页">
); } function NavBtn({ children, onClick, disabled, title, }: { children: React.ReactNode; onClick: () => void; disabled: boolean; title?: string; }) { return ( ); }