-
Notifications
You must be signed in to change notification settings - Fork 896
/
Copy pathpagination.js
108 lines (98 loc) · 3.61 KB
/
pagination.js
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
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)
}
}