'use client'; import { ReactNode, useState, useEffect } from 'react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Button } from '@/components/ui/button'; import { ChevronLeft, ChevronRight, Loader2 } from 'lucide-react'; import { cn } from '@/lib/utils'; export interface Column { key: string; title: string; width?: number | string; render?: (row: T, index: number) => ReactNode; className?: string; } export interface PaginationTableProps { columns: Column[]; rows: T[]; total: number; page: number; pageSize: number; loading?: boolean; onPageChange: (page: number) => void; rowKey?: (row: T, index: number) => string; emptyText?: string; className?: string; } export function PaginationTable({ columns, rows, total, page, pageSize, loading, onPageChange, rowKey, emptyText = '暂无数据', className, }: PaginationTableProps) { const totalPages = Math.max(1, Math.ceil(total / pageSize)); const [cur, setCur] = useState(page); useEffect(() => setCur(page), [page]); const go = (p: number) => { const target = Math.min(Math.max(1, p), totalPages); setCur(target); onPageChange(target); }; const start = total === 0 ? 0 : (cur - 1) * pageSize + 1; const end = Math.min(cur * pageSize, total); return (
{columns.map((c) => ( {c.title} ))} {loading ? (
加载中…
) : rows.length === 0 ? ( {emptyText} ) : ( rows.map((row, idx) => ( {columns.map((c) => ( {c.render ? c.render(row, idx) : String((row as Record)[c.key] ?? '')} ))} )) )}

共 {total} 条,当前 {start}-{end}

{cur} / {totalPages}
); }