Spaces:
Running
Running
| "use client" | |
| import { Button } from "@/components/ui/button" | |
| interface ListPaginationProps { | |
| page: number | |
| pageSize: number | |
| totalItems: number | |
| itemLabel: string | |
| onPageChange: (page: number) => void | |
| } | |
| export function ListPagination({ | |
| page, | |
| pageSize, | |
| totalItems, | |
| itemLabel, | |
| onPageChange, | |
| }: ListPaginationProps) { | |
| const totalPages = Math.max(1, Math.ceil(totalItems / pageSize)) | |
| const start = totalItems === 0 ? 0 : (page - 1) * pageSize + 1 | |
| const end = Math.min(page * pageSize, totalItems) | |
| if (totalItems <= pageSize) { | |
| return null | |
| } | |
| return ( | |
| <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"> | |
| <p className="text-sm text-muted-foreground"> | |
| Showing {start}-{end} of {totalItems} {itemLabel} | |
| </p> | |
| <div className="flex items-center gap-2"> | |
| <Button | |
| variant="outline" | |
| size="sm" | |
| onClick={() => onPageChange(Math.max(1, page - 1))} | |
| disabled={page === 1} | |
| > | |
| Previous | |
| </Button> | |
| <span className="text-sm text-muted-foreground"> | |
| Page {page} of {totalPages} | |
| </span> | |
| <Button | |
| variant="outline" | |
| size="sm" | |
| onClick={() => onPageChange(Math.min(totalPages, page + 1))} | |
| disabled={page === totalPages} | |
| > | |
| Next | |
| </Button> | |
| </div> | |
| </div> | |
| ) | |
| } | |