gbclient/app/tables/components/DataTablePagination.tsx

102 lines
4 KiB
TypeScript
Raw Normal View History

import React from 'react';
interface DataTablePaginationProps {
page: number;
setPage: (page: number) => void;
rowsPerPage: number;
setRowsPerPage: (rowsPerPage: number) => void;
totalItems: number;
}
export const DataTablePagination: React.FC<DataTablePaginationProps> = ({
page,
setPage,
rowsPerPage,
setRowsPerPage,
totalItems,
}) => {
const totalPages = Math.ceil(totalItems / rowsPerPage);
return (
<div className="flex items-center justify-between px-6 py-3 border-t border-gray-200">
<div className="flex-1 flex justify-between sm:hidden">
<button
onClick={() => setPage(page - 1)}
disabled={page === 0}
className="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
>
Previous
</button>
<button
onClick={() => setPage(page + 1)}
disabled={page === totalPages - 1}
className="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
>
Next
</button>
</div>
<div className="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
<div>
<p className="text-sm text-gray-700">
Showing <span className="font-medium">{page * rowsPerPage + 1}</span> to{' '}
<span className="font-medium">
{Math.min((page + 1) * rowsPerPage, totalItems)}
</span>{' '}
of <span className="font-medium">{totalItems}</span> results
</p>
</div>
<div>
<select
value={rowsPerPage}
onChange={(e) => setRowsPerPage(Number(e.target.value))}
className="mr-4 border-gray-300 rounded-md shadow-sm focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50"
>
{[5, 10, 25, 50].map((size) => (
<option key={size} value={size}>
Show {size}
</option>
))}
</select>
<nav className="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
<button
onClick={() => setPage(0)}
disabled={page === 0}
className="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 disabled:opacity-50"
>
<span className="sr-only">First</span>
&laquo;
</button>
<button
onClick={() => setPage(page - 1)}
disabled={page === 0}
className="relative inline-flex items-center px-2 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 disabled:opacity-50"
>
<span className="sr-only">Previous</span>
&lsaquo;
</button>
<span className="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700">
Page {page + 1} of {totalPages}
</span>
<button
onClick={() => setPage(page + 1)}
disabled={page === totalPages - 1}
className="relative inline-flex items-center px-2 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 disabled:opacity-50"
>
<span className="sr-only">Next</span>
&rsaquo;
</button>
<button
onClick={() => setPage(totalPages - 1)}
disabled={page === totalPages - 1}
className="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 disabled:opacity-50"
>
<span className="sr-only">Last</span>
&raquo;
</button>
</nav>
</div>
</div>
</div>
);
};