2025-03-30 16:42:51 -03:00
|
|
|
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 (
|
2025-03-30 19:28:28 -03:00
|
|
|
<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>
|
|
|
|
«
|
|
|
|
</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>
|
|
|
|
‹
|
|
|
|
</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>
|
|
|
|
›
|
|
|
|
</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>
|
|
|
|
»
|
|
|
|
</button>
|
|
|
|
</nav>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2025-03-30 16:42:51 -03:00
|
|
|
);
|
|
|
|
};
|