node-view-helpers icon indicating copy to clipboard operation
node-view-helpers copied to clipboard

fix to handle large number of pages gracefully

Open pradeepkaruturi opened this issue 12 years ago • 1 comments

pradeepkaruturi avatar Aug 25 '13 12:08 pradeepkaruturi

Some fixes to pagination

function createPagination (req) {
  return function createPagination (pages, currentPage, maxDisplay) {
    currentPage = parseInt(currentPage)
    pages=Math.ceil(pages)
    var paginationLinkFirst =function(page, params){
      params.page=page
      var clas = currentPage == page ? "disabled" : "no"
      return '<li class="'+clas+'"><a href="?'+qs.stringify(params)+'">&laquo;</a></li>'
    }
    var paginationLinkLast =function(page, params){
      params.page=page
      var clas = currentPage == page ? "disabled" : "no"
      return '<li class="'+clas+'"><a href="?'+qs.stringify(params)+'">&raquo;</a></li>'
    }
    var paginationLinkStr =function(page, text, params){
      params.page=page
      var clas = currentPage == page ? "active" : "no"
      return '<li class="'+clas+'"><a href="?'+qs.stringify(params)+'">'+text+'</a></li>'
    }
    var params = qs.parse(url.parse(req.url).query)
    var str = ''
    maxDisplay= maxDisplay===undefined ? 8 : maxDisplay

    // See the location of the current page.
    // if it is close to the first page by lesser than max-4 pages then show 1 to max-2 .. last-1, last
    // if it is close to the last page by lesser than max-4  pages then show 1,2 .. last-(max-2) to last
    // if neither.. then show 1,2 .. current-(max/2-1) to current+(max/2+1) .. last-1, last

    str += paginationLinkFirst(1, params)

    if(pages>maxDisplay){
      if(currentPage < (maxDisplay - 4)){        
        //case 1
        for (var pageNo = 1; pageNo <= (maxDisplay - 3); pageNo++) {
          str += paginationLinkStr(pageNo, pageNo, params)
        }
        str += paginationLinkStr(pages-1, pages-1, params)
        str += paginationLinkStr(pages, pages, params)
      }else if ((pages - currentPage) < (maxDisplay - 4)){
        //case 2
        str += paginationLinkStr(1, 1, params)
        for (var pageNo = (pages - maxDisplay + 2); pageNo < pages+1; pageNo++) {
          str += paginationLinkStr(pageNo, pageNo, params)
        }
      }else{
        //case 3
        str += paginationLinkStr(1, 1, params)
        var max=currentPage + maxDisplay/2 - 2
        for (var pageNo = currentPage - (maxDisplay / 2 - 2); pageNo <=max ; pageNo++) {
          str += paginationLinkStr(pageNo, pageNo, params)
        }
        str += paginationLinkStr(pages-1, pages-1, params)
        str += paginationLinkStr(pages, pages, params)
      }

    }else{
      //render all page links!!

      for (var pageNo = 1; pageNo < pages + 1; pageNo++) {
        str += paginationLinkStr(pageNo, pageNo, params)
      }
    }
    str += paginationLinkLast(pages, params)
    return str
  }
}

panzhangwang avatar Aug 29 '13 10:08 panzhangwang