version bump

This commit is contained in:
Rob Garrison 2016-01-10 22:22:16 -06:00
parent 06b190a520
commit a0181a4337
16 changed files with 151 additions and 150 deletions

View File

@ -92,6 +92,31 @@ If you would like to contribute, please...
View the [complete change log here](//github.com/Mottie/tablesorter/wiki/Changes). View the [complete change log here](//github.com/Mottie/tablesorter/wiki/Changes).
#### <a name="v2.25.1">Version 2.25.1</a> (1/10/2016)
* Docs:
* Update to jQuery v1.12.0.
* Fix HTML hint issues.
* Core:
* Fix time parser detection. See [issue #1107](https://github.com/Mottie/tablesorter/issues/1107).
* Add multiple widgets from table class. Fixes [issue #1109](https://github.com/Mottie/tablesorter/issues/1109).
* Fix extra header class name updating. See [issue #1116](https://github.com/Mottie/tablesorter/issues/1116).
* Fix typo in comments.
* ColumnSelector:
* Prevent remove widget js error. Fixes [issue #1106](https://github.com/Mottie/tablesorter/issues/1106).
* Add `tbody` colspan support. See [issue #1120](https://github.com/Mottie/tablesorter/issues/1120).
* Add child row colspan support. See [issue #1120](https://github.com/Mottie/tablesorter/issues/1120).
* Filter:
* Use replacement character instead of null (for IE).
* Fix "or" test regex. Fixes [issue #1117](https://github.com/Mottie/tablesorter/issues/1117).
* Restore `return false` to fix unit tests.
* Functions now get exact data, ignoring parsed flag. Fixes [issue #1107](https://github.com/Mottie/tablesorter/issues/1107).
* Parsed flag now all set `true` if `filter_useParsedData` is `true` &amp; stop using `config.$headers`.
* Output:
* `output_callback` can now return modified data. See [issue #1121](https://github.com/Mottie/tablesorter/issues/1121).
* Grunt:
* Add HTML hint.
#### <a name="v2.25.0">Version 2.25.0</a> (12/13/2015) #### <a name="v2.25.0">Version 2.25.0</a> (12/13/2015)
* Global * Global
@ -175,7 +200,3 @@ View the [complete change log here](//github.com/Mottie/tablesorter/wiki/Changes
* Don't use `$.extend` for simple additions. * Don't use `$.extend` for simple additions.
* Misc * Misc
* Update grunt dependencies. * Update grunt dependencies.
#### <a name="v2.24.5">Version 2.24.5</a> (11/10/2015)
* Pager: Fix javascript error in pager addon when using ajax.

View File

@ -1,4 +1,4 @@
/*! tablesorter (FORK) - updated 12-13-2015 (v2.25.0)*/ /*! tablesorter (FORK) - updated 01-10-2016 (v2.25.1)*/
/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */ /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
(function(factory) { (function(factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
@ -10,7 +10,7 @@
} }
}(function($) { }(function($) {
/*! TableSorter (FORK) v2.25.0 *//* /*! TableSorter (FORK) v2.25.1 *//*
* Client-side table sorting with ease! * Client-side table sorting with ease!
* @requires jQuery v1.2.6+ * @requires jQuery v1.2.6+
* *
@ -33,7 +33,7 @@
'use strict'; 'use strict';
var ts = $.tablesorter = { var ts = $.tablesorter = {
version : '2.25.0', version : '2.25.1',
parsers : [], parsers : [],
widgets : [], widgets : [],
@ -1058,8 +1058,8 @@
// find the footer // find the footer
$headers = c.$table $headers = c.$table
.find( 'tfoot tr' ) .find( 'tfoot tr' )
.children() .add( $( c.namespace + '_extra_headers' ).children( 'tr' ) )
.add( $( c.namespace + '_extra_headers' ) ) .children( 'td, th' )
.removeClass( css.join( ' ' ) ); .removeClass( css.join( ' ' ) );
// remove all header information // remove all header information
c.$headers c.$headers
@ -1892,15 +1892,19 @@
var len, indx, var len, indx,
c = table.config, c = table.config,
// look for widgets to apply from table class // look for widgets to apply from table class
// stop using \b otherwise this matches 'ui-widget-content' & adds 'content' widget // don't match from 'ui-widget-content'; use \S instead of \w to include widgets
regex = '\\s' + c.widgetClass.replace( ts.regex.templateName, '([\\w-]+)' ) + '\\s', // with dashes in the name, e.g. "widget-test-2" extracts out "test-2"
regex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\S+)+' ) + '$',
widgetClass = new RegExp( regex, 'g' ), widgetClass = new RegExp( regex, 'g' ),
// extract out the widget id from the table class (widget id's can include dashes) // split up table class (widget id's can include dashes) - stop using match
widget = ( ' ' + c.table.className + ' ' ).match( widgetClass ); // otherwise only one widget gets extracted, see #1109
if ( widget ) { widgets = ( table.className || '' ).split( ts.regex.spaces );
len = widget.length; if ( widgets.length ) {
len = widgets.length;
for ( indx = 0; indx < len; indx++ ) { for ( indx = 0; indx < len; indx++ ) {
c.widgets.push( widget[ indx ].replace( widgetClass, '$1' ) ); if ( widgets[ indx ].match( widgetClass ) ) {
c.widgets.push( widgets[ indx ].replace( widgetClass, '$1' ) );
}
} }
} }
}, },
@ -2636,7 +2640,7 @@
}); });
// match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk // match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk
ts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)$/i; ts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)$|^((?:[01]\d|[2][0-4]):[0-5]\d)$/i;
ts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i; ts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i;
ts.addParser({ ts.addParser({
id : 'time', id : 'time',
@ -3076,7 +3080,7 @@
})(jQuery); })(jQuery);
/*! Widget: filter - updated 12/13/2015 (v2.25.0) *//* /*! Widget: filter - updated 1/10/2016 (v2.25.1) *//*
* Requires tablesorter v2.8+ and jQuery 1.7+ * Requires tablesorter v2.8+ and jQuery 1.7+
* by Rob Garrison * by Rob Garrison
*/ */
@ -3445,7 +3449,7 @@
toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ), toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ),
andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ), andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ),
andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ), andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ),
orTest : /\|/, orTest : new RegExp( '(\\||\\s+' + ts.language.or + '\\s+)', 'i' ),
orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ), orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ),
iQuery : new RegExp( val, 'i' ), iQuery : new RegExp( val, 'i' ),
igQuery : new RegExp( val, 'ig' ), igQuery : new RegExp( val, 'ig' ),
@ -3920,7 +3924,7 @@
filters = Array.prototype.map ? filters = Array.prototype.map ?
filters.map( String ) : filters.map( String ) :
// for IE8 & older browsers - maybe not the best method // for IE8 & older browsers - maybe not the best method
filters.join( '\u0000' ).split( '\u0000' ); filters.join( '\ufffd' ).split( '\ufffd' );
if ( wo.filter_initialized ) { if ( wo.filter_initialized ) {
c.$table.triggerHandler( 'filterStart', [ filters ] ); c.$table.triggerHandler( 'filterStart', [ filters ] );
@ -4126,7 +4130,6 @@
vars.excludeMatch = vars.noAnyMatch; vars.excludeMatch = vars.noAnyMatch;
filterMatched = tsf.processTypes( c, data, vars ); filterMatched = tsf.processTypes( c, data, vars );
if ( filterMatched !== null ) { if ( filterMatched !== null ) {
showRow = filterMatched; showRow = filterMatched;
} else { } else {
@ -4159,13 +4162,8 @@
// ignore if filter is empty or disabled // ignore if filter is empty or disabled
if ( data.filter ) { if ( data.filter ) {
data.cache = data.cacheArray[ columnIndex ]; data.cache = data.cacheArray[ columnIndex ];
// check if column data should be from the cell or from parsed data result = data.rawArray[ columnIndex ] || '';
if ( wo.filter_useParsedData || data.parsed[ columnIndex ] ) { data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
data.exact = data.cache;
} else {
result = data.rawArray[ columnIndex ] || '';
data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
}
data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ? data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?
data.exact.toLowerCase() : data.exact; data.exact.toLowerCase() : data.exact;
@ -4220,8 +4218,7 @@
result = filterMatched; result = filterMatched;
// Look for match, and add child row data for matching // Look for match, and add child row data for matching
} else { } else {
txt = ( data.iExact + data.childRowText ) txt = ( data.iExact + data.childRowText ).indexOf( tsf.parseFilter( c, data.iFilter, data ) );
.indexOf( tsf.parseFilter( c, data.iFilter, data ) );
result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) ); result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) );
} }
} else { } else {
@ -4261,18 +4258,17 @@
}; };
// parse columns after formatter, in case the class is added at that point // parse columns after formatter, in case the class is added at that point
data.parsed = c.$headers.map( function( columnIndex ) { data.parsed = [];
return c.parsers && c.parsers[ columnIndex ] && for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
// force parsing if parser type is numeric data.parsed[ columnIndex ] = wo.filter_useParsedData ||
c.parsers[ columnIndex ].parsed || // parser has a "parsed" parameter
// getData won't return 'parsed' if other 'filter-' class names exist ( c.parsers && c.parsers[ columnIndex ] && c.parsers[ columnIndex ].parsed ||
// getData may not return 'parsed' if other 'filter-' class names exist
// ( e.g. <th class="filter-select filter-parsed"> ) // ( e.g. <th class="filter-select filter-parsed"> )
ts.getData && ts.getData( c.$headerIndexed[ columnIndex ], ts.getData && ts.getData( c.$headerIndexed[ columnIndex ],
ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' || ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' ||
$( this ).hasClass( 'filter-parsed' ); c.$headerIndexed[ columnIndex ].hasClass( 'filter-parsed' ) );
}).get();
for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
vars.functions[ columnIndex ] = vars.functions[ columnIndex ] =
ts.getColumnData( table, wo.filter_functions, columnIndex ); ts.getColumnData( table, wo.filter_functions, columnIndex );
vars.defaultColFilter[ columnIndex ] = vars.defaultColFilter[ columnIndex ] =
@ -4430,7 +4426,7 @@
// don't pass reference to val // don't pass reference to val
val = showParent ? true : false; val = showParent ? true : false;
childRow = rowData.$row.filter( ':gt( 0 )' ); childRow = rowData.$row.filter( ':gt(0)' );
if ( wo.filter_childRows && childRow.length ) { if ( wo.filter_childRows && childRow.length ) {
if ( wo.filter_childByColumn ) { if ( wo.filter_childByColumn ) {
if ( !wo.filter_childWithSibs ) { if ( !wo.filter_childWithSibs ) {

File diff suppressed because one or more lines are too long

View File

@ -8,7 +8,7 @@
} }
}(function($) { }(function($) {
/*! TableSorter (FORK) v2.25.0 *//* /*! TableSorter (FORK) v2.25.1 *//*
* Client-side table sorting with ease! * Client-side table sorting with ease!
* @requires jQuery v1.2.6+ * @requires jQuery v1.2.6+
* *
@ -31,7 +31,7 @@
'use strict'; 'use strict';
var ts = $.tablesorter = { var ts = $.tablesorter = {
version : '2.25.0', version : '2.25.1',
parsers : [], parsers : [],
widgets : [], widgets : [],
@ -1056,8 +1056,8 @@
// find the footer // find the footer
$headers = c.$table $headers = c.$table
.find( 'tfoot tr' ) .find( 'tfoot tr' )
.children() .add( $( c.namespace + '_extra_headers' ).children( 'tr' ) )
.add( $( c.namespace + '_extra_headers' ) ) .children( 'td, th' )
.removeClass( css.join( ' ' ) ); .removeClass( css.join( ' ' ) );
// remove all header information // remove all header information
c.$headers c.$headers
@ -1890,15 +1890,19 @@
var len, indx, var len, indx,
c = table.config, c = table.config,
// look for widgets to apply from table class // look for widgets to apply from table class
// stop using \b otherwise this matches 'ui-widget-content' & adds 'content' widget // don't match from 'ui-widget-content'; use \S instead of \w to include widgets
regex = '\\s' + c.widgetClass.replace( ts.regex.templateName, '([\\w-]+)' ) + '\\s', // with dashes in the name, e.g. "widget-test-2" extracts out "test-2"
regex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\S+)+' ) + '$',
widgetClass = new RegExp( regex, 'g' ), widgetClass = new RegExp( regex, 'g' ),
// extract out the widget id from the table class (widget id's can include dashes) // split up table class (widget id's can include dashes) - stop using match
widget = ( ' ' + c.table.className + ' ' ).match( widgetClass ); // otherwise only one widget gets extracted, see #1109
if ( widget ) { widgets = ( table.className || '' ).split( ts.regex.spaces );
len = widget.length; if ( widgets.length ) {
len = widgets.length;
for ( indx = 0; indx < len; indx++ ) { for ( indx = 0; indx < len; indx++ ) {
c.widgets.push( widget[ indx ].replace( widgetClass, '$1' ) ); if ( widgets[ indx ].match( widgetClass ) ) {
c.widgets.push( widgets[ indx ].replace( widgetClass, '$1' ) );
}
} }
} }
}, },
@ -2634,7 +2638,7 @@
}); });
// match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk // match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk
ts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)$/i; ts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)$|^((?:[01]\d|[2][0-4]):[0-5]\d)$/i;
ts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i; ts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i;
ts.addParser({ ts.addParser({
id : 'time', id : 'time',

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
/*! tablesorter (FORK) - updated 12-13-2015 (v2.25.0)*/ /*! tablesorter (FORK) - updated 01-10-2016 (v2.25.1)*/
/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */ /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
(function(factory) { (function(factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
@ -366,7 +366,7 @@
})(jQuery); })(jQuery);
/*! Widget: filter - updated 12/13/2015 (v2.25.0) *//* /*! Widget: filter - updated 1/10/2016 (v2.25.1) *//*
* Requires tablesorter v2.8+ and jQuery 1.7+ * Requires tablesorter v2.8+ and jQuery 1.7+
* by Rob Garrison * by Rob Garrison
*/ */
@ -735,7 +735,7 @@
toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ), toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ),
andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ), andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ),
andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ), andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ),
orTest : /\|/, orTest : new RegExp( '(\\||\\s+' + ts.language.or + '\\s+)', 'i' ),
orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ), orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ),
iQuery : new RegExp( val, 'i' ), iQuery : new RegExp( val, 'i' ),
igQuery : new RegExp( val, 'ig' ), igQuery : new RegExp( val, 'ig' ),
@ -1210,7 +1210,7 @@
filters = Array.prototype.map ? filters = Array.prototype.map ?
filters.map( String ) : filters.map( String ) :
// for IE8 & older browsers - maybe not the best method // for IE8 & older browsers - maybe not the best method
filters.join( '\u0000' ).split( '\u0000' ); filters.join( '\ufffd' ).split( '\ufffd' );
if ( wo.filter_initialized ) { if ( wo.filter_initialized ) {
c.$table.triggerHandler( 'filterStart', [ filters ] ); c.$table.triggerHandler( 'filterStart', [ filters ] );
@ -1416,7 +1416,6 @@
vars.excludeMatch = vars.noAnyMatch; vars.excludeMatch = vars.noAnyMatch;
filterMatched = tsf.processTypes( c, data, vars ); filterMatched = tsf.processTypes( c, data, vars );
if ( filterMatched !== null ) { if ( filterMatched !== null ) {
showRow = filterMatched; showRow = filterMatched;
} else { } else {
@ -1449,13 +1448,8 @@
// ignore if filter is empty or disabled // ignore if filter is empty or disabled
if ( data.filter ) { if ( data.filter ) {
data.cache = data.cacheArray[ columnIndex ]; data.cache = data.cacheArray[ columnIndex ];
// check if column data should be from the cell or from parsed data result = data.rawArray[ columnIndex ] || '';
if ( wo.filter_useParsedData || data.parsed[ columnIndex ] ) { data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
data.exact = data.cache;
} else {
result = data.rawArray[ columnIndex ] || '';
data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
}
data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ? data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?
data.exact.toLowerCase() : data.exact; data.exact.toLowerCase() : data.exact;
@ -1510,8 +1504,7 @@
result = filterMatched; result = filterMatched;
// Look for match, and add child row data for matching // Look for match, and add child row data for matching
} else { } else {
txt = ( data.iExact + data.childRowText ) txt = ( data.iExact + data.childRowText ).indexOf( tsf.parseFilter( c, data.iFilter, data ) );
.indexOf( tsf.parseFilter( c, data.iFilter, data ) );
result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) ); result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) );
} }
} else { } else {
@ -1551,18 +1544,17 @@
}; };
// parse columns after formatter, in case the class is added at that point // parse columns after formatter, in case the class is added at that point
data.parsed = c.$headers.map( function( columnIndex ) { data.parsed = [];
return c.parsers && c.parsers[ columnIndex ] && for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
// force parsing if parser type is numeric data.parsed[ columnIndex ] = wo.filter_useParsedData ||
c.parsers[ columnIndex ].parsed || // parser has a "parsed" parameter
// getData won't return 'parsed' if other 'filter-' class names exist ( c.parsers && c.parsers[ columnIndex ] && c.parsers[ columnIndex ].parsed ||
// getData may not return 'parsed' if other 'filter-' class names exist
// ( e.g. <th class="filter-select filter-parsed"> ) // ( e.g. <th class="filter-select filter-parsed"> )
ts.getData && ts.getData( c.$headerIndexed[ columnIndex ], ts.getData && ts.getData( c.$headerIndexed[ columnIndex ],
ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' || ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' ||
$( this ).hasClass( 'filter-parsed' ); c.$headerIndexed[ columnIndex ].hasClass( 'filter-parsed' ) );
}).get();
for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
vars.functions[ columnIndex ] = vars.functions[ columnIndex ] =
ts.getColumnData( table, wo.filter_functions, columnIndex ); ts.getColumnData( table, wo.filter_functions, columnIndex );
vars.defaultColFilter[ columnIndex ] = vars.defaultColFilter[ columnIndex ] =
@ -1720,7 +1712,7 @@
// don't pass reference to val // don't pass reference to val
val = showParent ? true : false; val = showParent ? true : false;
childRow = rowData.$row.filter( ':gt( 0 )' ); childRow = rowData.$row.filter( ':gt(0)' );
if ( wo.filter_childRows && childRow.length ) { if ( wo.filter_childRows && childRow.length ) {
if ( wo.filter_childByColumn ) { if ( wo.filter_childByColumn ) {
if ( !wo.filter_childWithSibs ) { if ( !wo.filter_childWithSibs ) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -455,7 +455,7 @@
<li><span class="label label-info">Beta</span> <a href="example-widget-chart.html">Chart Widget</a> (<span class="version">v2.19.0</span>; <span class="version updated">v2.24.0</span>).</li> <li><span class="label label-info">Beta</span> <a href="example-widget-chart.html">Chart Widget</a> (<span class="version">v2.19.0</span>; <span class="version updated">v2.24.0</span>).</li>
<li><span class="results">&dagger;</span> <a href="example-widget-columns.html">Columns highlight widget</a> (v2.0.17).</li> <li><span class="results">&dagger;</span> <a href="example-widget-columns.html">Columns highlight widget</a> (v2.0.17).</li>
<li><a href="example-widget-column-selector.html">Column selector widget</a> (<span class="version">v2.15</span>; <span class="version updated">v2.24.0</span>).</li> <li><a href="example-widget-column-selector.html">Column selector widget</a> (<span class="version">v2.15</span>; <span class="version updated">v2.25.1</span>).</li>
<li><a href="example-widget-editable.html">Content editable widget</a> (v2.9; <span class="version updated">v2.25.0</span>).</li> <li><a href="example-widget-editable.html">Content editable widget</a> (v2.9; <span class="version updated">v2.25.0</span>).</li>
<li><span class="label label-info">Beta</span> <a href="example-dragtable.html">Dragtable mod</a> - (jQuery UI widget for column reordering [<a href="http://stackoverflow.com/a/27770224/145346">ref</a>]; <span class="version">v2.24.0</span>).</li> <li><span class="label label-info">Beta</span> <a href="example-dragtable.html">Dragtable mod</a> - (jQuery UI widget for column reordering [<a href="http://stackoverflow.com/a/27770224/145346">ref</a>]; <span class="version">v2.24.0</span>).</li>
<li><span class="results">&dagger;</span> Filter widget (<span class="version updated">v2.25.1</span>): <li><span class="results">&dagger;</span> Filter widget (<span class="version updated">v2.25.1</span>):

View File

@ -4,7 +4,7 @@
*/ */
/*! tablesorter (FORK) - updated 12-13-2015 (v2.25.0)*/ /*! tablesorter (FORK) - updated 01-10-2016 (v2.25.1)*/
/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */ /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
(function(factory) { (function(factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
@ -16,7 +16,7 @@
} }
}(function($) { }(function($) {
/*! TableSorter (FORK) v2.25.0 *//* /*! TableSorter (FORK) v2.25.1 *//*
* Client-side table sorting with ease! * Client-side table sorting with ease!
* @requires jQuery v1.2.6+ * @requires jQuery v1.2.6+
* *
@ -39,7 +39,7 @@
'use strict'; 'use strict';
var ts = $.tablesorter = { var ts = $.tablesorter = {
version : '2.25.0', version : '2.25.1',
parsers : [], parsers : [],
widgets : [], widgets : [],
@ -1064,8 +1064,8 @@
// find the footer // find the footer
$headers = c.$table $headers = c.$table
.find( 'tfoot tr' ) .find( 'tfoot tr' )
.children() .add( $( c.namespace + '_extra_headers' ).children( 'tr' ) )
.add( $( c.namespace + '_extra_headers' ) ) .children( 'td, th' )
.removeClass( css.join( ' ' ) ); .removeClass( css.join( ' ' ) );
// remove all header information // remove all header information
c.$headers c.$headers
@ -1898,15 +1898,19 @@
var len, indx, var len, indx,
c = table.config, c = table.config,
// look for widgets to apply from table class // look for widgets to apply from table class
// stop using \b otherwise this matches 'ui-widget-content' & adds 'content' widget // don't match from 'ui-widget-content'; use \S instead of \w to include widgets
regex = '\\s' + c.widgetClass.replace( ts.regex.templateName, '([\\w-]+)' ) + '\\s', // with dashes in the name, e.g. "widget-test-2" extracts out "test-2"
regex = '^' + c.widgetClass.replace( ts.regex.templateName, '(\\S+)+' ) + '$',
widgetClass = new RegExp( regex, 'g' ), widgetClass = new RegExp( regex, 'g' ),
// extract out the widget id from the table class (widget id's can include dashes) // split up table class (widget id's can include dashes) - stop using match
widget = ( ' ' + c.table.className + ' ' ).match( widgetClass ); // otherwise only one widget gets extracted, see #1109
if ( widget ) { widgets = ( table.className || '' ).split( ts.regex.spaces );
len = widget.length; if ( widgets.length ) {
len = widgets.length;
for ( indx = 0; indx < len; indx++ ) { for ( indx = 0; indx < len; indx++ ) {
c.widgets.push( widget[ indx ].replace( widgetClass, '$1' ) ); if ( widgets[ indx ].match( widgetClass ) ) {
c.widgets.push( widgets[ indx ].replace( widgetClass, '$1' ) );
}
} }
} }
}, },
@ -2642,7 +2646,7 @@
}); });
// match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk // match 24 hour time & 12 hours time + am/pm - see http://regexr.com/3c3tk
ts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)$/i; ts.regex.timeTest = /^([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)$|^((?:[01]\d|[2][0-4]):[0-5]\d)$/i;
ts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i; ts.regex.timeMatch = /([1-9]|1[0-2]):([0-5]\d)(\s[AP]M)|((?:[01]\d|[2][0-4]):[0-5]\d)/i;
ts.addParser({ ts.addParser({
id : 'time', id : 'time',
@ -3082,7 +3086,7 @@
})(jQuery); })(jQuery);
/*! Widget: filter - updated 12/13/2015 (v2.25.0) *//* /*! Widget: filter - updated 1/10/2016 (v2.25.1) *//*
* Requires tablesorter v2.8+ and jQuery 1.7+ * Requires tablesorter v2.8+ and jQuery 1.7+
* by Rob Garrison * by Rob Garrison
*/ */
@ -3451,7 +3455,7 @@
toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ), toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ),
andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ), andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ),
andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ), andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ),
orTest : /\|/, orTest : new RegExp( '(\\||\\s+' + ts.language.or + '\\s+)', 'i' ),
orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ), orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ),
iQuery : new RegExp( val, 'i' ), iQuery : new RegExp( val, 'i' ),
igQuery : new RegExp( val, 'ig' ), igQuery : new RegExp( val, 'ig' ),
@ -3926,7 +3930,7 @@
filters = Array.prototype.map ? filters = Array.prototype.map ?
filters.map( String ) : filters.map( String ) :
// for IE8 & older browsers - maybe not the best method // for IE8 & older browsers - maybe not the best method
filters.join( '\u0000' ).split( '\u0000' ); filters.join( '\ufffd' ).split( '\ufffd' );
if ( wo.filter_initialized ) { if ( wo.filter_initialized ) {
c.$table.triggerHandler( 'filterStart', [ filters ] ); c.$table.triggerHandler( 'filterStart', [ filters ] );
@ -4132,7 +4136,6 @@
vars.excludeMatch = vars.noAnyMatch; vars.excludeMatch = vars.noAnyMatch;
filterMatched = tsf.processTypes( c, data, vars ); filterMatched = tsf.processTypes( c, data, vars );
if ( filterMatched !== null ) { if ( filterMatched !== null ) {
showRow = filterMatched; showRow = filterMatched;
} else { } else {
@ -4165,13 +4168,8 @@
// ignore if filter is empty or disabled // ignore if filter is empty or disabled
if ( data.filter ) { if ( data.filter ) {
data.cache = data.cacheArray[ columnIndex ]; data.cache = data.cacheArray[ columnIndex ];
// check if column data should be from the cell or from parsed data result = data.rawArray[ columnIndex ] || '';
if ( wo.filter_useParsedData || data.parsed[ columnIndex ] ) { data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
data.exact = data.cache;
} else {
result = data.rawArray[ columnIndex ] || '';
data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
}
data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ? data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?
data.exact.toLowerCase() : data.exact; data.exact.toLowerCase() : data.exact;
@ -4226,8 +4224,7 @@
result = filterMatched; result = filterMatched;
// Look for match, and add child row data for matching // Look for match, and add child row data for matching
} else { } else {
txt = ( data.iExact + data.childRowText ) txt = ( data.iExact + data.childRowText ).indexOf( tsf.parseFilter( c, data.iFilter, data ) );
.indexOf( tsf.parseFilter( c, data.iFilter, data ) );
result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) ); result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) );
} }
} else { } else {
@ -4267,18 +4264,17 @@
}; };
// parse columns after formatter, in case the class is added at that point // parse columns after formatter, in case the class is added at that point
data.parsed = c.$headers.map( function( columnIndex ) { data.parsed = [];
return c.parsers && c.parsers[ columnIndex ] && for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
// force parsing if parser type is numeric data.parsed[ columnIndex ] = wo.filter_useParsedData ||
c.parsers[ columnIndex ].parsed || // parser has a "parsed" parameter
// getData won't return 'parsed' if other 'filter-' class names exist ( c.parsers && c.parsers[ columnIndex ] && c.parsers[ columnIndex ].parsed ||
// getData may not return 'parsed' if other 'filter-' class names exist
// ( e.g. <th class="filter-select filter-parsed"> ) // ( e.g. <th class="filter-select filter-parsed"> )
ts.getData && ts.getData( c.$headerIndexed[ columnIndex ], ts.getData && ts.getData( c.$headerIndexed[ columnIndex ],
ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' || ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' ||
$( this ).hasClass( 'filter-parsed' ); c.$headerIndexed[ columnIndex ].hasClass( 'filter-parsed' ) );
}).get();
for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
vars.functions[ columnIndex ] = vars.functions[ columnIndex ] =
ts.getColumnData( table, wo.filter_functions, columnIndex ); ts.getColumnData( table, wo.filter_functions, columnIndex );
vars.defaultColFilter[ columnIndex ] = vars.defaultColFilter[ columnIndex ] =
@ -4436,7 +4432,7 @@
// don't pass reference to val // don't pass reference to val
val = showParent ? true : false; val = showParent ? true : false;
childRow = rowData.$row.filter( ':gt( 0 )' ); childRow = rowData.$row.filter( ':gt(0)' );
if ( wo.filter_childRows && childRow.length ) { if ( wo.filter_childRows && childRow.length ) {
if ( wo.filter_childByColumn ) { if ( wo.filter_childByColumn ) {
if ( !wo.filter_childWithSibs ) { if ( !wo.filter_childWithSibs ) {

View File

@ -1,4 +1,4 @@
/*! TableSorter (FORK) v2.25.0 *//* /*! TableSorter (FORK) v2.25.1 *//*
* Client-side table sorting with ease! * Client-side table sorting with ease!
* @requires jQuery v1.2.6+ * @requires jQuery v1.2.6+
* *
@ -21,7 +21,7 @@
'use strict'; 'use strict';
var ts = $.tablesorter = { var ts = $.tablesorter = {
version : '2.25.0', version : '2.25.1',
parsers : [], parsers : [],
widgets : [], widgets : [],

View File

@ -4,7 +4,7 @@
*/ */
/*! tablesorter (FORK) - updated 12-13-2015 (v2.25.0)*/ /*! tablesorter (FORK) - updated 01-10-2016 (v2.25.1)*/
/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */ /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
(function(factory) { (function(factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
@ -372,7 +372,7 @@
})(jQuery); })(jQuery);
/*! Widget: filter - updated 12/13/2015 (v2.25.0) *//* /*! Widget: filter - updated 1/10/2016 (v2.25.1) *//*
* Requires tablesorter v2.8+ and jQuery 1.7+ * Requires tablesorter v2.8+ and jQuery 1.7+
* by Rob Garrison * by Rob Garrison
*/ */
@ -741,7 +741,7 @@
toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ), toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)', 'gi' ),
andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ), andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ),
andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ), andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ),
orTest : /\|/, orTest : new RegExp( '(\\||\\s+' + ts.language.or + '\\s+)', 'i' ),
orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ), orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ),
iQuery : new RegExp( val, 'i' ), iQuery : new RegExp( val, 'i' ),
igQuery : new RegExp( val, 'ig' ), igQuery : new RegExp( val, 'ig' ),
@ -1216,7 +1216,7 @@
filters = Array.prototype.map ? filters = Array.prototype.map ?
filters.map( String ) : filters.map( String ) :
// for IE8 & older browsers - maybe not the best method // for IE8 & older browsers - maybe not the best method
filters.join( '\u0000' ).split( '\u0000' ); filters.join( '\ufffd' ).split( '\ufffd' );
if ( wo.filter_initialized ) { if ( wo.filter_initialized ) {
c.$table.triggerHandler( 'filterStart', [ filters ] ); c.$table.triggerHandler( 'filterStart', [ filters ] );
@ -1422,7 +1422,6 @@
vars.excludeMatch = vars.noAnyMatch; vars.excludeMatch = vars.noAnyMatch;
filterMatched = tsf.processTypes( c, data, vars ); filterMatched = tsf.processTypes( c, data, vars );
if ( filterMatched !== null ) { if ( filterMatched !== null ) {
showRow = filterMatched; showRow = filterMatched;
} else { } else {
@ -1455,13 +1454,8 @@
// ignore if filter is empty or disabled // ignore if filter is empty or disabled
if ( data.filter ) { if ( data.filter ) {
data.cache = data.cacheArray[ columnIndex ]; data.cache = data.cacheArray[ columnIndex ];
// check if column data should be from the cell or from parsed data result = data.rawArray[ columnIndex ] || '';
if ( wo.filter_useParsedData || data.parsed[ columnIndex ] ) { data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
data.exact = data.cache;
} else {
result = data.rawArray[ columnIndex ] || '';
data.exact = c.sortLocaleCompare ? ts.replaceAccents( result ) : result; // issue #405
}
data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ? data.iExact = !tsfRegex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?
data.exact.toLowerCase() : data.exact; data.exact.toLowerCase() : data.exact;
@ -1516,8 +1510,7 @@
result = filterMatched; result = filterMatched;
// Look for match, and add child row data for matching // Look for match, and add child row data for matching
} else { } else {
txt = ( data.iExact + data.childRowText ) txt = ( data.iExact + data.childRowText ).indexOf( tsf.parseFilter( c, data.iFilter, data ) );
.indexOf( tsf.parseFilter( c, data.iFilter, data ) );
result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) ); result = ( ( !wo.filter_startsWith && txt >= 0 ) || ( wo.filter_startsWith && txt === 0 ) );
} }
} else { } else {
@ -1557,18 +1550,17 @@
}; };
// parse columns after formatter, in case the class is added at that point // parse columns after formatter, in case the class is added at that point
data.parsed = c.$headers.map( function( columnIndex ) { data.parsed = [];
return c.parsers && c.parsers[ columnIndex ] && for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
// force parsing if parser type is numeric data.parsed[ columnIndex ] = wo.filter_useParsedData ||
c.parsers[ columnIndex ].parsed || // parser has a "parsed" parameter
// getData won't return 'parsed' if other 'filter-' class names exist ( c.parsers && c.parsers[ columnIndex ] && c.parsers[ columnIndex ].parsed ||
// getData may not return 'parsed' if other 'filter-' class names exist
// ( e.g. <th class="filter-select filter-parsed"> ) // ( e.g. <th class="filter-select filter-parsed"> )
ts.getData && ts.getData( c.$headerIndexed[ columnIndex ], ts.getData && ts.getData( c.$headerIndexed[ columnIndex ],
ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' || ts.getColumnData( table, c.headers, columnIndex ), 'filter' ) === 'parsed' ||
$( this ).hasClass( 'filter-parsed' ); c.$headerIndexed[ columnIndex ].hasClass( 'filter-parsed' ) );
}).get();
for ( columnIndex = 0; columnIndex < c.columns; columnIndex++ ) {
vars.functions[ columnIndex ] = vars.functions[ columnIndex ] =
ts.getColumnData( table, wo.filter_functions, columnIndex ); ts.getColumnData( table, wo.filter_functions, columnIndex );
vars.defaultColFilter[ columnIndex ] = vars.defaultColFilter[ columnIndex ] =
@ -1726,7 +1718,7 @@
// don't pass reference to val // don't pass reference to val
val = showParent ? true : false; val = showParent ? true : false;
childRow = rowData.$row.filter( ':gt( 0 )' ); childRow = rowData.$row.filter( ':gt(0)' );
if ( wo.filter_childRows && childRow.length ) { if ( wo.filter_childRows && childRow.length ) {
if ( wo.filter_childByColumn ) { if ( wo.filter_childByColumn ) {
if ( !wo.filter_childWithSibs ) { if ( !wo.filter_childWithSibs ) {

View File

@ -1,7 +1,7 @@
{ {
"name": "tablesorter", "name": "tablesorter",
"title": "tablesorter", "title": "tablesorter",
"version": "2.25.0", "version": "2.25.1",
"description": "tablesorter (FORK) is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. tablesorter can successfully parse and sort many types of data including linked data in a cell.", "description": "tablesorter (FORK) is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. tablesorter can successfully parse and sort many types of data including linked data in a cell.",
"author": { "author": {
"name": "Christian Bach", "name": "Christian Bach",

View File

@ -1,7 +1,7 @@
{ {
"name": "tablesorter", "name": "tablesorter",
"title": "tablesorter", "title": "tablesorter",
"version": "2.25.0", "version": "2.25.1",
"description": "tablesorter is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. tablesorter can successfully parse and sort many types of data including linked data in a cell.\n\nThis forked version adds lots of new enhancements including: alphanumeric sorting, pager callback functons, multiple widgets providing column styling, ui theme application, sticky headers, column filters and resizer, as well as extended documentation with a lot more demos.", "description": "tablesorter is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. tablesorter can successfully parse and sort many types of data including linked data in a cell.\n\nThis forked version adds lots of new enhancements including: alphanumeric sorting, pager callback functons, multiple widgets providing column styling, ui theme application, sticky headers, column filters and resizer, as well as extended documentation with a lot more demos.",
"author": { "author": {
"name": "Christian Bach", "name": "Christian Bach",