mirror of
https://github.com/Mottie/tablesorter.git
synced 2024-11-15 23:54:22 +00:00
Pager-custom-controls: Prevent out-of-range page numbers. Fixes #1276
This commit is contained in:
parent
27a931e785
commit
a42e762eda
@ -1,5 +1,5 @@
|
|||||||
/*!
|
/*!
|
||||||
* custom pager controls (beta) for TableSorter 9/15/2014 (v2.17.8) - updated 3/26/2015 (v2.21.3)
|
* custom pager controls (beta) for Tablesorter - updated 8/23/2016 (v2.27.6)
|
||||||
initialize custom pager script BEFORE initializing tablesorter/tablesorter pager
|
initialize custom pager script BEFORE initializing tablesorter/tablesorter pager
|
||||||
custom pager looks like this:
|
custom pager looks like this:
|
||||||
1 | 2 … 5 | 6 | 7 … 99 | 100
|
1 | 2 … 5 | 6 | 7 … 99 | 100
|
||||||
@ -35,52 +35,77 @@ $.tablesorter.customPagerControls = function(settings) {
|
|||||||
$table = $(options.table),
|
$table = $(options.table),
|
||||||
$pager = $(options.pager);
|
$pager = $(options.pager);
|
||||||
|
|
||||||
|
function validate(val, min, max) {
|
||||||
|
if (val < min) { return min; }
|
||||||
|
if (val > max) { return max; }
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
$table
|
$table
|
||||||
.on('pagerInitialized pagerComplete', function (e, c) {
|
.on('pagerInitialized pagerComplete', function (e, c) {
|
||||||
var indx,
|
var indx,
|
||||||
p = c.pager ? c.pager : c, // using widget
|
p = c.pager ? c.pager : c, // using widget
|
||||||
pages = $('<div/>'),
|
pages = $('<div/>'),
|
||||||
pageArray = [],
|
|
||||||
cur = p.page + 1,
|
cur = p.page + 1,
|
||||||
start = cur > 1 ? (p.filteredPages - cur < options.aroundCurrent ? -(options.aroundCurrent + 1) + (p.filteredPages - cur) : -options.aroundCurrent) : 0,
|
pageArray = [cur],
|
||||||
end = cur < options.aroundCurrent + 1 ? options.aroundCurrent + 3 - cur : options.aroundCurrent + 1;
|
max = p.filteredPages,
|
||||||
|
around = options.aroundCurrent,
|
||||||
|
start = validate(cur > 1 ? (max - cur < around ? -(around + 1) + (max - cur) : -around) : 0, 0, max),
|
||||||
|
end = validate(cur < around + 1 ? around + 3 - cur : around + 1, 0, max);
|
||||||
for (indx = start; indx < end; indx++) {
|
for (indx = start; indx < end; indx++) {
|
||||||
if (cur + indx >= 1 && cur + indx < p.filteredPages) { pageArray.push( cur + indx ); }
|
if (cur + indx >= 1 && cur + indx < max) {
|
||||||
|
pageArray.push(cur + indx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (pageArray.length) {
|
if (pageArray.length) {
|
||||||
// include first and last pages (ends) in the pagination
|
// include first and last pages (ends) in the pagination
|
||||||
for (indx = 0; indx < options.ends; indx++){
|
for (indx = 0; indx < options.ends; indx++){
|
||||||
if ($.inArray(indx + 1, pageArray) === -1) { pageArray.push(indx + 1); }
|
if ((indx + 1 < max) && $.inArray(indx + 1, pageArray) === -1) {
|
||||||
if ($.inArray(p.filteredPages - indx, pageArray) === -1) { pageArray.push(p.filteredPages - indx); }
|
pageArray.push(indx + 1);
|
||||||
|
}
|
||||||
|
if ((max - indx > 0) && $.inArray(max - indx, pageArray) === -1) {
|
||||||
|
pageArray.push(max - indx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// sort the list
|
// sort the list
|
||||||
pageArray = pageArray.sort(function(a, b){ return a - b; });
|
pageArray = pageArray.sort(function(a, b){ return a - b; });
|
||||||
|
// only include unique pages
|
||||||
|
pageArray = $.grep(pageArray, function(value, key){
|
||||||
|
return $.inArray(value, pageArray) === key;
|
||||||
|
});
|
||||||
// make links and spacers
|
// make links and spacers
|
||||||
$.each(pageArray, function(indx, value){
|
if (pageArray.length > 1) {
|
||||||
|
$.each(pageArray, function(indx, value) {
|
||||||
pages
|
pages
|
||||||
.append( $(options.link.replace(/\{page\}/g, value)).toggleClass(options.currentClass, value === cur).attr('data-page', value) )
|
.append( $(options.link.replace(/\{page\}/g, value)).toggleClass(options.currentClass, value === cur).attr('data-page', value) )
|
||||||
.append( '<span>' + (indx < pageArray.length - 1 && ( pageArray[ indx + 1 ] - 1 !== value ) ? options.distanceSpacer :
|
.append( '<span>' + (indx < pageArray.length - 1 && ( pageArray[ indx + 1 ] - 1 !== value ) ? options.distanceSpacer :
|
||||||
( indx >= pageArray.length - 1 ? '' : options.adjacentSpacer )) + '</span>' );
|
( indx >= pageArray.length - 1 ? '' : options.adjacentSpacer )) + '</span>' );
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
$pager.find('.pagecount').html(pages.html());
|
}
|
||||||
|
$pager
|
||||||
|
.find('.pagecount')
|
||||||
|
.html(pages.html());
|
||||||
});
|
});
|
||||||
|
|
||||||
// set up pager controls
|
// set up pager controls
|
||||||
$pager.find(options.pageSize).on('click', function () {
|
$pager
|
||||||
|
.find(options.pageSize)
|
||||||
|
.on('click', function () {
|
||||||
$(this)
|
$(this)
|
||||||
.addClass(options.currentClass)
|
.addClass(options.currentClass)
|
||||||
.siblings()
|
.siblings()
|
||||||
.removeClass(options.currentClass);
|
.removeClass(options.currentClass);
|
||||||
$table.trigger('pageSize', $(this).html());
|
$table.trigger('pageSize', $(this).html());
|
||||||
return false;
|
return false;
|
||||||
}).end()
|
})
|
||||||
|
.end()
|
||||||
.on('click', options.currentPage, function(){
|
.on('click', options.currentPage, function(){
|
||||||
$(this)
|
var $el =$(this)
|
||||||
.addClass(options.currentClass)
|
.addClass(options.currentClass)
|
||||||
.siblings()
|
.siblings()
|
||||||
.removeClass(options.currentClass);
|
.removeClass(options.currentClass);
|
||||||
$table.trigger('pageSet', $(this).attr('data-page'));
|
$table.trigger('pageSet', $el.attr('data-page'));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -88,13 +113,23 @@ $.tablesorter.customPagerControls = function(settings) {
|
|||||||
if (options.addKeyboard) {
|
if (options.addKeyboard) {
|
||||||
$(document).on('keydown', function(events){
|
$(document).on('keydown', function(events){
|
||||||
// ignore arrows inside form elements
|
// ignore arrows inside form elements
|
||||||
if (/input|select|textarea/i.test(events.target.nodeName)) { return; }
|
if (/input|select|textarea/i.test(events.target.nodeName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (events.which === 37) {
|
if (events.which === 37) {
|
||||||
// left
|
// left
|
||||||
$pager.find(options.currentPage).filter('.' + options.currentClass).prevAll(':not(span):first').click();
|
$pager
|
||||||
|
.find(options.currentPage)
|
||||||
|
.filter('.' + options.currentClass)
|
||||||
|
.prevAll(':not(span):first')
|
||||||
|
.click();
|
||||||
} else if (events.which === 39) {
|
} else if (events.which === 39) {
|
||||||
// right
|
// right
|
||||||
$pager.find(options.currentPage).filter('.' + options.currentClass).nextAll(':not(span):first').click();
|
$pager
|
||||||
|
.find(options.currentPage)
|
||||||
|
.filter('.' + options.currentClass)
|
||||||
|
.nextAll(':not(span):first')
|
||||||
|
.click();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user