I have made a simple pagination algorithm. It shows "next" and "previous" buttons when appropriate.
It also limits the amount of buttons if the page amount exceeds a certain amount, e.g. 1 2 ... 15 16 17 18 19 ... 99 100
.
It works fine, but I feel it can be simplified.
function appendTruncateButtons(buttons, pageCount) {
buttons.push("...");
buttons.push(pageCount - 1);
buttons.push(pageCount);
}
function prependTruncateButtons(buttons) {
buttons.push(1);
buttons.push(2);
buttons.push("...");
}
function generateButtons(currentPage, pageCount, surroundingPageLinkSize) {
var buttons = [];
if (currentPage > 1) {
buttons.push("<");
}
var truncate = pageCount > (7 + (surroundingPageLinkSize * 2));
if (!truncate) {
for (var i = 1; i <= pageCount; i++) {
buttons.push(i);
}
}
else {
var truncateEnd = currentPage < (1 + (surroundingPageLinkSize * 2)),
truncateBoth = (pageCount - (surroundingPageLinkSize * 2)) > currentPage && currentPage > (surroundingPageLinkSize * 2);
if (truncateEnd) {
for (var j = 1; j < (4 + (surroundingPageLinkSize * 2)); j++) {
buttons.push(j);
}
appendTruncateButtons(buttons, pageCount);
}
else if (truncateBoth) {
prependTruncateButtons(buttons);
for (var k = (currentPage - surroundingPageLinkSize); k <= (currentPage + surroundingPageLinkSize); k++) {
buttons.push(k);
}
appendTruncateButtons(buttons, pageCount);
}
else { // Truncate start
prependTruncateButtons(buttons);
for (var l = pageCount - (2 + (surroundingPageLinkSize * 2)); l <= pageCount; l++) {
buttons.push(l);
}
}
}
if (currentPage < pageCount) {
buttons.push(">");
}
return buttons;
}
// generateButtons(currentPage, pageCount, surroundingPageLinkSize)
console.log(generateButtons(1, 100, 3));
console.log(generateButtons(50, 100, 3));
console.log(generateButtons(99, 100, 3));