{{#if framework == "nextjs"}} "use client"; {{/if}} import { formUrlQuery, removeKeysFromQuery } from "@/lib/utils/url-helpers"; import { IconChevronLeft, IconChevronRight, IconChevronsLeft, IconChevronsRight, } from "@tabler/icons-react"; import type { Table } from "@tanstack/react-table"; {{#if framework == "nextjs"}} import { useRouter, useSearchParams } from "next/navigation"; {{else}} import { useNavigate, useSearchParams } from "react-router"; {{/if}} import SelectField from "../global/form-field/select-field"; import { Button } from "../ui/button"; import type { BaseRecord } from "./data-table"; interface DataTableFooterProps { table: Table; pageSize: number; total: number; } export default function DataTableFooter({ table, pageSize, total, }: DataTableFooterProps) { {{#if framework == "nextjs"}} const searchParams = useSearchParams(); const router = useRouter(); if (!searchParams) return null; {{else}} const navigate = useNavigate(); const [searchParams] = useSearchParams(); {{/if}} const currentPage = Number(searchParams.get("pageIndex")) || 1; const totalPages = Math.ceil(total / pageSize); const handlePageChange = (newPage: number) => { const query = formUrlQuery({ params: searchParams.toString(), key: "pageIndex", value: newPage.toString(), }); {{#if framework == "nextjs"}} router.push(query, { scroll: false }); {{else}} navigate(query); {{/if}} table.setPageIndex(newPage - 1); }; const handlePageSizeChange = (value: string | number | undefined) => { if (typeof value === "undefined" || value === null) return; const valueStr = String(value); const newUrl = valueStr ? formUrlQuery({ params: searchParams.toString(), key: "pageSize", value: valueStr, }) : removeKeysFromQuery({ params: searchParams.toString(), keysToRemove: ["pageSize"], }); {{#if framework == "nextjs"}} router.push(newUrl, { scroll: false }); {{else}} navigate(newUrl); {{/if}} table.setPageSize(Number(valueStr)); }; return (
{/* Selected Rows Summary */}
{table.getFilteredSelectedRowModel().rows.length} of{" "} {table.getFilteredRowModel().rows.length} row(s) selected
{/* Rows Per Page - Only on large screens */} ({ value: size, label: `${size}`, }))} className="hidden items-center gap-2 lg:flex" /> {/* Range Info */}
Showing {(currentPage - 1) * pageSize + 1}– {Math.min(currentPage * pageSize, total)} of {total} rows
{/* Pagination Controls */}
); }