Skip to content

Instantly share code, notes, and snippets.

@ikouchiha47
Last active October 24, 2015 21:51
Show Gist options
  • Save ikouchiha47/3dbbd3c7db695ec752b2 to your computer and use it in GitHub Desktop.
Save ikouchiha47/3dbbd3c7db695ec752b2 to your computer and use it in GitHub Desktop.
(function() {
'use strict';
angular
.module('githubApp')
.factory('Pagination', Pagination)
function Pagination(){
return {
pages: function(response, base_url){
var current_page = parseInt(response.headers('Current-Page'));
var total_pages = parseInt(response.headers('Total-Pages'));
var pages = [];
var first = { css_class: "first", href: base_url, text: "First" };
var prev = { css_class: "prev", href: paginationURL(base_url, current_page - 1), text: "Previous" };
var next = { css_class: "next_page", href: paginationURL(base_url, current_page + 1), text: "Next" };
var last = { css_class: "last next", href: paginationURL(base_url, total_pages), text: "Last" };
function paginationURL(base_url, val){
if(base_url.indexOf("?") > 0){
return base_url + '&page=' + val;
} else {
return base_url + '?page=' + val;
}
}
// previous link
if (current_page != 1){
pages.push(first);
pages.push(prev);
}
// windowed page numbers
var inner_window = 4;
var outer_window = 1;
var window_from = current_page - inner_window;
var window_to = current_page + inner_window;
var total_pages = total_pages;
// adjust lower or upper limit if other is out of bounds
if (window_to > total_pages){
window_from -= window_to - total_pages;
window_to = total_pages;
}
if (window_from < 1){
window_to += 1 - window_from;
window_from = 1;
if (window_to > total_pages)
window_to = total_pages ;
}
// these are always visible
var middle = [];
for(var i=window_from; i<=window_to; i++){
middle.push(i);
}
// left window
var left = [];
if (outer_window + 3 < middle[0]){
// there's a gap
for(i=1; i<=(outer_window + 1); i++){
left.push(i);
}
left.push("...");
}
else {
// runs into visible pages
for(i=1; i<middle[0]; i++){
left.push(i);
}
}
//right window
var right = [];
if (total_pages - outer_window - 2 > middle[middle.length - 1]){
// again, gap
for(i=(total_pages - outer_window); i<=total_pages; i++){
right.push(i);
}
right.unshift('...');
}
else {
// runs into visible pages
for(i=middle[middle.length - 1]; i<total_pages; i++){
right.push(i);
}
}
var page_numbers = left.concat(middle).concat(right);
if (total_pages > 1){
angular.forEach(page_numbers, function(val){
if (current_page == val){
var el = { css_class: "page active", href: paginationURL(base_url, val), text: val };
}
else if(val == '...'){
var el = { css_class: "page gap disabled", href: "#", text: val };
}
else {
var el = { css_class: "page", href: paginationURL(base_url, val), text: val };
}
pages.push(el);
});
// next link
if (current_page != total_pages){
pages.push(next);
pages.push(last);
}
}
return pages;
}
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment