Skip to content

Instantly share code, notes, and snippets.

@philjones88
Created June 7, 2013 13:11
Show Gist options
  • Save philjones88/5729135 to your computer and use it in GitHub Desktop.
Save philjones88/5729135 to your computer and use it in GitHub Desktop.
ugly angularjs pager generator
app.directive("pager", function ($compile) {
function generate(currentPage, totalPages, click) {
// How many adjacent pages should be shown on each side?
var adjacents = 2;
//previous page is page - 1
var prev = currentPage - 1;
//next page is page + 1
var next = currentPage + 1;
//lastPage is = total pages / items per page, rounded up.
var lastpage = totalPages;
//last page minus 1
var lpm1 = lastpage - 1;
var pagination = "";
if (lastpage > 1) {
pagination += "<ul>";
var counter;
//previous button
if (currentPage > 1) {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + prev + ")'>«</a></li>";
}
//pages
if (lastpage < 7 + (adjacents * 2)) //not enough pages to bother breaking it up
{
for (counter = 1; counter <= lastpage; counter++) {
if (counter == currentPage) {
pagination += "<li class='active'><a href='javascript:void(0)' ng-click='" + click + "(" + counter + ")'>" + counter + "</a></li>";
}
else {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + counter + ")'>" + counter + "</a></li>";
}
}
}
else if (lastpage > 5 + (adjacents * 2)) //enough pages to hide some
{
//close to beginning; only hide later pages
if (currentPage < 1 + (adjacents * 2)) {
for (counter = 1; counter < 4 + (adjacents * 2) ; counter++) {
if (counter == currentPage) {
pagination += "<li class='active'><a href='javascript:void(0)'>" + counter + "</a></li>";
}
else {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + counter + ")'>" + counter + "</a></li>";
}
}
pagination += "<li class=\"disabled disabled-dots\"><a href='javascript:void(0)'>...</a></li>";
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + lpm1 + ")'>" + lpm1 + "</a></li>";
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + lastpage + ")'>" + lastpage + "</a></li>";
}
//in middle; hide some front and some back
else if (lastpage - (adjacents * 2) > currentPage && currentPage > (adjacents * 2)) {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(1)'>1</a></li>";
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(2)'>2</a></li>";
pagination += "<li class='disabled disabled-dots'><a href='javascript:void(0)'>...</a></li>";
for (counter = currentPage - adjacents; counter <= currentPage + adjacents; counter++) {
if (counter == currentPage) {
pagination += "<li class='active'><a href='javascript:void(0)'>" + counter + "</a></li>";
}
else {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + counter + ")'>" + counter + "</a></li>";
}
}
pagination += "<li class='disabled disabled-dots'><a href='javascript:void(0)'>...</a></li>";
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + lpm1 + "'>" + lpm1 + "</a></li>";
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + lastpage + ")'>" + lastpage + "</a></li>";
}
//close to end; only hide early pages
else {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(1)'>1</a></li>";
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(2)'>2</a></li>";
pagination += "<li class='disabled disabled-dots'><a href='javascript:void(0)'>...</a></li>";
for (counter = lastpage - (2 + (adjacents * 2)) ; counter <= lastpage; counter++) {
if (counter == currentPage) {
pagination += "<li class='active'><a href='javascript:void(0)' ng-click='" + click + "(" + counter + ")'>" + counter + "</a></li>";
}
else {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + counter + ")'>" + counter + "</a></li>";
}
}
}
//next button
if (currentPage < counter - 1) {
pagination += "<li><a href='javascript:void(0)' ng-click='" + click + "(" + next + ")'>»</a></li>";
}
}
pagination += "</ul>";
}
return pagination;
}
return {
restrict: "E",
scope: {
currentPage: "=currentPage",
totalPages: "=totalPages",
click: "=click"
},
link: function (scope, element, attrs) {
scope.$watch('currentPage + totalPages', function () {
var click = attrs.click;
var currentPage = scope.currentPage || 1;
var totalPages = scope.totalPages || 1;
var html = generate(currentPage, totalPages, click);
// Wrap in bootstrap class
var pagination = '<div class="pagination">' + html + '</div>';
element.empty();
element.append(pagination);
$compile(element.contents())(scope);
});
}
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment