From 7b15ec99c51e78b2be110fa7b815669dd1f08d4c Mon Sep 17 00:00:00 2001 From: Rob Garrison Date: Sun, 18 Mar 2018 00:43:37 -0500 Subject: [PATCH] Core: Debug components separately --- addons/pager/jquery.tablesorter.pager.js | 89 +++++++++---------- docs/example-option-debug.html | 10 ++- docs/index.html | 19 ++++- js/jquery.tablesorter.js | 92 +++++++++++--------- js/widgets/widget-build-table.js | 44 ++++++---- js/widgets/widget-columnSelector.js | 40 +++++---- js/widgets/widget-filter.js | 17 ++-- js/widgets/widget-pager.js | 104 +++++++++++------------ js/widgets/widget-saveSort.js | 35 +++++--- js/widgets/widget-storage.js | 11 ++- js/widgets/widget-uitheme.js | 13 +-- 11 files changed, 266 insertions(+), 208 deletions(-) diff --git a/addons/pager/jquery.tablesorter.pager.js b/addons/pager/jquery.tablesorter.pager.js index 42161cbc..2729d450 100644 --- a/addons/pager/jquery.tablesorter.pager.js +++ b/addons/pager/jquery.tablesorter.pager.js @@ -246,8 +246,8 @@ pagerArrows( table, p ); fixHeight(table, p); if (p.initialized && completed !== false) { - if (c.debug) { - console.log('Pager: Triggering pagerComplete'); + if (ts.debug(c, 'pager')) { + console.log('Pager >> Triggering pagerComplete'); } c.$table.triggerHandler('pagerComplete', p); // save pager info to storage @@ -429,8 +429,8 @@ ts.showError( table ); if ( exception ) { - if (c.debug) { - console.error('Pager: >> Ajax Error', xhr, settings, exception); + if (ts.debug(c, 'pager')) { + console.error('Pager >> Ajax Error', xhr, settings, exception); } ts.showError( table, xhr, settings, exception ); c.$tbodies.eq(0).children('tr').detach(); @@ -527,8 +527,8 @@ // apply widgets after table has rendered & after a delay to prevent // multiple applyWidget blocking code from blocking this trigger setTimeout(function() { - if (c.debug) { - console.log('Pager: Triggering pagerChange'); + if (ts.debug(c, 'pager')) { + console.log('Pager >> Triggering pagerChange'); } $table.triggerHandler( 'pagerChange', p ); ts.applyWidget( table ); @@ -573,8 +573,8 @@ p.oldAjaxSuccess(data); } }; - if (c.debug) { - console.log('Pager: Ajax initialized', p.ajaxObject); + if (ts.debug(c, 'pager')) { + console.log('Pager >> Ajax initialized', p.ajaxObject); } $.ajax(p.ajaxObject); } @@ -618,8 +618,8 @@ if ( typeof p.customAjaxUrl === 'function' ) { url = p.customAjaxUrl(table, url); } - if (c.debug) { - console.log('Pager: Ajax url = ' + url); + if (ts.debug(c, 'pager')) { + console.log('Pager >> Ajax url = ' + url); } return url; }, @@ -628,13 +628,14 @@ var $tb, index, count, added, $t = $(table), c = table.config, + 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 (c.debug) { - console.warn('Pager: >> No rows for pager to render'); + if (debug) { + console.warn('Pager >> No rows for pager to render'); } // empty table, abort! return; @@ -646,8 +647,8 @@ p.cacheIndex = []; p.isDisabled = false; // needed because sorting will change the page and re-enable the pager if (p.initialized) { - if (c.debug) { - console.log('Pager: Triggering pagerChange'); + if (debug) { + console.log('Pager >> Triggering pagerChange'); } $t.triggerHandler( 'pagerChange', p ); } @@ -676,8 +677,8 @@ } updatePageDisplay(table, p); if (table.isUpdating) { - if (c.debug) { - console.log('Pager: Triggering updateComplete'); + if (debug) { + console.log('Pager >> Triggering updateComplete'); } $t.triggerHandler('updateComplete', [ table, true ]); } @@ -700,8 +701,8 @@ renderTable(table, table.config.rowsCopy, p); p.isDisabled = true; ts.applyWidget( table ); - if (table.config.debug) { - console.log('Pager: Disabled'); + if (ts.debug(table.config, 'pager')) { + console.log('Pager >> Disabled'); } } // disable size selector @@ -734,9 +735,10 @@ moveToPage = function(table, p, pageMoved) { if ( p.isDisabled ) { return; } var tmp, - c = table.config, - $t = $(table), - l = p.last; + c = table.config, + debug = ts.debug(c, 'pager'), + $t = $(table), + l = p.last; if ( pageMoved !== false && p.initialized && ts.isEmptyObject(c.cache)) { return updateCache(table); } @@ -756,8 +758,8 @@ // & ajax url option changes (dynamically add/remove/rename sort & filter parameters) (l.optAjaxUrl || '') === (p.ajaxUrl || '') && l.sortList === (c.sortList || []).join(',') ) { return; } - if (c.debug) { - console.log('Pager: Changing to page ' + p.page); + if (debug) { + console.log('Pager >> Changing to page ' + p.page); } p.last = { page : p.page, @@ -774,9 +776,9 @@ p.processAjaxOnInit = true; tmp = p.initialRows; p.totalRows = typeof tmp.total !== 'undefined' ? tmp.total : - ( c.debug ? console.error('Pager: no initial total page set!') || 0 : 0 ); + ( debug ? console.error('Pager >> No initial total page set!') || 0 : 0 ); p.filteredRows = typeof tmp.filtered !== 'undefined' ? tmp.filtered : - ( c.debug ? console.error('Pager: no initial filtered page set!') || 0 : 0 ); + ( debug ? console.error('Pager >> No initial filtered page set!') || 0 : 0 ); pagerInitialized( table, p ); } else { getAjax(table, p); @@ -786,14 +788,14 @@ } $.data(table, 'pagerLastPage', p.page); if (p.initialized && pageMoved !== false) { - if (c.debug) { - console.log('Pager: Triggering pageMoved'); + if (debug) { + console.log('Pager >> Triggering pageMoved'); } $t.triggerHandler('pageMoved', p); ts.applyWidget( table ); if (table.isUpdating) { - if (c.debug) { - console.log('Pager: Triggering updateComplete'); + if (debug) { + console.log('Pager >> Triggering updateComplete'); } $t.triggerHandler('updateComplete', [ table, true ]); } @@ -866,8 +868,8 @@ pagerInitialized = function(table, p) { p.initialized = true; p.initializing = false; - if (table.config.debug) { - console.log('Pager: Triggering pagerInitialized'); + if (ts.debug(table.config, 'pager')) { + console.log('Pager >> Triggering pagerInitialized'); } $(table).triggerHandler( 'pagerInitialized', p ); ts.applyWidget( table ); @@ -934,8 +936,8 @@ setPageSize(table, p.size, p); moveToPage(table, p); hideRowsSetup(table, p); - if (c.debug) { - console.log('Pager: Enabled'); + if (ts.debug(c, 'pager')) { + console.log('Pager >> Enabled'); } } }, @@ -944,6 +946,7 @@ var t, ctrls, fxn, $el, c = table.config, wo = c.widgetOptions, + debug = ts.debug(c, 'pager'), p = c.pager = $.extend( true, {}, $.tablesorterPager.defaults, settings ), $t = c.$table, namespace = c.namespace + 'pager', @@ -951,8 +954,8 @@ pager = p.$container = $(p.container).addClass('tablesorter-pager').show(); // save a copy of the original settings p.settings = $.extend( true, {}, $.tablesorterPager.defaults, settings ); - if (c.debug) { - console.log('Pager: Initializing'); + if (debug) { + console.log('Pager >> Initializing'); } p.oldAjaxSuccess = p.oldAjaxSuccess || p.ajaxObject.success; c.appender = $this.appender; @@ -1066,8 +1069,8 @@ // clicked controls ctrls = [ p.cssFirst, p.cssPrev, p.cssNext, p.cssLast ]; fxn = [ moveToFirstPage, moveToPrevPage, moveToNextPage, moveToLastPage ]; - if (c.debug && !pager.length) { - console.warn('Pager: >> Container not found'); + if (debug && !pager.length) { + console.warn('Pager >> "container" not found'); } pager.find(ctrls.join(',')) .attr('tabindex', 0) @@ -1095,8 +1098,8 @@ moveToPage(table, p, true); updatePageDisplay(table, p, false); }); - } else if (c.debug) { - console.warn('Pager: >> Goto selector not found'); + } else if (debug) { + console.warn('Pager >> "goto" selector not found'); } // page size selector $el = pager.find(p.cssPageSize); @@ -1113,8 +1116,8 @@ } return false; }); - } else if (c.debug) { - console.warn('Pager: >> Size selector not found'); + } else if (debug) { + console.warn('Pager >> "size" selector not found'); } // clear initialized flag @@ -1145,8 +1148,8 @@ // update page size on init setPageSize(table, p.size, p); moveToPage(table, p); - if (c.debug) { - console.log('Pager: Triggering pagerInitialized'); + if (debug) { + console.log('Pager >> Triggering pagerInitialized'); } c.$table.triggerHandler( 'pagerInitialized', p ); if ( !( c.widgetOptions.filter_initialized && ts.hasWidget(table, 'filter') ) ) { diff --git a/docs/example-option-debug.html b/docs/example-option-debug.html index fdd207b9..a678bb4f 100644 --- a/docs/example-option-debug.html +++ b/docs/example-option-debug.html @@ -16,14 +16,18 @@ + @@ -39,7 +43,7 @@

- NOTE! If firebug is installed the debuging information will be displayed in the firebug console. + NOTE! Debugging information will be displayed in the development console (Press F12 and select the console tab).

Demo

diff --git a/docs/index.html b/docs/index.html index 2bc951b6..38b9c7cb 100644 --- a/docs/index.html +++ b/docs/index.html @@ -928,11 +928,24 @@ - debug - Boolean + + Boolean or String false - Boolean flag indicating if tablesorter should display debuging information useful for development. + Set this option to provide useful for development debugging information in the console v2.30.0. +
+ In v2.30.0, set this option as a string containing either "core" and/or a specific widget name; or, a boolean value. +

When a boolean flag is set, all debugging information is shown in the console.

+ To display debugging information specific to a widget, or widgets include the widget name: +
$(function() {
+  $("table").tablesorter({
+    // Show debugging info only for the filter and columnSelector widgets
+    // include "core" to only show the core debugging info
+    debug : "filter columnSelector"
+  });
+});
+ The option only tests if the string contains the widget name, so "corefilter" would show debugging for both the core and filter widget. +
Example diff --git a/js/jquery.tablesorter.js b/js/jquery.tablesorter.js index d8271bae..ea228d21 100644 --- a/js/jquery.tablesorter.js +++ b/js/jquery.tablesorter.js @@ -216,7 +216,7 @@ setup : function( table, c ) { // if no thead or tbody, or tablesorter is already present, quit if ( !table || !table.tHead || table.tBodies.length === 0 || table.hasInitialized === true ) { - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { if ( table.hasInitialized ) { console.warn( 'Stopping initialization. Tablesorter has already been initialized' ); } else { @@ -237,7 +237,7 @@ table.config = c; // save the settings where they read $.data( table, 'tablesorter', c ); - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console[ console.group ? 'group' : 'log' ]( 'Initializing tablesorter v' + ts.version ); $.data( table, 'startoveralltimer', new Date() ); } @@ -343,9 +343,9 @@ // initialized table.hasInitialized = true; table.isProcessing = false; - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.log( 'Overall initialization time:' + ts.benchmark( $.data( table, 'startoveralltimer' ) ) ); - if ( c.debug && console.groupEnd ) { console.groupEnd(); } + if ( ts.debug(c, 'core') && console.groupEnd ) { console.groupEnd(); } } $table.triggerHandler( 'tablesorter-initialized', table ); if ( typeof c.initialized === 'function' ) { @@ -542,7 +542,7 @@ c.headerList = []; c.headerContent = []; c.sortVars = []; - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { timer = new Date(); } // children tr in tfoot - see issue #196 & #547 @@ -637,7 +637,7 @@ }); // enable/disable sorting ts.updateHeader( c ); - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.log( 'Built headers:' + ts.benchmark( timer ) ); console.log( c.$headers ); } @@ -660,14 +660,15 @@ noParser, parser, extractor, time, tbody, len, table = c.table, tbodyIndex = 0, - debug = {}; + debug = ts.debug(c, 'core'), + debugOutput = {}; // update table bodies in case we start with an empty table c.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' ); tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies; len = tbody.length; if ( len === 0 ) { - return c.debug ? console.warn( 'Warning: *Empty table!* Not building a parser cache' ) : ''; - } else if ( c.debug ) { + return debug ? console.warn( 'Warning: *Empty table!* Not building a parser cache' ) : ''; + } else if ( debug ) { time = new Date(); console[ console.group ? 'group' : 'log' ]( 'Detecting parsers for each column' ); } @@ -709,8 +710,8 @@ if ( !parser ) { parser = ts.detectParserForColumn( c, rows, -1, colIndex ); } - if ( c.debug ) { - debug[ '(' + colIndex + ') ' + header.text() ] = { + if ( debug ) { + debugOutput[ '(' + colIndex + ') ' + header.text() ] = { parser : parser.id, extractor : extractor ? extractor.id : 'none', string : c.strings[ colIndex ], @@ -736,9 +737,9 @@ } tbodyIndex += ( list.parsers.length ) ? len : 1; } - if ( c.debug ) { - if ( !ts.isEmptyObject( debug ) ) { - console[ console.table ? 'table' : 'log' ]( debug ); + if ( debug ) { + if ( !ts.isEmptyObject( debugOutput ) ) { + console[ console.table ? 'table' : 'log' ]( debugOutput ); } else { console.warn( ' No parsers detected!' ); } @@ -781,6 +782,7 @@ indx = ts.parsers.length, node = false, nodeValue = '', + debug = ts.debug(c, 'core'), keepLooking = true; while ( nodeValue === '' && keepLooking ) { rowIndex++; @@ -791,7 +793,7 @@ node = rows[ rowIndex ].cells[ cellIndex ]; nodeValue = ts.getElementText( c, node, cellIndex ); $node = $( node ); - if ( c.debug ) { + if ( debug ) { console.log( 'Checking if value was empty on row ' + rowIndex + ', column: ' + cellIndex + ': "' + nodeValue + '"' ); } @@ -873,7 +875,8 @@ cols, $cells, cell, cacheTime, totalRows, rowData, prevRowData, colMax, span, cacheIndex, hasParser, max, len, index, table = c.table, - parsers = c.parsers; + parsers = c.parsers, + debug = ts.debug(c, 'core'); // update tbody variable c.$tbodies = c.$table.children( 'tbody:not(.' + c.cssInfoBlock + ')' ); $tbody = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies, @@ -881,9 +884,9 @@ c.totalRows = 0; // if no parsers found, return - it's an empty table. if ( !parsers ) { - return c.debug ? console.warn( 'Warning: *Empty table!* Not building a cache' ) : ''; + return debug ? console.warn( 'Warning: *Empty table!* Not building a cache' ) : ''; } - if ( c.debug ) { + if ( debug ) { cacheTime = new Date(); } // processing icon @@ -952,7 +955,7 @@ cell = $row[ 0 ].cells[ colIndex ]; if ( cell && cacheIndex < c.columns ) { hasParser = typeof parsers[ cacheIndex ] !== 'undefined'; - if ( !hasParser && c.debug ) { + if ( !hasParser && debug ) { console.warn( 'No parser found for row: ' + rowIndex + ', column: ' + colIndex + '; cell containing: "' + $(cell).text() + '"; does it have a header?' ); } @@ -1000,7 +1003,7 @@ if ( c.showProcessing ) { ts.isProcessing( table ); // remove processing icon } - if ( c.debug ) { + if ( debug ) { len = Math.min( 5, c.cache[ 0 ].normalized.length ); console[ console.group ? 'group' : 'log' ]( 'Building cache for ' + c.totalRows + ' rows (showing ' + len + ' rows in log) and ' + c.columns + ' columns' + @@ -1031,7 +1034,7 @@ data = { raw : [], parsed: [], $cell: [] }, c = table.config; if ( ts.isEmptyObject( c ) ) { - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.warn( 'No cache found - aborting getColumnText function!' ); } } else { @@ -1375,7 +1378,7 @@ ts.resortComplete( c, callback ); } } else { - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.error( 'updateCell aborted, tbody missing or not within the indicated table' ); } c.table.isUpdating = false; @@ -1398,7 +1401,7 @@ // row contained in the table? ( ts.getClosest( $row, 'table' )[ 0 ] !== c.table ) ) { - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.error( 'addRows method requires (1) a jQuery selector reference to rows that have already ' + 'been added to the table, or (2) row HTML string to be added to a table with only one tbody' ); } @@ -1480,7 +1483,7 @@ return c.appender ? c.appender( table, rows ) : table.isUpdating ? c.$table.triggerHandler( 'updateComplete', table ) : ''; // Fixes #532 } - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { appendTime = new Date(); } for ( tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) { @@ -1504,7 +1507,7 @@ if ( c.appender ) { c.appender( table, rows ); } - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.log( 'Rebuilt table' + ts.benchmark( appendTime ) ); } // apply table widgets; but not before ajax completes @@ -1686,7 +1689,7 @@ // empty table - fixes #206/#346 return; } - if ( c.debug ) { sortTime = new Date(); } + if ( ts.debug(c, 'core') ) { sortTime = new Date(); } // cache textSorter to optimize speed if ( typeof textSorter === 'object' ) { colMax = c.columns; @@ -1748,7 +1751,7 @@ return a[ c.columns ].order - b[ c.columns ].order; }); } - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.log( 'Applying sort ' + sortList.toString() + ts.benchmark( sortTime ) ); } }, @@ -2001,6 +2004,7 @@ var applied, time, name, c = table.config, wo = c.widgetOptions, + debug = ts.debug(c, 'core'), widget = ts.getWidgetById( id ); if ( widget ) { name = widget.id; @@ -2009,7 +2013,7 @@ if ( $.inArray( name, c.widgets ) < 0 ) { c.widgets[ c.widgets.length ] = name; } - if ( c.debug ) { time = new Date(); } + if ( debug ) { time = new Date(); } if ( init || !( c.widgetInit[ name ] ) ) { // set init flag first to prevent calling init more than once (e.g. pager) @@ -2020,7 +2024,7 @@ } if ( typeof widget.init === 'function' ) { applied = true; - if ( c.debug ) { + if ( debug ) { console[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' ); } widget.init( table, widget, c, wo ); @@ -2028,12 +2032,12 @@ } if ( !init && typeof widget.format === 'function' ) { applied = true; - if ( c.debug ) { + if ( debug ) { console[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' ); } widget.format( table, c, wo, false ); } - if ( c.debug ) { + if ( debug ) { if ( applied ) { console.log( 'Completed ' + ( init ? 'initializing ' : 'applying ' ) + name + ' widget' + ts.benchmark( time ) ); if ( console.groupEnd ) { console.groupEnd(); } @@ -2046,12 +2050,13 @@ table = $( table )[ 0 ]; // in case this is called externally var indx, len, names, widget, time, c = table.config, + debug = ts.debug(c, 'core'), widgets = []; // prevent numerous consecutive widget applications if ( init !== false && table.hasInitialized && ( table.isApplyingWidgets || table.isUpdating ) ) { return; } - if ( c.debug ) { time = new Date(); } + if ( debug ) { time = new Date(); } ts.addWidgetFromClass( table ); // prevent "tablesorter-ready" from firing multiple times in a row clearTimeout( c.timerReady ); @@ -2070,7 +2075,7 @@ // set priority to 10 if not defined if ( !widget.priority ) { widget.priority = 10; } widgets[ indx ] = widget; - } else if ( c.debug ) { + } else if ( debug ) { console.warn( '"' + names[ indx ] + '" was enabled, but the widget code has not been loaded!' ); } } @@ -2080,7 +2085,7 @@ }); // add/update selected widgets len = widgets.length; - if ( c.debug ) { + if ( debug ) { console[ console.group ? 'group' : 'log' ]( 'Start ' + ( init ? 'initializing' : 'applying' ) + ' widgets' ); } for ( indx = 0; indx < len; indx++ ) { @@ -2089,7 +2094,7 @@ ts.applyWidgetId( table, widget.id, init ); } } - if ( c.debug && console.groupEnd ) { console.groupEnd(); } + if ( debug && console.groupEnd ) { console.groupEnd(); } } c.timerReady = setTimeout( function() { table.isApplyingWidgets = false; @@ -2099,7 +2104,7 @@ if ( !init && typeof callback === 'function' ) { callback( table ); } - if ( c.debug ) { + if ( debug ) { widget = c.widgets.length; console.log( 'Completed ' + ( init === true ? 'initializing ' : 'applying ' ) + widget + @@ -2136,7 +2141,7 @@ c.widgets.splice( indx, 1 ); } if ( widget && widget.remove ) { - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.log( ( refreshing ? 'Refreshing' : 'Removing' ) + ' "' + name[ index ] + '" widget' ); } widget.remove( table, c, c.widgetOptions, refreshing ); @@ -2190,6 +2195,12 @@ log : function() { console.log( arguments ); }, + debug : function(c, name) { + return c && ( + c.debug === true || + typeof c.debug === 'string' && c.debug.indexOf(name) > -1 + ); + }, // $.isEmptyObject from jQuery v1.4 isEmptyObject : function( obj ) { @@ -2495,7 +2506,7 @@ ignore = 'headers sortForce sortList sortAppend widgets'.split( ' ' ), orig = c.originalSettings; if ( orig ) { - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { timer = new Date(); } for ( setting in orig ) { @@ -2511,7 +2522,7 @@ } } } - if ( c.debug ) { + if ( ts.debug(c, 'core') ) { console.log( 'validate options time:' + ts.benchmark( timer ) ); } } @@ -2542,7 +2553,6 @@ var events, $t = $( table ), c = table.config, - debug = c.debug, $h = $t.find( 'thead:first' ), $r = $h.find( 'tr.' + ts.css.headerRow ).removeClass( ts.css.headerRow + ' ' + c.cssHeaderRow ), $f = $t.find( 'tfoot:first > tr' ).children( 'th, td' ); @@ -2580,7 +2590,7 @@ if ( typeof callback === 'function' ) { callback( table ); } - if ( debug ) { + if ( ts.debug(c, 'core') ) { console.log( 'tablesorter has been removed' ); } } diff --git a/js/widgets/widget-build-table.js b/js/widgets/widget-build-table.js index 057fef10..62bcb628 100644 --- a/js/widgets/widget-build-table.js +++ b/js/widgets/widget-build-table.js @@ -4,14 +4,14 @@ */ /*jshint browser:true, jquery:true, unused:false */ /*global jQuery: false */ -;(function($){ +;(function($) { 'use strict'; var ts = $.tablesorter = $.tablesorter || {}, // build a table from data (requires existing tag) // data.header contains an array of header titles // data.rows contains an array of rows which contains an array of cells - bt = ts.buildTable = function(tar, c){ + bt = ts.buildTable = function(tar, c) { // add build options to defaults to prevent warnings $.extend(true, ts.defaults.widgetOptions, bt.defaults); // add table if one doesn't exist @@ -21,9 +21,10 @@ p = wo.build_processing, typ = wo.build_type, d = wo.build_source || c.data, + debug = ts.debug(c, 'build'), // determine type: html, json, array, csv, object - runType = function(d){ + runType = function(d) { var t = $.type(d), jq = d instanceof jQuery; // run any processing if set @@ -59,7 +60,9 @@ // even if wo.build_type is undefined, we can try to figure out the type if ( !ts.buildTable.hasOwnProperty(typ) && typ !== '' ) { - if (c.debug) { console.error('aborting build table widget, incorrect build type'); } + if (debug) { + console.error('Build >> ERROR: Aborting build table widget, incorrect build type'); + } return false; } @@ -72,8 +75,10 @@ .done(function(data) { runType(data); }) - .fail(function( jqXHR, textStatus, errorThrown) { - if (c.debug) { console.error('aborting build table widget, failed ajax load'); } + .fail(function( jqXHR, textStatus) { + if (debug) { + console.error('Build >> ERROR: Aborting build table widget, failed ajax load'); + } $tbl.html(''); }); } else { @@ -125,7 +130,7 @@ // add colgroup if widths set if (widths && widths.length) { t += ''; - $.each(widths, function(i, w){ + $.each(widths, function(i, w) { t += ''; }); t += ''; @@ -133,7 +138,7 @@ return t; }, // d = cell data; typ = 'th' or 'td'; first = save widths from first header row only - cell : function(d, wo, typ, col, first){ + cell : function(d, wo, typ, col, first) { var j, $td, $col = first ? $('') : '', cls = wo.build_headers.classes, @@ -150,7 +155,7 @@ // assume we have an object $td = $('<' + typ + '>'); for (j in d) { - if (d.hasOwnProperty(j)){ + if (d.hasOwnProperty(j)) { if (j === 'text' || j === 'html') { $td[j]( d[j] ); } else if (first && j === 'width') { @@ -165,7 +170,7 @@ return [ $td, $col ]; }, // h1 = header text from data - header : function(h1, wo){ + header : function(h1, wo) { var h2 = wo.build_headers.text, cls = wo.build_headers.classes, t = '' + (wo.build_numbers.addColumn ? ''; }, - rows : function(items, txt, c, wo, num, ftr){ + rows : function(items, txt, c, wo, num, ftr) { var h = (ftr ? 'th' : 'td'), t = '' + (wo.build_numbers.addColumn ? '<' + h + '>' + (ftr ? '' : num) + '' : ''); $.each(items, function(i, item) { @@ -196,8 +201,11 @@ } }; - bt.buildComplete = function(table, wo){ + bt.buildComplete = function(table, wo) { $(table).triggerHandler(wo.build_complete); + if (table.config && ts.debug(table.config, 'build')) { + console.log('Build >> Table build complete'); + } ts.setup(table, table.config); }; @@ -361,7 +369,9 @@ r = data.hasOwnProperty(kr) && !$.isEmptyObject(data.kr) ? data.kr : data.hasOwnProperty('rows') ? data.rows : false; if (!h || !r || h.length === 0 || r.length === 0) { - if (c.debug) { console.error('aborting build table widget, missing data for object build'); } + if (ts.debug(c, 'build')) { + console.error('Build >> ERROR: Aborting build table widget, missing data for object build'); + } return false; } @@ -371,7 +381,7 @@ // Build thead // h = [ ['headerRow1Cell1', 'headerRow1Cell2', ... 'headerRow1CellN' ], ['headerRow2Cell1', ... ] ] // or h = [ [ { text: 'firstCell', class: 'fc', width: '20%' }, ..., { text: 'last Cell' } ], [ /* second row */ ] ] - $.each(h, function(i, d){ + $.each(h, function(i, d) { $tr = $('').appendTo( $t.find('thead') ); l = d.length; // header row for ( j = 0; j < l; j++ ) { @@ -388,14 +398,14 @@ $tb = $(''); // Build tbody - $.each(r, function(i, d){ + $.each(r, function(i, d) { var j; t = $.type(d) === 'object'; // add new tbody if (t && d.newTbody) { $tb = $('').appendTo( $t ); for (j in d) { - if (d.hasOwnProperty(j) && j !== 'newTbody'){ + if (d.hasOwnProperty(j) && j !== 'newTbody') { $tb.attr(j, d[j]); } } @@ -409,7 +419,7 @@ if (t) { // row defined by object for (j in d) { - if (d.hasOwnProperty(j) && j !== wo.build_objectCellKey){ + if (d.hasOwnProperty(j) && j !== wo.build_objectCellKey) { $tr.attr(j, d[j]); } } diff --git a/js/widgets/widget-columnSelector.js b/js/widgets/widget-columnSelector.js index f401b339..99405bc0 100644 --- a/js/widgets/widget-columnSelector.js +++ b/js/widgets/widget-columnSelector.js @@ -1,10 +1,10 @@ -/* Widget: columnSelector (responsive table widget) - updated 9/27/2017 (v2.29.0) *//* +/* Widget: columnSelector (responsive table widget) - updated 2018-03-17 (v2.30.0) *//* * Requires tablesorter v2.8+ and jQuery 1.7+ * by Justin Hallett & Rob Garrison */ /*jshint browser:true, jquery:true, unused:false */ /*global jQuery: false */ -;(function($){ +;(function($) { 'use strict'; var ts = $.tablesorter, @@ -15,13 +15,14 @@ queryBreak : '@media all and (min-width: [size]) { [columns] { display: table-cell; } } ', init: function(table, c, wo) { - var $t, colSel; + var $t, colSel, + debug = ts.debug(c, 'columnSelector'); // abort if no input is contained within the layout $t = $(wo.columnSelector_layout); if (!$t.find('input').add( $t.filter('input') ).length) { - if (c.debug) { - console.error('ColumnSelector: >> ERROR: Column Selector aborting, no input found in the layout! ***'); + if (debug) { + console.error('ColumnSelector >> ERROR: Column Selector aborting, no input found in the layout! ***'); } return; } @@ -45,8 +46,8 @@ colSel.isInitializing = false; if (colSel.$container.length) { tsColSel.updateCols(c, wo); - } else if (c.debug) { - console.warn('ColumnSelector: >> container not found'); + } else if (debug) { + console.warn('ColumnSelector >> container not found'); } c.$table @@ -59,11 +60,14 @@ [ 'auto', [2,3,4] ] = set visible columns; turn on "auto" mode. true = turn on "auto" mode. */ - .on('refreshColumnSelector' + namespace, function( e, optName, optState ){ + .on('refreshColumnSelector' + namespace, function( e, optName, optState ) { // make sure we're using current config settings tsColSel.refreshColumns( this.config, optName, optState ); }); + if (debug) { + console.log('ColumnSelector >> Widget initialized'); + } }, refreshColumns: function( c, optName, optState ) { @@ -87,7 +91,7 @@ if (isArry) { arry = optState || optName; // make sure array contains numbers - $.each(arry, function(i, v){ + $.each(arry, function(i, v) { arry[i] = parseInt(v, 10); }); for (i = 0; i < c.columns; i++) { @@ -229,7 +233,7 @@ .attr('data-column', 'auto') .prop('checked', colSel.auto) .toggleClass( wo.columnSelector_cssChecked, colSel.auto ) - .on('change', function(){ + .on('change', function() { tsColSel.updateAuto(c, wo, $(this)); }).change(); } @@ -243,7 +247,7 @@ updateAuto: function(c, wo, $el) { var colSel = c.selector; colSel.auto = $el.prop('checked') || false; - $.each( colSel.$checkbox, function(i, $cb){ + $.each( colSel.$checkbox, function(i, $cb) { if ($cb) { $cb[0].disabled = colSel.auto; colSel.$wrapper[i].toggleClass('disabled', colSel.auto); @@ -257,7 +261,7 @@ if (c.selector.$popup) { c.selector.$popup.find('.tablesorter-column-selector') .html( colSel.$container.html() ) - .find('input').each(function(){ + .find('input').each(function() { var indx = $(this).attr('data-column'); $(this).prop( 'checked', indx === 'auto' ? colSel.auto : colSel.states[indx] ); }); @@ -306,10 +310,10 @@ } } // only 6 breakpoints (same as jQuery Mobile) - for (priority = 0; priority < wo.columnSelector_maxPriorities; priority++){ + for (priority = 0; priority < wo.columnSelector_maxPriorities; priority++) { /*jshint loopfunc:true */ breaks = []; - c.$headers.filter('[' + wo.columnSelector_priority + '=' + (priority + 1) + ']').each(function(){ + c.$headers.filter('[' + wo.columnSelector_priority + '=' + (priority + 1) + ']').each(function() { column = parseInt($(this).attr('data-column'), 10) + 1; // don't reveal columnSelector false columns if ( !isHidden[ column ] ) { @@ -340,14 +344,14 @@ colSel = c.selector, styles = [], prefix = c.namespace + 'columnselector'; - colSel.$container.find('input[data-column]').filter('[data-column!="auto"]').each(function(){ + colSel.$container.find('input[data-column]').filter('[data-column!="auto"]').each(function() { if (!this.checked) { column = parseInt( $(this).attr('data-column'), 10 ) + 1; styles = styles.concat( tsColSel.addSelectors( wo, prefix, column ) ); } $(this).toggleClass( wo.columnSelector_cssChecked, this.checked ); }); - if (wo.columnSelector_mediaquery){ + if (wo.columnSelector_mediaquery) { colSel.$breakpoints.prop('disabled', true); } if (colSel.$style) { @@ -451,7 +455,7 @@ wo = c.widgetOptions; $popup.find('.tablesorter-column-selector') .html( colSel.$container.html() ) - .find('input').each(function(){ + .find('input').each(function() { var indx = $(this).attr('data-column'), isChecked = indx === 'auto' ? colSel.auto : colSel.states[indx]; $(this) @@ -503,7 +507,7 @@ // container layout columnSelector_layout : '', // layout customizer callback called for each column - // function($cell, name, column){ return name || $cell.html(); } + // function($cell, name, column) { return name || $cell.html(); } columnSelector_layoutCustomizer : null, // data attribute containing column name to use in the selector container columnSelector_name : 'data-selector-name', diff --git a/js/widgets/widget-filter.js b/js/widgets/widget-filter.js index af7a6e25..01d67557 100644 --- a/js/widgets/widget-filter.js +++ b/js/widgets/widget-filter.js @@ -627,6 +627,9 @@ c.lastSearch = c.$table.data( 'lastSearch' ); c.$table.triggerHandler( 'filterInit', c ); tsf.findRows( c.table, c.lastSearch || [] ); + if (ts.debug(c, 'filter')) { + console.log('Filter >> Widget initialized'); + } }; if ( $.isEmptyObject( wo.filter_formatter ) ) { completed(); @@ -1327,6 +1330,7 @@ storedFilters = $.extend( [], filters ), c = table.config, wo = c.widgetOptions, + debug = ts.debug(c, 'filter'), // data object passed to filters; anyMatch is a flag for the filters data = { anyMatch: false, @@ -1343,7 +1347,6 @@ defaultColFilter : [], defaultAnyFilter : ts.getColumnData( table, wo.filter_defaultFilter, c.columns, true ) || '' }; - // parse columns after formatter, in case the class is added at that point data.parsed = []; for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) { @@ -1365,8 +1368,8 @@ ( ts.getColumnData( table, wo.filter_excludeFilter, columnIndex, true ) || '' ).split( /\s+/ ); } - if ( c.debug ) { - console.log( 'Filter: Starting filter widget search', filters ); + if ( debug ) { + console.log( 'Filter >> Starting filter widget search', filters ); time = new Date(); } // filtered rows count @@ -1464,8 +1467,8 @@ notFiltered = $rows.not( '.' + wo.filter_filteredRow ).length; // can't search when all rows are hidden - this happens when looking for exact matches if ( searchFiltered && notFiltered === 0 ) { searchFiltered = false; } - if ( c.debug ) { - console.log( 'Filter: Searching through ' + + if ( debug ) { + console.log( 'Filter >> Searching through ' + ( searchFiltered && notFiltered < len ? notFiltered : 'all' ) + ' rows' ); } if ( data.anyMatchFlag ) { @@ -1568,8 +1571,8 @@ if ( wo.filter_saveFilters && ts.storage ) { ts.storage( table, 'tablesorter-filters', tsf.processFilters( storedFilters, true ) ); } - if ( c.debug ) { - console.log( 'Completed filter widget search' + ts.benchmark(time) ); + if ( debug ) { + console.log( 'Filter >> Completed search' + ts.benchmark(time) ); } if ( wo.filter_initialized ) { c.$table.triggerHandler( 'filterBeforeEnd', c ); diff --git a/js/widgets/widget-pager.js b/js/widgets/widget-pager.js index 1b38b912..a360aaa3 100644 --- a/js/widgets/widget-pager.js +++ b/js/widgets/widget-pager.js @@ -1,9 +1,9 @@ -/*! Widget: Pager - updated 5/24/2017 (v2.28.11) */ +/*! Widget: Pager - updated 2018-03-17 (v2.30.0) */ /* Requires tablesorter v2.8+ and jQuery 1.7+ * by Rob Garrison */ /*jshint browser:true, jquery:true, unused:false */ -;(function($){ +;(function($) { 'use strict'; var tsp, ts = $.tablesorter; @@ -66,7 +66,7 @@ pager_customAjaxUrl: function( table, url ) { return url; }, // ajax error callback from $.tablesorter.showError function - // pager_ajaxError: function( config, xhr, settings, exception ){ return exception; }; + // pager_ajaxError: function( config, xhr, settings, exception ) { return exception; }; // returning false will abort the error message pager_ajaxError: null, @@ -91,7 +91,7 @@ // ], // [ "header1", "header2", ... "headerN" ] // optional // ] - pager_ajaxProcessing: function( ajax ){ return [ 0, [], null ]; }, + pager_ajaxProcessing: function( /* ajax */ ) { return [ 0, [], null ]; }, // css class names of pager arrows pager_css: { @@ -162,8 +162,8 @@ if ( p.isInitializing ) { return; } p.isInitializing = true; - if ( c.debug ) { - console.log( 'Pager: Initializing' ); + if ( ts.debug(c, 'pager') ) { + console.log( 'Pager >> Initializing' ); } p.size = $.data( table, 'pagerLastSize' ) || wo.pager_size; @@ -227,8 +227,8 @@ p.initializing = false; p.isInitializing = false; tsp.setPageSize( c, p.size ); // page size 0 is ignored - if ( c.debug ) { - console.log( 'Pager: Triggering pagerInitialized' ); + 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 @@ -243,7 +243,8 @@ p = c.pager, wo = c.widgetOptions, namespace = c.namespace + 'pager', - s = wo.pager_selectors; + s = wo.pager_selectors, + debug = ts.debug(c, 'pager'); c.$table .off( namespace ) .on( 'filterInit filterStart '.split( ' ' ).join( namespace + ' ' ), function( e, filters ) { @@ -284,7 +285,7 @@ e.stopPropagation(); tsp.enablePager( c, true ); }) - .on( 'destroyPager' + namespace, function( e, refreshing ) { + .on( 'destroyPager' + namespace, function( e ) { e.stopPropagation(); // call removeWidget to make sure internal flags are modified. ts.removeWidget( c.table, 'pager', false ); @@ -343,8 +344,8 @@ // clicked controls ctrls = [ s.first, s.prev, s.next, s.last ]; fxn = [ 'moveToFirstPage', 'moveToPrevPage', 'moveToNextPage', 'moveToLastPage' ]; - if ( c.debug && !p.$container.length ) { - console.warn( 'Pager: >> Container not found' ); + if ( debug && !p.$container.length ) { + console.warn( 'Pager >> "container" not found' ); } p.$container.find( ctrls.join( ',' ) ) .attr( 'tabindex', 0 ) @@ -373,8 +374,8 @@ tsp.moveToPage( c, p, true ); tsp.updatePageDisplay( c, false ); }); - } else if ( c.debug ) { - console.warn( 'Pager: >> Goto selector not found' ); + } else if ( debug ) { + console.warn( 'Pager >> "goto" selector not found' ); } tmp = p.$container.find( wo.pager_selectors.pageSize ); @@ -394,8 +395,8 @@ } return false; }); - } else if ( c.debug ) { - console.warn('Pager: >> Size selector not found'); + } else if ( debug ) { + console.warn('Pager >> "size" selector not found'); } }, @@ -532,8 +533,8 @@ tsp.pagerArrows( c ); tsp.fixHeight( c ); if ( p.initialized && completed !== false ) { - if ( c.debug ) { - console.log( 'Pager: Triggering pagerComplete' ); + if ( ts.debug(c, 'pager') ) { + console.log( 'Pager >> Triggering pagerComplete' ); } c.$table.triggerHandler( 'pagerComplete', c ); // save pager info to storage @@ -655,7 +656,6 @@ hideRows: function( c ) { if ( !c.widgetOptions.pager_ajaxUrl ) { var tbodyIndex, rowIndex, $rows, len, lastIndex, - table = c.table, p = c.pager, wo = c.widgetOptions, tbodyLen = c.$tbodies.length, @@ -721,7 +721,8 @@ renderAjax: function( data, c, xhr, settings, exception ) { var table = c.table, p = c.pager, - wo = c.widgetOptions; + wo = c.widgetOptions, + debug = ts.debug(c, 'pager'); // process data if ( $.isFunction( wo.pager_ajaxProcessing ) ) { @@ -734,15 +735,14 @@ 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, [] ], - hl = $table.find( 'thead th' ).length; + result = wo.pager_ajaxProcessing( data, table, xhr ) || [ 0, [] ]; // Clean up any previous error. ts.showError( table ); if ( exception ) { - if ( c.debug ) { - console.error( 'Pager: >> Ajax Error', xhr, settings, exception ); + if ( debug ) { + console.error( 'Pager >> Ajax Error', xhr, settings, exception ); } ts.showError( table, xhr, settings, exception ); c.$tbodies.eq( 0 ).children( 'tr' ).detach(); @@ -846,8 +846,8 @@ // apply widgets after table has rendered & after a delay to prevent // multiple applyWidget blocking code from blocking this trigger setTimeout( function() { - if ( c.debug ) { - console.log( 'Pager: Triggering pagerChange' ); + if ( debug ) { + console.log( 'Pager >> Triggering pagerChange' ); } $table.triggerHandler( 'pagerChange', p ); ts.applyWidget( table ); @@ -889,8 +889,8 @@ p.oldAjaxSuccess( data ); } }; - if ( c.debug ) { - console.log( 'Pager: Ajax initialized', p.ajaxObject ); + if ( ts.debug(c, 'pager') ) { + console.log( 'Pager >> Ajax initialized', p.ajaxObject ); } $.ajax( p.ajaxObject ); } @@ -935,8 +935,8 @@ if ( $.isFunction( wo.pager_customAjaxUrl ) ) { url = wo.pager_customAjaxUrl( c.table, url ); } - if ( c.debug ) { - console.log( 'Pager: Ajax url = ' + url ); + if ( ts.debug(c, 'pager') ) { + console.log( 'Pager >> Ajax url = ' + url ); } return url; }, @@ -946,13 +946,14 @@ 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 ( c.debug ) { - console.warn( 'Pager: >> No rows for pager to render' ); + if ( debug ) { + console.warn( 'Pager >> No rows for pager to render' ); } // empty table, abort! return; @@ -964,8 +965,8 @@ p.cacheIndex = []; p.isDisabled = false; // needed because sorting will change the page and re-enable the pager if ( p.initialized ) { - if ( c.debug ) { - console.log( 'Pager: Triggering pagerChange' ); + if ( debug ) { + console.log( 'Pager >> Triggering pagerChange' ); } c.$table.triggerHandler( 'pagerChange', c ); } @@ -997,8 +998,8 @@ wo.pager_startPage = p.page; wo.pager_size = p.size; if ( table.isUpdating ) { - if ( c.debug ) { - console.log( 'Pager: Triggering updateComplete' ); + if ( debug ) { + console.log( 'Pager >> Triggering updateComplete' ); } c.$table.triggerHandler( 'updateComplete', [ table, true ] ); } @@ -1026,8 +1027,8 @@ tsp.renderTable( c, c.rowsCopy ); p.isDisabled = true; ts.applyWidget( table ); - if ( c.debug ) { - console.log( 'Pager: Disabled' ); + if ( ts.debug(c, 'pager') ) { + console.log( 'Pager >> Disabled' ); } } // disable size selector @@ -1074,14 +1075,14 @@ var tmp, table = c.table, wo = c.widgetOptions, - l = p.last; + 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; @@ -1096,8 +1097,8 @@ l.sortList === ( c.sortList || [] ).join( ',' ) ) { return; } - if ( c.debug ) { - console.log( 'Pager: Changing to page ' + p.page ); + if ( debug ) { + console.log( 'Pager >> Changing to page ' + p.page ); } p.last = { page: p.page, @@ -1114,9 +1115,9 @@ wo.pager_processAjaxOnInit = true; tmp = wo.pager_initialRows; p.totalRows = typeof tmp.total !== 'undefined' ? tmp.total : - ( c.debug ? console.error('Pager: no initial total page set!') || 0 : 0 ); + ( debug ? console.error('Pager >> No initial total page set!') || 0 : 0 ); p.filteredRows = typeof tmp.filtered !== 'undefined' ? tmp.filtered : - ( c.debug ? console.error('Pager: no initial filtered page set!') || 0 : 0 ); + ( debug ? console.error('Pager >> No initial filtered page set!') || 0 : 0 ); tsp.updatePageDisplay( c, false ); } else { tsp.getAjax( c ); @@ -1126,14 +1127,14 @@ } $.data( table, 'pagerLastPage', p.page ); if ( p.initialized && pageMoved !== false ) { - if ( c.debug ) { - console.log( 'Pager: Triggering pageMoved' ); + if ( debug ) { + console.log( 'Pager >> Triggering pageMoved' ); } c.$table.triggerHandler( 'pageMoved', c ); ts.applyWidget( table ); if ( !p.ajax && table.isUpdating ) { - if ( c.debug ) { - console.log( 'Pager: Triggering updateComplete' ); + if ( debug ) { + console.log( 'Pager >> Triggering updateComplete' ); } c.$table.triggerHandler( 'updateComplete', [ table, true ] ); } @@ -1269,8 +1270,8 @@ tsp.setPageSize( c, p.size ); tsp.moveToPage( c, p, true ); tsp.hideRowsSetup( c ); - if ( c.debug ) { - console.log( 'Pager: Enabled' ); + if ( ts.debug(c, 'pager') ) { + console.log( 'Pager >> Enabled' ); } } }, @@ -1296,8 +1297,7 @@ // see #486 ts.showError = function( table, xhr, settings, exception ) { - var $row, - $table = $( table ), + var $table = $( table ), c = $table[ 0 ].config, wo = c && c.widgetOptions, errorRow = c.pager && c.pager.cssErrorRow || diff --git a/js/widgets/widget-saveSort.js b/js/widgets/widget-saveSort.js index 1278345e..0762e4ba 100644 --- a/js/widgets/widget-saveSort.js +++ b/js/widgets/widget-saveSort.js @@ -1,4 +1,4 @@ -/*! Widget: saveSort - updated 10/31/2015 (v2.24.0) *//* +/*! Widget: saveSort - updated 2018-03-17 (v2.30.0) *//* * Requires tablesorter v2.16+ * by Rob Garrison */ @@ -6,6 +6,15 @@ 'use strict'; var ts = $.tablesorter || {}; + function getStoredSortList(c) { + var stored = ts.storage( c.table, 'tablesorter-savesort' ); + return (stored && stored.hasOwnProperty('sortList') && $.isArray(stored.sortList)) ? stored.sortList : ''; + } + + function sortListChanged(c, sortList) { + return (sortList || getStoredSortList(c)).join(',') !== c.sortList.join(','); + } + // this widget saves the last sort only if the // saveSort widget option is true AND the // $.tablesorter.storage function is included @@ -21,18 +30,19 @@ thisWidget.format(table, c, wo, true); }, format: function(table, c, wo, init) { - var stored, time, + var time, $table = c.$table, saveSort = wo.saveSort !== false, // make saveSort active/inactive; default to true - sortList = { 'sortList' : c.sortList }; - if (c.debug) { + sortList = { 'sortList' : c.sortList }, + debug = ts.debug(c, 'saveSort'); + if (debug) { time = new Date(); } if ($table.hasClass('hasSaveSort')) { - if (saveSort && table.hasInitialized && ts.storage) { + if (saveSort && table.hasInitialized && ts.storage && sortListChanged(c)) { ts.storage( table, 'tablesorter-savesort', sortList ); - if (c.debug) { - console.log('saveSort widget: Saving last sort: ' + c.sortList + ts.benchmark(time)); + if (debug) { + console.log('saveSort >> Saving last sort: ' + c.sortList + ts.benchmark(time)); } } } else { @@ -41,10 +51,9 @@ sortList = ''; // get data if (ts.storage) { - stored = ts.storage( table, 'tablesorter-savesort' ); - sortList = (stored && stored.hasOwnProperty('sortList') && $.isArray(stored.sortList)) ? stored.sortList : ''; - if (c.debug) { - console.log('saveSort: Last sort loaded: "' + sortList + '"' + ts.benchmark(time)); + sortList = getStoredSortList(c); + if (debug) { + console.log('saveSort >> Last sort loaded: "' + sortList + '"' + ts.benchmark(time)); } $table.bind('saveSortReset', function(event) { event.stopPropagation(); @@ -57,7 +66,9 @@ c.sortList = sortList; } else if (table.hasInitialized && sortList && sortList.length > 0) { // update sort change - ts.sortOn( c, sortList ); + if (sortListChanged(c, sortList)) { + ts.sortOn(c, sortList); + } } } }, diff --git a/js/widgets/widget-storage.js b/js/widgets/widget-storage.js index 93485ac5..0d7ce297 100644 --- a/js/widgets/widget-storage.js +++ b/js/widgets/widget-storage.js @@ -1,4 +1,4 @@ -/*! Widget: storage - updated 4/18/2017 (v2.28.8) */ +/*! Widget: storage - updated 2018-03-17 (v2.30.0) */ /*global JSON:false */ ;(function ($, window, document) { 'use strict'; @@ -44,6 +44,7 @@ values = {}, c = table.config, wo = c && c.widgetOptions, + debug = ts.debug(c, 'storage'), storageType = ( ( options && options.storageType ) || ( wo && wo.storage_storageType ) ).toString().charAt(0).toLowerCase(), @@ -72,14 +73,12 @@ hasStorage = true; window[storageType].removeItem('_tmptest'); } catch (error) { - if (c && c.debug) { - console.warn( storageType + ' is not supported in this browser' ); - } + console.warn( storageType + ' is not supported in this browser' ); } } } - if (c.debug) { - console.log('Storage widget using', hasStorage ? storageType : 'cookies'); + if (debug) { + console.log('Storage >> Using', hasStorage ? storageType : 'cookies'); } // *** get value *** if ($.parseJSON) { diff --git a/js/widgets/widget-uitheme.js b/js/widgets/widget-uitheme.js index 9c16901c..67a7ab26 100644 --- a/js/widgets/widget-uitheme.js +++ b/js/widgets/widget-uitheme.js @@ -1,4 +1,4 @@ -/*! Widget: uitheme - updated 9/27/2017 (v2.29.0) */ +/*! Widget: uitheme - updated 2018-03-17 (v2.30.0) */ ;(function ($) { 'use strict'; var ts = $.tablesorter || {}; @@ -63,8 +63,9 @@ theme = c.theme || 'jui', themes = themesAll[theme] || {}, remove = $.trim( [ themes.sortNone, themes.sortDesc, themes.sortAsc, themes.active ].join( ' ' ) ), - iconRmv = $.trim( [ themes.iconSortNone, themes.iconSortDesc, themes.iconSortAsc ].join( ' ' ) ); - if (c.debug) { time = new Date(); } + iconRmv = $.trim( [ themes.iconSortNone, themes.iconSortDesc, themes.iconSortAsc ].join( ' ' ) ), + debug = ts.debug(c, 'uitheme'); + if (debug) { time = new Date(); } // initialization code - run once if (!$table.hasClass('tablesorter-' + theme) || c.theme !== c.appliedTheme || !wo.uitheme_applied) { wo.uitheme_applied = true; @@ -109,7 +110,7 @@ $(this)[ event.type === 'mouseenter' ? 'addClass' : 'removeClass' ](themes.hover || ''); }); - $headers.each(function(){ + $headers.each(function() { var $this = $(this); if (!$this.find('.' + ts.css.wrapper).length) { // Firefox needs this inner div to position the icon & resizer correctly @@ -167,8 +168,8 @@ } } } - if (c.debug) { - console.log('Applying ' + theme + ' theme' + ts.benchmark(time)); + if (debug) { + console.log('uitheme >> Applied ' + theme + ' theme' + ts.benchmark(time)); } }, remove: function(table, c, wo, refreshing) {
' + jqXHR.status + ' ' + textStatus + '