import React from 'react'; import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, MoreHorizontal } from 'lucide-react'; import { Button } from './button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select'; import { cn } from '@/lib/utils'; interface DataPaginationProps { currentPage: number; totalPages: number; pageSize: number; totalItems: number; startIndex: number; endIndex: number; onPageChange: (page: number) => void; onPageSizeChange: (size: number) => void; canPreviousPage: boolean; canNextPage: boolean; pageSizeOptions?: number[]; } export function DataPagination({ currentPage, totalPages, pageSize, totalItems, startIndex, endIndex, onPageChange, onPageSizeChange, canPreviousPage, canNextPage, pageSizeOptions = [10, 30, 50, 100], }: DataPaginationProps) { // 生成页码数组 const generatePageNumbers = () => { const pages: (number | 'ellipsis')[] = []; const maxVisiblePages = 5; if (totalPages <= maxVisiblePages) { // 如果总页数少,显示所有页码 for (let i = 1; i <= totalPages; i++) { pages.push(i); } } else { // 总是显示第一页 pages.push(1); if (currentPage > 3) { pages.push('ellipsis'); } // 显示当前页附近的页码 const startPage = Math.max(2, currentPage - 1); const endPage = Math.min(totalPages - 1, currentPage + 1); for (let i = startPage; i <= endPage; i++) { pages.push(i); } if (currentPage < totalPages - 2) { pages.push('ellipsis'); } // 总是显示最后一页 if (totalPages > 1) { pages.push(totalPages); } } return pages; }; const pageNumbers = generatePageNumbers(); if (totalItems === 0) { return null; } return (
{/* 左侧:每页显示数量 */}
每页显示
{/* 中间:分页器 */}
{/* 第一页 */} {/* 上一页 */} {/* 页码 */}
{pageNumbers.map((page, index) => ( {page === 'ellipsis' ? (
) : ( )}
))}
{/* 下一页 */} {/* 最后一页 */}
{/* 右侧:统计信息 */}
显示 {startIndex} 至{' '} {endIndex} 条, {totalItems}
); }