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

103 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">
2025-10-10 16:18:43 +02:00
<div className="flex-1 text-muted-foreground text-sm">
2025-08-29 16:47:33 +02:00
{hasSelectRow &&
`${table.getFilteredSelectedRowModel().rows.length} selezioni su `}
{table.getFilteredRowModel().rows.length} righe totali
2025-08-28 18:27:07 +02:00
</div>
2025-08-29 16:47:33 +02:00
2025-08-28 18:27:07 +02:00
<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">
2025-10-10 16:18:43 +02:00
<p className="font-medium text-sm">Righe per pagina</p>
2025-08-28 18:27:07 +02:00
<Select
onValueChange={(value) => {
table.setPageSize(Number(value));
}}
2025-08-29 16:18:32 +02:00
value={`${table.getState().pagination.pageSize}`}
2025-08-28 18:27:07 +02:00
>
<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">
2025-10-10 16:18:43 +02:00
<div className="flex items-center justify-between font-medium text-sm">
2025-08-28 18:27:07 +02:00
Pagina {table.getState().pagination.pageIndex + 1} di{" "}
{table.getPageCount()}
</div>
<div className="flex items-center space-x-2">
<Button
className="hidden size-8 p-0 lg:flex"
disabled={!table.getCanPreviousPage()}
2025-08-29 16:18:32 +02:00
onClick={() => table.setPageIndex(0)}
variant="outline"
2025-08-28 18:27:07 +02:00
>
<span className="sr-only">Vai alla prima pagina</span>
<ChevronFirst className="size-4" />
</Button>
<Button
className="size-8 p-0"
disabled={!table.getCanPreviousPage()}
2025-08-29 16:18:32 +02:00
onClick={() => table.previousPage()}
variant="outline"
2025-08-28 18:27:07 +02:00
>
<span className="sr-only">Vai alla pagina precedente</span>
<ChevronLeftIcon className="size-4" />
</Button>
<Button
className="size-8 p-0"
disabled={!table.getCanNextPage()}
2025-08-29 16:18:32 +02:00
onClick={() => table.nextPage()}
variant="outline"
2025-08-28 18:27:07 +02:00
>
<span className="sr-only">Vai alla pagina successiva</span>
<ChevronRightIcon className="size-4" />
</Button>
<Button
className="hidden size-8 p-0 lg:flex"
disabled={!table.getCanNextPage()}
2025-08-29 16:18:32 +02:00
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
variant="outline"
2025-08-28 18:27:07 +02:00
>
<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
}