Pager: use "all" only when option exists. Fixes #1364 & #1366

This commit is contained in:
Rob Garrison 2017-04-02 03:40:10 -05:00
parent f429b96c6c
commit 4f43c31b7c
2 changed files with 54 additions and 41 deletions

View File

@ -393,10 +393,8 @@
}, },
hideRowsSetup = function(table, p){ hideRowsSetup = function(table, p){
var $el = p.$container.find(p.cssPageSize); p.size = parsePageSize( p, p.$container.find(p.cssPageSize).val(), 'get' );
p.size = parsePageSize( p, $el.val(), 'get' ); setPageSize( table, p.size, p );
$el.val( p.size );
$.data(table, 'pagerLastSize', p.size);
pagerArrows( table, p ); pagerArrows( table, p );
if ( !p.removeRows ) { if ( !p.removeRows ) {
hideRows(table, p); hideRows(table, p);
@ -689,7 +687,7 @@
$.data(table, 'pagerLastPage', p.page); $.data(table, 'pagerLastPage', p.page);
$.data(table, 'pagerLastSize', p.size); $.data(table, 'pagerLastSize', p.size);
p.page = 0; p.page = 0;
p.size = 'all'; p.size = p.totalPages;
p.totalPages = 1; p.totalPages = 1;
$(table) $(table)
.addClass('pagerDisabled') .addClass('pagerDisabled')
@ -799,15 +797,9 @@
}, },
getTotalPages = function( table, p ) { getTotalPages = function( table, p ) {
return ts.hasWidget( table, 'filter' ) ? Math.min( p.totalPages, p.filteredPages ) : p.totalPages; return ts.hasWidget( table, 'filter' ) ?
}, Math.min( p.totalPages, p.filteredPages ) :
p.totalPages;
// set to either set or get value
parsePageSize = function( p, size, mode ) {
var s = parseInt( size, 10 ) || p.size || p.settings.size || 10;
return p.initialized && (/all/i.test( size ) || s === p.totalRows) ?
// "get" to get `p.size` or "set" to set `pageSize.val()`
'all' : ( mode === 'get' ? s : p.size );
}, },
parsePageNumber = function( table, p ) { parsePageNumber = function( table, p ) {
@ -818,16 +810,26 @@
return p.page; return p.page;
}, },
// set to either set or get value
parsePageSize = function( p, size, mode ) {
var s = parseInt( size, 10 ) || p.size || p.settings.size || 10;
if (p.initialized && (/all/i.test( s + ' ' + size ) || s === p.totalRows)) {
// Fixing #1364 & #1366
return p.$container.find(p.cssPageSize + ' option[value="all"]').length ?
'all' : p.totalRows;
}
// "get" to get `p.size` or "set" to set `pageSize.val()`
return mode === 'get' ? s : p.size;
},
setPageSize = function(table, size, p) { setPageSize = function(table, size, p) {
// "all" size is only returned if an "all" option exists - fixes #1366
p.size = parsePageSize( p, size, 'get' ); p.size = parsePageSize( p, size, 'get' );
var updatedPageSize = parsePageSize( p, p.size, 'set' ); p.$container.find( p.cssPageSize ).val( p.size );
p.$container.find(p.cssPageSize).val( updatedPageSize !== 'all' ? updatedPageSize :
(p.$container.find(p.cssPageSize.concat(' option[value="').concat(size).concat('"]')).length !== 0 ? size : updatedPageSize) );
$.data(table, 'pagerLastPage', parsePageNumber( table, p ) ); $.data(table, 'pagerLastPage', parsePageNumber( table, p ) );
$.data(table, 'pagerLastSize', p.size); $.data(table, 'pagerLastSize', p.size);
p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size ); p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
p.filteredPages = p.size === 'all' ? 1 : Math.ceil( p.filteredRows / p.size ); p.filteredPages = p.size === 'all' ? 1 : Math.ceil( p.filteredRows / p.size );
moveToPage(table, p);
}, },
moveToFirstPage = function(table, p) { moveToFirstPage = function(table, p) {
@ -908,8 +910,8 @@
$el = p.$container.find(p.cssPageSize); $el = p.$container.find(p.cssPageSize);
size = $el.find('option[selected]').val(); size = $el.find('option[selected]').val();
p.size = $.data(table, 'pagerLastSize') || parsePageSize( p, size, 'get' ); p.size = $.data(table, 'pagerLastSize') || parsePageSize( p, size, 'get' );
$el.val( p.size ); // set page size
p.totalPages = p.size === 'all' ? 1 : Math.ceil( getTotalPages( table, p ) / p.size ); p.totalPages = p.size === 'all' ? 1 : Math.ceil( getTotalPages( table, p ) / p.size );
setPageSize(table, p.size, p); // set page size
// if table id exists, include page display with aria info // if table id exists, include page display with aria info
if ( table.id && !c.$table.attr( 'aria-describedby' ) ) { if ( table.id && !c.$table.attr( 'aria-describedby' ) ) {
$el = p.$container.find( p.cssPageDisplay ); $el = p.$container.find( p.cssPageDisplay );
@ -926,6 +928,7 @@
// tablesorter core update table // tablesorter core update table
ts.update( c ); ts.update( c );
setPageSize(table, p.size, p); setPageSize(table, p.size, p);
moveToPage(table, p);
hideRowsSetup(table, p); hideRowsSetup(table, p);
if (c.debug) { if (c.debug) {
console.log('Pager: Enabled'); console.log('Pager: Enabled');
@ -954,8 +957,7 @@
t = ts.storage(table, p.storageKey) || {}; // fixes #387 t = ts.storage(table, p.storageKey) || {}; // fixes #387
p.page = isNaN(t.page) ? p.page : t.page; p.page = isNaN(t.page) ? p.page : t.page;
p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10; p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
$.data(table, 'pagerLastSize', p.size); setPageSize(table, p.size, p);
pager.find(p.cssPageSize).val(p.size);
} }
// skipped rows // skipped rows
p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')'); p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')');
@ -1025,6 +1027,7 @@
.bind('pageSize refreshComplete '.split(' ').join(namespace + ' '), function(e, size){ .bind('pageSize refreshComplete '.split(' ').join(namespace + ' '), function(e, size){
e.stopPropagation(); e.stopPropagation();
setPageSize(table, parsePageSize( p, size, 'get' ), p); setPageSize(table, parsePageSize( p, size, 'get' ), p);
moveToPage(table, p);
hideRows(table, p); hideRows(table, p);
updatePageDisplay(table, p, false); updatePageDisplay(table, p, false);
}) })
@ -1092,8 +1095,8 @@
if ( !$(this).hasClass(p.cssDisabled) ) { if ( !$(this).hasClass(p.cssDisabled) ) {
var size = $(this).val(); var size = $(this).val();
// in case there are more than one pager // in case there are more than one pager
p.$container.find(p.cssGoto).val( size );
setPageSize(table, size, p); setPageSize(table, size, p);
moveToPage(table, p);
changeHeight(table, p); changeHeight(table, p);
} }
return false; return false;
@ -1127,6 +1130,8 @@
if (!p.ajax && !p.initialized) { if (!p.ajax && !p.initialized) {
p.initializing = false; p.initializing = false;
p.initialized = true; p.initialized = true;
// update page size on init
setPageSize(table, p.size, p);
moveToPage(table, p); moveToPage(table, p);
if (c.debug) { if (c.debug) {
console.log('Pager: Triggering pagerInitialized'); console.log('Pager: Triggering pagerInitialized');

View File

@ -180,8 +180,7 @@
t = ts.storage( table, wo.pager_storageKey ) || {}; // fixes #387 t = ts.storage( table, wo.pager_storageKey ) || {}; // fixes #387
p.page = ( isNaN( t.page ) ? p.page : t.page ) || p.setPage || 0; p.page = ( isNaN( t.page ) ? p.page : t.page ) || p.setPage || 0;
p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10; p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
$.data( table, 'pagerLastSize', p.size ); tsp.setPageSize( c, p.size );
p.$container.find( s.pageSize ).val( p.size );
} }
// skipped rows // skipped rows
@ -219,7 +218,6 @@
initComplete: function( c ) { initComplete: function( c ) {
var p = c.pager; var p = c.pager;
tsp.bindEvents( c ); tsp.bindEvents( c );
tsp.setPageSize( c, 0 ); // page size 0 is ignored
if ( !p.ajax ) { if ( !p.ajax ) {
tsp.hideRowsSetup( c ); tsp.hideRowsSetup( c );
} }
@ -228,6 +226,7 @@
p.initialized = true; p.initialized = true;
p.initializing = false; p.initializing = false;
p.isInitializing = false; p.isInitializing = false;
tsp.setPageSize( c, p.size ); // page size 0 is ignored
if ( c.debug ) { if ( c.debug ) {
console.log( 'Pager: Triggering pagerInitialized' ); console.log( 'Pager: Triggering pagerInitialized' );
} }
@ -310,6 +309,7 @@
.on( 'pageSize refreshComplete '.split( ' ' ).join( namespace + ' ' ), function( e, size ) { .on( 'pageSize refreshComplete '.split( ' ' ).join( namespace + ' ' ), function( e, size ) {
e.stopPropagation(); e.stopPropagation();
tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) ); tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) );
tsp.moveToPage( c, p, true );
tsp.hideRows( c ); tsp.hideRows( c );
tsp.updatePageDisplay( c, false ); tsp.updatePageDisplay( c, false );
}) })
@ -382,6 +382,7 @@
// in case there are more than one pager // in case there are more than one pager
p.$container.find( wo.pager_selectors.pageSize ).val( size ); p.$container.find( wo.pager_selectors.pageSize ).val( size );
tsp.setPageSize( c, size ); tsp.setPageSize( c, size );
tsp.moveToPage( c, p, true );
tsp.changeHeight( c ); tsp.changeHeight( c );
} }
return false; return false;
@ -694,8 +695,7 @@
$el = p.$container.find( c.widgetOptions.pager_selectors.pageSize ), $el = p.$container.find( c.widgetOptions.pager_selectors.pageSize ),
size = $el.val(); size = $el.val();
p.size = tsp.parsePageSize( c, size, 'get' ); p.size = tsp.parsePageSize( c, size, 'get' );
$el.val( p.size ); tsp.setPageSize( c, p.size );
$.data( c.table, 'pagerLastSize', p.size );
tsp.pagerArrows( c ); tsp.pagerArrows( c );
if ( !c.widgetOptions.pager_removeRows ) { if ( !c.widgetOptions.pager_removeRows ) {
tsp.hideRows( c ); tsp.hideRows( c );
@ -1003,7 +1003,7 @@
$.data( table, 'pagerLastPage', p.page ); $.data( table, 'pagerLastPage', p.page );
$.data( table, 'pagerLastSize', p.size ); $.data( table, 'pagerLastSize', p.size );
p.page = 0; p.page = 0;
p.size = 'all'; p.size = p.totalPages;
p.totalPages = 1; p.totalPages = 1;
c.$table c.$table
.addClass( 'pagerDisabled' ) .addClass( 'pagerDisabled' )
@ -1128,16 +1128,9 @@
}, },
getTotalPages: function( c, p ) { getTotalPages: function( c, p ) {
return ts.hasWidget( c.table, 'filter' ) ? Math.min( p.totalPages, p.filteredPages ) : p.totalPages; return ts.hasWidget( c.table, 'filter' ) ?
}, Math.min( p.totalPages, p.filteredPages ) :
p.totalPages;
// set to either set or get value
parsePageSize: function( c, size, mode ) {
var p = c.pager,
s = parseInt( size, 10 ) || p.size || c.widgetOptions.pager_size || 10;
return p.initialized && (/all/i.test( size ) || s === p.totalRows) ?
// "get" to set `p.size` or "set" to set `pageSize.val()`
'all' : ( mode === 'get' ? s : p.size );
}, },
parsePageNumber: function( c, p ) { parsePageNumber: function( c, p ) {
@ -1148,18 +1141,32 @@
return p.page; return p.page;
}, },
// set to either set or get value
parsePageSize: function( c, size, mode ) {
var p = c.pager,
wo = c.widgetOptions,
s = parseInt( size, 10 ) || p.size || wo.pager_size || 10;
if (p.initialized && (/all/i.test( s + ' ' + size ) || s === p.totalRows)) {
// Fixing #1364 & #1366
return p.$container.find( wo.pager_selectors.pageSize + ' option[value="all"]').length ?
'all' : p.totalRows;
}
// "get" to set `p.size` or "set" to set `pageSize.val()`
return mode === 'get' ? s : p.size;
},
setPageSize: function( c, size ) { setPageSize: function( c, size ) {
var p = c.pager, var p = c.pager,
table = c.table; table = c.table;
// "all" size is only returned if an "all" option exists - fixes #1366
p.size = tsp.parsePageSize( c, size, 'get' ); p.size = tsp.parsePageSize( c, size, 'get' );
p.$container p.$container
.find( c.widgetOptions.pager_selectors.pageSize ) .find( c.widgetOptions.pager_selectors.pageSize )
.val( tsp.parsePageSize( c, p.size, 'set' ) ); .val( p.size );
$.data( table, 'pagerLastPage', tsp.parsePageNumber( c, p ) ); $.data( table, 'pagerLastPage', tsp.parsePageNumber( c, p ) );
$.data( table, 'pagerLastSize', p.size ); $.data( table, 'pagerLastSize', p.size );
p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size ); p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
p.filteredPages = p.size === 'all' ? 1 : Math.ceil( p.filteredRows / p.size ); p.filteredPages = p.size === 'all' ? 1 : Math.ceil( p.filteredRows / p.size );
tsp.moveToPage( c, p, true );
}, },
moveToFirstPage: function( c, p ) { moveToFirstPage: function( c, p ) {
@ -1228,7 +1235,7 @@
p.page = $.data( table, 'pagerLastPage' ) || p.page || 0; p.page = $.data( table, 'pagerLastPage' ) || p.page || 0;
size = $el.find('option[selected]' ).val(); size = $el.find('option[selected]' ).val();
p.size = $.data( table, 'pagerLastSize' ) || tsp.parsePageSize( c, size, 'get' ); p.size = $.data( table, 'pagerLastSize' ) || tsp.parsePageSize( c, size, 'get' );
$el.val( p.size ); // set page size tsp.setPageSize( c, p.size ); // set page size
p.totalPages = p.size === 'all' ? 1 : Math.ceil( tsp.getTotalPages( c, p ) / p.size ); p.totalPages = p.size === 'all' ? 1 : Math.ceil( tsp.getTotalPages( c, p ) / p.size );
c.$table.removeClass( 'pagerDisabled' ); c.$table.removeClass( 'pagerDisabled' );
// if table id exists, include page display with aria info // if table id exists, include page display with aria info
@ -1247,6 +1254,7 @@
// tablesorter core update table // tablesorter core update table
ts.update( c ); ts.update( c );
tsp.setPageSize( c, p.size ); tsp.setPageSize( c, p.size );
tsp.moveToPage( c, p, true );
tsp.hideRowsSetup( c ); tsp.hideRowsSetup( c );
if ( c.debug ) { if ( c.debug ) {
console.log( 'Pager: Enabled' ); console.log( 'Pager: Enabled' );