const PaginationCtl = ({
currentPage = 1,
setCurrentPage,
onPageChange,
totalPages = 1,
totalItems = 0,
pageSize = 20,
setPageSize,
onPageSizeChange,
backRefLink = true,
pageSizes = [10, 20, 50, 100],
childComponent
}) => {
const { Pagination, Dropdown, DropdownButton } = ReactBootstrap;
const paginationItems = [];
let history = null;
let location = null;
try {
if (typeof useHistory === 'function') history = useHistory();
if (typeof useLocation === 'function') location = useLocation();
} catch (e) {}
const safeCurrentPage = Number(currentPage) || 1;
const safeTotalPages = Number(totalPages) || (pageSize > 0 ? Math.ceil(totalItems / pageSize) : 1) || 1;
const maxVisiblePages = 2; // Số trang tối đa hiển thị
const startPage = Math.max(1, safeCurrentPage - maxVisiblePages);
const endPage = Math.min(safeTotalPages, safeCurrentPage + maxVisiblePages);
// Tạo các mục phân trang
for (let number = startPage; number <= endPage; number++) {
paginationItems.push(
handlePageChange(number)}
>
{number}
);
}
// Thêm trang đầu
if (startPage > 1) {
paginationItems.unshift(
handlePageChange(1)}>
{/* Biểu tượng Go to First */}
);
}
// Thêm trang cuối
if (endPage < safeTotalPages) {
paginationItems.push(
handlePageChange(safeTotalPages)}>
{/* Biểu tượng Go to Last */}
);
// Thêm ellipsis nếu cần
if (totalItems > 0) {
paginationItems.push({totalItems} );
}
}
const handlePageChange = (pageNumber) => {
if (typeof setCurrentPage === 'function') {
setCurrentPage(pageNumber);
} else if (typeof onPageChange === 'function') {
onPageChange(pageNumber);
}
if (backRefLink && history) {
const data = { page: pageNumber, per_page: pageSize };
const params = new URLSearchParams(data).toString();
history.push(`?${params}`);
}
};
const handlePageSizeChange = (size) => {
const numericSize = Number(size);
if (typeof setPageSize === 'function') {
setPageSize(numericSize);
} else if (typeof onPageSizeChange === 'function') {
onPageSizeChange(numericSize);
}
if (typeof setCurrentPage === 'function') {
setCurrentPage(1);
} else if (typeof onPageChange === 'function') {
onPageChange(1);
}
if (backRefLink && history) {
const data = { page: 1, per_page: numericSize };
const params = new URLSearchParams(data).toString();
history.push(`?${params}`);
}
};
return (
{pageSizes.map(size => (
{size}
))}
{childComponent}
{paginationItems}
);
};
const PaginationControl = ({ total_items, page, perpage, onPageChange }) => {
const { Pagination } = ReactBootstrap
// 1. Tính tổng số trang
const totalPages = Math.ceil(total_items / perpage);
// Nếu chỉ có 1 trang hoặc không có dữ liệu thì không hiển thị
if (totalPages <= 1) return null;
// 2. Logic tính toán các chỉ số trang cần hiển thị
const items = [];
const delta = 2; // Số lượng trang hiển thị ở mỗi bên trang hiện tại
for (let i = 1; i <= totalPages; i++) {
// Luôn hiển thị trang đầu, trang cuối, và các trang trong khoảng delta xung quanh trang hiện tại
if (
i === 1 ||
i === totalPages ||
(i >= page - delta && i <= page + delta)
) {
items.push(i);
} else if (
(i === page - delta - 1) ||
(i === page + delta + 1)
) {
// Thêm dấu "..." nếu có khoảng cách
items.push('...');
}
}
return (
{/* Nút về trang đầu và trang trước */}
onPageChange(1)} disabled={page === 1} />
onPageChange(page - 1)} disabled={page === 1} />
{/* Danh sách các con số */}
{items.map((item, index) => {
if (item === '...') {
return ;
}
return (
onPageChange(item)}
>
{item}
);
})}
{/* Nút sang trang kế tiếp và trang cuối */}
onPageChange(page + 1)} disabled={page === totalPages} />
onPageChange(totalPages)} disabled={page === totalPages} />
);
};