infoalloggi-monorepo/apps/infoalloggi/src/components/custom_ui/dataTable-pagination.tsx

105 lines
3 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import type { Table } from "@tanstack/react-table";
import {
2025-08-28 18:27:07 +02:00
ChevronFirst,
ChevronLast,
ChevronLeftIcon,
ChevronRightIcon,
} from "lucide-react";
2025-08-04 17:45:44 +02:00
import { Button } from "~/components/ui/button";
import {
2025-08-28 18:27:07 +02:00
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "~/components/ui/select";
2025-08-04 17:45:44 +02:00
interface DataTablePaginationProps<TData> {
2025-08-28 18:27:07 +02:00
table: Table<TData>;
hasSelectRow?: boolean;
2025-08-04 17:45:44 +02:00
}
export function DataTablePagination<TData>({
2025-08-28 18:27:07 +02:00
table,
hasSelectRow,
2025-08-04 17:45:44 +02:00
}: DataTablePaginationProps<TData>) {
2025-08-28 18:27:07 +02:00
return (
<div className="flex items-center justify-between px-2">
<div className="text-muted-foreground flex-1 text-sm">
{hasSelectRow && (
<>
{table.getFilteredSelectedRowModel().rows.length} di{" "}
{table.getFilteredRowModel().rows.length} righe selezionate.
</>
)}
</div>
<div className="flex flex-wrap items-center gap-x-6 gap-y-2 lg:gap-x-8">
<div className="flex items-center space-x-2">
<p className="text-sm font-medium">Righe per pagina</p>
<Select
value={`${table.getState().pagination.pageSize}`}
onValueChange={(value) => {
table.setPageSize(Number(value));
}}
>
<SelectTrigger className="h-8 w-[70px]">
<SelectValue placeholder={table.getState().pagination.pageSize} />
</SelectTrigger>
<SelectContent side="top">
{[10, 20, 30, 40, 50].map((pageSize) => (
<SelectItem key={pageSize} value={`${pageSize}`}>
{pageSize}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="flex items-center gap-x-6 lg:gap-x-8">
<div className="flex items-center justify-between text-sm font-medium">
Pagina {table.getState().pagination.pageIndex + 1} di{" "}
{table.getPageCount()}
</div>
<div className="flex items-center space-x-2">
<Button
variant="outline"
className="hidden size-8 p-0 lg:flex"
onClick={() => table.setPageIndex(0)}
disabled={!table.getCanPreviousPage()}
>
<span className="sr-only">Vai alla prima pagina</span>
<ChevronFirst className="size-4" />
</Button>
<Button
variant="outline"
className="size-8 p-0"
onClick={() => table.previousPage()}
disabled={!table.getCanPreviousPage()}
>
<span className="sr-only">Vai alla pagina precedente</span>
<ChevronLeftIcon className="size-4" />
</Button>
<Button
variant="outline"
className="size-8 p-0"
onClick={() => table.nextPage()}
disabled={!table.getCanNextPage()}
>
<span className="sr-only">Vai alla pagina successiva</span>
<ChevronRightIcon className="size-4" />
</Button>
<Button
variant="outline"
className="hidden size-8 p-0 lg:flex"
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
disabled={!table.getCanNextPage()}
>
<span className="sr-only">Vai alla pagina finale</span>
<ChevronLast className="size-4" />
</Button>
</div>
</div>
</div>
</div>
);
2025-08-04 17:45:44 +02:00
}