Files
pulse-signage/src/web/lib/pagination.js
T
2026-07-25 15:11:41 +01:00

64 lines
2.2 KiB
JavaScript

function normalizePageNumber(value) {
const pageNumber = Math.floor(Number(value) || 1);
return Math.max(1, pageNumber);
}
function buildQueryString(query) {
const searchParams = new URLSearchParams();
Object.keys(query || {}).forEach(function (key) {
const value = query[key];
if (value === undefined || value === null || value === '') {
return;
}
searchParams.set(key, String(value));
});
const queryString = searchParams.toString();
return queryString ? `?${queryString}` : '';
}
function buildPagination(totalItems, currentPage, pageParam, queryState, pageSize, itemLabel, ariaLabel) {
const normalizedPageParam = String(pageParam || 'page').trim() || 'page';
const normalizedPageSize = Math.max(1, Number(pageSize) || 10);
const totalPages = Math.max(1, Math.ceil(Number(totalItems) / normalizedPageSize));
const safeCurrentPage = Math.min(normalizePageNumber(currentPage), totalPages);
const startIndex = totalItems <= 0 ? 0 : (safeCurrentPage - 1) * normalizedPageSize;
const endIndex = totalItems <= 0 ? 0 : Math.min(totalItems, startIndex + normalizedPageSize);
const pages = [];
for (let pageNumber = 1; pageNumber <= totalPages; pageNumber += 1) {
const nextQuery = Object.assign({}, queryState, { [normalizedPageParam]: pageNumber });
pages.push({
number: pageNumber,
active: pageNumber === safeCurrentPage,
url: buildQueryString(nextQuery)
});
}
const previousQuery = Object.assign({}, queryState, { [normalizedPageParam]: safeCurrentPage - 1 });
const nextQuery = Object.assign({}, queryState, { [normalizedPageParam]: safeCurrentPage + 1 });
return {
currentPage: safeCurrentPage,
totalPages: totalPages,
totalItems: Number(totalItems) || 0,
hasMultiplePages: totalPages > 1,
startItem: startIndex + 1,
endItem: endIndex,
hasPrevious: safeCurrentPage > 1,
hasNext: safeCurrentPage < totalPages,
previousUrl: buildQueryString(previousQuery),
nextUrl: buildQueryString(nextQuery),
pages: pages,
pageSize: normalizedPageSize,
pageParam: normalizedPageParam,
itemLabel: String(itemLabel || 'items'),
ariaLabel: String(ariaLabel || 'Pagination')
};
}
module.exports = {
normalizePageNumber,
buildQueryString,
buildPagination
};