109 lines
3.6 KiB
JavaScript
109 lines
3.6 KiB
JavaScript
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)
|
|
}
|
|
}
|