Files
thrilltrack-explorer/src-old/components/moderation/QueuePagination.tsx

164 lines
5.1 KiB
TypeScript

import { Button } from '@/components/ui/button';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import {
Pagination,
PaginationContent,
PaginationEllipsis,
PaginationItem,
PaginationLink,
PaginationNext,
PaginationPrevious,
} from '@/components/ui/pagination';
interface QueuePaginationProps {
currentPage: number;
totalPages: number;
pageSize: number;
totalCount: number;
isMobile: boolean;
onPageChange: (page: number) => void;
onPageSizeChange: (size: number) => void;
}
export const QueuePagination = ({
currentPage,
totalPages,
pageSize,
totalCount,
isMobile,
onPageChange,
onPageSizeChange
}: QueuePaginationProps) => {
if (totalPages <= 1) return null;
const handlePageChange = (page: number) => {
onPageChange(page);
window.scrollTo({ top: 0, behavior: 'smooth' });
};
const handlePageSizeChange = (size: number) => {
onPageSizeChange(size);
window.scrollTo({ top: 0, behavior: 'smooth' });
};
const startItem = ((currentPage - 1) * pageSize) + 1;
const endItem = Math.min(currentPage * pageSize, totalCount);
return (
<div className="flex items-center justify-between border-t pt-4 mt-6">
{/* Item Count & Page Size Selector */}
<div className="flex items-center gap-2 text-sm text-muted-foreground">
<span>
Showing {startItem} - {endItem} of {totalCount} items
</span>
{!isMobile && (
<>
<span></span>
<Select
value={pageSize.toString()}
onValueChange={(value) => handlePageSizeChange(parseInt(value))}
>
<SelectTrigger className="w-[120px] h-8">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="10">10 per page</SelectItem>
<SelectItem value="25">25 per page</SelectItem>
<SelectItem value="50">50 per page</SelectItem>
<SelectItem value="100">100 per page</SelectItem>
</SelectContent>
</Select>
</>
)}
</div>
{/* Pagination Controls */}
{isMobile ? (
<div className="flex items-center justify-between gap-4">
<Button
variant="outline"
size="sm"
onClick={() => handlePageChange(Math.max(1, currentPage - 1))}
disabled={currentPage === 1}
>
Previous
</Button>
<span className="text-sm text-muted-foreground">
Page {currentPage} of {totalPages}
</span>
<Button
variant="outline"
size="sm"
onClick={() => handlePageChange(Math.min(totalPages, currentPage + 1))}
disabled={currentPage === totalPages}
>
Next
</Button>
</div>
) : (
<Pagination>
<PaginationContent>
<PaginationItem>
<PaginationPrevious
onClick={() => handlePageChange(Math.max(1, currentPage - 1))}
className={currentPage === 1 ? 'pointer-events-none opacity-50' : 'cursor-pointer'}
/>
</PaginationItem>
{currentPage > 3 && (
<>
<PaginationItem>
<PaginationLink
onClick={() => handlePageChange(1)}
isActive={currentPage === 1}
>
1
</PaginationLink>
</PaginationItem>
{currentPage > 4 && <PaginationEllipsis />}
</>
)}
{Array.from({ length: totalPages }, (_, i) => i + 1)
.filter(page => page >= currentPage - 2 && page <= currentPage + 2)
.map(page => (
<PaginationItem key={page}>
<PaginationLink
onClick={() => handlePageChange(page)}
isActive={currentPage === page}
>
{page}
</PaginationLink>
</PaginationItem>
))
}
{currentPage < totalPages - 2 && (
<>
{currentPage < totalPages - 3 && <PaginationEllipsis />}
<PaginationItem>
<PaginationLink
onClick={() => handlePageChange(totalPages)}
isActive={currentPage === totalPages}
>
{totalPages}
</PaginationLink>
</PaginationItem>
</>
)}
<PaginationItem>
<PaginationNext
onClick={() => handlePageChange(Math.min(totalPages, currentPage + 1))}
className={currentPage === totalPages ? 'pointer-events-none opacity-50' : 'cursor-pointer'}
/>
</PaginationItem>
</PaginationContent>
</Pagination>
)}
</div>
);
};
QueuePagination.displayName = 'QueuePagination';