import { ChevronLeftIcon, ChevronRightIcon, DoubleArrowLeftIcon, DoubleArrowRightIcon } from "@radix-ui/react-icons"; import { Table } from "@tanstack/react-table"; import { Button } from "@app/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@app/components/ui/select"; import { useTranslations } from "next-intl"; interface DataTablePaginationProps { table: Table; onPageSizeChange?: (pageSize: number) => void; onPageChange?: (pageIndex: number) => void; totalCount?: number; isServerPagination?: boolean; isLoading?: boolean; disabled?: boolean; pageSize?: number; pageIndex?: number; } export function DataTablePagination({ table, onPageSizeChange, onPageChange, totalCount, isServerPagination = false, isLoading = false, disabled = false, pageSize: controlledPageSize, pageIndex: controlledPageIndex }: DataTablePaginationProps) { const t = useTranslations(); // Use controlled values if provided, otherwise fall back to table state const pageSize = controlledPageSize ?? table.getState().pagination.pageSize; const pageIndex = controlledPageIndex ?? table.getState().pagination.pageIndex; // Calculate page boundaries based on controlled state // For server-side pagination, use totalCount if available for accurate page count const pageCount = isServerPagination && totalCount !== undefined ? Math.ceil(totalCount / pageSize) : table.getPageCount(); const canNextPage = pageIndex < pageCount - 1; const canPreviousPage = pageIndex > 0; const handlePageSizeChange = (value: string) => { const newPageSize = Number(value); table.setPageSize(newPageSize); // Call the callback if provided (for persistence) if (onPageSizeChange) { onPageSizeChange(newPageSize); } }; const handlePageNavigation = ( action: "first" | "previous" | "next" | "last" ) => { if (isServerPagination && onPageChange) { const currentPage = pageIndex; const pageCount = table.getPageCount(); let newPage: number; switch (action) { case "first": newPage = 0; break; case "previous": newPage = Math.max(0, currentPage - 1); break; case "next": newPage = Math.min(pageCount - 1, currentPage + 1); break; case "last": newPage = pageCount - 1; break; default: return; } if (newPage !== currentPage) { onPageChange(newPage); } } else { // Use table's built-in navigation for client-side pagination // But add bounds checking to prevent going beyond page boundaries const pageCount = table.getPageCount(); switch (action) { case "first": table.setPageIndex(0); break; case "previous": if (pageIndex > 0) { table.previousPage(); } break; case "next": if (pageIndex < pageCount - 1) { table.nextPage(); } break; case "last": table.setPageIndex(Math.max(0, pageCount - 1)); break; } } }; return (
{isServerPagination && totalCount !== undefined ? t("paginator", { current: pageIndex + 1, last: Math.ceil(totalCount / pageSize) }) : t("paginator", { current: pageIndex + 1, last: table.getPageCount() })}
); }