# All files / src pagination.js

90.91% Statements 50/55
90.7% Branches 39/43
91.67% Functions 11/12
90.74% Lines 49/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    10917x
    17x
    17x

    17x
    91x

    91x
    26x
    2x
    2x
    2x
    24x
    2x

    24x
    24x
    24x
    24x
    24x
    24x
    24x
    24x

    24x
    24x
    24x
    234x

    234x
    95x

    95x
    24x

    95x
    95x
    139x
    30x

    30x

    91x

    234x

    234x

    249x

    239x

    139x

    139x

    124x
    39x

    85x

    91x
    4x

    4x

    4x
    22x

    4x

     var classes = require('./utils/classes'),
      events = require('./utils/events'),
      List = require('./index')

    module.exports = function (list) {
      var isHidden = false

      var refresh = function (pagingList, options) {
        if (list.page < 1) {
          list.listContainer.style.display = 'none'
          isHidden = true
          return
        } else if (isHidden) {
          list.listContainer.style.display = 'block'
        }

        var item,
          l = list.matchingItems.length,
          index = list.i,
          page = list.page,
          pages = Math.ceil(l / page),
          currentPage = Math.ceil(index / page),
          innerWindow = options.innerWindow || 2,
          left = options.left || options.outerWindow || 0,
          right = options.right || options.outerWindow || 0

        right = pages - right
        pagingList.clear()
        for (var i = 1; i <= pages; i++) {
          var className = currentPage === i ? 'active' : ''

          //console.log(i, left, right, currentPage, (currentPage - innerWindow), (currentPage + innerWindow), className);

          if (is.number(i, left, right, currentPage, innerWindow)) {
            item = pagingList.add({
              page: i,
              dotted: false,
            })[0]
            if (className) {
              classes(item.elm).add(className)
            }
            item.elm.firstChild.setAttribute('data-i', i)
            item.elm.firstChild.setAttribute('data-page', page)
          } else if (is.dotted(pagingList, i, left, right, currentPage, innerWindow, pagingList.size())) {
            item = pagingList.add({
              page: '...',
              dotted: true,
            })[0]
            classes(item.elm).add('disabled')
          }
        }
      }

      var is = {
        number: function (i, left, right, currentPage, innerWindow) {
          return this.left(i, left) || this.right(i, right) || this.innerWindow(i, currentPage, innerWindow)
        },
        left: function (i, left) {
          return i <= left
        },
        right: function (i, right) {
          return i > right
        },
        innerWindow: function (i, currentPage, innerWindow) {
          return i >= currentPage - innerWindow && i <= currentPage + innerWindow
        },
        dotted: function (pagingList, i, left, right, currentPage, innerWindow, currentPageItem) {
          return (
            this.dottedLeft(pagingList, i, left, right, currentPage, innerWindow) ||
            this.dottedRight(pagingList, i, left, right, currentPage, innerWindow, currentPageItem)
          )
        },
        dottedLeft: function (pagingList, i, left, right, currentPage, innerWindow) {
          return i == left + 1 && !this.innerWindow(i, currentPage, innerWindow) && !this.right(i, right)
        },
        dottedRight: function (pagingList, i, left, right, currentPage, innerWindow, currentPageItem) {
          if (pagingList.items[currentPageItem - 1].values().dotted) {
            return false
          } else {
            return i == right && !this.innerWindow(i, currentPage, innerWindow) && !this.right(i, right)
          }
        },
      }

      return function (options) {
        var pagingList = new List(list.listContainer.id, {
          listClass: options.paginationClass || 'pagination',
          item: options.item || "<li><a class='page' href='#'></a></li>",
          valueNames: ['page', 'dotted'],
          searchClass: 'pagination-search-that-is-not-supposed-to-exist',
          sortClass: 'pagination-sort-that-is-not-supposed-to-exist',
        })

        events.bind(pagingList.listContainer, 'click', function (e) {
          var target = e.target || e.srcElement,
            page = list.utils.getAttribute(target, 'data-page'),
            i = list.utils.getAttribute(target, 'data-i')
          if (i) {
            list.show((i - 1) * page + 1, page)
          }
        })

        list.on('updated', function () {
          refresh(pagingList, options)
        })
        refresh(pagingList, options)
      }
    }