diff options
author | Ted Trask <ttrask01@yahoo.com> | 2019-09-18 22:16:10 +0000 |
---|---|---|
committer | Ted Trask <ttrask01@yahoo.com> | 2019-09-18 22:16:10 +0000 |
commit | fe202584bb9045e6e008e037656da196a9045f13 (patch) | |
tree | a0add5f78fc85101cb1e6512a697f9c8c59ae429 /widgets | |
parent | d3b95ba6d0b69f9d23caa1e665425931835b582b (diff) | |
download | acf-jquery-fe202584bb9045e6e008e037656da196a9045f13.tar.bz2 acf-jquery-fe202584bb9045e6e008e037656da196a9045f13.tar.xz |
Minify the tablesorter js files
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/widget-pager.js | 1371 |
1 files changed, 1 insertions, 1370 deletions
diff --git a/widgets/widget-pager.js b/widgets/widget-pager.js index 362e77b..b596d6d 100644 --- a/widgets/widget-pager.js +++ b/widgets/widget-pager.js @@ -3,1373 +3,4 @@ * by Rob Garrison */ /*jshint browser:true, jquery:true, unused:false */ -;(function($) { - 'use strict'; - var tsp, - ts = $.tablesorter; - - ts.addWidget({ - id: 'pager', - priority: 55, // load pager after filter widget - options: { - // output default: '{page}/{totalPages}' - // possible variables: {size}, {page}, {totalPages}, {filteredPages}, {startRow}, - // {endRow}, {filteredRows} and {totalRows} - pager_output: '{startRow} to {endRow} of {totalRows} rows', // '{page}/{totalPages}' - - // apply disabled classname to the pager arrows when the rows at either extreme is visible - pager_updateArrows: true, - - // starting page of the pager (zero based index) - pager_startPage: 0, - - // reset pager after filtering; set to desired page # - // set to false to not change page at filter start - pager_pageReset: 0, - - // Number of visible rows - pager_size: 10, - - // Number of options to include in the pager number selector - pager_maxOptionSize: 20, - - // Save pager page & size if the storage script is loaded (requires $.tablesorter.storage - // in jquery.tablesorter.widgets.js) - pager_savePages: true, - - // defines custom storage key - pager_storageKey: 'tablesorter-pager', - - // if true, the table will remain the same height no matter how many records are displayed. - // The space is made up by an empty table row set to a height to compensate; default is false - pager_fixedHeight: false, - - // count child rows towards the set page size? (set true if it is a visible table row within the pager) - // if true, child row(s) may not appear to be attached to its parent row, may be split across pages or - // may distort the table if rowspan or cellspans are included. - pager_countChildRows: false, - - // remove rows from the table to speed up the sort of large tables. - // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with - // the pager enabled. - pager_removeRows: false, // removing rows in larger tables speeds up the sort - - // use this format: 'http://mydatabase.com?page={page}&size={size}&{sortList:col}&{filterList:fcol}' - // where {page} is replaced by the page number, {size} is replaced by the number of records to show, - // {sortList:col} adds the sortList to the url into a 'col' array, and {filterList:fcol} adds - // the filterList to the url into an 'fcol' array. - // So a sortList = [[2,0],[3,0]] becomes '&col[2]=0&col[3]=0' in the url - // and a filterList = [[2,Blue],[3,13]] becomes '&fcol[2]=Blue&fcol[3]=13' in the url - pager_ajaxUrl: null, - - // modify the url after all processing has been applied - pager_customAjaxUrl: function( table, url ) { return url; }, - - // ajax error callback from $.tablesorter.showError function - // pager_ajaxError: function( config, xhr, settings, exception ) { return exception; }; - // returning false will abort the error message - pager_ajaxError: null, - - // modify the $.ajax object to allow complete control over your ajax requests - pager_ajaxObject: { - dataType: 'json' - }, - - // set this to false if you want to block ajax loading on init - pager_processAjaxOnInit: true, - - // process ajax so that the following information is returned: - // [ total_rows (number), rows (array of arrays), headers (array; optional) ] - // example: - // [ - // 100, // total rows - // [ - // [ "row1cell1", "row1cell2", ... "row1cellN" ], - // [ "row2cell1", "row2cell2", ... "row2cellN" ], - // ... - // [ "rowNcell1", "rowNcell2", ... "rowNcellN" ] - // ], - // [ "header1", "header2", ... "headerN" ] // optional - // ] - pager_ajaxProcessing: function( data ) { return data; }, - - // css class names of pager arrows - pager_css: { - container : 'tablesorter-pager', - // error information row (don't include period at beginning) - errorRow : 'tablesorter-errorRow', - // class added to arrows @ extremes (i.e. prev/first arrows 'disabled' on first page) - disabled : 'disabled' - }, - - // jQuery selectors - pager_selectors: { - container : '.pager', // target the pager markup - first : '.first', // go to first page arrow - prev : '.prev', // previous page arrow - next : '.next', // next page arrow - last : '.last', // go to last page arrow - // goto is a reserved word #657 - gotoPage : '.gotoPage', // go to page selector - select dropdown that sets the current page - pageDisplay : '.pagedisplay', // location of where the 'output' is displayed - pageSize : '.pagesize' // page size selector - select dropdown that sets the 'size' option - } - }, - init: function( table ) { - tsp.init( table ); - }, - // only update to complete sorter initialization - format: function( table, c ) { - if ( !( c.pager && c.pager.initialized ) ) { - return tsp.initComplete( c ); - } - tsp.moveToPage( c, c.pager, false ); - }, - remove: function( table, c, wo, refreshing ) { - tsp.destroyPager( c, refreshing ); - } - }); - - /* pager widget functions */ - tsp = ts.pager = { - - init: function( table ) { - // check if tablesorter has initialized - if ( table.hasInitialized && table.config.pager && table.config.pager.initialized ) { return; } - var t, - c = table.config, - wo = c.widgetOptions, - s = wo.pager_selectors, - - // save pager variables - p = c.pager = $.extend({ - totalPages: 0, - filteredRows: 0, - filteredPages: 0, - currentFilters: [], - page: wo.pager_startPage, - startRow: 0, - endRow: 0, - ajaxCounter: 0, - $size: null, - last: {}, - // save original pager size - setSize: wo.pager_size, - setPage: wo.pager_startPage - }, c.pager ); - - // Used by core appendCache; !undefined is always true - p.removeRows = wo.pager_removeRows; - - // pager initializes multiple times before table has completed initialization - if ( p.isInitializing ) { return; } - - p.isInitializing = true; - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Initializing' ); - } - - p.size = $.data( table, 'pagerLastSize' ) || wo.pager_size; - // added in case the pager is reinitialized after being destroyed. - p.$container = $( s.container ).addClass( wo.pager_css.container ).show(); - p.totalRows = c.$tbodies.eq( 0 ) - .children( 'tr' ) - .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow ) - .length; - p.oldAjaxSuccess = p.oldAjaxSuccess || wo.pager_ajaxObject.success; - c.appender = tsp.appender; - p.initializing = true; - if ( wo.pager_savePages && ts.storage ) { - t = ts.storage( table, wo.pager_storageKey ) || {}; // fixes #387 - 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; - tsp.setPageSize( c, p.size ); - } - - // skipped rows - p.regexRows = new RegExp( '(' + ( wo.filter_filteredRow || 'filtered' ) + '|' + - c.selectorRemove.slice( 1 ) + '|' + c.cssChildRow + ')' ); - p.regexFiltered = new RegExp( wo.filter_filteredRow || 'filtered' ); - - // clear initialized flag - p.initialized = false; - // before initialization event - c.$table.triggerHandler( 'pagerBeforeInitialized', c ); - - tsp.enablePager( c, false ); - - // p must have ajaxObject - p.ajaxObject = wo.pager_ajaxObject; - p.ajaxObject.url = wo.pager_ajaxUrl; - - if ( typeof wo.pager_ajaxUrl === 'string' ) { - // ajax pager; interact with database - p.ajax = true; - // When filtering with ajax, allow only custom filtering function, disable default filtering - // since it will be done server side. - wo.filter_serversideFiltering = true; - c.serverSideSorting = true; - tsp.moveToPage( c, p ); - } else { - p.ajax = false; - // Regular pager; all rows stored in memory - ts.appendCache( c, true ); // true = don't apply widgets - } - - }, - - initComplete: function( c ) { - var p = c.pager; - tsp.bindEvents( c ); - if ( !p.ajax ) { - tsp.hideRowsSetup( c ); - } - - // pager initialized - p.initialized = true; - p.initializing = false; - p.isInitializing = false; - tsp.setPageSize( c, p.size ); // page size 0 is ignored - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Triggering pagerInitialized' ); - } - c.$table.triggerHandler( 'pagerInitialized', c ); - // filter widget not initialized; it will update the output display & fire off the pagerComplete event - if ( !( c.widgetOptions.filter_initialized && ts.hasWidget( c.table, 'filter' ) ) ) { - // if ajax, then don't fire off pagerComplete - tsp.updatePageDisplay( c, !p.ajax ); - } - }, - - bindEvents: function( c ) { - var ctrls, fxn, tmp, - p = c.pager, - wo = c.widgetOptions, - namespace = c.namespace + 'pager', - s = wo.pager_selectors, - debug = ts.debug(c, 'pager'); - c.$table - .off( namespace ) - .on( 'filterInit filterStart '.split( ' ' ).join( namespace + ' ' ), function( e, filters ) { - p.currentFilters = $.isArray( filters ) ? filters : c.$table.data( 'lastSearch' ); - var filtersEqual; - if (p.ajax && e.type === 'filterInit') { - // ensure pager ajax is called after filter widget has initialized - return tsp.moveToPage( c, p, false ); - } - if (ts.filter.equalFilters) { - filtersEqual = ts.filter.equalFilters(c, c.lastSearch, p.currentFilters); - } else { - // will miss filter changes of the same value in a different column, see #1363 - filtersEqual = ( c.lastSearch || [] ).join( '' ) !== ( p.currentFilters || [] ).join( '' ); - } - // don't change page if filters are the same (pager updating, etc) - if ( e.type === 'filterStart' && wo.pager_pageReset !== false && !filtersEqual ) { - p.page = wo.pager_pageReset; // fixes #456 & #565 - } - }) - // update pager after filter widget completes - .on( 'filterEnd sortEnd '.split( ' ' ).join( namespace + ' ' ), function() { - p.currentFilters = c.$table.data( 'lastSearch' ); - if ( p.initialized || p.initializing ) { - 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( c ); - } - tsp.updatePageDisplay( c, false ); - ts.applyWidget( c.table ); - } - }) - .on( 'disablePager' + namespace, function( e ) { - e.stopPropagation(); - tsp.showAllRows( c ); - }) - .on( 'enablePager' + namespace, function( e ) { - e.stopPropagation(); - tsp.enablePager( c, true ); - }) - .on( 'destroyPager' + namespace, function( e ) { - e.stopPropagation(); - // call removeWidget to make sure internal flags are modified. - ts.removeWidget( c.table, 'pager', false ); - }) - .on( 'updateComplete' + namespace, function( e, table, triggered ) { - e.stopPropagation(); - // table can be unintentionally undefined in tablesorter v2.17.7 and earlier - // don't recalculate total rows/pages if using ajax - if ( !table || triggered || p.ajax ) { return; } - var $rows = c.$tbodies.eq( 0 ).children( 'tr' ).not( c.selectorRemove ); - p.totalRows = $rows.length - - ( wo.pager_countChildRows ? 0 : $rows.filter( '.' + c.cssChildRow ).length ); - p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size ); - if ( $rows.length && c.rowsCopy && c.rowsCopy.length === 0 ) { - // make a copy of all table rows once the cache has been built - tsp.updateCache( c ); - } - if ( p.page >= p.totalPages ) { - tsp.moveToLastPage( c, p ); - } - tsp.hideRows( c ); - tsp.changeHeight( c ); - // update without triggering pagerComplete - tsp.updatePageDisplay( c, false ); - // make sure widgets are applied - fixes #450 - ts.applyWidget( table ); - tsp.updatePageDisplay( c ); - }) - .on( 'pageSize refreshComplete '.split( ' ' ).join( namespace + ' ' ), function( e, size ) { - e.stopPropagation(); - tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) ); - tsp.moveToPage( c, p, true ); - tsp.hideRows( c ); - tsp.updatePageDisplay( c, false ); - }) - .on( 'pageSet pagerUpdate '.split( ' ' ).join( namespace + ' ' ), function( e, num ) { - e.stopPropagation(); - // force pager refresh - if ( e.type === 'pagerUpdate' ) { - num = typeof num === 'undefined' ? p.page + 1 : num; - p.last.page = true; - } - p.page = ( parseInt( num, 10 ) || 1 ) - 1; - tsp.moveToPage( c, p, true ); - tsp.updatePageDisplay( c, false ); - }) - .on( 'pageAndSize' + namespace, function( e, page, size ) { - e.stopPropagation(); - p.page = ( parseInt(page, 10) || 1 ) - 1; - tsp.setPageSize( c, tsp.parsePageSize( c, size, 'get' ) ); - tsp.moveToPage( c, p, true ); - tsp.hideRows( c ); - tsp.updatePageDisplay( c, false ); - }); - - // clicked controls - ctrls = [ s.first, s.prev, s.next, s.last ]; - fxn = [ 'moveToFirstPage', 'moveToPrevPage', 'moveToNextPage', 'moveToLastPage' ]; - if ( debug && !p.$container.length ) { - console.warn( 'Pager >> "container" not found' ); - } - p.$container.find( ctrls.join( ',' ) ) - .attr( 'tabindex', 0 ) - .off( 'click' + namespace ) - .on( 'click' + namespace, function( e ) { - e.stopPropagation(); - var i, - $c = $( this ), - l = ctrls.length; - if ( !$c.hasClass( wo.pager_css.disabled ) ) { - for ( i = 0; i < l; i++ ) { - if ( $c.is( ctrls[ i ] ) ) { - tsp[ fxn[ i ] ]( c, p ); - break; - } - } - } - }); - - tmp = p.$container.find( wo.pager_selectors.gotoPage ); - if ( tmp.length ) { - tmp - .off( 'change' + namespace ) - .on( 'change' + namespace, function() { - p.page = $( this ).val() - 1; - tsp.moveToPage( c, p, true ); - tsp.updatePageDisplay( c, false ); - }); - } else if ( debug ) { - console.warn( 'Pager >> "goto" selector not found' ); - } - - tmp = p.$container.find( wo.pager_selectors.pageSize ); - if ( tmp.length ) { - // setting an option as selected appears to cause issues with initial page size - tmp.find( 'option' ).removeAttr( 'selected' ); - tmp - .off( 'change' + namespace ) - .on( 'change' + namespace, function() { - if ( !$( this ).hasClass( wo.pager_css.disabled ) ) { - var size = $( this ).val(); - // in case there are more than one pager - p.$container.find( wo.pager_selectors.pageSize ).val( size ); - tsp.setPageSize( c, size ); - tsp.moveToPage( c, p, true ); - tsp.changeHeight( c ); - } - return false; - }); - } else if ( debug ) { - console.warn('Pager >> "size" selector not found'); - } - - }, - - // hide arrows at extremes - pagerArrows: function( c, disable ) { - var p = c.pager, - dis = !!disable, - first = dis || p.page === 0, - tp = tsp.getTotalPages( c, p ), - last = dis || p.page === tp - 1 || tp === 0, - wo = c.widgetOptions, - s = wo.pager_selectors; - if ( wo.pager_updateArrows ) { - p.$container - .find( s.first + ',' + s.prev ) - .toggleClass( wo.pager_css.disabled, first ) - .prop( 'aria-disabled', first ); - p.$container - .find( s.next + ',' + s.last ) - .toggleClass( wo.pager_css.disabled, last ) - .prop( 'aria-disabled', last ); - } - }, - - calcFilters: function( c ) { - var normalized, indx, len, - wo = c.widgetOptions, - p = c.pager, - hasFilters = c.$table.hasClass( 'hasFilters' ); - if ( hasFilters && !p.ajax ) { - if ( $.isEmptyObject( c.cache ) ) { - // delayInit: true so nothing is in the cache - p.filteredRows = p.totalRows = c.$tbodies.eq( 0 ) - .children( 'tr' ) - .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow ) - .length; - } else { - p.filteredRows = 0; - normalized = c.cache[ 0 ].normalized; - len = normalized.length; - for ( indx = 0; indx < len; indx++ ) { - p.filteredRows += p.regexRows.test( normalized[ indx ][ c.columns ].$row[ 0 ].className ) ? 0 : 1; - } - } - } else if ( !hasFilters ) { - p.filteredRows = p.totalRows; - } - }, - - updatePageDisplay: function( c, completed ) { - if ( c.pager && c.pager.initializing ) { return; } - var s, t, $out, options, indx, len, output, - table = c.table, - wo = c.widgetOptions, - p = c.pager, - namespace = c.namespace + 'pager', - sz = tsp.parsePageSize( c, p.size, 'get' ); // don't allow dividing by zero - if ( sz === 'all' ) { sz = p.totalRows; } - if ( wo.pager_countChildRows ) { t[ t.length ] = c.cssChildRow; } - p.$container.find( wo.pager_selectors.pageSize + ',' + wo.pager_selectors.gotoPage ) - .removeClass( wo.pager_css.disabled ) - .removeAttr( 'disabled' ) - .prop( 'aria-disabled', 'false' ); - p.totalPages = Math.ceil( p.totalRows / sz ); // needed for 'pageSize' method - c.totalRows = p.totalRows; - tsp.parsePageNumber( c, p ); - tsp.calcFilters( c ); - c.filteredRows = p.filteredRows; - p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0; - if ( tsp.getTotalPages( c, p ) >= 0 ) { - t = ( sz * p.page > p.filteredRows ) && completed; - p.page = t ? wo.pager_pageReset || 0 : p.page; - p.startRow = t ? sz * p.page + 1 : ( p.filteredRows === 0 ? 0 : sz * p.page + 1 ); - p.endRow = Math.min( p.filteredRows, p.totalRows, sz * ( p.page + 1 ) ); - $out = p.$container.find( wo.pager_selectors.pageDisplay ); - - // Output param can be callback for custom rendering or string - if ( typeof wo.pager_output === 'function' ) { - s = wo.pager_output( table, p ); - } else { - output = $out - // get output template from data-pager-output or data-pager-output-filtered - .attr('data-pager-output' + (p.filteredRows < p.totalRows ? '-filtered' : '')) || - wo.pager_output; - // form the output string (can now get a new output string from the server) - s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || output : output ) - // {page} = one-based index; {page+#} = zero based index +/- value - .replace( /\{page([\-+]\d+)?\}/gi, function( m, n ) { - return p.totalPages ? p.page + ( n ? parseInt( n, 10 ) : 1 ) : 0; - }) - // {totalPages}, {extra}, {extra:0} (array) or {extra : key} (object) - .replace( /\{\w+(\s*:\s*\w+)?\}/gi, function( m ) { - var len, indx, - str = m.replace( /[{}\s]/g, '' ), - extra = str.split( ':' ), - data = p.ajaxData, - // return zero for default page/row numbers - deflt = /(rows?|pages?)$/i.test( str ) ? 0 : ''; - if ( /(startRow|page)/.test( extra[ 0 ] ) && extra[ 1 ] === 'input' ) { - len = ( '' + ( extra[ 0 ] === 'page' ? p.totalPages : p.totalRows ) ).length; - indx = extra[ 0 ] === 'page' ? p.page + 1 : p.startRow; - return '<input type="text" class="ts-' + extra[ 0 ] + - '" style="max-width:' + len + 'em" value="' + indx + '"/>'; - } - return extra.length > 1 && data && data[ extra[ 0 ] ] ? - data[ extra[ 0 ] ][ extra[ 1 ] ] : - p[ str ] || ( data ? data[ str ] : deflt ) || deflt; - }); - } - if ( p.$container.find( wo.pager_selectors.gotoPage ).length ) { - t = ''; - options = tsp.buildPageSelect( c, p ); - len = options.length; - for ( indx = 0; indx < len; indx++ ) { - t += '<option value="' + options[ indx ] + '">' + options[ indx ] + '</option>'; - } - // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228 - p.$container.find( wo.pager_selectors.gotoPage ).html( t ).val( p.page + 1 ); - } - if ( $out.length ) { - $out[ ($out[ 0 ].nodeName === 'INPUT' ) ? 'val' : 'html' ]( s ); - // rebind startRow/page inputs - $out - .find( '.ts-startRow, .ts-page' ) - .off( 'change' + namespace ) - .on( 'change' + namespace, function() { - var v = $( this ).val(), - pg = $( this ).hasClass( 'ts-startRow' ) ? Math.floor( v / sz ) + 1 : v; - c.$table.triggerHandler( 'pageSet' + namespace, [ pg ] ); - }); - } - } - tsp.pagerArrows( c ); - tsp.fixHeight( c ); - if ( p.initialized && completed !== false ) { - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Triggering pagerComplete' ); - } - c.$table.triggerHandler( 'pagerComplete', c ); - // save pager info to storage - if ( wo.pager_savePages && ts.storage ) { - ts.storage( table, wo.pager_storageKey, { - page : p.page, - size : sz === p.totalRows ? 'all' : sz - }); - } - } - }, - - buildPageSelect: function( c, p ) { - // Filter the options page number link array if it's larger than 'pager_maxOptionSize' - // as large page set links will slow the browser on large dom inserts - var i, centralFocusSize, focusOptionPages, insertIndex, optionLength, focusLength, - wo = c.widgetOptions, - pg = tsp.getTotalPages( c, p ) || 1, - // make skip set size multiples of 5 - skipSetSize = Math.ceil( ( pg / wo.pager_maxOptionSize ) / 5 ) * 5, - largeCollection = pg > wo.pager_maxOptionSize, - currentPage = p.page + 1, - startPage = skipSetSize, - endPage = pg - skipSetSize, - optionPages = [ 1 ], - // construct default options pages array - optionPagesStartPage = largeCollection ? skipSetSize : 1; - - for ( i = optionPagesStartPage; i <= pg; ) { - optionPages[ optionPages.length ] = i; - i = i + ( largeCollection ? skipSetSize : 1 ); - } - optionPages[ optionPages.length ] = pg; - - if ( largeCollection ) { - focusOptionPages = []; - // don't allow central focus size to be > 5 on either side of current page - centralFocusSize = Math.max( Math.floor( wo.pager_maxOptionSize / skipSetSize ) - 1, 5 ); - - startPage = currentPage - centralFocusSize; - if ( startPage < 1 ) { startPage = 1; } - endPage = currentPage + centralFocusSize; - if ( endPage > pg ) { endPage = pg; } - // construct an array to get a focus set around the current page - for ( i = startPage; i <= endPage ; i++ ) { - focusOptionPages[ focusOptionPages.length ] = i; - } - - // keep unique values - optionPages = $.grep( optionPages, function( value, indx ) { - return $.inArray( value, optionPages ) === indx; - }); - - optionLength = optionPages.length; - focusLength = focusOptionPages.length; - - // make sure at all optionPages aren't replaced - if ( optionLength - focusLength > skipSetSize / 2 && optionLength + focusLength > wo.pager_maxOptionSize ) { - insertIndex = Math.floor( optionLength / 2 ) - Math.floor( focusLength / 2 ); - Array.prototype.splice.apply( optionPages, [ insertIndex, focusLength ] ); - } - optionPages = optionPages.concat( focusOptionPages ); - - } - - // keep unique values again - optionPages = $.grep( optionPages, function( value, indx ) { - return $.inArray( value, optionPages ) === indx; - }) - .sort( function( a, b ) { - return a - b; - }); - - return optionPages; - }, - - fixHeight: function( c ) { - var d, h, bs, - table = c.table, - p = c.pager, - wo = c.widgetOptions, - $b = c.$tbodies.eq( 0 ); - $b.find( 'tr.pagerSavedHeightSpacer' ).remove(); - if ( wo.pager_fixedHeight && !p.isDisabled ) { - h = $.data( table, 'pagerSavedHeight' ); - if ( h ) { - bs = 0; - if ( $(table).css('border-spacing').split(' ').length > 1 ) { - bs = $(table).css('border-spacing').split(' ')[1].replace( /[^-\d\.]/g, '' ); - } - d = h - $b.height() + (bs * p.size) - bs; - if ( - d > 5 && $.data( table, 'pagerLastSize' ) === p.size && - $b.children( 'tr:visible' ).length < ( p.size === 'all' ? p.totalRows : p.size ) - ) { - $b.append( '<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice( 1 ) + - '" style="height:' + d + 'px;"></tr>' ); - } - } - } - }, - - changeHeight: function( c ) { - var h, - table = c.table, - p = c.pager, - sz = p.size === 'all' ? p.totalRows : p.size, - $b = c.$tbodies.eq( 0 ); - $b.find( 'tr.pagerSavedHeightSpacer' ).remove(); - if ( !$b.children( 'tr:visible' ).length ) { - $b.append( '<tr class="pagerSavedHeightSpacer ' + c.selectorRemove.slice( 1 ) + '"><td> </td></tr>' ); - } - h = $b.children( 'tr' ).eq( 0 ).height() * sz; - $.data( table, 'pagerSavedHeight', h ); - tsp.fixHeight( c ); - $.data( table, 'pagerLastSize', p.size ); - }, - - hideRows: function( c ) { - if ( !c.widgetOptions.pager_ajaxUrl ) { - var tbodyIndex, rowIndex, $rows, len, lastIndex, - p = c.pager, - wo = c.widgetOptions, - tbodyLen = c.$tbodies.length, - sz = p.size === 'all' ? p.totalRows : p.size, - start = ( p.page * sz ), - end = start + sz, - last = 0, // for cache indexing - size = 0; // size counter - p.cacheIndex = []; - for ( tbodyIndex = 0; tbodyIndex < tbodyLen; tbodyIndex++ ) { - $rows = c.$tbodies.eq( tbodyIndex ).children( 'tr' ); - len = $rows.length; - lastIndex = 0; - last = 0; // for cache indexing - size = 0; // size counter - for ( rowIndex = 0; rowIndex < len; rowIndex++ ) { - if ( !p.regexFiltered.test( $rows[ rowIndex ].className ) ) { - if ( size === start && $rows[ rowIndex ].className.match( c.cssChildRow ) ) { - // hide child rows @ start of pager (if already visible) - $rows[ rowIndex ].style.display = 'none'; - } else { - $rows[ rowIndex ].style.display = ( size >= start && size < end ) ? '' : 'none'; - if ( last !== size && size >= start && size < end ) { - p.cacheIndex[ p.cacheIndex.length ] = rowIndex; - last = size; - } - // don't count child rows - size += $rows[ rowIndex ].className - .match( c.cssChildRow + '|' + c.selectorRemove.slice( 1 ) ) && !wo.pager_countChildRows ? 0 : 1; - if ( size === end && $rows[ rowIndex ].style.display !== 'none' && - $rows[ rowIndex ].className.match( ts.css.cssHasChild ) ) { - lastIndex = rowIndex; - } - } - } - } - // add any attached child rows to last row of pager. Fixes part of issue #396 - if ( lastIndex > 0 && $rows[ lastIndex ].className.match( ts.css.cssHasChild ) ) { - while ( ++lastIndex < len && $rows[ lastIndex ].className.match( c.cssChildRow ) ) { - $rows[ lastIndex ].style.display = ''; - } - } - } - } - }, - - hideRowsSetup: function( c ) { - var p = c.pager, - namespace = c.namespace + 'pager', - $el = p.$container.find( c.widgetOptions.pager_selectors.pageSize ), - size = $el.val(); - p.size = tsp.parsePageSize( c, size, 'get' ); - tsp.setPageSize( c, p.size ); - tsp.pagerArrows( c ); - if ( !c.widgetOptions.pager_removeRows ) { - tsp.hideRows( c ); - c.$table.on( 'sortEnd filterEnd '.split( ' ' ).join( namespace + ' ' ), function() { - tsp.hideRows( c ); - }); - } - }, - - renderAjax: function( data, c, xhr, settings, exception ) { - var table = c.table, - p = c.pager, - wo = c.widgetOptions, - debug = ts.debug(c, 'pager'); - // process data - if ( $.isFunction( wo.pager_ajaxProcessing ) ) { - - // in case nothing is returned by ajax, empty out the table; see #1032 - // but do it before calling pager_ajaxProcessing because that function may add content - // directly to the table - c.$tbodies.eq( 0 ).empty(); - - // ajaxProcessing result: [ total, rows, headers ] - var i, j, t, hsh, $f, $sh, $headers, $h, icon, th, d, l, rr_count, len, sz, - $table = c.$table, - tds = '', - result = wo.pager_ajaxProcessing( data, table, xhr ) || [ 0, [] ]; - - // Clean up any previous error. - ts.showError( table ); - - if ( exception ) { - if ( debug ) { - console.error( 'Pager >> Ajax Error', xhr, settings, exception ); - } - ts.showError( table, xhr, settings, exception ); - c.$tbodies.eq( 0 ).children( 'tr' ).detach(); - p.totalRows = 0; - } else { - // process ajax object - if ( !$.isArray( result ) ) { - p.ajaxData = result; - c.totalRows = p.totalRows = result.total; - c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ? - result.filteredRows : - result.total; - th = result.headers; - d = result.rows || []; - } else { - // allow [ total, rows, headers ] or [ rows, total, headers ] - t = isNaN( result[ 0 ] ) && !isNaN( result[ 1 ] ); - // ensure a zero returned row count doesn't fail the logical || - rr_count = result[ t ? 1 : 0 ]; - p.totalRows = isNaN( rr_count ) ? p.totalRows || 0 : rr_count; - // can't set filtered rows when returning an array - c.totalRows = c.filteredRows = p.filteredRows = p.totalRows; - // set row data to empty array if nothing found - see http://stackoverflow.com/q/30875583/145346 - d = p.totalRows === 0 ? [] : result[ t ? 0 : 1 ] || []; // row data - th = result[ 2 ]; // headers - } - l = d && d.length; - if ( d instanceof $ ) { - if ( wo.pager_processAjaxOnInit ) { - // append jQuery object - c.$tbodies.eq( 0 ).empty(); - c.$tbodies.eq( 0 ).append( d ); - } - } else if ( l ) { - // build table from array - for ( i = 0; i < l; i++ ) { - tds += '<tr>'; - for ( j = 0; j < d[i].length; j++ ) { - // build tbody cells; watch for data containing HTML markup - see #434 - tds += /^\s*<td/.test( d[ i ][ j ] ) ? $.trim( d[ i ][ j ] ) : '<td>' + d[ i ][ j ] + '</td>'; - } - tds += '</tr>'; - } - // add rows to first tbody - if ( wo.pager_processAjaxOnInit ) { - c.$tbodies.eq( 0 ).html( tds ); - } - } - wo.pager_processAjaxOnInit = true; - // update new header text - if ( th ) { - hsh = $table.hasClass( 'hasStickyHeaders' ); - $sh = hsh ? - wo.$sticky.children( 'thead:first' ).children( 'tr:not(.' + c.cssIgnoreRow + ')' ).children() : - ''; - $f = $table.find( 'tfoot tr:first' ).children(); - // don't change td headers (may contain pager) - $headers = c.$headers.filter( 'th' ); - len = $headers.length; - for ( j = 0; j < len; j++ ) { - $h = $headers.eq( j ); - // add new test within the first span it finds, or just in the header - if ( $h.find( '.' + ts.css.icon ).length ) { - icon = $h.find( '.' + ts.css.icon ).clone( true ); - $h.find( '.' + ts.css.headerIn ).html( th[ j ] ).append( icon ); - if ( hsh && $sh.length ) { - icon = $sh.eq( j ).find( '.' + ts.css.icon ).clone( true ); - $sh.eq( j ).find( '.' + ts.css.headerIn ).html( th[ j ] ).append( icon ); - } - } else { - $h.find( '.' + ts.css.headerIn ).html( th[ j ] ); - if ( hsh && $sh.length ) { - // add sticky header to container just in case it contains pager controls - p.$container = p.$container.add( wo.$sticky ); - $sh.eq( j ).find( '.' + ts.css.headerIn ).html( th[ j ] ); - } - } - $f.eq( j ).html( th[ j ] ); - } - if ( hsh ) { - tsp.bindEvents( c ); - } - } - } - if ( c.showProcessing ) { - ts.isProcessing( table ); // remove loading icon - } - sz = tsp.parsePageSize( c, p.size, 'get' ); - // make sure last pager settings are saved, prevents multiple server side calls with - // the same parameters - p.totalPages = sz === 'all' ? 1 : Math.ceil( p.totalRows / sz ); - p.last.totalRows = p.totalRows; - p.last.currentFilters = p.currentFilters; - p.last.sortList = ( c.sortList || [] ).join( ',' ); - p.initializing = false; - // update display without triggering pager complete... before updating cache - tsp.updatePageDisplay( c, false ); - // tablesorter core updateCache (not pager) - ts.updateCache( c, function() { - if ( p.initialized ) { - // apply widgets after table has rendered & after a delay to prevent - // multiple applyWidget blocking code from blocking this trigger - setTimeout( function() { - if ( debug ) { - console.log( 'Pager >> Triggering pagerChange' ); - } - $table.triggerHandler( 'pagerChange', p ); - ts.applyWidget( table ); - tsp.updatePageDisplay( c ); - }, 0 ); - } - }); - } - if ( !p.initialized ) { - ts.applyWidget( table ); - } - }, - - getAjax: function( c ) { - var counter, - url = tsp.getAjaxUrl( c ), - $doc = $( document ), - namespace = c.namespace + 'pager', - p = c.pager; - if ( url !== '' ) { - if ( c.showProcessing ) { - ts.isProcessing( c.table, true ); // show loading icon - } - $doc.on( 'ajaxError' + namespace, function( e, xhr, settings, exception ) { - tsp.renderAjax( null, c, xhr, settings, exception ); - $doc.off( 'ajaxError' + namespace ); - }); - counter = ++p.ajaxCounter; - p.last.ajaxUrl = url; // remember processed url - p.ajaxObject.url = url; // from the ajaxUrl option and modified by customAjaxUrl - p.ajaxObject.success = function( data, status, jqxhr ) { - // Refuse to process old ajax commands that were overwritten by new ones - see #443 - if ( counter < p.ajaxCounter ) { - return; - } - tsp.renderAjax( data, c, jqxhr ); - $doc.off( 'ajaxError' + namespace ); - if ( typeof p.oldAjaxSuccess === 'function' ) { - p.oldAjaxSuccess( data ); - } - }; - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Ajax initialized', p.ajaxObject ); - } - $.ajax( p.ajaxObject ); - } - }, - - getAjaxUrl: function( c ) { - var indx, len, - p = c.pager, - wo = c.widgetOptions, - url = wo.pager_ajaxUrl ? wo.pager_ajaxUrl - // allow using '{page+1}' in the url string to switch to a non-zero based index - .replace( /\{page([\-+]\d+)?\}/, function( s, n ) { return p.page + ( n ? parseInt( n, 10 ) : 0 ); }) - // this will pass "all" to server when size is set to "all" - .replace( /\{size\}/g, p.size ) : '', - sortList = c.sortList, - filterList = p.currentFilters || c.$table.data( 'lastSearch' ) || [], - sortCol = url.match( /\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/ ), - filterCol = url.match( /\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/ ), - arry = []; - if ( sortCol ) { - sortCol = sortCol[ 1 ]; - len = sortList.length; - for ( indx = 0; indx < len; indx++ ) { - arry[ arry.length ] = sortCol + '[' + sortList[ indx ][ 0 ] + ']=' + sortList[ indx ][ 1 ]; - } - // if the arry is empty, just add the col parameter... '&{sortList:col}' becomes '&col' - url = url.replace( /\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join( '&' ) : sortCol ); - arry = []; - } - if ( filterCol ) { - filterCol = filterCol[ 1 ]; - len = filterList.length; - for ( indx = 0; indx < len; indx++ ) { - if ( filterList[ indx ] ) { - arry[ arry.length ] = filterCol + '[' + indx + ']=' + encodeURIComponent( filterList[ indx ] ); - } - } - // if the arry is empty, just add the fcol parameter... '&{filterList:fcol}' becomes '&fcol' - url = url.replace( /\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g, arry.length ? arry.join( '&' ) : filterCol ); - p.currentFilters = filterList; - } - if ( $.isFunction( wo.pager_customAjaxUrl ) ) { - url = wo.pager_customAjaxUrl( c.table, url ); - } - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Ajax url = ' + url ); - } - return url; - }, - - renderTable: function( c, rows ) { - var $tb, index, count, added, - table = c.table, - p = c.pager, - wo = c.widgetOptions, - debug = ts.debug(c, 'pager'), - f = c.$table.hasClass('hasFilters'), - l = rows && rows.length || 0, // rows may be undefined - e = p.size === 'all' ? p.totalRows : p.size, - s = ( p.page * e ); - if ( l < 1 ) { - if ( debug ) { - console.warn( 'Pager >> No rows for pager to render' ); - } - // empty table, abort! - return; - } - if ( p.page >= p.totalPages ) { - // lets not render the table more than once - return tsp.moveToLastPage( c, p ); - } - p.cacheIndex = []; - p.isDisabled = false; // needed because sorting will change the page and re-enable the pager - if ( p.initialized ) { - if ( debug ) { - console.log( 'Pager >> Triggering pagerChange' ); - } - c.$table.triggerHandler( 'pagerChange', c ); - } - if ( !wo.pager_removeRows ) { - tsp.hideRows( c ); - } else { - ts.clearTableBody( table ); - $tb = ts.processTbody( table, c.$tbodies.eq(0), true ); - // not filtered, start from the calculated starting point (s) - // if filtered, start from zero - index = f ? 0 : s; - count = f ? 0 : s; - added = 0; - while ( added < e && index < rows.length ) { - if ( !f || !p.regexFiltered.test( rows[ index ][ 0 ].className ) ) { - count++; - if ( count > s && added <= e ) { - added++; - p.cacheIndex[ p.cacheIndex.length ] = index; - $tb.append( rows[ index ] ); - } - } - index++; - } - ts.processTbody( table, $tb, false ); - } - tsp.updatePageDisplay( c ); - - wo.pager_startPage = p.page; - wo.pager_size = p.size; - if ( table.isUpdating ) { - if ( debug ) { - console.log( 'Pager >> Triggering updateComplete' ); - } - c.$table.triggerHandler( 'updateComplete', [ table, true ] ); - } - - }, - - showAllRows: function( c ) { - var index, $controls, len, - table = c.table, - p = c.pager, - wo = c.widgetOptions; - if ( p.ajax ) { - tsp.pagerArrows( c, true ); - } else { - $.data( table, 'pagerLastPage', p.page ); - $.data( table, 'pagerLastSize', p.size ); - p.page = 0; - p.size = p.totalRows; - p.totalPages = 1; - c.$table - .addClass( 'pagerDisabled' ) - .removeAttr( 'aria-describedby' ) - .find( 'tr.pagerSavedHeightSpacer' ) - .remove(); - tsp.renderTable( c, c.rowsCopy ); - p.isDisabled = true; - ts.applyWidget( table ); - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Disabled' ); - } - } - // disable size selector - $controls = p.$container.find( - wo.pager_selectors.pageSize + ',' + - wo.pager_selectors.gotoPage + ',' + - '.ts-startRow, .ts-page' - ); - len = $controls.length; - for ( index = 0; index < len; index++ ) { - $controls.eq( index ) - .prop( 'aria-disabled', 'true' ) - .addClass( wo.pager_css.disabled )[ 0 ].disabled = true; - } - }, - - // updateCache if delayInit: true - // this is normally done by 'appendToTable' function in the tablesorter core AFTER a sort - updateCache: function( c ) { - var p = c.pager; - // tablesorter core updateCache (not pager) - ts.updateCache( c, function() { - if ( !$.isEmptyObject( c.cache ) ) { - var index, - rows = [], - normalized = c.cache[ 0 ].normalized; - p.totalRows = normalized.length; - for ( index = 0; index < p.totalRows; index++ ) { - rows[ rows.length ] = normalized[ index ][ c.columns ].$row; - } - c.rowsCopy = rows; - tsp.moveToPage( c, p, true ); - // clear out last search to force an update - p.last.currentFilters = [ ' ' ]; - } - }); - }, - - moveToPage: function( c, p, pageMoved ) { - if ( p.isDisabled ) { return; } - if ( pageMoved !== false && p.initialized && $.isEmptyObject( c.cache ) ) { - return tsp.updateCache( c ); - } - var tmp, - table = c.table, - wo = c.widgetOptions, - l = p.last, - debug = ts.debug(c, 'pager'); - - // abort page move if the table has filters and has not been initialized - if ( p.ajax && !wo.filter_initialized && ts.hasWidget( table, 'filter' ) ) { return; } - - tsp.parsePageNumber( c, p ); - tsp.calcFilters( c ); - // fixes issue where one current filter is [] and the other is [ '', '', '' ], - // making the next if comparison think the filters as different. Fixes #202. - l.currentFilters = ( l.currentFilters || [] ).join( '' ) === '' ? [] : l.currentFilters; - p.currentFilters = ( p.currentFilters || [] ).join( '' ) === '' ? [] : p.currentFilters; - // don't allow rendering multiple times on the same page/size/totalRows/filters/sorts - if ( l.page === p.page && l.size === p.size && l.totalRows === p.totalRows && - ( l.currentFilters || [] ).join( ',' ) === ( p.currentFilters || [] ).join( ',' ) && - // check for ajax url changes see #730 - ( l.ajaxUrl || '' ) === ( p.ajaxObject.url || '' ) && - // & ajax url option changes (dynamically add/remove/rename sort & filter parameters) - ( l.optAjaxUrl || '' ) === ( wo.pager_ajaxUrl || '' ) && - l.sortList === ( c.sortList || [] ).join( ',' ) ) { - return; - } - if ( debug ) { - console.log( 'Pager >> Changing to page ' + p.page ); - } - p.last = { - page: p.page, - size: p.size, - // fixes #408; modify sortList otherwise it auto-updates - sortList: ( c.sortList || [] ).join( ',' ), - totalRows: p.totalRows, - currentFilters: p.currentFilters || [], - ajaxUrl: p.ajaxObject.url || '', - optAjaxUrl: wo.pager_ajaxUrl - }; - if ( p.ajax ) { - if ( !wo.pager_processAjaxOnInit && !$.isEmptyObject(wo.pager_initialRows) ) { - wo.pager_processAjaxOnInit = true; - tmp = wo.pager_initialRows; - p.totalRows = typeof tmp.total !== 'undefined' ? tmp.total : - ( debug ? console.error('Pager >> No initial total page set!') || 0 : 0 ); - p.filteredRows = typeof tmp.filtered !== 'undefined' ? tmp.filtered : - ( debug ? console.error('Pager >> No initial filtered page set!') || 0 : 0 ); - tsp.updatePageDisplay( c, false ); - } else { - tsp.getAjax( c ); - } - } else if ( !p.ajax ) { - tsp.renderTable( c, c.rowsCopy ); - } - $.data( table, 'pagerLastPage', p.page ); - if ( p.initialized && pageMoved !== false ) { - if ( debug ) { - console.log( 'Pager >> Triggering pageMoved' ); - } - c.$table.triggerHandler( 'pageMoved', c ); - ts.applyWidget( table ); - if ( !p.ajax && table.isUpdating ) { - if ( debug ) { - console.log( 'Pager >> Triggering updateComplete' ); - } - c.$table.triggerHandler( 'updateComplete', [ table, true ] ); - } - } - }, - - getTotalPages: function( c, p ) { - return ts.hasWidget( c.table, 'filter' ) ? - Math.min( p.totalPages, p.filteredPages ) : - p.totalPages; - }, - - parsePageNumber: function( c, p ) { - var min = tsp.getTotalPages( c, p ) - 1; - p.page = parseInt( p.page, 10 ); - if ( p.page < 0 || isNaN( p.page ) ) { p.page = 0; } - if ( p.page > min && min >= 0 ) { p.page = min; } - 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 ) { - var p = c.pager, - table = c.table; - // "all" size is only returned if an "all" option exists - fixes #1366 - p.size = tsp.parsePageSize( c, size, 'get' ); - p.$container - .find( c.widgetOptions.pager_selectors.pageSize ) - .val( p.size ); - $.data( table, 'pagerLastPage', tsp.parsePageNumber( c, p ) ); - $.data( table, 'pagerLastSize', 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 ); - }, - - moveToFirstPage: function( c, p ) { - p.page = 0; - tsp.moveToPage( c, p, true ); - }, - - moveToLastPage: function( c, p ) { - p.page = tsp.getTotalPages( c, p ) - 1; - tsp.moveToPage( c, p, true ); - }, - - moveToNextPage: function( c, p ) { - p.page++; - var last = tsp.getTotalPages( c, p ) - 1; - if ( p.page >= last ) { - p.page = last; - } - tsp.moveToPage( c, p, true ); - }, - - moveToPrevPage: function( c, p ) { - p.page--; - if ( p.page <= 0 ) { - p.page = 0; - } - tsp.moveToPage( c, p, true ); - }, - - destroyPager: function( c, refreshing ) { - var table = c.table, - p = c.pager, - s = c.widgetOptions.pager_selectors || {}, - ctrls = [ s.first, s.prev, s.next, s.last, s.gotoPage, s.pageSize ].join( ',' ), - namespace = c.namespace + 'pager'; - // check pager object in case two successive pager destroys are triggered - // e.g. "destroyPager" then "removeWidget" - see #1155 - if ( p ) { - p.initialized = false; - c.$table.off( namespace ); - p.$container - // hide pager - .hide() - // unbind pager controls - .find( ctrls ) - .off( namespace ); - if ( refreshing ) { return; } - c.appender = null; // remove pager appender function - tsp.showAllRows( c ); - if ( ts.storage ) { - ts.storage( table, c.widgetOptions.pager_storageKey, '' ); - } - p.$container = null; - c.pager = null; - c.rowsCopy = null; - } - }, - - enablePager: function( c, triggered ) { - var info, size, - table = c.table, - p = c.pager, - wo = c.widgetOptions, - $el = p.$container.find( wo.pager_selectors.pageSize ); - p.isDisabled = false; - p.page = $.data( table, 'pagerLastPage' ) || p.page || 0; - size = $el.find('option[selected]' ).val(); - p.size = $.data( table, 'pagerLastSize' ) || tsp.parsePageSize( c, size, 'get' ); - tsp.setPageSize( c, p.size ); // set page size - p.totalPages = p.size === 'all' ? 1 : Math.ceil( tsp.getTotalPages( c, p ) / p.size ); - c.$table.removeClass( 'pagerDisabled' ); - // if table id exists, include page display with aria info - if ( table.id && !c.$table.attr( 'aria-describedby' ) ) { - $el = p.$container.find( wo.pager_selectors.pageDisplay ); - info = $el.attr( 'id' ); - if ( !info ) { - // only add pageDisplay id if it doesn't exist - see #1288 - info = table.id + '_pager_info'; - $el.attr( 'id', info ); - } - c.$table.attr( 'aria-describedby', info ); - } - tsp.changeHeight( c ); - if ( triggered ) { - // tablesorter core update table - ts.update( c ); - tsp.setPageSize( c, p.size ); - tsp.moveToPage( c, p, true ); - tsp.hideRowsSetup( c ); - if ( ts.debug(c, 'pager') ) { - console.log( 'Pager >> Enabled' ); - } - } - }, - - appender: function( table, rows ) { - var c = table.config, - wo = c.widgetOptions, - p = c.pager; - if ( !p.ajax ) { - c.rowsCopy = rows; - p.totalRows = wo.pager_countChildRows ? c.$tbodies.eq( 0 ).children( 'tr' ).length : rows.length; - p.size = $.data( table, 'pagerLastSize' ) || p.size || wo.pager_size || p.setSize || 10; - p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size ); - tsp.moveToPage( c, p ); - // update display here in case all rows are removed - tsp.updatePageDisplay( c, false ); - } else { - tsp.moveToPage( c, p, true ); - } - } - - }; - - // see #486 - ts.showError = function( table, xhr, settings, exception ) { - var $table = $( table ), - c = $table[ 0 ].config, - wo = c && c.widgetOptions, - errorRow = c.pager && c.pager.cssErrorRow || - wo && wo.pager_css && wo.pager_css.errorRow || - 'tablesorter-errorRow', - typ = typeof xhr, - valid = true, - message = '', - removeRow = function() { - c.$table.find( 'thead' ).find( c.selectorRemove ).remove(); - }; - - if ( !$table.length ) { - console.error( 'tablesorter showError: no table parameter passed' ); - return; - } - - // ajaxError callback for plugin or widget - see #992 - if ( typeof c.pager.ajaxError === 'function' ) { - valid = c.pager.ajaxError( c, xhr, settings, exception ); - if ( valid === false ) { - return removeRow(); - } else { - message = valid; - } - } else if ( typeof wo.pager_ajaxError === 'function' ) { - valid = wo.pager_ajaxError( c, xhr, settings, exception ); - if ( valid === false ) { - return removeRow(); - } else { - message = valid; - } - } - - if ( message === '' ) { - if ( typ === 'object' ) { - message = - xhr.status === 0 ? 'Not connected, verify Network' : - xhr.status === 404 ? 'Requested page not found [404]' : - xhr.status === 500 ? 'Internal Server Error [500]' : - exception === 'parsererror' ? 'Requested JSON parse failed' : - exception === 'timeout' ? 'Time out error' : - exception === 'abort' ? 'Ajax Request aborted' : - 'Uncaught error: ' + xhr.statusText + ' [' + xhr.status + ']'; - } else if ( typ === 'string' ) { - // keep backward compatibility (external usage just passes a message string) - message = xhr; - } else { - // remove all error rows - return removeRow(); - } - } - - // allow message to include entire row HTML! - $( /tr\>/.test( message ) ? - message : - '<tr><td colspan="' + c.columns + '">' + message + '</td></tr>' - ) - .click( function() { - $( this ).remove(); - }) - // add error row to thead instead of tbody, or clicking on the header will result in a parser error - .appendTo( c.$table.find( 'thead:first' ) ) - .addClass( errorRow + ' ' + c.selectorRemove.slice( 1 ) ) - .attr({ - role: 'alert', - 'aria-live': 'assertive' - }); - - }; - -})(jQuery); +!function(e){"use strict";var a,t=e.tablesorter;t.addWidget({id:"pager",priority:55,options:{pager_output:"{startRow} to {endRow} of {totalRows} rows",pager_updateArrows:!0,pager_startPage:0,pager_pageReset:0,pager_size:10,pager_maxOptionSize:20,pager_savePages:!0,pager_storageKey:"tablesorter-pager",pager_fixedHeight:!1,pager_countChildRows:!1,pager_removeRows:!1,pager_ajaxUrl:null,pager_customAjaxUrl:function(e,a){return a},pager_ajaxError:null,pager_ajaxObject:{dataType:"json"},pager_processAjaxOnInit:!0,pager_ajaxProcessing:function(e){return e},pager_css:{container:"tablesorter-pager",errorRow:"tablesorter-errorRow",disabled:"disabled"},pager_selectors:{container:".pager",first:".first",prev:".prev",next:".next",last:".last",gotoPage:".gotoPage",pageDisplay:".pagedisplay",pageSize:".pagesize"}},init:function(e){a.init(e)},format:function(e,t){if(!t.pager||!t.pager.initialized)return a.initComplete(t);a.moveToPage(t,t.pager,!1)},remove:function(e,t,r,i){a.destroyPager(t,i)}}),a=t.pager={init:function(r){if(!(r.hasInitialized&&r.config.pager&&r.config.pager.initialized)){var i,s=r.config,o=s.widgetOptions,g=o.pager_selectors,n=s.pager=e.extend({totalPages:0,filteredRows:0,filteredPages:0,currentFilters:[],page:o.pager_startPage,startRow:0,endRow:0,ajaxCounter:0,$size:null,last:{},setSize:o.pager_size,setPage:o.pager_startPage},s.pager);n.removeRows=o.pager_removeRows,n.isInitializing||(n.isInitializing=!0,t.debug(s,"pager")&&console.log("Pager >> Initializing"),n.size=e.data(r,"pagerLastSize")||o.pager_size,n.$container=e(g.container).addClass(o.pager_css.container).show(),n.totalRows=s.$tbodies.eq(0).children("tr").not(o.pager_countChildRows?"":"."+s.cssChildRow).length,n.oldAjaxSuccess=n.oldAjaxSuccess||o.pager_ajaxObject.success,s.appender=a.appender,n.initializing=!0,o.pager_savePages&&t.storage&&(i=t.storage(r,o.pager_storageKey)||{},n.page=(isNaN(i.page)?n.page:i.page)||n.setPage||0,n.size="all"===i.size?i.size:(isNaN(i.size)?n.size:i.size)||n.setSize||10,a.setPageSize(s,n.size)),n.regexRows=new RegExp("("+(o.filter_filteredRow||"filtered")+"|"+s.selectorRemove.slice(1)+"|"+s.cssChildRow+")"),n.regexFiltered=new RegExp(o.filter_filteredRow||"filtered"),n.initialized=!1,s.$table.triggerHandler("pagerBeforeInitialized",s),a.enablePager(s,!1),n.ajaxObject=o.pager_ajaxObject,n.ajaxObject.url=o.pager_ajaxUrl,"string"==typeof o.pager_ajaxUrl?(n.ajax=!0,o.filter_serversideFiltering=!0,s.serverSideSorting=!0,a.moveToPage(s,n)):(n.ajax=!1,t.appendCache(s,!0)))}},initComplete:function(e){var r=e.pager;a.bindEvents(e),r.ajax||a.hideRowsSetup(e),r.initialized=!0,r.initializing=!1,r.isInitializing=!1,a.setPageSize(e,r.size),t.debug(e,"pager")&&console.log("Pager >> Triggering pagerInitialized"),e.$table.triggerHandler("pagerInitialized",e),e.widgetOptions.filter_initialized&&t.hasWidget(e.table,"filter")||a.updatePageDisplay(e,!r.ajax)},bindEvents:function(r){var i,s,o,g=r.pager,n=r.widgetOptions,l=r.namespace+"pager",p=n.pager_selectors,d=t.debug(r,"pager");r.$table.off(l).on("filterInit filterStart ".split(" ").join(l+" "),function(i,s){var o;if(g.currentFilters=e.isArray(s)?s:r.$table.data("lastSearch"),g.ajax&&"filterInit"===i.type)return a.moveToPage(r,g,!1);o=t.filter.equalFilters?t.filter.equalFilters(r,r.lastSearch,g.currentFilters):(r.lastSearch||[]).join("")!==(g.currentFilters||[]).join(""),"filterStart"!==i.type||!1===n.pager_pageReset||o||(g.page=n.pager_pageReset)}).on("filterEnd sortEnd ".split(" ").join(l+" "),function(){g.currentFilters=r.$table.data("lastSearch"),(g.initialized||g.initializing)&&(r.delayInit&&r.rowsCopy&&0===r.rowsCopy.length&&a.updateCache(r),a.updatePageDisplay(r,!1),t.applyWidget(r.table))}).on("disablePager"+l,function(e){e.stopPropagation(),a.showAllRows(r)}).on("enablePager"+l,function(e){e.stopPropagation(),a.enablePager(r,!0)}).on("destroyPager"+l,function(e){e.stopPropagation(),t.removeWidget(r.table,"pager",!1)}).on("updateComplete"+l,function(e,i,s){if(e.stopPropagation(),i&&!s&&!g.ajax){var o=r.$tbodies.eq(0).children("tr").not(r.selectorRemove);g.totalRows=o.length-(n.pager_countChildRows?0:o.filter("."+r.cssChildRow).length),g.totalPages="all"===g.size?1:Math.ceil(g.totalRows/g.size),o.length&&r.rowsCopy&&0===r.rowsCopy.length&&a.updateCache(r),g.page>=g.totalPages&&a.moveToLastPage(r,g),a.hideRows(r),a.changeHeight(r),a.updatePageDisplay(r,!1),t.applyWidget(i),a.updatePageDisplay(r)}}).on("pageSize refreshComplete ".split(" ").join(l+" "),function(e,t){e.stopPropagation(),a.setPageSize(r,a.parsePageSize(r,t,"get")),a.moveToPage(r,g,!0),a.hideRows(r),a.updatePageDisplay(r,!1)}).on("pageSet pagerUpdate ".split(" ").join(l+" "),function(e,t){e.stopPropagation(),"pagerUpdate"===e.type&&(t=void 0===t?g.page+1:t,g.last.page=!0),g.page=(parseInt(t,10)||1)-1,a.moveToPage(r,g,!0),a.updatePageDisplay(r,!1)}).on("pageAndSize"+l,function(e,t,i){e.stopPropagation(),g.page=(parseInt(t,10)||1)-1,a.setPageSize(r,a.parsePageSize(r,i,"get")),a.moveToPage(r,g,!0),a.hideRows(r),a.updatePageDisplay(r,!1)}),i=[p.first,p.prev,p.next,p.last],s=["moveToFirstPage","moveToPrevPage","moveToNextPage","moveToLastPage"],d&&!g.$container.length&&console.warn('Pager >> "container" not found'),g.$container.find(i.join(",")).attr("tabindex",0).off("click"+l).on("click"+l,function(t){t.stopPropagation();var o,l=e(this),p=i.length;if(!l.hasClass(n.pager_css.disabled))for(o=0;o<p;o++)if(l.is(i[o])){a[s[o]](r,g);break}}),(o=g.$container.find(n.pager_selectors.gotoPage)).length?o.off("change"+l).on("change"+l,function(){g.page=e(this).val()-1,a.moveToPage(r,g,!0),a.updatePageDisplay(r,!1)}):d&&console.warn('Pager >> "goto" selector not found'),(o=g.$container.find(n.pager_selectors.pageSize)).length?(o.find("option").removeAttr("selected"),o.off("change"+l).on("change"+l,function(){if(!e(this).hasClass(n.pager_css.disabled)){var t=e(this).val();g.$container.find(n.pager_selectors.pageSize).val(t),a.setPageSize(r,t),a.moveToPage(r,g,!0),a.changeHeight(r)}return!1})):d&&console.warn('Pager >> "size" selector not found')},pagerArrows:function(e,t){var r=e.pager,i=!!t,s=i||0===r.page,o=a.getTotalPages(e,r),g=i||r.page===o-1||0===o,n=e.widgetOptions,l=n.pager_selectors;n.pager_updateArrows&&(r.$container.find(l.first+","+l.prev).toggleClass(n.pager_css.disabled,s).prop("aria-disabled",s),r.$container.find(l.next+","+l.last).toggleClass(n.pager_css.disabled,g).prop("aria-disabled",g))},calcFilters:function(a){var t,r,i,s=a.widgetOptions,o=a.pager,g=a.$table.hasClass("hasFilters");if(g&&!o.ajax)if(e.isEmptyObject(a.cache))o.filteredRows=o.totalRows=a.$tbodies.eq(0).children("tr").not(s.pager_countChildRows?"":"."+a.cssChildRow).length;else for(o.filteredRows=0,i=(t=a.cache[0].normalized).length,r=0;r<i;r++)o.filteredRows+=o.regexRows.test(t[r][a.columns].$row[0].className)?0:1;else g||(o.filteredRows=o.totalRows)},updatePageDisplay:function(r,i){if(!r.pager||!r.pager.initializing){var s,o,g,n,l,p,d,c=r.table,f=r.widgetOptions,u=r.pager,h=r.namespace+"pager",w=a.parsePageSize(r,u.size,"get");if("all"===w&&(w=u.totalRows),f.pager_countChildRows&&(o[o.length]=r.cssChildRow),u.$container.find(f.pager_selectors.pageSize+","+f.pager_selectors.gotoPage).removeClass(f.pager_css.disabled).removeAttr("disabled").prop("aria-disabled","false"),u.totalPages=Math.ceil(u.totalRows/w),r.totalRows=u.totalRows,a.parsePageNumber(r,u),a.calcFilters(r),r.filteredRows=u.filteredRows,u.filteredPages=Math.ceil(u.filteredRows/w)||0,a.getTotalPages(r,u)>=0){if(o=w*u.page>u.filteredRows&&i,u.page=o?f.pager_pageReset||0:u.page,u.startRow=o?w*u.page+1:0===u.filteredRows?0:w*u.page+1,u.endRow=Math.min(u.filteredRows,u.totalRows,w*(u.page+1)),g=u.$container.find(f.pager_selectors.pageDisplay),"function"==typeof f.pager_output?s=f.pager_output(c,u):(d=g.attr("data-pager-output"+(u.filteredRows<u.totalRows?"-filtered":""))||f.pager_output,s=(u.ajaxData&&u.ajaxData.output&&u.ajaxData.output||d).replace(/\{page([\-+]\d+)?\}/gi,function(e,a){return u.totalPages?u.page+(a?parseInt(a,10):1):0}).replace(/\{\w+(\s*:\s*\w+)?\}/gi,function(e){var a,t,r=e.replace(/[{}\s]/g,""),i=r.split(":"),s=u.ajaxData,o=/(rows?|pages?)$/i.test(r)?0:"";return/(startRow|page)/.test(i[0])&&"input"===i[1]?(a=(""+("page"===i[0]?u.totalPages:u.totalRows)).length,t="page"===i[0]?u.page+1:u.startRow,'<input type="text" class="ts-'+i[0]+'" style="max-width:'+a+'em" value="'+t+'"/>'):i.length>1&&s&&s[i[0]]?s[i[0]][i[1]]:u[r]||(s?s[r]:o)||o})),u.$container.find(f.pager_selectors.gotoPage).length){for(o="",p=(n=a.buildPageSelect(r,u)).length,l=0;l<p;l++)o+='<option value="'+n[l]+'">'+n[l]+"</option>";u.$container.find(f.pager_selectors.gotoPage).html(o).val(u.page+1)}g.length&&(g["INPUT"===g[0].nodeName?"val":"html"](s),g.find(".ts-startRow, .ts-page").off("change"+h).on("change"+h,function(){var a=e(this).val(),t=e(this).hasClass("ts-startRow")?Math.floor(a/w)+1:a;r.$table.triggerHandler("pageSet"+h,[t])}))}a.pagerArrows(r),a.fixHeight(r),u.initialized&&!1!==i&&(t.debug(r,"pager")&&console.log("Pager >> Triggering pagerComplete"),r.$table.triggerHandler("pagerComplete",r),f.pager_savePages&&t.storage&&t.storage(c,f.pager_storageKey,{page:u.page,size:w===u.totalRows?"all":w}))}},buildPageSelect:function(t,r){var i,s,o,g,n,l,p=t.widgetOptions,d=a.getTotalPages(t,r)||1,c=5*Math.ceil(d/p.pager_maxOptionSize/5),f=d>p.pager_maxOptionSize,u=r.page+1,h=c,w=d-c,P=[1];for(i=f?c:1;i<=d;)P[P.length]=i,i+=f?c:1;if(P[P.length]=d,f){for(o=[],(h=u-(s=Math.max(Math.floor(p.pager_maxOptionSize/c)-1,5)))<1&&(h=1),(w=u+s)>d&&(w=d),i=h;i<=w;i++)o[o.length]=i;(n=(P=e.grep(P,function(a,t){return e.inArray(a,P)===t})).length)-(l=o.length)>c/2&&n+l>p.pager_maxOptionSize&&(g=Math.floor(n/2)-Math.floor(l/2),Array.prototype.splice.apply(P,[g,l])),P=P.concat(o)}return P=e.grep(P,function(a,t){return e.inArray(a,P)===t}).sort(function(e,a){return e-a})},fixHeight:function(a){var t,r,i,s=a.table,o=a.pager,g=a.widgetOptions,n=a.$tbodies.eq(0);n.find("tr.pagerSavedHeightSpacer").remove(),g.pager_fixedHeight&&!o.isDisabled&&(r=e.data(s,"pagerSavedHeight"))&&(i=0,e(s).css("border-spacing").split(" ").length>1&&(i=e(s).css("border-spacing").split(" ")[1].replace(/[^-\d\.]/g,"")),(t=r-n.height()+i*o.size-i)>5&&e.data(s,"pagerLastSize")===o.size&&n.children("tr:visible").length<("all"===o.size?o.totalRows:o.size)&&n.append('<tr class="pagerSavedHeightSpacer '+a.selectorRemove.slice(1)+'" style="height:'+t+'px;"></tr>'))},changeHeight:function(t){var r,i=t.table,s=t.pager,o="all"===s.size?s.totalRows:s.size,g=t.$tbodies.eq(0);g.find("tr.pagerSavedHeightSpacer").remove(),g.children("tr:visible").length||g.append('<tr class="pagerSavedHeightSpacer '+t.selectorRemove.slice(1)+'"><td> </td></tr>'),r=g.children("tr").eq(0).height()*o,e.data(i,"pagerSavedHeight",r),a.fixHeight(t),e.data(i,"pagerLastSize",s.size)},hideRows:function(e){if(!e.widgetOptions.pager_ajaxUrl){var a,r,i,s,o,g=e.pager,n=e.widgetOptions,l=e.$tbodies.length,p="all"===g.size?g.totalRows:g.size,d=g.page*p,c=d+p,f=0,u=0;for(g.cacheIndex=[],a=0;a<l;a++){for(s=(i=e.$tbodies.eq(a).children("tr")).length,o=0,f=0,u=0,r=0;r<s;r++)g.regexFiltered.test(i[r].className)||(u===d&&i[r].className.match(e.cssChildRow)?i[r].style.display="none":(i[r].style.display=u>=d&&u<c?"":"none",f!==u&&u>=d&&u<c&&(g.cacheIndex[g.cacheIndex.length]=r,f=u),(u+=i[r].className.match(e.cssChildRow+"|"+e.selectorRemove.slice(1))&&!n.pager_countChildRows?0:1)===c&&"none"!==i[r].style.display&&i[r].className.match(t.css.cssHasChild)&&(o=r)));if(o>0&&i[o].className.match(t.css.cssHasChild))for(;++o<s&&i[o].className.match(e.cssChildRow);)i[o].style.display=""}}},hideRowsSetup:function(e){var t=e.pager,r=e.namespace+"pager",i=t.$container.find(e.widgetOptions.pager_selectors.pageSize).val();t.size=a.parsePageSize(e,i,"get"),a.setPageSize(e,t.size),a.pagerArrows(e),e.widgetOptions.pager_removeRows||(a.hideRows(e),e.$table.on("sortEnd filterEnd ".split(" ").join(r+" "),function(){a.hideRows(e)}))},renderAjax:function(r,i,s,o,g){var n=i.table,l=i.pager,p=i.widgetOptions,d=t.debug(i,"pager");if(e.isFunction(p.pager_ajaxProcessing)){i.$tbodies.eq(0).empty();var c,f,u,h,w,P,b,z,R,v,m,x,j,_,y,S=i.$table,C="",$=p.pager_ajaxProcessing(r,n,s)||[0,[]];if(t.showError(n),g)d&&console.error("Pager >> Ajax Error",s,o,g),t.showError(n,s,o,g),i.$tbodies.eq(0).children("tr").detach(),l.totalRows=0;else{if(e.isArray($)?(j=$[(u=isNaN($[0])&&!isNaN($[1]))?1:0],l.totalRows=isNaN(j)?l.totalRows||0:j,i.totalRows=i.filteredRows=l.filteredRows=l.totalRows,m=0===l.totalRows?[]:$[u?0:1]||[],v=$[2]):(l.ajaxData=$,i.totalRows=l.totalRows=$.total,i.filteredRows=l.filteredRows=void 0!==$.filteredRows?$.filteredRows:$.total,v=$.headers,m=$.rows||[]),x=m&&m.length,m instanceof e)p.pager_processAjaxOnInit&&(i.$tbodies.eq(0).empty(),i.$tbodies.eq(0).append(m));else if(x){for(c=0;c<x;c++){for(C+="<tr>",f=0;f<m[c].length;f++)C+=/^\s*<td/.test(m[c][f])?e.trim(m[c][f]):"<td>"+m[c][f]+"</td>";C+="</tr>"}p.pager_processAjaxOnInit&&i.$tbodies.eq(0).html(C)}if(p.pager_processAjaxOnInit=!0,v){for(P=(h=S.hasClass("hasStickyHeaders"))?p.$sticky.children("thead:first").children("tr:not(."+i.cssIgnoreRow+")").children():"",w=S.find("tfoot tr:first").children(),_=(b=i.$headers.filter("th")).length,f=0;f<_;f++)(z=b.eq(f)).find("."+t.css.icon).length?(R=z.find("."+t.css.icon).clone(!0),z.find("."+t.css.headerIn).html(v[f]).append(R),h&&P.length&&(R=P.eq(f).find("."+t.css.icon).clone(!0),P.eq(f).find("."+t.css.headerIn).html(v[f]).append(R))):(z.find("."+t.css.headerIn).html(v[f]),h&&P.length&&(l.$container=l.$container.add(p.$sticky),P.eq(f).find("."+t.css.headerIn).html(v[f]))),w.eq(f).html(v[f]);h&&a.bindEvents(i)}}i.showProcessing&&t.isProcessing(n),y=a.parsePageSize(i,l.size,"get"),l.totalPages="all"===y?1:Math.ceil(l.totalRows/y),l.last.totalRows=l.totalRows,l.last.currentFilters=l.currentFilters,l.last.sortList=(i.sortList||[]).join(","),l.initializing=!1,a.updatePageDisplay(i,!1),t.updateCache(i,function(){l.initialized&&setTimeout(function(){d&&console.log("Pager >> Triggering pagerChange"),S.triggerHandler("pagerChange",l),t.applyWidget(n),a.updatePageDisplay(i)},0)})}l.initialized||t.applyWidget(n)},getAjax:function(r){var i,s=a.getAjaxUrl(r),o=e(document),g=r.namespace+"pager",n=r.pager;""!==s&&(r.showProcessing&&t.isProcessing(r.table,!0),o.on("ajaxError"+g,function(e,t,i,s){a.renderAjax(null,r,t,i,s),o.off("ajaxError"+g)}),i=++n.ajaxCounter,n.last.ajaxUrl=s,n.ajaxObject.url=s,n.ajaxObject.success=function(e,t,s){i<n.ajaxCounter||(a.renderAjax(e,r,s),o.off("ajaxError"+g),"function"==typeof n.oldAjaxSuccess&&n.oldAjaxSuccess(e))},t.debug(r,"pager")&&console.log("Pager >> Ajax initialized",n.ajaxObject),e.ajax(n.ajaxObject))},getAjaxUrl:function(a){var r,i,s=a.pager,o=a.widgetOptions,g=o.pager_ajaxUrl?o.pager_ajaxUrl.replace(/\{page([\-+]\d+)?\}/,function(e,a){return s.page+(a?parseInt(a,10):0)}).replace(/\{size\}/g,s.size):"",n=a.sortList,l=s.currentFilters||a.$table.data("lastSearch")||[],p=g.match(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/),d=g.match(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/),c=[];if(p){for(p=p[1],i=n.length,r=0;r<i;r++)c[c.length]=p+"["+n[r][0]+"]="+n[r][1];g=g.replace(/\{\s*sort(?:List)?\s*:\s*(\w*)\s*\}/g,c.length?c.join("&"):p),c=[]}if(d){for(d=d[1],i=l.length,r=0;r<i;r++)l[r]&&(c[c.length]=d+"["+r+"]="+encodeURIComponent(l[r]));g=g.replace(/\{\s*filter(?:List)?\s*:\s*(\w*)\s*\}/g,c.length?c.join("&"):d),s.currentFilters=l}return e.isFunction(o.pager_customAjaxUrl)&&(g=o.pager_customAjaxUrl(a.table,g)),t.debug(a,"pager")&&console.log("Pager >> Ajax url = "+g),g},renderTable:function(e,r){var i,s,o,g,n=e.table,l=e.pager,p=e.widgetOptions,d=t.debug(e,"pager"),c=e.$table.hasClass("hasFilters"),f=r&&r.length||0,u="all"===l.size?l.totalRows:l.size,h=l.page*u;if(f<1)d&&console.warn("Pager >> No rows for pager to render");else{if(l.page>=l.totalPages)return a.moveToLastPage(e,l);if(l.cacheIndex=[],l.isDisabled=!1,l.initialized&&(d&&console.log("Pager >> Triggering pagerChange"),e.$table.triggerHandler("pagerChange",e)),p.pager_removeRows){for(t.clearTableBody(n),i=t.processTbody(n,e.$tbodies.eq(0),!0),s=c?0:h,o=c?0:h,g=0;g<u&&s<r.length;)c&&l.regexFiltered.test(r[s][0].className)||++o>h&&g<=u&&(g++,l.cacheIndex[l.cacheIndex.length]=s,i.append(r[s])),s++;t.processTbody(n,i,!1)}else a.hideRows(e);a.updatePageDisplay(e),p.pager_startPage=l.page,p.pager_size=l.size,n.isUpdating&&(d&&console.log("Pager >> Triggering updateComplete"),e.$table.triggerHandler("updateComplete",[n,!0]))}},showAllRows:function(r){var i,s,o,g=r.table,n=r.pager,l=r.widgetOptions;for(n.ajax?a.pagerArrows(r,!0):(e.data(g,"pagerLastPage",n.page),e.data(g,"pagerLastSize",n.size),n.page=0,n.size=n.totalRows,n.totalPages=1,r.$table.addClass("pagerDisabled").removeAttr("aria-describedby").find("tr.pagerSavedHeightSpacer").remove(),a.renderTable(r,r.rowsCopy),n.isDisabled=!0,t.applyWidget(g),t.debug(r,"pager")&&console.log("Pager >> Disabled")),o=(s=n.$container.find(l.pager_selectors.pageSize+","+l.pager_selectors.gotoPage+",.ts-startRow, .ts-page")).length,i=0;i<o;i++)s.eq(i).prop("aria-disabled","true").addClass(l.pager_css.disabled)[0].disabled=!0},updateCache:function(r){var i=r.pager;t.updateCache(r,function(){if(!e.isEmptyObject(r.cache)){var t,s=[],o=r.cache[0].normalized;for(i.totalRows=o.length,t=0;t<i.totalRows;t++)s[s.length]=o[t][r.columns].$row;r.rowsCopy=s,a.moveToPage(r,i,!0),i.last.currentFilters=[" "]}})},moveToPage:function(r,i,s){if(!i.isDisabled){if(!1!==s&&i.initialized&&e.isEmptyObject(r.cache))return a.updateCache(r);var o,g=r.table,n=r.widgetOptions,l=i.last,p=t.debug(r,"pager");i.ajax&&!n.filter_initialized&&t.hasWidget(g,"filter")||(a.parsePageNumber(r,i),a.calcFilters(r),l.currentFilters=""===(l.currentFilters||[]).join("")?[]:l.currentFilters,i.currentFilters=""===(i.currentFilters||[]).join("")?[]:i.currentFilters,l.page===i.page&&l.size===i.size&&l.totalRows===i.totalRows&&(l.currentFilters||[]).join(",")===(i.currentFilters||[]).join(",")&&(l.ajaxUrl||"")===(i.ajaxObject.url||"")&&(l.optAjaxUrl||"")===(n.pager_ajaxUrl||"")&&l.sortList===(r.sortList||[]).join(",")||(p&&console.log("Pager >> Changing to page "+i.page),i.last={page:i.page,size:i.size,sortList:(r.sortList||[]).join(","),totalRows:i.totalRows,currentFilters:i.currentFilters||[],ajaxUrl:i.ajaxObject.url||"",optAjaxUrl:n.pager_ajaxUrl},i.ajax?n.pager_processAjaxOnInit||e.isEmptyObject(n.pager_initialRows)?a.getAjax(r):(n.pager_processAjaxOnInit=!0,o=n.pager_initialRows,i.totalRows=void 0!==o.total?o.total:p&&console.error("Pager >> No initial total page set!")||0,i.filteredRows=void 0!==o.filtered?o.filtered:p&&console.error("Pager >> No initial filtered page set!")||0,a.updatePageDisplay(r,!1)):i.ajax||a.renderTable(r,r.rowsCopy),e.data(g,"pagerLastPage",i.page),i.initialized&&!1!==s&&(p&&console.log("Pager >> Triggering pageMoved"),r.$table.triggerHandler("pageMoved",r),t.applyWidget(g),!i.ajax&&g.isUpdating&&(p&&console.log("Pager >> Triggering updateComplete"),r.$table.triggerHandler("updateComplete",[g,!0])))))}},getTotalPages:function(e,a){return t.hasWidget(e.table,"filter")?Math.min(a.totalPages,a.filteredPages):a.totalPages},parsePageNumber:function(e,t){var r=a.getTotalPages(e,t)-1;return t.page=parseInt(t.page,10),(t.page<0||isNaN(t.page))&&(t.page=0),t.page>r&&r>=0&&(t.page=r),t.page},parsePageSize:function(e,a,t){var r=e.pager,i=e.widgetOptions,s=parseInt(a,10)||r.size||i.pager_size||10;return r.initialized&&(/all/i.test(s+" "+a)||s===r.totalRows)?r.$container.find(i.pager_selectors.pageSize+' option[value="all"]').length?"all":r.totalRows:"get"===t?s:r.size},setPageSize:function(t,r){var i=t.pager,s=t.table;i.size=a.parsePageSize(t,r,"get"),i.$container.find(t.widgetOptions.pager_selectors.pageSize).val(i.size),e.data(s,"pagerLastPage",a.parsePageNumber(t,i)),e.data(s,"pagerLastSize",i.size),i.totalPages="all"===i.size?1:Math.ceil(i.totalRows/i.size),i.filteredPages="all"===i.size?1:Math.ceil(i.filteredRows/i.size)},moveToFirstPage:function(e,t){t.page=0,a.moveToPage(e,t,!0)},moveToLastPage:function(e,t){t.page=a.getTotalPages(e,t)-1,a.moveToPage(e,t,!0)},moveToNextPage:function(e,t){t.page++;var r=a.getTotalPages(e,t)-1;t.page>=r&&(t.page=r),a.moveToPage(e,t,!0)},moveToPrevPage:function(e,t){t.page--,t.page<=0&&(t.page=0),a.moveToPage(e,t,!0)},destroyPager:function(e,r){var i=e.table,s=e.pager,o=e.widgetOptions.pager_selectors||{},g=[o.first,o.prev,o.next,o.last,o.gotoPage,o.pageSize].join(","),n=e.namespace+"pager";if(s){if(s.initialized=!1,e.$table.off(n),s.$container.hide().find(g).off(n),r)return;e.appender=null,a.showAllRows(e),t.storage&&t.storage(i,e.widgetOptions.pager_storageKey,""),s.$container=null,e.pager=null,e.rowsCopy=null}},enablePager:function(r,i){var s,o,g=r.table,n=r.pager,l=r.widgetOptions,p=n.$container.find(l.pager_selectors.pageSize);n.isDisabled=!1,n.page=e.data(g,"pagerLastPage")||n.page||0,o=p.find("option[selected]").val(),n.size=e.data(g,"pagerLastSize")||a.parsePageSize(r,o,"get"),a.setPageSize(r,n.size),n.totalPages="all"===n.size?1:Math.ceil(a.getTotalPages(r,n)/n.size),r.$table.removeClass("pagerDisabled"),g.id&&!r.$table.attr("aria-describedby")&&((s=(p=n.$container.find(l.pager_selectors.pageDisplay)).attr("id"))||(s=g.id+"_pager_info",p.attr("id",s)),r.$table.attr("aria-describedby",s)),a.changeHeight(r),i&&(t.update(r),a.setPageSize(r,n.size),a.moveToPage(r,n,!0),a.hideRowsSetup(r),t.debug(r,"pager")&&console.log("Pager >> Enabled"))},appender:function(t,r){var i=t.config,s=i.widgetOptions,o=i.pager;o.ajax?a.moveToPage(i,o,!0):(i.rowsCopy=r,o.totalRows=s.pager_countChildRows?i.$tbodies.eq(0).children("tr").length:r.length,o.size=e.data(t,"pagerLastSize")||o.size||s.pager_size||o.setSize||10,o.totalPages="all"===o.size?1:Math.ceil(o.totalRows/o.size),a.moveToPage(i,o),a.updatePageDisplay(i,!1))}},t.showError=function(a,t,r,i){var s=e(a),o=s[0].config,g=o&&o.widgetOptions,n=o.pager&&o.pager.cssErrorRow||g&&g.pager_css&&g.pager_css.errorRow||"tablesorter-errorRow",l=typeof t,p=!0,d="",c=function(){o.$table.find("thead").find(o.selectorRemove).remove()};if(s.length){if("function"==typeof o.pager.ajaxError){if(!1===(p=o.pager.ajaxError(o,t,r,i)))return c();d=p}else if("function"==typeof g.pager_ajaxError){if(!1===(p=g.pager_ajaxError(o,t,r,i)))return c();d=p}if(""===d)if("object"===l)d=0===t.status?"Not connected, verify Network":404===t.status?"Requested page not found [404]":500===t.status?"Internal Server Error [500]":"parsererror"===i?"Requested JSON parse failed":"timeout"===i?"Time out error":"abort"===i?"Ajax Request aborted":"Uncaught error: "+t.statusText+" ["+t.status+"]";else{if("string"!==l)return c();d=t}e(/tr\>/.test(d)?d:'<tr><td colspan="'+o.columns+'">'+d+"</td></tr>").click(function(){e(this).remove()}).appendTo(o.$table.find("thead:first")).addClass(n+" "+o.selectorRemove.slice(1)).attr({role:"alert","aria-live":"assertive"})}else console.error("tablesorter showError: no table parameter passed")}}(jQuery); |