tablesorter/beta-testing/pager-custom-controls.js

131 lines
4.2 KiB
JavaScript
Raw Normal View History

2013-11-13 22:15:04 +00:00
/*!
* custom pager controls (beta) for Tablesorter - updated 8/23/2016 (v2.27.6)
2013-11-13 22:15:04 +00:00
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)
2013-06-01 00:32:50 +00:00
*/
/*jshint browser:true, jquery:true, unused:false, loopfunc:true */
2013-11-13 22:15:04 +00:00
/*global jQuery: false */
2013-06-01 00:32:50 +00:00
;(function($) {
2013-06-01 00:32:50 +00:00
"use strict";
$.tablesorter = $.tablesorter || {};
2013-11-13 22:15:04 +00:00
$.tablesorter.customPagerControls = function(settings) {
2013-06-01 00:32:50 +00:00
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 : ' | ', // spacer for page numbers next to each other
distanceSpacer : ' &#133; ', // spacer for page numbers away from each other (ellipsis)
addKeyboard : true // add left/right keyboard arrows to change current page
},
2013-11-13 22:15:04 +00:00
options = $.extend({}, defaults, settings),
$table = $(options.table),
$pager = $(options.pager);
2013-06-01 00:32:50 +00:00
$table
.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);
}
2013-06-01 00:32:50 +00:00
}
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( '<span>' + (indx < pageArray.length - 1 && ( pageArray[ indx + 1 ] - 1 !== value ) ? options.distanceSpacer :
( indx >= pageArray.length - 1 ? '' : options.adjacentSpacer )) + '</span>' );
});
}
2013-06-01 00:32:50 +00:00
}
$pager
.find('.pagecount')
.html(pages.html());
2013-06-01 00:32:50 +00:00
});
// 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() {
var $el = $(this);
$el
.addClass(options.currentClass)
.siblings()
.removeClass(options.currentClass);
$table.trigger('pageSet', $el.attr('data-page'));
return false;
});
2013-06-01 00:32:50 +00:00
// make right/left arrow keys work
2013-11-13 22:15:04 +00:00
if (options.addKeyboard) {
$(document).on('keydown', function(events) {
2013-06-01 00:32:50 +00:00
// ignore arrows inside form elements
if (/input|select|textarea/i.test(events.target.nodeName)) {
return;
}
2013-11-13 22:15:04 +00:00
if (events.which === 37) {
2013-06-01 00:32:50 +00:00
// left
$pager
.find(options.currentPage)
.filter('.' + options.currentClass)
.prevAll(':not(span):first')
.click();
2013-11-13 22:15:04 +00:00
} else if (events.which === 39) {
2013-06-01 00:32:50 +00:00
// right
$pager
.find(options.currentPage)
.filter('.' + options.currentClass)
.nextAll(':not(span):first')
.click();
2013-06-01 00:32:50 +00:00
}
});
}
};
})(jQuery);