Pager: initialize without building cache when delayInit true. Fixes #678

This commit is contained in:
Mottie 2014-07-11 14:51:50 -05:00
parent 98d47ff3bb
commit 4ef7bcd5a8
2 changed files with 103 additions and 29 deletions

View File

@ -137,15 +137,20 @@
t = [ (c.widgetOptions && c.widgetOptions.filter_filteredRow || 'filtered'), c.selectorRemove.replace(/^(\w+\.)/g,'') ]; t = [ (c.widgetOptions && c.widgetOptions.filter_filteredRow || 'filtered'), c.selectorRemove.replace(/^(\w+\.)/g,'') ];
if (p.countChildRows) { t.push(c.cssChildRow); } if (p.countChildRows) { t.push(c.cssChildRow); }
regex = new RegExp( '(' + t.join('|') + ')' ); regex = new RegExp( '(' + t.join('|') + ')' );
p.totalPages = Math.ceil( p.totalRows / sz ); // needed for "pageSize" method
if (f && !p.ajaxUrl) { if (f && !p.ajaxUrl) {
if ($.isEmptyObject(c.cache)) {
// delayInit: true so nothing is in the cache
p.filteredRows = p.totalRows = c.$tbodies.eq(0).children('tr').not( p.countChildRows ? '' : '.' + c.cssChildRow ).length;
} else {
p.filteredRows = 0; p.filteredRows = 0;
$.each(c.cache[0].normalized, function(i, el) { $.each(c.cache[0].normalized, function(i, el) {
p.filteredRows += p.regexRows.test(el[c.columns].$row[0].className) ? 0 : 1; p.filteredRows += p.regexRows.test(el[c.columns].$row[0].className) ? 0 : 1;
}); });
}
} else if (!f) { } else if (!f) {
p.filteredRows = p.totalRows; p.filteredRows = p.totalRows;
} }
p.totalPages = Math.ceil( p.totalRows / sz ); // needed for "pageSize" method
c.totalRows = p.totalRows; c.totalRows = p.totalRows;
c.filteredRows = p.filteredRows; c.filteredRows = p.filteredRows;
p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0; p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
@ -292,7 +297,7 @@
exception === 'timeout' ? 'Time out error' : exception === 'timeout' ? 'Time out error' :
exception === 'abort' ? 'Ajax Request aborted' : exception === 'abort' ? 'Ajax Request aborted' :
'Uncaught error: ' + xhr.statusText + ' [' + xhr.status + ']' ); 'Uncaught error: ' + xhr.statusText + ' [' + xhr.status + ']' );
c.$tbodies.eq(0).children().detach(); c.$tbodies.eq(0).children('tr').detach();
p.totalRows = 0; p.totalRows = 0;
} else { } else {
// process ajax object // process ajax object
@ -317,7 +322,7 @@
if (d instanceof jQuery) { if (d instanceof jQuery) {
if (p.processAjaxOnInit) { if (p.processAjaxOnInit) {
// append jQuery object // append jQuery object
c.$tbodies.eq(0).children().detach(); c.$tbodies.eq(0).children('tr').detach();
c.$tbodies.eq(0).append(d); c.$tbodies.eq(0).append(d);
} }
} else if (l) { } else if (l) {
@ -477,7 +482,13 @@
l = rows && rows.length || 0, // rows may be undefined l = rows && rows.length || 0, // rows may be undefined
s = ( p.page * p.size ), s = ( p.page * p.size ),
e = p.size; e = p.size;
if ( l < 1 ) { return; } // empty table, abort! if ( l < 1 ) {
if (c.debug) {
ts.log('Pager: no rows for pager to render');
}
// empty table, abort!
return;
}
if ( p.page >= p.totalPages ) { if ( p.page >= p.totalPages ) {
// lets not render the table more than once // lets not render the table more than once
moveToLastPage(table, p); moveToLastPage(table, p);
@ -540,12 +551,32 @@
}); });
}, },
// updateCache if delayInit: true
updateCache = function(table) {
var c = table.config,
p = c.pager;
c.$table.trigger('updateCache', [ function(){
var i,
rows = [],
n = table.config.cache[0].normalized;
p.totalRows = n.length;
for (i = 0; i < p.totalRows; i++) {
rows.push(n[i][c.columns].$row);
}
c.rowsCopy = rows;
moveToPage(table, p, true);
} ]);
},
moveToPage = function(table, p, pageMoved) { moveToPage = function(table, p, pageMoved) {
if ( p.isDisabled ) { return; } if ( p.isDisabled ) { return; }
var c = table.config, var c = table.config,
$t = $(table), $t = $(table),
l = p.last, l = p.last,
pg = Math.min( p.totalPages, p.filteredPages ); pg = Math.min( p.totalPages, p.filteredPages );
if ( pageMoved !== false && p.initialized && $.isEmptyObject(table.config.cache)) {
return updateCache(table);
}
if ( p.page < 0 ) { p.page = 0; } if ( p.page < 0 ) { p.page = 0; }
if ( p.page > ( pg - 1 ) && pg !== 0 ) { p.page = pg - 1; } if ( p.page > ( pg - 1 ) && pg !== 0 ) { p.page = pg - 1; }
// fixes issue where one currentFilter is [] and the other is ['','',''], // fixes issue where one currentFilter is [] and the other is ['','',''],
@ -716,6 +747,10 @@
// update pager after filter widget completes // update pager after filter widget completes
.bind('filterEnd.pager sortEnd.pager', function() { .bind('filterEnd.pager sortEnd.pager', function() {
if (p.initialized) { if (p.initialized) {
if (c.delayInit && c.rowsCopy && c.rowsCopy.length === 0) {
// make sure we have a copy of all table rows once the cache has been built
updateCache(table);
}
// update page display first, so we update p.filteredPages // update page display first, so we update p.filteredPages
updatePageDisplay(table, p, false); updatePageDisplay(table, p, false);
moveToPage(table, p, false); moveToPage(table, p, false);
@ -754,7 +789,7 @@
e.stopPropagation(); e.stopPropagation();
p.page = (parseInt(v, 10) || 1) - 1; p.page = (parseInt(v, 10) || 1) - 1;
if (p.$goto.length) { p.$goto.val(p.size); } // twice? if (p.$goto.length) { p.$goto.val(p.size); } // twice?
moveToPage(table, p); moveToPage(table, p, true);
updatePageDisplay(table, p, false); updatePageDisplay(table, p, false);
}); });
@ -784,7 +819,7 @@
.unbind('change') .unbind('change')
.bind('change', function(){ .bind('change', function(){
p.page = $(this).val() - 1; p.page = $(this).val() - 1;
moveToPage(table, p); moveToPage(table, p, true);
updatePageDisplay(table, p, false); updatePageDisplay(table, p, false);
}); });
} }

View File

@ -153,7 +153,7 @@ tsp = ts.pager = {
p.$goto = p.$container.find(s.gotoPage); // goto is a reserved word #657 p.$goto = p.$container.find(s.gotoPage); // goto is a reserved word #657
// page size selector // page size selector
p.$size = p.$container.find(s.pageSize); p.$size = p.$container.find(s.pageSize);
p.totalRows = c.$tbodies.eq(0).children('tr').length; p.totalRows = c.$tbodies.eq(0).children('tr').not( c.widgetOptions.pager_countChildRows ? '' : '.' + c.cssChildRow ).length;
p.oldAjaxSuccess = p.oldAjaxSuccess || wo.pager_ajaxObject.success; p.oldAjaxSuccess = p.oldAjaxSuccess || wo.pager_ajaxObject.success;
c.appender = tsp.appender; c.appender = tsp.appender;
if (ts.filter && $.inArray('filter', c.widgets) >= 0) { if (ts.filter && $.inArray('filter', c.widgets) >= 0) {
@ -199,11 +199,11 @@ tsp = ts.pager = {
var p = c.pager; var p = c.pager;
tsp.changeHeight(table, c); tsp.changeHeight(table, c);
tsp.bindEvents(table, c); tsp.bindEvents(table, c);
tsp.setPageSize(table, 0, c); // page size 0 is ignored
// pager initialized // pager initialized
p.initialized = true; p.initialized = true;
p.isInitializing = false; p.isInitializing = false;
tsp.setPageSize(table, 0, c); // page size 0 is ignored
c.$table.trigger('pagerInitialized', c); c.$table.trigger('pagerInitialized', c);
tsp.updatePageDisplay(table, c); tsp.updatePageDisplay(table, c);
}, },
@ -226,6 +226,10 @@ tsp = ts.pager = {
// update pager after filter widget completes // update pager after filter widget completes
.bind('filterEnd.pager sortEnd.pager', function() { .bind('filterEnd.pager sortEnd.pager', function() {
if (p.initialized) { if (p.initialized) {
if (c.delayInit && c.rowsCopy && c.rowsCopy.length === 0) {
// make sure we have a copy of all table rows once the cache has been built
tsp.updateCache(table);
}
// update page display first, so we update p.filteredPages // update page display first, so we update p.filteredPages
tsp.updatePageDisplay(table, c, false); tsp.updatePageDisplay(table, c, false);
tsp.moveToPage(table, p, false); tsp.moveToPage(table, p, false);
@ -266,7 +270,7 @@ tsp = ts.pager = {
e.stopPropagation(); e.stopPropagation();
p.page = (parseInt(v, 10) || 1) - 1; p.page = (parseInt(v, 10) || 1) - 1;
if (p.$goto.length) { p.$goto.val(c.size); } // twice? if (p.$goto.length) { p.$goto.val(c.size); } // twice?
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
tsp.updatePageDisplay(table, c, false); tsp.updatePageDisplay(table, c, false);
}); });
@ -296,7 +300,7 @@ tsp = ts.pager = {
.unbind('change') .unbind('change')
.bind('change', function(){ .bind('change', function(){
p.page = $(this).val() - 1; p.page = $(this).val() - 1;
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
tsp.updatePageDisplay(table, c, false); tsp.updatePageDisplay(table, c, false);
}); });
} }
@ -342,15 +346,20 @@ tsp = ts.pager = {
if (wo.pager_countChildRows) { t.push(c.cssChildRow); } if (wo.pager_countChildRows) { t.push(c.cssChildRow); }
regex = new RegExp( '(' + t.join('|') + ')' ); regex = new RegExp( '(' + t.join('|') + ')' );
p.$size.add(p.$goto).removeClass(wo.pager_css.disabled).removeAttr('disabled').attr('aria-disabled', 'false'); p.$size.add(p.$goto).removeClass(wo.pager_css.disabled).removeAttr('disabled').attr('aria-disabled', 'false');
p.totalPages = Math.ceil( p.totalRows / sz ); // needed for "pageSize" method
if (f && !wo.pager_ajaxUrl) { if (f && !wo.pager_ajaxUrl) {
if ($.isEmptyObject(c.cache)) {
// delayInit: true so nothing is in the cache
p.filteredRows = p.totalRows = c.$tbodies.eq(0).children('tr').not( c.widgetOptions.pager_countChildRows ? '' : '.' + c.cssChildRow ).length;
} else {
p.filteredRows = 0; p.filteredRows = 0;
$.each(c.cache[0].normalized, function(i, el) { $.each(c.cache[0].normalized, function(i, el) {
p.filteredRows += p.regexRows.test(el[c.columns].$row[0].className) ? 0 : 1; p.filteredRows += p.regexRows.test(el[c.columns].$row[0].className) ? 0 : 1;
}); });
}
} else if (!f) { } else if (!f) {
p.filteredRows = p.totalRows; p.filteredRows = p.totalRows;
} }
p.totalPages = Math.ceil( p.totalRows / sz ); // needed for "pageSize" method
c.totalRows = p.totalRows; c.totalRows = p.totalRows;
c.filteredRows = p.filteredRows; c.filteredRows = p.filteredRows;
p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0; p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
@ -494,7 +503,7 @@ tsp = ts.pager = {
ts.log('Ajax Error', xhr, exception); ts.log('Ajax Error', xhr, exception);
} }
ts.showError(table, exception.message + ' (' + xhr.status + ')'); ts.showError(table, exception.message + ' (' + xhr.status + ')');
c.$tbodies.eq(0).children().detach(); c.$tbodies.eq(0).children('tr').detach();
p.totalRows = 0; p.totalRows = 0;
} else { } else {
// process ajax object // process ajax object
@ -519,7 +528,7 @@ tsp = ts.pager = {
if (d instanceof jQuery) { if (d instanceof jQuery) {
if (wo.pager_processAjaxOnInit) { if (wo.pager_processAjaxOnInit) {
// append jQuery object // append jQuery object
c.$tbodies.eq(0).children().detach(); c.$tbodies.eq(0).children('tr').detach();
c.$tbodies.eq(0).append(d); c.$tbodies.eq(0).append(d);
} }
} else if (l) { } else if (l) {
@ -676,14 +685,19 @@ tsp = ts.pager = {
l = rows && rows.length || 0, // rows may be undefined l = rows && rows.length || 0, // rows may be undefined
s = ( p.page * p.size ), s = ( p.page * p.size ),
e = p.size; e = p.size;
if ( l < 1 ) { return; } // empty table, abort! if ( l < 1 ) {
if (c.debug) {
ts.log('Pager: no rows for pager to render');
}
// empty table, abort!
return;
}
if ( p.page >= p.totalPages ) { if ( p.page >= p.totalPages ) {
// lets not render the table more than once // lets not render the table more than once
return tsp.moveToLastPage(table, p); return tsp.moveToLastPage(table, p);
} }
p.isDisabled = false; // needed because sorting will change the page and re-enable the pager p.isDisabled = false; // needed because sorting will change the page and re-enable the pager
if (p.initialized) { c.$table.trigger('pagerChange', c); } if (p.initialized) { c.$table.trigger('pagerChange', c); }
if ( !wo.pager_removeRows ) { if ( !wo.pager_removeRows ) {
tsp.hideRows(table, c); tsp.hideRows(table, c);
} else { } else {
@ -746,8 +760,33 @@ tsp = ts.pager = {
}); });
}, },
// updateCache if delayInit: true
// this is normally done by "appendToTable" function in the tablesorter core AFTER a sort
updateCache: function(table) {
var c = table.config,
p = c.pager;
c.$table.trigger('updateCache', [ function(){
if ( !$.isEmptyObject(table.config.cache) ) {
var i,
rows = [],
n = table.config.cache[0].normalized;
p.totalRows = n.length;
for (i = 0; i < p.totalRows; i++) {
rows.push(n[i][c.columns].$row);
}
c.rowsCopy = rows;
tsp.moveToPage(table, p, true);
// clear out last search to force an update
p.last.currentFilters = [' '];
}
} ]);
},
moveToPage: function(table, p, pageMoved) { moveToPage: function(table, p, pageMoved) {
if ( p.isDisabled ) { return; } if ( p.isDisabled ) { return; }
if ( pageMoved !== false && p.initialized && $.isEmptyObject(table.config.cache)) {
return tsp.updateCache(table);
}
var c = table.config, var c = table.config,
l = p.last, l = p.last,
pg = Math.min( p.totalPages, p.filteredPages ); pg = Math.min( p.totalPages, p.filteredPages );
@ -796,17 +835,17 @@ tsp = ts.pager = {
$.data(table, 'pagerLastSize', p.size); $.data(table, 'pagerLastSize', p.size);
p.totalPages = Math.ceil( p.totalRows / p.size ); p.totalPages = Math.ceil( p.totalRows / p.size );
p.filteredPages = Math.ceil( p.filteredRows / p.size ); p.filteredPages = Math.ceil( p.filteredRows / p.size );
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
}, },
moveToFirstPage: function(table, p) { moveToFirstPage: function(table, p) {
p.page = 0; p.page = 0;
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
}, },
moveToLastPage: function(table, p) { moveToLastPage: function(table, p) {
p.page = ( Math.min( p.totalPages, p.filteredPages ) - 1 ); p.page = ( Math.min( p.totalPages, p.filteredPages ) - 1 );
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
}, },
moveToNextPage: function(table, p) { moveToNextPage: function(table, p) {
@ -814,7 +853,7 @@ tsp = ts.pager = {
if ( p.page >= ( Math.min( p.totalPages, p.filteredPages ) - 1 ) ) { if ( p.page >= ( Math.min( p.totalPages, p.filteredPages ) - 1 ) ) {
p.page = ( Math.min( p.totalPages, p.filteredPages ) - 1 ); p.page = ( Math.min( p.totalPages, p.filteredPages ) - 1 );
} }
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
}, },
moveToPrevPage: function(table, p) { moveToPrevPage: function(table, p) {
@ -822,7 +861,7 @@ tsp = ts.pager = {
if ( p.page <= 0 ) { if ( p.page <= 0 ) {
p.page = 0; p.page = 0;
} }
tsp.moveToPage(table, p); tsp.moveToPage(table, p, true);
}, },
destroyPager: function(table, c){ destroyPager: function(table, c){
@ -872,7 +911,7 @@ tsp = ts.pager = {
p.totalRows = c.widgetOptions.pager_countChildRows ? c.$tbodies.eq(0).children('tr').length : rows.length; p.totalRows = c.widgetOptions.pager_countChildRows ? c.$tbodies.eq(0).children('tr').length : rows.length;
p.size = $.data(table, 'pagerLastSize') || p.size || wo.pager_size || 10; p.size = $.data(table, 'pagerLastSize') || p.size || wo.pager_size || 10;
p.totalPages = Math.ceil( p.totalRows / p.size ); p.totalPages = Math.ceil( p.totalRows / p.size );
tsp.moveToPage(table, p, true); tsp.moveToPage(table, p);
// update display here in case all rows are removed // update display here in case all rows are removed
tsp.updatePageDisplay(table, c, false); tsp.updatePageDisplay(table, c, false);
} else { } else {