jquery-tablesorter 1.19.4 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/jquery-tablesorter/version.rb +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +10 -10
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +210 -108
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +151 -74
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +59 -34
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +62 -32
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +15 -12
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-type-insideRange.js +6 -5
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +53 -28
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +154 -76
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +9 -9
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-print.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sort2Hash.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-staticRow.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-view.js +2 -2
- metadata +2 -2
@@ -4,7 +4,7 @@
|
|
4
4
|
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀██
|
5
5
|
█████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
|
6
6
|
*/
|
7
|
-
/*! tablesorter (FORK) - updated
|
7
|
+
/*! tablesorter (FORK) - updated 12-13-2015 (v2.25.0)*/
|
8
8
|
/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
|
9
9
|
(function(factory) {
|
10
10
|
if (typeof define === 'function' && define.amd) {
|
@@ -372,7 +372,7 @@
|
|
372
372
|
|
373
373
|
})(jQuery);
|
374
374
|
|
375
|
-
/*! Widget: filter - updated
|
375
|
+
/*! Widget: filter - updated 12/13/2015 (v2.25.0) *//*
|
376
376
|
* Requires tablesorter v2.8+ and jQuery 1.7+
|
377
377
|
* by Rob Garrison
|
378
378
|
*/
|
@@ -582,7 +582,7 @@
|
|
582
582
|
table = c.table,
|
583
583
|
parsed = data.parsed[ data.index ],
|
584
584
|
query = ts.formatFloat( data.iFilter.replace( tsfRegex.operators, '' ), table ),
|
585
|
-
parser = c.parsers[ data.index ],
|
585
|
+
parser = c.parsers[ data.index ] || {},
|
586
586
|
savedSearch = query;
|
587
587
|
// parse filter value in case we're comparing numbers ( dates )
|
588
588
|
if ( parsed || parser.type === 'numeric' ) {
|
@@ -722,6 +722,7 @@
|
|
722
722
|
|
723
723
|
var options, string, txt, $header, column, filters, val, fxn, noSelect;
|
724
724
|
c.$table.addClass( 'hasFilters' );
|
725
|
+
c.lastSearch = [];
|
725
726
|
|
726
727
|
// define timers so using clearTimeout won't cause an undefined error
|
727
728
|
wo.filter_searchTimer = null;
|
@@ -804,7 +805,7 @@
|
|
804
805
|
if ( wo.filter_reset instanceof $ ) {
|
805
806
|
// reset contains a jQuery object, bind to it
|
806
807
|
wo.filter_reset.click( function() {
|
807
|
-
c.$table.
|
808
|
+
c.$table.triggerHandler( 'filterReset' );
|
808
809
|
});
|
809
810
|
} else if ( $( wo.filter_reset ).length ) {
|
810
811
|
// reset is a jQuery selector, use event delegation
|
@@ -812,7 +813,7 @@
|
|
812
813
|
.undelegate( wo.filter_reset, 'click' + c.namespace + 'filter' )
|
813
814
|
.delegate( wo.filter_reset, 'click' + c.namespace + 'filter', function() {
|
814
815
|
// trigger a reset event, so other functions ( filter_formatter ) know when to reset
|
815
|
-
c.$table.
|
816
|
+
c.$table.triggerHandler( 'filterReset' );
|
816
817
|
});
|
817
818
|
}
|
818
819
|
}
|
@@ -914,7 +915,7 @@
|
|
914
915
|
ts.setFilters( table, filters, true );
|
915
916
|
}
|
916
917
|
}
|
917
|
-
c.$table.
|
918
|
+
c.$table.triggerHandler( 'filterFomatterUpdate' );
|
918
919
|
// trigger init after setTimeout to prevent multiple filterStart/End/Init triggers
|
919
920
|
setTimeout( function() {
|
920
921
|
if ( !wo.filter_initialized ) {
|
@@ -924,7 +925,7 @@
|
|
924
925
|
});
|
925
926
|
// if filter widget is added after pager has initialized; then set filter init flag
|
926
927
|
if ( c.pager && c.pager.initialized && !wo.filter_initialized ) {
|
927
|
-
c.$table.
|
928
|
+
c.$table.triggerHandler( 'filterFomatterUpdate' );
|
928
929
|
setTimeout( function() {
|
929
930
|
tsf.filterInitComplete( c );
|
930
931
|
}, 100 );
|
@@ -947,7 +948,7 @@
|
|
947
948
|
count = 0,
|
948
949
|
completed = function() {
|
949
950
|
wo.filter_initialized = true;
|
950
|
-
c.$table.
|
951
|
+
c.$table.triggerHandler( 'filterInit', c );
|
951
952
|
tsf.findRows( c.table, c.$table.data( 'lastSearch' ) || [] );
|
952
953
|
};
|
953
954
|
if ( $.isEmptyObject( wo.filter_formatter ) ) {
|
@@ -1002,7 +1003,7 @@
|
|
1002
1003
|
for ( indx = 0; indx <= c.columns; indx++ ) {
|
1003
1004
|
// include data-column='all' external filters
|
1004
1005
|
col = indx === c.columns ? 'all' : indx;
|
1005
|
-
filters[indx] = $filters
|
1006
|
+
filters[ indx ] = $filters
|
1006
1007
|
.filter( '[data-column="' + col + '"]' )
|
1007
1008
|
.attr( wo.filter_defaultAttrib ) || filters[indx] || '';
|
1008
1009
|
}
|
@@ -1024,11 +1025,12 @@
|
|
1024
1025
|
buildFilter = '<tr role="row" class="' + tscss.filterRow + ' ' + c.cssIgnoreRow + '">';
|
1025
1026
|
for ( column = 0; column < columns; column++ ) {
|
1026
1027
|
if ( c.$headerIndexed[ column ].length ) {
|
1027
|
-
buildFilter += '<td data-column="' + column + '"';
|
1028
1028
|
// account for entire column set with colspan. See #1047
|
1029
1029
|
tmp = c.$headerIndexed[ column ] && c.$headerIndexed[ column ][0].colSpan || 0;
|
1030
1030
|
if ( tmp > 1 ) {
|
1031
|
-
buildFilter += ' colspan="' + tmp + '"';
|
1031
|
+
buildFilter += '<td data-column="' + column + '-' + ( column + tmp - 1 ) + '" colspan="' + tmp + '"';
|
1032
|
+
} else {
|
1033
|
+
buildFilter += '<td data-column="' + column + '"';
|
1032
1034
|
}
|
1033
1035
|
if ( arry ) {
|
1034
1036
|
buildFilter += ( cellFilter[ column ] ? ' class="' + cellFilter[ column ] + '"' : '' );
|
@@ -1047,7 +1049,8 @@
|
|
1047
1049
|
// assuming last cell of a column is the main column
|
1048
1050
|
$header = c.$headerIndexed[ column ];
|
1049
1051
|
if ( $header && $header.length ) {
|
1050
|
-
$filter = c.$filters.filter( '[data-column="' + column + '"]' );
|
1052
|
+
// $filter = c.$filters.filter( '[data-column="' + column + '"]' );
|
1053
|
+
$filter = tsf.getColumnElm( c, c.$filters, column );
|
1051
1054
|
ffxn = ts.getColumnData( table, wo.filter_functions, column );
|
1052
1055
|
makeSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
|
1053
1056
|
$header.hasClass( 'filter-select' );
|
@@ -1087,7 +1090,8 @@
|
|
1087
1090
|
name = ( $.isArray( wo.filter_cssFilter ) ?
|
1088
1091
|
( typeof wo.filter_cssFilter[column] !== 'undefined' ? wo.filter_cssFilter[column] || '' : '' ) :
|
1089
1092
|
wo.filter_cssFilter ) || '';
|
1090
|
-
|
1093
|
+
// copy data-column from table cell (it will include colspan)
|
1094
|
+
buildFilter.addClass( tscss.filter + ' ' + name ).attr( 'data-column', $filter.attr( 'data-column' ) );
|
1091
1095
|
if ( disabled ) {
|
1092
1096
|
buildFilter.attr( 'placeholder', '' ).addClass( tscss.filterDisabled )[0].disabled = true;
|
1093
1097
|
}
|
@@ -1195,7 +1199,7 @@
|
|
1195
1199
|
// show/hide filter row as needed
|
1196
1200
|
c.$table
|
1197
1201
|
.find( '.' + tscss.filterRow )
|
1198
|
-
.
|
1202
|
+
.triggerHandler( combinedFilters === '' ? 'mouseleave' : 'mouseenter' );
|
1199
1203
|
}
|
1200
1204
|
// return if the last search is the same; but filter === false when updating the search
|
1201
1205
|
// see example-widget-filter.html filter toggle buttons
|
@@ -1206,6 +1210,8 @@
|
|
1206
1210
|
c.lastCombinedFilter = null;
|
1207
1211
|
c.lastSearch = [];
|
1208
1212
|
}
|
1213
|
+
// define filter inside it is false
|
1214
|
+
filters = filters || [];
|
1209
1215
|
// convert filters to strings - see #1070
|
1210
1216
|
filters = Array.prototype.map ?
|
1211
1217
|
filters.map( String ) :
|
@@ -1213,7 +1219,7 @@
|
|
1213
1219
|
filters.join( '\u0000' ).split( '\u0000' );
|
1214
1220
|
|
1215
1221
|
if ( wo.filter_initialized ) {
|
1216
|
-
c.$table.
|
1222
|
+
c.$table.triggerHandler( 'filterStart', [ filters ] );
|
1217
1223
|
}
|
1218
1224
|
if ( c.showProcessing ) {
|
1219
1225
|
// give it time for the processing icon to kick in
|
@@ -1294,22 +1300,18 @@
|
|
1294
1300
|
}
|
1295
1301
|
return $input || $();
|
1296
1302
|
},
|
1297
|
-
|
1303
|
+
findRange: function( c, val, ignoreRanges ) {
|
1298
1304
|
// look for multiple columns '1-3,4-6,8' in data-column
|
1299
1305
|
var temp, ranges, range, start, end, singles, i, indx, len,
|
1300
|
-
|
1301
|
-
|
1302
|
-
//
|
1303
|
-
|
1304
|
-
columns = [],
|
1305
|
-
val = $.trim( tsf.getLatestSearch( $input ).attr( 'data-column' ) || '' );
|
1306
|
-
if ( /^[0-9]+$/.test(val)) {
|
1307
|
-
return parseInt( val, 10 );
|
1306
|
+
columns = [];
|
1307
|
+
if ( /^[0-9]+$/.test( val ) ) {
|
1308
|
+
// always return an array
|
1309
|
+
return [ parseInt( val, 10 ) ];
|
1308
1310
|
}
|
1309
1311
|
// process column range
|
1310
|
-
if (
|
1312
|
+
if ( !ignoreRanges && /-/.test( val ) ) {
|
1311
1313
|
ranges = val.match( /(\d+)\s*-\s*(\d+)/g );
|
1312
|
-
len = ranges.length;
|
1314
|
+
len = ranges ? ranges.length : 0;
|
1313
1315
|
for ( indx = 0; indx < len; indx++ ) {
|
1314
1316
|
range = ranges[indx].split( /\s*-\s*/ );
|
1315
1317
|
start = parseInt( range[0], 10 ) || 0;
|
@@ -1328,7 +1330,7 @@
|
|
1328
1330
|
}
|
1329
1331
|
}
|
1330
1332
|
// process single columns
|
1331
|
-
if (
|
1333
|
+
if ( !ignoreRanges && /,/.test( val ) ) {
|
1332
1334
|
singles = val.split( /\s*,\s*/ );
|
1333
1335
|
len = singles.length;
|
1334
1336
|
for ( i = 0; i < len; i++ ) {
|
@@ -1348,6 +1350,23 @@
|
|
1348
1350
|
}
|
1349
1351
|
return columns;
|
1350
1352
|
},
|
1353
|
+
getColumnElm: function( c, $elements, column ) {
|
1354
|
+
// data-column may contain multiple columns '1-3,5-6,8'
|
1355
|
+
// replaces: c.$filters.filter( '[data-column="' + column + '"]' );
|
1356
|
+
return $elements.filter( function() {
|
1357
|
+
var cols = tsf.findRange( c, $( this ).attr( 'data-column' ) );
|
1358
|
+
return $.inArray( column, cols ) > -1;
|
1359
|
+
});
|
1360
|
+
},
|
1361
|
+
multipleColumns: function( c, $input ) {
|
1362
|
+
// look for multiple columns '1-3,4-6,8' in data-column
|
1363
|
+
var wo = c.widgetOptions,
|
1364
|
+
// only target 'all' column inputs on initialization
|
1365
|
+
// & don't target 'all' column inputs if they don't exist
|
1366
|
+
targets = wo.filter_initialized || !$input.filter( wo.filter_anyColumnSelector ).length,
|
1367
|
+
val = $.trim( tsf.getLatestSearch( $input ).attr( 'data-column' ) || '' );
|
1368
|
+
return tsf.findRange( c, val, !targets );
|
1369
|
+
},
|
1351
1370
|
processTypes: function( c, data, vars ) {
|
1352
1371
|
var ffxn,
|
1353
1372
|
filterMatched = null,
|
@@ -1461,6 +1480,11 @@
|
|
1461
1480
|
data.filter = ts.replaceAccents( data.filter );
|
1462
1481
|
}
|
1463
1482
|
|
1483
|
+
// replace column specific default filters - see #1088
|
1484
|
+
if ( wo.filter_defaultFilter && tsfRegex.iQuery.test( vars.defaultColFilter[ columnIndex ] ) ) {
|
1485
|
+
data.filter = tsf.defaultFilter( data.filter, vars.defaultColFilter[ columnIndex ] );
|
1486
|
+
}
|
1487
|
+
|
1464
1488
|
// data.iFilter = case insensitive ( if wo.filter_ignoreCase is true ),
|
1465
1489
|
// data.filter = case sensitive
|
1466
1490
|
data.iFilter = wo.filter_ignoreCase ? ( data.filter || '' ).toLowerCase() : data.filter;
|
@@ -1749,7 +1773,8 @@
|
|
1749
1773
|
console.log( 'Completed filter widget search' + ts.benchmark(time) );
|
1750
1774
|
}
|
1751
1775
|
if ( wo.filter_initialized ) {
|
1752
|
-
c.$table.
|
1776
|
+
c.$table.triggerHandler( 'filterBeforeEnd', c );
|
1777
|
+
c.$table.triggerHandler( 'filterEnd', c );
|
1753
1778
|
}
|
1754
1779
|
setTimeout( function() {
|
1755
1780
|
ts.applyWidget( c.table ); // make sure zebra widget is applied
|
@@ -2114,7 +2139,7 @@
|
|
2114
2139
|
c.lastCombinedFilter = null;
|
2115
2140
|
c.lastSearch = [];
|
2116
2141
|
tsf.searching( c.table, filter, skipFirst );
|
2117
|
-
c.$table.
|
2142
|
+
c.$table.triggerHandler( 'filterFomatterUpdate' );
|
2118
2143
|
}
|
2119
2144
|
return !!valid;
|
2120
2145
|
};
|
@@ -2162,7 +2187,7 @@
|
|
2162
2187
|
}
|
2163
2188
|
}
|
2164
2189
|
if ( headers.length && triggerEvent !== false ) {
|
2165
|
-
c.$table.
|
2190
|
+
c.$table.triggerHandler( 'resize', [ headers ] );
|
2166
2191
|
}
|
2167
2192
|
wo.resize_flag = false;
|
2168
2193
|
};
|
@@ -2389,7 +2414,7 @@
|
|
2389
2414
|
}
|
2390
2415
|
}
|
2391
2416
|
|
2392
|
-
$table.
|
2417
|
+
$table.triggerHandler('stickyHeadersInit');
|
2393
2418
|
|
2394
2419
|
},
|
2395
2420
|
remove: function(table, c, wo) {
|
@@ -2717,7 +2742,7 @@
|
|
2717
2742
|
}
|
2718
2743
|
vars.mouseXPosition = event.pageX;
|
2719
2744
|
// dynamically update sticky header widths
|
2720
|
-
c.$table.
|
2745
|
+
c.$table.triggerHandler('stickyHeadersUpdate');
|
2721
2746
|
},
|
2722
2747
|
|
2723
2748
|
stopResize : function( c, wo ) {
|
@@ -2731,7 +2756,7 @@
|
|
2731
2756
|
vars.mouseXPosition = 0;
|
2732
2757
|
vars.$target = vars.$next = null;
|
2733
2758
|
// will update stickyHeaders, just in case, see #912
|
2734
|
-
c.$table.
|
2759
|
+
c.$table.triggerHandler('stickyHeadersUpdate');
|
2735
2760
|
}
|
2736
2761
|
};
|
2737
2762
|
|
@@ -2793,7 +2818,7 @@
|
|
2793
2818
|
}
|
2794
2819
|
|
2795
2820
|
// reset stickyHeader widths
|
2796
|
-
c.$table.
|
2821
|
+
c.$table.triggerHandler( 'stickyHeadersUpdate' );
|
2797
2822
|
if ( ts.storage && !refreshing ) {
|
2798
2823
|
ts.storage( this, ts.css.resizableStorage, {} );
|
2799
2824
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! Parser: input & select - updated
|
1
|
+
/*! Parser: input & select - updated 12/13/2015 (v2.25.0) *//*
|
2
2
|
* for jQuery 1.7+ & tablesorter 2.7.11+
|
3
3
|
* Demo: http://mottie.github.com/tablesorter/docs/example-widget-grouping.html
|
4
4
|
*/
|
@@ -54,23 +54,12 @@
|
|
54
54
|
},
|
55
55
|
format : function( txt, table, cell, cellIndex ) {
|
56
56
|
var $cell = $( cell ),
|
57
|
-
$row = $cell.closest( 'tr' ),
|
58
57
|
wo = table.config.widgetOptions,
|
59
|
-
checkedClass = table.config.checkboxClass || 'checked',
|
60
58
|
// returning plain language here because this is what is shown in the
|
61
59
|
// group headers - change it as desired
|
62
60
|
status = wo.group_checkbox ? wo.group_checkbox : [ 'checked', 'unchecked' ],
|
63
61
|
$input = $cell.find( 'input[type="checkbox"]' ),
|
64
62
|
isChecked = $input.length ? $input[ 0 ].checked : '';
|
65
|
-
// adding class to row, indicating that a checkbox is checked; includes
|
66
|
-
// a column index in case more than one checkbox happens to be in a row
|
67
|
-
$row.toggleClass( checkedClass + '-' + cellIndex, isChecked );
|
68
|
-
if ( isChecked ) {
|
69
|
-
$row.addClass( checkedClass );
|
70
|
-
} else if ( $row.length && !( $row[0].className || '' ).match( checkedClass + '-' ) ) {
|
71
|
-
// don't remove checked class if other columns have a check
|
72
|
-
$row.removeClass( checkedClass );
|
73
|
-
}
|
74
63
|
return $input.length ? status[ isChecked ? 0 : 1 ] : txt;
|
75
64
|
},
|
76
65
|
parsed : true, // filter widget flag
|
@@ -127,6 +116,34 @@
|
|
127
116
|
// if this code interferes somehow, target the specific table $('#mytable'), instead of $('table')
|
128
117
|
$( function() {
|
129
118
|
if ( !$.fn.on ) { return; }
|
119
|
+
var toggleRowClass = function( $row, checkboxClass, indx, isChecked ) {
|
120
|
+
// adding class to row, indicating that a checkbox is checked; includes
|
121
|
+
// a column index in case more than one checkbox happens to be in a row
|
122
|
+
$row.toggleClass( checkboxClass + '-' + indx, isChecked );
|
123
|
+
// don't remove checked class if other columns have a check
|
124
|
+
if ( ( $row[0].className || '' ).match( checkboxClass + '-' ) ) {
|
125
|
+
$row.addClass( checkboxClass );
|
126
|
+
} else {
|
127
|
+
$row.removeClass( checkboxClass );
|
128
|
+
}
|
129
|
+
},
|
130
|
+
updateHeaderCheckbox = function( $table, checkboxClass ) {
|
131
|
+
var $rows = $table.children( 'tbody' ).children( ':visible' ), // (include child rows?)
|
132
|
+
len = $rows.length;
|
133
|
+
// set indeterminate state on header checkbox
|
134
|
+
$table.children( 'thead' ).find( 'input[type="checkbox"]' ).each( function() {
|
135
|
+
var column = $( this ).closest( 'td, th' ).attr( 'data-column' ),
|
136
|
+
vis = $rows.filter( '.' + checkboxClass + '-' + column ).length,
|
137
|
+
allChecked = vis === len;
|
138
|
+
if ( vis === 0 || allChecked ) {
|
139
|
+
this.checked = allChecked;
|
140
|
+
this.indeterminate = false;
|
141
|
+
} else {
|
142
|
+
this.indeterminate = true;
|
143
|
+
}
|
144
|
+
});
|
145
|
+
};
|
146
|
+
|
130
147
|
$( 'table' ).on( 'tablesorter-initialized updateComplete', function() {
|
131
148
|
this.tablesorterBusy = false;
|
132
149
|
var namespace = '.parser-forms';
|
@@ -159,7 +176,7 @@
|
|
159
176
|
if ( event.type === 'change' ||
|
160
177
|
( event.type === 'keyup' && event.which === 13 &&
|
161
178
|
( event.target.nodeName === 'INPUT' || event.target.nodeName === 'TEXTAREA' && event.altKey ) ) ) {
|
162
|
-
var undef,
|
179
|
+
var undef, checkboxClass,
|
163
180
|
$target = $( event.target ),
|
164
181
|
isCheckbox = event.target.type === 'checkbox',
|
165
182
|
$cell = $target.closest( 'td' ),
|
@@ -169,9 +186,18 @@
|
|
169
186
|
busy = $table.length && $table[ 0 ].tablesorterBusy,
|
170
187
|
$hdr = c && c.$headerIndexed && c.$headerIndexed[ indx ] || [],
|
171
188
|
val = isCheckbox ? event.target.checked : $target.val();
|
172
|
-
// abort if not a tablesorter table, or busy
|
173
|
-
|
174
|
-
|
189
|
+
// abort if not a tablesorter table, or busy
|
190
|
+
if ( $.isEmptyObject( c ) || busy !== false ) {
|
191
|
+
return;
|
192
|
+
}
|
193
|
+
if ( isCheckbox ) {
|
194
|
+
checkboxClass = c.checkboxClass || 'checked';
|
195
|
+
toggleRowClass( $cell.closest( 'tr' ), checkboxClass, indx, val );
|
196
|
+
updateHeaderCheckbox( $table, checkboxClass );
|
197
|
+
}
|
198
|
+
// don't use updateCell if column is set to 'sorter-false' and 'filter-false',
|
199
|
+
// or column is set to 'parser-false'
|
200
|
+
if ( $hdr.length && ( $hdr.hasClass( 'parser-false' ) ||
|
175
201
|
( $hdr.hasClass( 'sorter-false' ) && $hdr.hasClass( 'filter-false' ) ) ) ||
|
176
202
|
// table already updating; get out of here, we might be in an endless loop (in IE)! See #971
|
177
203
|
( event.type === 'change' && c.table.isUpdating ) ) {
|
@@ -201,20 +227,8 @@
|
|
201
227
|
if ( !$.isEmptyObject( c ) ) {
|
202
228
|
this.tablesorterBusy = true;
|
203
229
|
checkboxClass = c && c.checkboxClass || 'checked';
|
204
|
-
$rows = $table.children( 'tbody' ).children( ':visible' ); // (include child rows?)
|
205
|
-
len = $rows.length;
|
206
230
|
// set indeterminate state on header checkbox
|
207
|
-
|
208
|
-
var column = $( this ).closest( 'td, th' ).attr( 'data-column' ),
|
209
|
-
vis = $rows.filter( '.' + checkboxClass + '-' + column ).length,
|
210
|
-
allChecked = vis === len;
|
211
|
-
if ( vis === 0 || allChecked ) {
|
212
|
-
this.checked = allChecked;
|
213
|
-
this.indeterminate = false;
|
214
|
-
} else {
|
215
|
-
this.indeterminate = true;
|
216
|
-
}
|
217
|
-
});
|
231
|
+
updateHeaderCheckbox( $table, checkboxClass );
|
218
232
|
this.tablesorterBusy = false;
|
219
233
|
}
|
220
234
|
})
|
@@ -222,13 +236,14 @@
|
|
222
236
|
.off( namespace )
|
223
237
|
// modified from http://jsfiddle.net/abkNM/6163/
|
224
238
|
.on( 'change' + namespace, 'input[type="checkbox"]', function( event ) {
|
225
|
-
var undef, onlyVisible, column, $target,
|
239
|
+
var undef, onlyVisible, column, $target, isParsed, $row, checkboxClass,
|
226
240
|
$checkbox = $( this ),
|
227
241
|
$table = $checkbox.closest( 'table' ),
|
228
242
|
c = $table.length && $table[ 0 ].config,
|
229
243
|
isChecked = this.checked;
|
230
244
|
if ( $table.length && c && !$table[ 0 ].tablesorterBusy ) {
|
231
245
|
column = parseInt( $checkbox.closest( 'td, th' ).attr( 'data-column' ), 10 );
|
246
|
+
isParsed = c.parsers[ column ].id === 'checkbox';
|
232
247
|
onlyVisible = $table.length && c.checkboxVisible;
|
233
248
|
$table[ 0 ].tablesorterBusy = true; // prevent "change" event from calling updateCell numerous times (see #971)
|
234
249
|
$target = $table
|
@@ -237,10 +252,25 @@
|
|
237
252
|
.children( ':nth-child(' + ( column + 1 ) + ')' )
|
238
253
|
.find( 'input[type="checkbox"]' )
|
239
254
|
.prop( 'checked', isChecked );
|
240
|
-
|
255
|
+
if ( !isParsed ) {
|
256
|
+
// add checkbox class names
|
257
|
+
checkboxClass = c.checkboxClass || 'checked';
|
258
|
+
$target.each(function(){
|
259
|
+
$row = $(this).closest('tr');
|
260
|
+
toggleRowClass( $(this).closest( 'tr' ), checkboxClass, column, isChecked );
|
261
|
+
});
|
262
|
+
updateHeaderCheckbox( $table, checkboxClass );
|
241
263
|
updateServer( event, $table, $target );
|
242
264
|
$table[ 0 ].tablesorterBusy = false;
|
243
|
-
}
|
265
|
+
} else {
|
266
|
+
// only update cache if checkboxes are being sorted
|
267
|
+
$.tablesorter.update( c, undef, function() {
|
268
|
+
updateServer( event, $table, $target );
|
269
|
+
$table[ 0 ].tablesorterBusy = false;
|
270
|
+
});
|
271
|
+
}
|
272
|
+
// needed for IE8
|
273
|
+
return true;
|
244
274
|
}
|
245
275
|
// update already going on, don't do anything!
|
246
276
|
return false;
|
@@ -132,7 +132,7 @@
|
|
132
132
|
format : function(table, c, wo){
|
133
133
|
// reinitialize in case table is empty when first initialized
|
134
134
|
if (!wo.alignChar_initialized) {
|
135
|
-
c.$table.
|
135
|
+
c.$table.triggerHandler('refreshAlign');
|
136
136
|
}
|
137
137
|
},
|
138
138
|
remove : function(table, c, wo, refreshing){
|