152 lines
5.0 KiB
JavaScript
152 lines
5.0 KiB
JavaScript
/*!
|
|
* custom pager controls (beta) for Tablesorter - updated 9/28/2016 (v2.27.8)
|
|
initialize custom pager script BEFORE initializing tablesorter/tablesorter pager
|
|
custom pager looks like this:
|
|
1 | 2 … 5 | 6 | 7 … 99 | 100
|
|
_ _ _ _ adjacentSpacer
|
|
_ _ distanceSpacer
|
|
_____ ________ ends (2 default)
|
|
_________ aroundCurrent (1 default)
|
|
|
|
*/
|
|
/*jshint browser:true, jquery:true, unused:false, loopfunc:true */
|
|
/*global jQuery: false */
|
|
|
|
;(function($) {
|
|
'use strict';
|
|
|
|
$.tablesorter = $.tablesorter || {};
|
|
|
|
$.tablesorter.customPagerControls = function(settings) {
|
|
var defaults = {
|
|
table : 'table',
|
|
pager : '.pager',
|
|
pageSize : '.left a',
|
|
currentPage : '.right a',
|
|
ends : 2, // number of pages to show of either end
|
|
aroundCurrent : 1, // number of pages surrounding the current page
|
|
link : '<a href="#">{page}</a>', // page element; use {page} to include the page number
|
|
currentClass : 'current', // current page class name
|
|
adjacentSpacer : '<span> | </span>', // spacer for page numbers next to each other
|
|
distanceSpacer : '<span> … <span>', // spacer for page numbers away from each other (ellipsis)
|
|
addKeyboard : true, // use left,right,up,down,pageUp,pageDown,home, or end to change current page
|
|
pageKeyStep : 10 // page step to use for pageUp and pageDown
|
|
},
|
|
options = $.extend({}, defaults, settings),
|
|
$table = $(options.table),
|
|
$pager = $(options.pager),
|
|
focusOnPager = false;
|
|
|
|
$table
|
|
.on('filterStart', function() {
|
|
focusOnPager = false;
|
|
})
|
|
.on('pagerInitialized pagerComplete', function (e, c) {
|
|
var indx,
|
|
p = c.pager ? c.pager : c, // using widget
|
|
pages = $('<div/>'),
|
|
cur = p.page + 1,
|
|
pageArray = [],
|
|
max = p.filteredPages,
|
|
around = options.aroundCurrent;
|
|
for (indx = -around; indx <= around; indx++) {
|
|
if (cur + indx >= 1 && cur + indx <= max) {
|
|
pageArray.push(cur + indx);
|
|
}
|
|
}
|
|
if (pageArray.length) {
|
|
// include first and last pages (ends) in the pagination
|
|
for (indx = 0; indx < options.ends; indx++) {
|
|
if ((indx + 1 <= max) && $.inArray(indx + 1, pageArray) === -1) {
|
|
pageArray.push(indx + 1);
|
|
}
|
|
if ((max - indx > 0) && $.inArray(max - indx, pageArray) === -1) {
|
|
pageArray.push(max - indx);
|
|
}
|
|
}
|
|
// sort the list
|
|
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
|
|
if (pageArray.length) {
|
|
max = pageArray.length - 1;
|
|
$.each(pageArray, function(indx, value) {
|
|
pages
|
|
.append(
|
|
$(options.link.replace(/\{page\}/g, value))
|
|
.toggleClass(options.currentClass, value === cur)
|
|
.attr('data-page', value)
|
|
)
|
|
.append((indx < max && (pageArray[ indx + 1 ] - 1 !== value) ?
|
|
options.distanceSpacer :
|
|
(indx >= max ? '' : options.adjacentSpacer)
|
|
));
|
|
});
|
|
}
|
|
}
|
|
$pager.find('.pagecount').html(pages.html());
|
|
if (focusOnPager) {
|
|
// don't focus on pager when using filter - fixes #1296
|
|
$pager.find('.' + options.currentClass).focus();
|
|
}
|
|
});
|
|
|
|
// set up pager controls
|
|
$pager
|
|
.find(options.pageSize)
|
|
.on('click', function () {
|
|
$(this)
|
|
.addClass(options.currentClass)
|
|
.siblings()
|
|
.removeClass(options.currentClass);
|
|
$table.trigger('pageSize', $(this).html());
|
|
return false;
|
|
})
|
|
.end()
|
|
.on('click', options.currentPage, function() {
|
|
focusOnPager = true;
|
|
var $el = $(this);
|
|
$el
|
|
.addClass(options.currentClass)
|
|
.siblings()
|
|
.removeClass(options.currentClass);
|
|
$table.trigger('pageSet', $el.attr('data-page'));
|
|
return false;
|
|
});
|
|
|
|
// make right/left arrow keys work
|
|
if (options.addKeyboard) {
|
|
$(document).on('keydown', function(events) {
|
|
// ignore arrows inside form elements
|
|
if (/input|select|textarea/i.test(events.target.nodeName) ||
|
|
!(events.which > 32 && events.which < 41)) {
|
|
focusOnPager = false;
|
|
return;
|
|
}
|
|
// only allow keyboard use if element inside of pager is focused
|
|
if ($(document.activeElement).closest(options.pager).is($pager)) {
|
|
events.preventDefault();
|
|
focusOnPager = true;
|
|
var key = events.which,
|
|
max = $table[0].config.totalRows,
|
|
$el = $pager.find(options.currentPage).filter('.' + options.currentClass),
|
|
page = $el.length ? parseInt($el.attr('data-page'), 10) : null;
|
|
if (page) {
|
|
if (key === 33) { page -= options.pageKeyStep; } // pageUp
|
|
if (key === 34) { page += options.pageKeyStep; } // pageDown
|
|
if (key === 35) { page = max; } // end
|
|
if (key === 36) { page = 1; } // home
|
|
if (key === 37 || key === 38) { page -= 1; } // left/up
|
|
if (key === 39 || key === 40) { page += 1; } // right/down
|
|
$table.trigger('pageSet', page);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
})(jQuery);
|