metaminded/tabulatr2

View on GitHub
app/assets/javascripts/tabulatr/_pagination.js

Summary

Maintainability
B
5 hrs
Test Coverage
function TabulatrPagination(pageCount, tableId){
  this.pageCount = pageCount;
  this.tableId = tableId;
}

TabulatrPagination.prototype = {
  constructor: TabulatrPagination,

  createPaginationListItem: function(page, active){
    var $page = $('<li><a href="" data-page="'+ page +'">'+ page +'</a></li>');
    if(active){
      $page.addClass('active');
    }
    return $page;
  },

  updatePagination: function(currentPage){
    var $paginatorUl = $('.pagination[data-table='+ this.tableId +'] > ul');
    $paginatorUl.html(this.createResetButton());
    if(this.pageCount < 13){
      for(var i = 1; i <= this.pageCount; i++){
        $paginatorUl.append(this.createPaginationListItem(i, (i == currentPage)));
      }
    }else{
      if(currentPage > 1){
        $paginatorUl.append(this.createPaginationListItem(1, false));
      }

      var between = Math.floor((1 + currentPage) / 2);
      if(between > 1 && between < currentPage - 2){
        $paginatorUl.append('<li><span>...</span></li>');
        $paginatorUl.append(this.createPaginationListItem(between, false));
      }

      if(currentPage > 4){
        $paginatorUl.append('<li><span>...</span></li>');
      }

      if(currentPage > 3){
        $paginatorUl.append(this.createPaginationListItem(currentPage-2, false));
      }

      if(currentPage > 2){
        $paginatorUl.append(this.createPaginationListItem(currentPage-1, false));
      }

      $paginatorUl.append(this.createPaginationListItem(currentPage, true));

      if(currentPage < this.pageCount - 1){
        $paginatorUl.append(this.createPaginationListItem(currentPage+1, false));
      }

      if(currentPage < this.pageCount - 2){
        $paginatorUl.append(this.createPaginationListItem(currentPage+2, false));
      }

      if(currentPage < this.pageCount - 3){
        $paginatorUl.append('<li><span>...</span></li>');
      }

      between = Math.floor((currentPage + this.pageCount) / 2);

      if(this.additionalPlaceholderNeeded(between, currentPage)){
        $paginatorUl.append(this.createPaginationListItem(between, false));
        $paginatorUl.append('<li><span>...</span></li>');
      }
      if(currentPage < this.pageCount){
        $paginatorUl.append(this.createPaginationListItem(this.pageCount, false));
      }
    }

  },

  createResetButton: function() {
    var html = '';
    if($('table#'+ this.tableId).data('persistent')){
      html = '<li><a href="#" data-tabulatr-reset="'+ this.tableId +'"><i class="fa fa-refresh"></i></a></li>';
    }
    return html;
  },

  additionalPlaceholderNeeded: function(pageToCompare, currentPage){
    return pageToCompare > currentPage + 3 && pageToCompare < this.pageCount - 1;
  }
}