Last active
October 24, 2015 21:51
-
-
Save ikouchiha47/3dbbd3c7db695ec752b2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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