jquery-tablesorter 1.17.1 → 1.17.2
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 +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +6 -2
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +353 -228
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +41 -37
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +313 -192
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +2 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +63 -48
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +17 -12
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +10 -5
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +114 -71
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +95 -66
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +3 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +120 -59
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +510 -242
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sortTbodies.js +228 -0
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +76 -59
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 853a88593e71f448072c8a7917b8f1365d45e98b
|
4
|
+
data.tar.gz: c021dba2083ef3ee1efe3b0039ec1de19232f5df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2863d563ad0304efcdf39676e4b54411da4f1da60929229f09991fa5e0cefb85f3b1e1fe49bc4c10ce02558e059d3946e26cbb001205a0f0209c799aafb1afe
|
7
|
+
data.tar.gz: 9f3b893120f50751ac24432d432ea54d74fb0501c084fd931c672fc32b07911739005f63089270d7b3746acc72f9a0f5f9934130597b17cf50c0bd3759ca37f4
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
Simple integration of jquery-tablesorter into the asset pipeline.
|
6
6
|
|
7
|
-
Current tablesorter version: 2.22.
|
7
|
+
Current tablesorter version: 2.22.3 (6/30/2015), [documentation]
|
8
8
|
|
9
9
|
Any issue associated with the js/css files, please report to [Mottie's fork].
|
10
10
|
|
@@ -408,7 +408,7 @@
|
|
408
408
|
c.totalRows = p.totalRows = result.total;
|
409
409
|
c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total;
|
410
410
|
th = result.headers;
|
411
|
-
d = result.rows;
|
411
|
+
d = result.rows || [];
|
412
412
|
} else {
|
413
413
|
// allow [ total, rows, headers ] or [ rows, total, headers ]
|
414
414
|
t = isNaN(result[0]) && !isNaN(result[1]);
|
@@ -417,7 +417,8 @@
|
|
417
417
|
p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count;
|
418
418
|
// can't set filtered rows when returning an array
|
419
419
|
c.totalRows = c.filteredRows = p.filteredRows = p.totalRows;
|
420
|
-
|
420
|
+
// set row data to empty array if nothing found - see http://stackoverflow.com/q/30875583/145346
|
421
|
+
d = p.totalRows === 0 ? [] : result[t ? 0 : 1] || []; // row data
|
421
422
|
th = result[2]; // headers
|
422
423
|
}
|
423
424
|
l = d && d.length;
|
@@ -1046,6 +1047,9 @@
|
|
1046
1047
|
updatePageDisplay(table, p, false);
|
1047
1048
|
}
|
1048
1049
|
}
|
1050
|
+
|
1051
|
+
// make the hasWidget function think that the pager widget is being used
|
1052
|
+
c.widgetInit.pager = true;
|
1049
1053
|
});
|
1050
1054
|
};
|
1051
1055
|
|
@@ -4,7 +4,7 @@
|
|
4
4
|
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀▀██
|
5
5
|
█████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
|
6
6
|
*/
|
7
|
-
/*! tablesorter (FORK) - updated
|
7
|
+
/*! tablesorter (FORK) - updated 06-30-2015 (v2.22.2)*/
|
8
8
|
/* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
|
9
9
|
(function(factory) {
|
10
10
|
if (typeof define === 'function' && define.amd) {
|
@@ -16,7 +16,7 @@
|
|
16
16
|
}
|
17
17
|
}(function($) {
|
18
18
|
|
19
|
-
/*! TableSorter (FORK) v2.22.
|
19
|
+
/*! TableSorter (FORK) v2.22.3 *//*
|
20
20
|
* Client-side table sorting with ease!
|
21
21
|
* @requires jQuery v1.2.6+
|
22
22
|
*
|
@@ -44,7 +44,7 @@
|
|
44
44
|
|
45
45
|
var ts = this;
|
46
46
|
|
47
|
-
ts.version = '2.22.
|
47
|
+
ts.version = '2.22.3';
|
48
48
|
|
49
49
|
ts.parsers = [];
|
50
50
|
ts.widgets = [];
|
@@ -209,10 +209,10 @@
|
|
209
209
|
if (typeof(t) === 'string') {
|
210
210
|
// check data-attribute first when set to 'basic'; don't use node.innerText - it's really slow!
|
211
211
|
// http://www.kellegous.com/j/2013/02/27/innertext-vs-textcontent/
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
);
|
212
|
+
if ( t === 'basic' && typeof ( te = $node.attr(c.textAttribute) ) !== 'undefined' ) {
|
213
|
+
return $.trim( te );
|
214
|
+
}
|
215
|
+
return $.trim( node.textContent || $node.text() );
|
216
216
|
} else {
|
217
217
|
if (typeof(t) === 'function') {
|
218
218
|
return $.trim( t($node[0], c.table, cellIndex) );
|
@@ -224,9 +224,8 @@
|
|
224
224
|
return $.trim( $node[0].textContent || $node.text() );
|
225
225
|
};
|
226
226
|
|
227
|
-
function detectParserForColumn(
|
227
|
+
function detectParserForColumn(c, rows, rowIndex, cellIndex) {
|
228
228
|
var cur, $node,
|
229
|
-
c = table.config,
|
230
229
|
i = ts.parsers.length,
|
231
230
|
node = false,
|
232
231
|
nodeValue = '',
|
@@ -237,7 +236,7 @@
|
|
237
236
|
node = rows[rowIndex].cells[cellIndex];
|
238
237
|
nodeValue = ts.getElementText(c, node, cellIndex);
|
239
238
|
$node = $(node);
|
240
|
-
if (
|
239
|
+
if (c.debug) {
|
241
240
|
log('Checking if value was empty on row ' + rowIndex + ', column: ' + cellIndex + ': "' + nodeValue + '"');
|
242
241
|
}
|
243
242
|
} else {
|
@@ -247,7 +246,7 @@
|
|
247
246
|
while (--i >= 0) {
|
248
247
|
cur = ts.parsers[i];
|
249
248
|
// ignore the default text parser because it will always be true
|
250
|
-
if (cur && cur.id !== 'text' && cur.is && cur.is(nodeValue, table, node, $node)) {
|
249
|
+
if (cur && cur.id !== 'text' && cur.is && cur.is(nodeValue, c.table, node, $node)) {
|
251
250
|
return cur;
|
252
251
|
}
|
253
252
|
}
|
@@ -256,7 +255,7 @@
|
|
256
255
|
}
|
257
256
|
|
258
257
|
// centralized function to extract/parse cell contents
|
259
|
-
function
|
258
|
+
ts.getParsedText = function( c, cell, colIndex, txt ) {
|
260
259
|
if ( typeof txt === 'undefined' ) {
|
261
260
|
txt = ts.getElementText( c, cell, colIndex );
|
262
261
|
}
|
@@ -279,16 +278,17 @@
|
|
279
278
|
}
|
280
279
|
}
|
281
280
|
return val;
|
282
|
-
}
|
281
|
+
};
|
283
282
|
|
284
|
-
function buildParserCache(
|
285
|
-
var
|
286
|
-
|
287
|
-
tb = c.$tbodies = c.$table.children('tbody:not(.' + c.cssInfoBlock + ')'),
|
288
|
-
rows, list, l, i, h, ch, np, p, e, time,
|
283
|
+
function buildParserCache( c, $tbodies ) {
|
284
|
+
var rows, list, l, i, h, ch, np, p, e, time, tb, len,
|
285
|
+
table = c.table,
|
289
286
|
j = 0,
|
290
|
-
parsersDebug = ''
|
291
|
-
|
287
|
+
parsersDebug = '';
|
288
|
+
// update table bodies in case we start with an empty table
|
289
|
+
c.$tbodies = c.$table.children('tbody:not(.' + c.cssInfoBlock + ')');
|
290
|
+
tb = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies;
|
291
|
+
len = tb.length;
|
292
292
|
if ( len === 0) {
|
293
293
|
return c.debug ? log('Warning: *Empty table!* Not building a parser cache') : '';
|
294
294
|
} else if (c.debug) {
|
@@ -323,7 +323,7 @@
|
|
323
323
|
e = false;
|
324
324
|
}
|
325
325
|
if (!p) {
|
326
|
-
p = detectParserForColumn(
|
326
|
+
p = detectParserForColumn(c, rows, -1, i);
|
327
327
|
}
|
328
328
|
if (c.debug) {
|
329
329
|
parsersDebug += 'column:' + i + '; extractor:' + e.id + '; parser:' + p.id + '; string:' + c.strings[i] + '; empty: ' + c.empties[i] + '\n';
|
@@ -343,12 +343,14 @@
|
|
343
343
|
}
|
344
344
|
|
345
345
|
/* utils */
|
346
|
-
function buildCache(table) {
|
347
|
-
var cc, t, v, i, j, k, $row, cols, cacheTime,
|
346
|
+
function buildCache(table, $tbodies) {
|
347
|
+
var cc, t, v, i, j, k, $tb, $row, cols, cacheTime,
|
348
348
|
totalRows, rowData, prevRowData, colMax,
|
349
349
|
c = table.config,
|
350
|
-
$tb = c.$tbodies,
|
351
350
|
parsers = c.parsers;
|
351
|
+
// update tbody variable
|
352
|
+
c.$tbodies = c.$table.children('tbody:not(.' + c.cssInfoBlock + ')');
|
353
|
+
$tb = typeof $tbodies === 'undefined' ? c.$tbodies : $tbodies,
|
352
354
|
c.cache = {};
|
353
355
|
c.totalRows = 0;
|
354
356
|
// if no parsers found, return - it's an empty table.
|
@@ -396,7 +398,7 @@
|
|
396
398
|
prevRowData.child[ t ] = [];
|
397
399
|
// child row content does not account for colspans/rowspans; so indexing may be off
|
398
400
|
for ( j = 0; j < c.columns; j++ ) {
|
399
|
-
prevRowData.child[ t ][ j ] = getParsedText( c, v[ j ], j );
|
401
|
+
prevRowData.child[ t ][ j ] = ts.getParsedText( c, v[ j ], j );
|
400
402
|
}
|
401
403
|
// go to the next for loop
|
402
404
|
continue;
|
@@ -412,7 +414,7 @@
|
|
412
414
|
}
|
413
415
|
t = ts.getElementText( c, $row[ 0 ].cells[j], j );
|
414
416
|
rowData.raw.push( t ); // save original row text
|
415
|
-
v = getParsedText( c, $row[ 0 ].cells[ j ], j, t );
|
417
|
+
v = ts.getParsedText( c, $row[ 0 ].cells[ j ], j, t );
|
416
418
|
cols.push( v );
|
417
419
|
if ( ( parsers[ j ].type || '' ).toLowerCase() === 'numeric' ) {
|
418
420
|
// determine column max value (ignore sign)
|
@@ -565,7 +567,7 @@
|
|
565
567
|
// remove rows/elements before update
|
566
568
|
c.$table.find(c.selectorRemove).remove();
|
567
569
|
// rebuild parsers
|
568
|
-
buildParserCache(
|
570
|
+
buildParserCache(c);
|
569
571
|
// rebuild the cache map
|
570
572
|
buildCache(table);
|
571
573
|
checkResort(c, resort, callback);
|
@@ -855,7 +857,7 @@
|
|
855
857
|
num = (c.strings[col]) ? c.string[c.strings[col]] || 0 : 0;
|
856
858
|
}
|
857
859
|
// fall back to built-in numeric sort
|
858
|
-
// var sort = $.tablesorter['sort' + s](
|
860
|
+
// var sort = $.tablesorter['sort' + s]( a[c], b[c], dir, colMax[c], table);
|
859
861
|
sort = c.numberSorter ? c.numberSorter(a[col], b[col], dir, colMax[col], table) :
|
860
862
|
ts[ 'sortNumeric' + (dir ? 'Asc' : 'Desc') ](a[col], b[col], num, colMax[col], col, table);
|
861
863
|
} else {
|
@@ -968,7 +970,7 @@
|
|
968
970
|
row = $tb.eq( tbdy ).find( 'tr' ).index( $row );
|
969
971
|
cache = tbcache.normalized[ row ];
|
970
972
|
icell = $cell.index();
|
971
|
-
t = getParsedText( c, cell, icell );
|
973
|
+
t = ts.getParsedText( c, cell, icell );
|
972
974
|
cache[ icell ] = t;
|
973
975
|
cache[ c.columns ].$row = $row;
|
974
976
|
if ( (c.parsers[icell].type || '').toLowerCase() === 'numeric' ) {
|
@@ -1003,7 +1005,7 @@
|
|
1003
1005
|
tbdy = c.$tbodies.index( $row.parents('tbody').filter(':first') );
|
1004
1006
|
// fixes adding rows to an empty table - see issue #179
|
1005
1007
|
if (!(c.parsers && c.parsers.length)) {
|
1006
|
-
buildParserCache(
|
1008
|
+
buildParserCache(c);
|
1007
1009
|
}
|
1008
1010
|
// add each row
|
1009
1011
|
for (i = 0; i < rows; i++) {
|
@@ -1016,7 +1018,7 @@
|
|
1016
1018
|
};
|
1017
1019
|
// add each cell
|
1018
1020
|
for (j = 0; j < l; j++) {
|
1019
|
-
cells[j] = getParsedText( c, $row[i].cells[j], j );
|
1021
|
+
cells[j] = ts.getParsedText( c, $row[i].cells[j], j );
|
1020
1022
|
if ((c.parsers[j].type || '').toLowerCase() === 'numeric') {
|
1021
1023
|
// update column max value (ignore sign)
|
1022
1024
|
c.cache[tbdy].colMax[j] = Math.max(Math.abs(cells[j]) || 0, c.cache[tbdy].colMax[j] || 0);
|
@@ -1061,13 +1063,14 @@
|
|
1061
1063
|
callback(table);
|
1062
1064
|
}
|
1063
1065
|
})
|
1064
|
-
|
1066
|
+
// $tbodies variable is used by the tbody sorting widget
|
1067
|
+
.bind('updateCache' + c.namespace, function(e, callback, $tbodies){
|
1065
1068
|
// rebuild parsers
|
1066
1069
|
if (!(c.parsers && c.parsers.length)) {
|
1067
|
-
buildParserCache(
|
1070
|
+
buildParserCache(c, $tbodies);
|
1068
1071
|
}
|
1069
1072
|
// rebuild the cache map
|
1070
|
-
buildCache(table);
|
1073
|
+
buildCache(table, $tbodies);
|
1071
1074
|
if ($.isFunction(callback)) {
|
1072
1075
|
callback(table);
|
1073
1076
|
}
|
@@ -1187,7 +1190,7 @@
|
|
1187
1190
|
// add widget options before parsing (e.g. grouping widget has parser settings)
|
1188
1191
|
ts.applyWidgetOptions(table, c);
|
1189
1192
|
// try to auto detect column type, and store in tables config
|
1190
|
-
buildParserCache(
|
1193
|
+
buildParserCache(c);
|
1191
1194
|
// start total row count at zero
|
1192
1195
|
c.totalRows = 0;
|
1193
1196
|
// build the cache for the tbody cells
|
@@ -1413,10 +1416,11 @@
|
|
1413
1416
|
}
|
1414
1417
|
// ignore mouseup if mousedown wasn't on the same target
|
1415
1418
|
if ( type.match(' ' + c.pointerUp + ' ') && downTarget !== e.target && external !== true ) { return; }
|
1416
|
-
// set
|
1419
|
+
// set target on mousedown
|
1417
1420
|
if ( type.match(' ' + c.pointerDown + ' ') ) {
|
1418
1421
|
downTarget = e.target;
|
1419
|
-
// needed or jQuery v1.3.2
|
1422
|
+
// preventDefault needed or jQuery v1.3.2 and older throws an
|
1423
|
+
// "Uncaught TypeError: handler.apply is not a function" error
|
1420
1424
|
temp = $target.jquery.split( '.' );
|
1421
1425
|
if ( temp[0] === '1' && temp[1] < 4 ) { e.preventDefault(); }
|
1422
1426
|
return;
|
@@ -2155,7 +2159,7 @@
|
|
2155
2159
|
format: function(table, c, wo) {
|
2156
2160
|
var $tv, $tr, row, even, time, k, i, len,
|
2157
2161
|
child = new RegExp(c.cssChildRow, 'i'),
|
2158
|
-
b = c.$tbodies.add( $( c.namespace + '_extra_table' ).children( 'tbody' ) );
|
2162
|
+
b = c.$tbodies.add( $( c.namespace + '_extra_table' ).children( 'tbody:not(.' + c.cssInfoBlock + ')' ) );
|
2159
2163
|
if (c.debug) {
|
2160
2164
|
time = new Date();
|
2161
2165
|
}
|
@@ -2650,6 +2654,66 @@ ts.filter = {
|
|
2650
2654
|
// data.index = column index; table = table element ( DOM )
|
2651
2655
|
// data.parsed = array ( by column ) of boolean values ( from filter_useParsedData or 'filter-parsed' class )
|
2652
2656
|
types: {
|
2657
|
+
or : function( c, data, vars ) {
|
2658
|
+
if ( /\|/.test( data.iFilter ) || ts.filter.regex.orSplit.test( data.filter ) ) {
|
2659
|
+
var indx, filterMatched, txt, query, regex,
|
2660
|
+
// duplicate data but split filter
|
2661
|
+
data2 = $.extend( {}, data ),
|
2662
|
+
index = data.index,
|
2663
|
+
parsed = data.parsed[ index ],
|
2664
|
+
filter = data.filter.split( ts.filter.regex.orSplit ),
|
2665
|
+
iFilter = data.iFilter.split( ts.filter.regex.orSplit ),
|
2666
|
+
len = filter.length;
|
2667
|
+
for ( indx = 0; indx < len; indx++ ) {
|
2668
|
+
data2.nestedFilters = true;
|
2669
|
+
data2.filter = '' + ( ts.filter.parseFilter( c, filter[ indx ], index, parsed ) || '' );
|
2670
|
+
data2.iFilter = '' + ( ts.filter.parseFilter( c, iFilter[ indx ], index, parsed ) || '' );
|
2671
|
+
query = '(' + ( ts.filter.parseFilter( c, data2.filter, index, parsed ) || '' ) + ')';
|
2672
|
+
regex = new RegExp( data.isMatch ? query : '^' + query + '$', c.widgetOptions.filter_ignoreCase ? 'i' : '' );
|
2673
|
+
// filterMatched = data2.filter === '' && indx > 0 ? true
|
2674
|
+
// look for an exact match with the 'or' unless the 'filter-match' class is found
|
2675
|
+
filterMatched = regex.test( data2.exact ) || ts.filter.processTypes( c, data2, vars );
|
2676
|
+
if ( filterMatched ) {
|
2677
|
+
return filterMatched;
|
2678
|
+
}
|
2679
|
+
}
|
2680
|
+
// may be null from processing types
|
2681
|
+
return filterMatched || false;
|
2682
|
+
}
|
2683
|
+
return null;
|
2684
|
+
},
|
2685
|
+
// Look for an AND or && operator ( logical and )
|
2686
|
+
and : function( c, data, vars ) {
|
2687
|
+
if ( ts.filter.regex.andTest.test( data.filter ) ) {
|
2688
|
+
var indx, filterMatched, result, txt, query, regex,
|
2689
|
+
// duplicate data but split filter
|
2690
|
+
data2 = $.extend( {}, data ),
|
2691
|
+
index = data.index,
|
2692
|
+
parsed = data.parsed[ index ],
|
2693
|
+
filter = data.filter.split( ts.filter.regex.andSplit ),
|
2694
|
+
iFilter = data.iFilter.split( ts.filter.regex.andSplit ),
|
2695
|
+
len = filter.length;
|
2696
|
+
for ( indx = 0; indx < len; indx++ ) {
|
2697
|
+
data2.nestedFilters = true;
|
2698
|
+
data2.filter = '' + ( ts.filter.parseFilter( c, filter[ indx ], index, parsed ) || '' );
|
2699
|
+
data2.iFilter = '' + ( ts.filter.parseFilter( c, iFilter[ indx ], index, parsed ) || '' );
|
2700
|
+
query = ( '(' + ( ts.filter.parseFilter( c, data2.filter, index, parsed ) || '' ) + ')' )
|
2701
|
+
// replace wild cards since /(a*)/i will match anything
|
2702
|
+
.replace( /\?/g, '\\S{1}' ).replace( /\*/g, '\\S*' );
|
2703
|
+
regex = new RegExp( data.isMatch ? query : '^' + query + '$', c.widgetOptions.filter_ignoreCase ? 'i' : '' );
|
2704
|
+
// look for an exact match with the 'and' unless the 'filter-match' class is found
|
2705
|
+
result = ( regex.test( data2.exact ) || ts.filter.processTypes( c, data2, vars ) );
|
2706
|
+
if ( indx === 0 ) {
|
2707
|
+
filterMatched = result;
|
2708
|
+
} else {
|
2709
|
+
filterMatched = filterMatched && result;
|
2710
|
+
}
|
2711
|
+
}
|
2712
|
+
// may be null from processing types
|
2713
|
+
return filterMatched || false;
|
2714
|
+
}
|
2715
|
+
return null;
|
2716
|
+
},
|
2653
2717
|
// Look for regex
|
2654
2718
|
regex: function( c, data ) {
|
2655
2719
|
if ( ts.filter.regex.regex.test( data.filter ) ) {
|
@@ -2737,23 +2801,6 @@ ts.filter = {
|
|
2737
2801
|
}
|
2738
2802
|
return null;
|
2739
2803
|
},
|
2740
|
-
// Look for an AND or && operator ( logical and )
|
2741
|
-
and : function( c, data ) {
|
2742
|
-
if ( ts.filter.regex.andTest.test( data.filter ) ) {
|
2743
|
-
var index = data.index,
|
2744
|
-
parsed = data.parsed[index],
|
2745
|
-
query = data.iFilter.split( ts.filter.regex.andSplit ),
|
2746
|
-
result = data.iExact.search( $.trim( ts.filter.parseFilter( c, query[0], index, parsed ) ) ) >= 0,
|
2747
|
-
indx = query.length - 1;
|
2748
|
-
while ( result && indx ) {
|
2749
|
-
result = result &&
|
2750
|
-
data.iExact.search( $.trim( ts.filter.parseFilter( c, query[indx], index, parsed ) ) ) >= 0;
|
2751
|
-
indx--;
|
2752
|
-
}
|
2753
|
-
return result;
|
2754
|
-
}
|
2755
|
-
return null;
|
2756
|
-
},
|
2757
2804
|
// Look for a range ( using ' to ' or ' - ' ) - see issue #166; thanks matzhu!
|
2758
2805
|
range : function( c, data ) {
|
2759
2806
|
if ( ts.filter.regex.toTest.test( data.iFilter ) ) {
|
@@ -2790,24 +2837,20 @@ ts.filter = {
|
|
2790
2837
|
},
|
2791
2838
|
// Look for wild card: ? = single, * = multiple, or | = logical OR
|
2792
2839
|
wild : function( c, data ) {
|
2793
|
-
if ( /[\?\*\|]/.test( data.iFilter )
|
2840
|
+
if ( /[\?\*\|]/.test( data.iFilter ) ) {
|
2794
2841
|
var index = data.index,
|
2795
2842
|
parsed = data.parsed[ index ],
|
2796
|
-
|
2797
|
-
query = '' + ( ts.filter.parseFilter( c, txt, index, parsed ) || '' );
|
2843
|
+
query = '' + ( ts.filter.parseFilter( c, data.iFilter, index, parsed ) || '' );
|
2798
2844
|
// look for an exact match with the 'or' unless the 'filter-match' class is found
|
2799
|
-
if (
|
2800
|
-
|
2801
|
-
if ( query[ query.length - 1 ] === '|' ) {
|
2802
|
-
query += '*';
|
2803
|
-
}
|
2804
|
-
query = data.anyMatch && $.isArray( data.rowArray ) ?
|
2805
|
-
'(' + query + ')' :
|
2806
|
-
'^(' + query + ')$';
|
2845
|
+
if ( !/\?\*/.test( query ) && data.nestedFilters ) {
|
2846
|
+
query = data.isMatch ? query : '^(' + query + ')$';
|
2807
2847
|
}
|
2808
2848
|
// parsing the filter may not work properly when using wildcards =/
|
2809
|
-
return new RegExp(
|
2810
|
-
.
|
2849
|
+
return new RegExp(
|
2850
|
+
query.replace( /\?/g, '\\S{1}' ).replace( /\*/g, '\\S*' ),
|
2851
|
+
c.widgetOptions.filter_ignoreCase ? 'i' : ''
|
2852
|
+
)
|
2853
|
+
.test( data.exact );
|
2811
2854
|
}
|
2812
2855
|
return null;
|
2813
2856
|
},
|
@@ -2861,7 +2904,7 @@ ts.filter = {
|
|
2861
2904
|
toSplit : new RegExp( '(?:\\s+(?:-|' + ts.language.to + ')\\s+)' ,'gi' ),
|
2862
2905
|
andTest : new RegExp( '\\s+(' + ts.language.and + '|&&)\\s+', 'i' ),
|
2863
2906
|
andSplit : new RegExp( '(?:\\s+(?:' + ts.language.and + '|&&)\\s+)', 'gi' ),
|
2864
|
-
|
2907
|
+
orSplit : new RegExp( '(?:\\s+(?:' + ts.language.or + ')\\s+|\\|)', 'gi' ),
|
2865
2908
|
iQuery : new RegExp( val, 'i' ),
|
2866
2909
|
igQuery : new RegExp( val, 'ig' )
|
2867
2910
|
});
|
@@ -3081,7 +3124,6 @@ ts.filter = {
|
|
3081
3124
|
}
|
3082
3125
|
}
|
3083
3126
|
},
|
3084
|
-
|
3085
3127
|
setDefaults: function( table, c, wo ) {
|
3086
3128
|
var isArray, saved, indx, col, $filters,
|
3087
3129
|
// get current ( default ) filters
|
@@ -3308,14 +3350,13 @@ ts.filter = {
|
|
3308
3350
|
}
|
3309
3351
|
},
|
3310
3352
|
hideFilters: function( table, c ) {
|
3311
|
-
var
|
3312
|
-
|
3353
|
+
var timer;
|
3354
|
+
c.$table
|
3313
3355
|
.find( '.' + tscss.filterRow )
|
3314
|
-
.addClass( tscss.filterRowHide )
|
3315
3356
|
.bind( 'mouseenter mouseleave', function( e ) {
|
3316
3357
|
// save event object - http://bugs.jquery.com/ticket/12140
|
3317
|
-
var event = e
|
3318
|
-
|
3358
|
+
var event = e,
|
3359
|
+
$filterRow = $( this );
|
3319
3360
|
clearTimeout( timer );
|
3320
3361
|
timer = setTimeout( function() {
|
3321
3362
|
if ( /enter|over/.test( event.type ) ) {
|
@@ -3333,13 +3374,14 @@ ts.filter = {
|
|
3333
3374
|
}, 200 );
|
3334
3375
|
})
|
3335
3376
|
.find( 'input, select' ).bind( 'focus blur', function( e ) {
|
3336
|
-
|
3377
|
+
var event = e,
|
3378
|
+
$row = $( this ).closest( 'tr' );
|
3337
3379
|
clearTimeout( timer );
|
3338
|
-
var event = e;
|
3339
3380
|
timer = setTimeout( function() {
|
3381
|
+
clearTimeout( timer );
|
3340
3382
|
// don't hide row if any filter has a value
|
3341
3383
|
if ( ts.getFilters( c.$table ).join( '' ) === '' ) {
|
3342
|
-
$
|
3384
|
+
$row.toggleClass( tscss.filterRowHide, event.type !== 'focus' );
|
3343
3385
|
}
|
3344
3386
|
}, 200 );
|
3345
3387
|
});
|
@@ -3373,7 +3415,7 @@ ts.filter = {
|
|
3373
3415
|
return $( b ).attr( 'data-lastSearchTime' ) - $( a ).attr( 'data-lastSearchTime' );
|
3374
3416
|
});
|
3375
3417
|
}
|
3376
|
-
return $();
|
3418
|
+
return $input || $();
|
3377
3419
|
},
|
3378
3420
|
multipleColumns: function( c, $input ) {
|
3379
3421
|
// look for multiple columns '1-3,4-6,8' in data-column
|
@@ -3426,8 +3468,22 @@ ts.filter = {
|
|
3426
3468
|
}
|
3427
3469
|
return columns;
|
3428
3470
|
},
|
3471
|
+
processTypes: function( c, data, vars ) {
|
3472
|
+
var ffxn,
|
3473
|
+
filterMatched = null,
|
3474
|
+
matches = null;
|
3475
|
+
for ( ffxn in ts.filter.types ) {
|
3476
|
+
if ( $.inArray( ffxn, vars.excludeMatch ) < 0 && matches === null ) {
|
3477
|
+
matches = ts.filter.types[ffxn]( c, data, vars );
|
3478
|
+
if ( matches !== null ) {
|
3479
|
+
filterMatched = matches;
|
3480
|
+
}
|
3481
|
+
}
|
3482
|
+
}
|
3483
|
+
return filterMatched;
|
3484
|
+
},
|
3429
3485
|
processRow: function( c, data, vars ) {
|
3430
|
-
var
|
3486
|
+
var columnIndex, hasSelect, result, val, filterMatched,
|
3431
3487
|
fxn, ffxn, txt,
|
3432
3488
|
regex = ts.filter.regex,
|
3433
3489
|
wo = c.widgetOptions,
|
@@ -3438,6 +3494,7 @@ ts.filter = {
|
|
3438
3494
|
// look for multiple columns '1-3,4-6,8'
|
3439
3495
|
columnIndex = ts.filter.multipleColumns( c, wo.filter_$anyMatch );
|
3440
3496
|
data.anyMatch = true;
|
3497
|
+
data.isMatch = true;
|
3441
3498
|
data.rowArray = data.$cells.map( function( i ) {
|
3442
3499
|
if ( $.inArray( i, columnIndex ) > -1 ) {
|
3443
3500
|
if ( data.parsed[ i ] ) {
|
@@ -3457,16 +3514,10 @@ ts.filter = {
|
|
3457
3514
|
data.exact = data.rowArray.join( ' ' );
|
3458
3515
|
data.iExact = wo.filter_ignoreCase ? data.exact.toLowerCase() : data.exact;
|
3459
3516
|
data.cache = data.cacheArray.slice( 0, -1 ).join( ' ' );
|
3460
|
-
|
3461
|
-
|
3462
|
-
|
3463
|
-
|
3464
|
-
matches = ts.filter.types[ffxn]( c, data );
|
3465
|
-
if ( matches !== null ) {
|
3466
|
-
filterMatched = matches;
|
3467
|
-
}
|
3468
|
-
}
|
3469
|
-
}
|
3517
|
+
|
3518
|
+
vars.excludeMatch = vars.noAnyMatch;
|
3519
|
+
filterMatched = ts.filter.processTypes( c, data, vars );
|
3520
|
+
|
3470
3521
|
if ( filterMatched !== null ) {
|
3471
3522
|
showRow = filterMatched;
|
3472
3523
|
} else {
|
@@ -3493,7 +3544,7 @@ ts.filter = {
|
|
3493
3544
|
data.index = columnIndex;
|
3494
3545
|
|
3495
3546
|
// filter types to exclude, per column
|
3496
|
-
excludeMatch = vars.excludeFilter[ columnIndex ];
|
3547
|
+
vars.excludeMatch = vars.excludeFilter[ columnIndex ];
|
3497
3548
|
|
3498
3549
|
// ignore if filter is empty or disabled
|
3499
3550
|
if ( data.filter ) {
|
@@ -3507,6 +3558,9 @@ ts.filter = {
|
|
3507
3558
|
}
|
3508
3559
|
data.iExact = !regex.type.test( typeof data.exact ) && wo.filter_ignoreCase ?
|
3509
3560
|
data.exact.toLowerCase() : data.exact;
|
3561
|
+
|
3562
|
+
data.isMatch = c.$headerIndexed[ data.index ].hasClass( 'filter-match' );
|
3563
|
+
|
3510
3564
|
result = showRow; // if showRow is true, show that row
|
3511
3565
|
|
3512
3566
|
// in case select filter option has a different value vs text 'a - z|A through Z'
|
@@ -3531,13 +3585,12 @@ ts.filter = {
|
|
3531
3585
|
// data.filter = case sensitive
|
3532
3586
|
data.iFilter = wo.filter_ignoreCase ? ( data.filter || '' ).toLowerCase() : data.filter;
|
3533
3587
|
fxn = vars.functions[ columnIndex ];
|
3534
|
-
|
3535
|
-
hasSelect = $cell.hasClass( 'filter-select' );
|
3588
|
+
hasSelect = c.$headerIndexed[ columnIndex ].hasClass( 'filter-select' );
|
3536
3589
|
filterMatched = null;
|
3537
3590
|
if ( fxn || ( hasSelect && val ) ) {
|
3538
3591
|
if ( fxn === true || hasSelect ) {
|
3539
3592
|
// default selector uses exact match unless 'filter-match' class is found
|
3540
|
-
filterMatched =
|
3593
|
+
filterMatched = data.isMatch ?
|
3541
3594
|
data.iExact.search( data.iFilter ) >= 0 :
|
3542
3595
|
data.filter === data.exact;
|
3543
3596
|
} else if ( typeof fxn === 'function' ) {
|
@@ -3554,15 +3607,7 @@ ts.filter = {
|
|
3554
3607
|
if ( filterMatched === null ) {
|
3555
3608
|
// cycle through the different filters
|
3556
3609
|
// filters return a boolean or null if nothing matches
|
3557
|
-
|
3558
|
-
for ( ffxn in ts.filter.types ) {
|
3559
|
-
if ( $.inArray( ffxn, excludeMatch ) < 0 && matches === null ) {
|
3560
|
-
matches = ts.filter.types[ ffxn ]( c, data );
|
3561
|
-
if ( matches !== null ) {
|
3562
|
-
filterMatched = matches;
|
3563
|
-
}
|
3564
|
-
}
|
3565
|
-
}
|
3610
|
+
filterMatched = ts.filter.processTypes( c, data, vars );
|
3566
3611
|
if ( filterMatched !== null ) {
|
3567
3612
|
result = filterMatched;
|
3568
3613
|
// Look for match, and add child row data for matching
|
@@ -3596,7 +3641,7 @@ ts.filter = {
|
|
3596
3641
|
anyMatch: false,
|
3597
3642
|
filters: filters,
|
3598
3643
|
// regex filter type cache
|
3599
|
-
filter_regexCache : []
|
3644
|
+
filter_regexCache : []
|
3600
3645
|
},
|
3601
3646
|
vars = {
|
3602
3647
|
// anyMatch really screws up with these types of filters
|
@@ -3817,7 +3862,7 @@ ts.filter = {
|
|
3817
3862
|
},
|
3818
3863
|
getOptionSource: function( table, column, onlyAvail ) {
|
3819
3864
|
table = $( table )[0];
|
3820
|
-
var cts, indx, len,
|
3865
|
+
var cts, txt, indx, len,
|
3821
3866
|
c = table.config,
|
3822
3867
|
wo = c.widgetOptions,
|
3823
3868
|
parsed = [],
|
@@ -3862,11 +3907,13 @@ ts.filter = {
|
|
3862
3907
|
len = arry.length;
|
3863
3908
|
// parse select option values
|
3864
3909
|
for ( indx = 0; indx < len; indx++ ) {
|
3910
|
+
txt = arry[ indx ];
|
3865
3911
|
// parse array data using set column parser; this DOES NOT pass the original
|
3866
3912
|
// table cell to the parser format function
|
3867
3913
|
parsed.push({
|
3868
|
-
t :
|
3869
|
-
|
3914
|
+
t : txt,
|
3915
|
+
// check parser length - fixes #934
|
3916
|
+
p : c.parsers && c.parsers.length && c.parsers[ column ].format( txt, table, [], column ) || txt
|
3870
3917
|
});
|
3871
3918
|
}
|
3872
3919
|
|
@@ -4056,8 +4103,8 @@ ts.getFilters = function( table, getRaw, setFilters, skipFirst ) {
|
|
4056
4103
|
$column = ts.filter.getLatestSearch( $column );
|
4057
4104
|
if ( $.isArray( setFilters ) ) {
|
4058
4105
|
// skip first ( latest input ) to maintain cursor position while typing
|
4059
|
-
if ( skipFirst ) {
|
4060
|
-
$column.slice( 1 );
|
4106
|
+
if ( skipFirst && $column.length > 1 ) {
|
4107
|
+
$column = $column.slice( 1 );
|
4061
4108
|
}
|
4062
4109
|
if ( i === c.columns ) {
|
4063
4110
|
// prevent data-column='all' from filling data-column='0,1' ( etc )
|
@@ -4129,32 +4176,34 @@ $.extend(ts.css, {
|
|
4129
4176
|
// Add a resize event to table headers
|
4130
4177
|
ts.addHeaderResizeEvent = function(table, disable, settings) {
|
4131
4178
|
table = $(table)[0]; // make sure we're using a dom element
|
4132
|
-
|
4133
|
-
|
4179
|
+
if ( !table.config ) { return; }
|
4180
|
+
var defaults = {
|
4134
4181
|
timer : 250
|
4135
4182
|
},
|
4136
4183
|
options = $.extend({}, defaults, settings),
|
4137
4184
|
c = table.config,
|
4138
4185
|
wo = c.widgetOptions,
|
4139
|
-
checkSizes = function(triggerEvent) {
|
4186
|
+
checkSizes = function( triggerEvent ) {
|
4187
|
+
var index, headers, $header, sizes, width, height,
|
4188
|
+
len = c.$headers.length;
|
4140
4189
|
wo.resize_flag = true;
|
4141
4190
|
headers = [];
|
4142
|
-
|
4143
|
-
|
4144
|
-
|
4145
|
-
|
4146
|
-
|
4147
|
-
if (width !== sizes[0] || height !== sizes[1]) {
|
4148
|
-
$header.data('savedSizes', [ width, height ]);
|
4149
|
-
headers.push(
|
4191
|
+
for ( index = 0; index < len; index++ ) {
|
4192
|
+
$header = c.$headers.eq( index );
|
4193
|
+
sizes = $header.data( 'savedSizes' ) || [ 0,0 ]; // fixes #394
|
4194
|
+
width = $header[0].offsetWidth;
|
4195
|
+
height = $header[0].offsetHeight;
|
4196
|
+
if ( width !== sizes[0] || height !== sizes[1] ) {
|
4197
|
+
$header.data( 'savedSizes', [ width, height ] );
|
4198
|
+
headers.push( $header[0] );
|
4150
4199
|
}
|
4151
|
-
}
|
4152
|
-
if (headers.length && triggerEvent !== false) {
|
4153
|
-
c.$table.trigger('resize', [ headers ]);
|
4200
|
+
}
|
4201
|
+
if ( headers.length && triggerEvent !== false ) {
|
4202
|
+
c.$table.trigger( 'resize', [ headers ] );
|
4154
4203
|
}
|
4155
4204
|
wo.resize_flag = false;
|
4156
4205
|
};
|
4157
|
-
checkSizes(false);
|
4206
|
+
checkSizes( false );
|
4158
4207
|
clearInterval(wo.resize_timer);
|
4159
4208
|
if (disable) {
|
4160
4209
|
wo.resize_flag = false;
|
@@ -4190,7 +4239,8 @@ ts.addWidget({
|
|
4190
4239
|
if ( c.$table.hasClass('hasStickyHeaders') || ($.inArray('filter', c.widgets) >= 0 && !c.$table.hasClass('hasFilters')) ) {
|
4191
4240
|
return;
|
4192
4241
|
}
|
4193
|
-
var
|
4242
|
+
var index, len, $t,
|
4243
|
+
$table = c.$table,
|
4194
4244
|
// add position: relative to attach element, hopefully it won't cause trouble.
|
4195
4245
|
$attach = $(wo.stickyHeaders_attachTo),
|
4196
4246
|
namespace = c.namespace + 'stickyheaders ',
|
@@ -4225,17 +4275,19 @@ ts.addWidget({
|
|
4225
4275
|
laststate = '',
|
4226
4276
|
spacing = 0,
|
4227
4277
|
setWidth = function($orig, $clone){
|
4228
|
-
$
|
4229
|
-
|
4230
|
-
|
4231
|
-
|
4278
|
+
var index, width, border, $cell, $this,
|
4279
|
+
$cells = $orig.filter(':visible'),
|
4280
|
+
len = $cells.length;
|
4281
|
+
for ( index = 0; index < len; index++ ) {
|
4282
|
+
$cell = $clone.filter(':visible').eq(index);
|
4283
|
+
$this = $cells.eq(index);
|
4232
4284
|
// code from https://github.com/jmosbech/StickyTableHeaders
|
4233
4285
|
if ($this.css('box-sizing') === 'border-box') {
|
4234
4286
|
width = $this.outerWidth();
|
4235
4287
|
} else {
|
4236
4288
|
if ($cell.css('border-collapse') === 'collapse') {
|
4237
4289
|
if (window.getComputedStyle) {
|
4238
|
-
width = parseFloat( window.getComputedStyle(this, null).width );
|
4290
|
+
width = parseFloat( window.getComputedStyle($this[0], null).width );
|
4239
4291
|
} else {
|
4240
4292
|
// ie8 only
|
4241
4293
|
border = parseFloat( $this.css('border-width') );
|
@@ -4246,10 +4298,11 @@ ts.addWidget({
|
|
4246
4298
|
}
|
4247
4299
|
}
|
4248
4300
|
$cell.css({
|
4301
|
+
'width': width,
|
4249
4302
|
'min-width': width,
|
4250
4303
|
'max-width': width
|
4251
4304
|
});
|
4252
|
-
}
|
4305
|
+
}
|
4253
4306
|
},
|
4254
4307
|
resizeHeader = function() {
|
4255
4308
|
stickyOffset = $stickyOffset.length ? $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0;
|
@@ -4261,6 +4314,39 @@ ts.addWidget({
|
|
4261
4314
|
});
|
4262
4315
|
setWidth( $table, $stickyTable );
|
4263
4316
|
setWidth( $header, $stickyCells );
|
4317
|
+
},
|
4318
|
+
scrollSticky = function( resizing ) {
|
4319
|
+
if (!$table.is(':visible')) { return; } // fixes #278
|
4320
|
+
// Detect nested tables - fixes #724
|
4321
|
+
nestedStickyTop = $nestedSticky.length ? $nestedSticky.offset().top - $yScroll.scrollTop() + $nestedSticky.height() : 0;
|
4322
|
+
var offset = $table.offset(),
|
4323
|
+
yWindow = $.isWindow( $yScroll[0] ), // $.isWindow needs jQuery 1.4.3
|
4324
|
+
xWindow = $.isWindow( $xScroll[0] ),
|
4325
|
+
// scrollTop = ( $attach.length ? $attach.offset().top : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
|
4326
|
+
scrollTop = ( $attach.length ? ( yWindow ? $yScroll.scrollTop() : $yScroll.offset().top ) : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
|
4327
|
+
tableHeight = $table.height() - ($stickyWrap.height() + ($tfoot.height() || 0)),
|
4328
|
+
isVisible = ( scrollTop > offset.top ) && ( scrollTop < offset.top + tableHeight ) ? 'visible' : 'hidden',
|
4329
|
+
cssSettings = { visibility : isVisible };
|
4330
|
+
|
4331
|
+
if ($attach.length) {
|
4332
|
+
cssSettings.top = yWindow ? scrollTop - $attach.offset().top : $attach.scrollTop();
|
4333
|
+
}
|
4334
|
+
if (xWindow) {
|
4335
|
+
// adjust when scrolling horizontally - fixes issue #143
|
4336
|
+
cssSettings.left = $table.offset().left - parseInt($table.css('margin-left'), 10) - $xScroll.scrollLeft() - spacing;
|
4337
|
+
}
|
4338
|
+
if ($nestedSticky.length) {
|
4339
|
+
cssSettings.top = ( cssSettings.top || 0 ) + stickyOffset + nestedStickyTop;
|
4340
|
+
}
|
4341
|
+
$stickyWrap
|
4342
|
+
.removeClass( ts.css.stickyVis + ' ' + ts.css.stickyHide )
|
4343
|
+
.addClass( isVisible === 'visible' ? ts.css.stickyVis : ts.css.stickyHide )
|
4344
|
+
.css(cssSettings);
|
4345
|
+
if (isVisible !== laststate || resizing) {
|
4346
|
+
// make sure the column widths match
|
4347
|
+
resizeHeader();
|
4348
|
+
laststate = isVisible;
|
4349
|
+
}
|
4264
4350
|
};
|
4265
4351
|
// only add a position relative if a position isn't already defined
|
4266
4352
|
if ($attach.length && !$attach.css('position')) {
|
@@ -4292,48 +4378,26 @@ ts.addWidget({
|
|
4292
4378
|
|
4293
4379
|
// onRenderHeader is defined, we need to do something about it (fixes #641)
|
4294
4380
|
if (c.onRenderHeader) {
|
4295
|
-
$stickyThead.children('tr').children()
|
4381
|
+
$t = $stickyThead.children('tr').children();
|
4382
|
+
len = $t.length;
|
4383
|
+
for ( index = 0; index < len; index++ ) {
|
4296
4384
|
// send second parameter
|
4297
|
-
c.onRenderHeader.apply( $(
|
4298
|
-
}
|
4385
|
+
c.onRenderHeader.apply( $t.eq( index ), [ index, c, $stickyTable ] );
|
4386
|
+
}
|
4299
4387
|
}
|
4300
4388
|
|
4301
4389
|
// make it sticky!
|
4302
4390
|
$xScroll.add($yScroll)
|
4303
|
-
|
4304
|
-
|
4305
|
-
|
4306
|
-
|
4307
|
-
|
4308
|
-
|
4309
|
-
|
4310
|
-
|
4311
|
-
|
4312
|
-
|
4313
|
-
tableHeight = $table.height() - ($stickyWrap.height() + ($tfoot.height() || 0)),
|
4314
|
-
isVisible = ( scrollTop > offset.top ) && ( scrollTop < offset.top + tableHeight ) ? 'visible' : 'hidden',
|
4315
|
-
cssSettings = { visibility : isVisible };
|
4316
|
-
|
4317
|
-
if ($attach.length) {
|
4318
|
-
cssSettings.top = yWindow ? scrollTop - $attach.offset().top : $attach.scrollTop();
|
4319
|
-
}
|
4320
|
-
if (xWindow) {
|
4321
|
-
// adjust when scrolling horizontally - fixes issue #143
|
4322
|
-
cssSettings.left = $table.offset().left - parseInt($table.css('margin-left'), 10) - $xScroll.scrollLeft() - spacing;
|
4323
|
-
}
|
4324
|
-
if ($nestedSticky.length) {
|
4325
|
-
cssSettings.top = ( cssSettings.top || 0 ) + stickyOffset + nestedStickyTop;
|
4326
|
-
}
|
4327
|
-
$stickyWrap
|
4328
|
-
.removeClass( ts.css.stickyVis + ' ' + ts.css.stickyHide )
|
4329
|
-
.addClass( isVisible === 'visible' ? ts.css.stickyVis : ts.css.stickyHide )
|
4330
|
-
.css(cssSettings);
|
4331
|
-
if (isVisible !== laststate || event.type === 'resize') {
|
4332
|
-
// make sure the column widths match
|
4333
|
-
resizeHeader();
|
4334
|
-
laststate = isVisible;
|
4335
|
-
}
|
4336
|
-
});
|
4391
|
+
.unbind( ('scroll resize '.split(' ').join( namespace )).replace(/\s+/g, ' ') )
|
4392
|
+
.bind('scroll resize '.split(' ').join( namespace ), function( event ) {
|
4393
|
+
scrollSticky( event.type === 'resize' );
|
4394
|
+
});
|
4395
|
+
c.$table
|
4396
|
+
.unbind('stickyHeadersUpdate' + namespace)
|
4397
|
+
.bind('stickyHeadersUpdate' + namespace, function(){
|
4398
|
+
scrollSticky( true );
|
4399
|
+
});
|
4400
|
+
|
4337
4401
|
if (wo.stickyHeaders_addResizeEvent) {
|
4338
4402
|
ts.addHeaderResizeEvent(table);
|
4339
4403
|
}
|
@@ -4369,7 +4433,7 @@ ts.addWidget({
|
|
4369
4433
|
var namespace = c.namespace + 'stickyheaders ';
|
4370
4434
|
c.$table
|
4371
4435
|
.removeClass('hasStickyHeaders')
|
4372
|
-
.unbind( ('pagerComplete filterEnd '.split(' ').join(namespace)).replace(/\s+/g, ' ') )
|
4436
|
+
.unbind( ('pagerComplete filterEnd stickyHeadersUpdate '.split(' ').join(namespace)).replace(/\s+/g, ' ') )
|
4373
4437
|
.next('.' + ts.css.stickyWrap).remove();
|
4374
4438
|
if (wo.$sticky && wo.$sticky.length) { wo.$sticky.remove(); } // remove cloned table
|
4375
4439
|
$(window)
|
@@ -4383,7 +4447,8 @@ ts.addWidget({
|
|
4383
4447
|
|
4384
4448
|
})(jQuery, window);
|
4385
4449
|
|
4386
|
-
/*! Widget: resizable - updated
|
4450
|
+
/*! Widget: resizable - updated 6/26/2015 (v2.22.2) */
|
4451
|
+
/*jshint browser:true, jquery:true, unused:false */
|
4387
4452
|
;(function ($, window) {
|
4388
4453
|
'use strict';
|
4389
4454
|
var ts = $.tablesorter || {};
|
@@ -4402,8 +4467,8 @@ $(function(){
|
|
4402
4467
|
'-khtml-user-select: none; -webkit-user-select: none; user-select: none; }' +
|
4403
4468
|
'.' + ts.css.resizableContainer + ' { position: relative; height: 1px; }' +
|
4404
4469
|
// make handle z-index > than stickyHeader z-index, so the handle stays above sticky header
|
4405
|
-
'.' + ts.css.resizableHandle + ' { position: absolute; display: inline-block; width: 8px;
|
4406
|
-
'cursor: ew-resize; z-index: 3; user-select: none; -moz-user-select: none; }' +
|
4470
|
+
'.' + ts.css.resizableHandle + ' { position: absolute; display: inline-block; width: 8px;' +
|
4471
|
+
'top: 1px; cursor: ew-resize; z-index: 3; user-select: none; -moz-user-select: none; }' +
|
4407
4472
|
'</style>';
|
4408
4473
|
$(s).appendTo('body');
|
4409
4474
|
});
|
@@ -4412,34 +4477,69 @@ ts.resizable = {
|
|
4412
4477
|
init : function( c, wo ) {
|
4413
4478
|
if ( c.$table.hasClass( 'hasResizable' ) ) { return; }
|
4414
4479
|
c.$table.addClass( 'hasResizable' );
|
4415
|
-
|
4480
|
+
|
4481
|
+
var noResize, $header, column, storedSizes, tmp,
|
4482
|
+
$table = c.$table,
|
4483
|
+
$parent = $table.parent(),
|
4484
|
+
marginTop = parseInt( $table.css( 'margin-top' ), 10 ),
|
4416
4485
|
|
4417
4486
|
// internal variables
|
4418
|
-
wo.resizable_ = {
|
4419
|
-
|
4487
|
+
vars = wo.resizable_ = {
|
4488
|
+
useStorage : ts.storage && wo.resizable !== false,
|
4489
|
+
$wrap : $parent,
|
4420
4490
|
mouseXPosition : 0,
|
4421
4491
|
$target : null,
|
4422
4492
|
$next : null,
|
4423
|
-
overflow :
|
4424
|
-
|
4493
|
+
overflow : $parent.css('overflow') === 'auto' ||
|
4494
|
+
$parent.css('overflow') === 'scroll' ||
|
4495
|
+
$parent.css('overflow-x') === 'auto' ||
|
4496
|
+
$parent.css('overflow-x') === 'scroll',
|
4425
4497
|
storedSizes : []
|
4426
4498
|
};
|
4427
4499
|
|
4428
|
-
|
4429
|
-
|
4500
|
+
// set default widths
|
4501
|
+
ts.resizableReset( c.table, true );
|
4502
|
+
|
4503
|
+
// now get measurements!
|
4504
|
+
vars.tableWidth = $table.width();
|
4505
|
+
// attempt to autodetect
|
4506
|
+
vars.fullWidth = Math.abs( $parent.width() - vars.tableWidth ) < 20;
|
4507
|
+
|
4508
|
+
/*
|
4509
|
+
// Hacky method to determine if table width is set to "auto"
|
4510
|
+
// http://stackoverflow.com/a/20892048/145346
|
4511
|
+
if ( !vars.fullWidth ) {
|
4512
|
+
tmp = $table.width();
|
4513
|
+
$header = $table.wrap('<span>').parent(); // temp variable
|
4514
|
+
storedSizes = parseInt( $table.css( 'margin-left' ), 10 ) || 0;
|
4515
|
+
$table.css( 'margin-left', storedSizes + 50 );
|
4516
|
+
vars.tableWidth = $header.width() > tmp ? 'auto' : tmp;
|
4517
|
+
$table.css( 'margin-left', storedSizes ? storedSizes : '' );
|
4518
|
+
$header = null;
|
4519
|
+
$table.unwrap('<span>');
|
4520
|
+
}
|
4521
|
+
*/
|
4430
4522
|
|
4431
|
-
|
4523
|
+
if ( vars.useStorage && vars.overflow ) {
|
4524
|
+
// save table width
|
4525
|
+
ts.storage( c.table, 'tablesorter-table-original-css-width', vars.tableWidth );
|
4526
|
+
tmp = ts.storage( c.table, 'tablesorter-table-resized-width' ) || 'auto';
|
4527
|
+
ts.resizable.setWidth( $table, tmp, true );
|
4528
|
+
}
|
4529
|
+
wo.resizable_.storedSizes = storedSizes = ( vars.useStorage ?
|
4432
4530
|
ts.storage( c.table, ts.css.resizableStorage ) :
|
4433
4531
|
[] ) || [];
|
4434
4532
|
ts.resizable.setWidths( c, wo, storedSizes );
|
4533
|
+
ts.resizable.updateStoredSizes( c, wo );
|
4435
4534
|
|
4436
4535
|
wo.$resizable_container = $( '<div class="' + ts.css.resizableContainer + '">' )
|
4437
4536
|
.css({ top : marginTop })
|
4438
|
-
.insertBefore(
|
4537
|
+
.insertBefore( $table );
|
4439
4538
|
// add container
|
4440
4539
|
for ( column = 0; column < c.columns; column++ ) {
|
4441
4540
|
$header = c.$headerIndexed[ column ];
|
4442
|
-
|
4541
|
+
tmp = ts.getColumnData( c.table, c.headers, column );
|
4542
|
+
noResize = ts.getData( $header, tmp, 'resizable' ) === 'false';
|
4443
4543
|
if ( !noResize ) {
|
4444
4544
|
$( '<div class="' + ts.css.resizableHandle + '">' )
|
4445
4545
|
.appendTo( wo.$resizable_container )
|
@@ -4451,37 +4551,52 @@ ts.resizable = {
|
|
4451
4551
|
.bind( 'selectstart', false );
|
4452
4552
|
}
|
4453
4553
|
}
|
4454
|
-
|
4554
|
+
$table.one('tablesorter-initialized', function() {
|
4455
4555
|
ts.resizable.setHandlePosition( c, wo );
|
4456
4556
|
ts.resizable.bindings( this.config, this.config.widgetOptions );
|
4457
4557
|
});
|
4458
4558
|
},
|
4459
4559
|
|
4460
|
-
|
4560
|
+
updateStoredSizes : function( c, wo ) {
|
4561
|
+
var column, $header,
|
4562
|
+
len = c.columns,
|
4563
|
+
vars = wo.resizable_;
|
4564
|
+
vars.storedSizes = [];
|
4565
|
+
for ( column = 0; column < len; column++ ) {
|
4566
|
+
$header = c.$headerIndexed[ column ];
|
4567
|
+
vars.storedSizes[ column ] = $header.is(':visible') ? $header.width() : 0;
|
4568
|
+
}
|
4569
|
+
},
|
4570
|
+
|
4571
|
+
setWidth : function( $el, width, overflow ) {
|
4572
|
+
// overflow tables need min & max width set as well
|
4461
4573
|
$el.css({
|
4462
4574
|
'width' : width,
|
4463
|
-
'min-width' : '',
|
4464
|
-
'max-width' : ''
|
4575
|
+
'min-width' : overflow ? width : '',
|
4576
|
+
'max-width' : overflow ? width : ''
|
4465
4577
|
});
|
4466
4578
|
},
|
4467
4579
|
|
4468
4580
|
setWidths : function( c, wo, storedSizes ) {
|
4469
|
-
var column,
|
4581
|
+
var column, $temp,
|
4582
|
+
vars = wo.resizable_,
|
4470
4583
|
$extra = $( c.namespace + '_extra_headers' ),
|
4471
4584
|
$col = c.$table.children( 'colgroup' ).children( 'col' );
|
4472
|
-
storedSizes = storedSizes ||
|
4585
|
+
storedSizes = storedSizes || vars.storedSizes || [];
|
4473
4586
|
// process only if table ID or url match
|
4474
4587
|
if ( storedSizes.length ) {
|
4475
4588
|
for ( column = 0; column < c.columns; column++ ) {
|
4476
4589
|
// set saved resizable widths
|
4477
|
-
c.$headerIndexed[ column ]
|
4590
|
+
ts.resizable.setWidth( c.$headerIndexed[ column ], storedSizes[ column ], vars.overflow );
|
4478
4591
|
if ( $extra.length ) {
|
4479
4592
|
// stickyHeaders needs to modify min & max width as well
|
4480
|
-
|
4593
|
+
$temp = $extra.eq( column ).add( $col.eq( column ) );
|
4594
|
+
ts.resizable.setWidth( $temp, storedSizes[ column ], vars.overflow );
|
4481
4595
|
}
|
4482
4596
|
}
|
4483
|
-
|
4484
|
-
|
4597
|
+
$temp = $( c.namespace + '_extra_table' );
|
4598
|
+
if ( $temp.length && !ts.hasWidget( c.table, 'scroller' ) ) {
|
4599
|
+
ts.resizable.setWidth( $temp, c.$table.outerWidth(), vars.overflow );
|
4485
4600
|
}
|
4486
4601
|
}
|
4487
4602
|
},
|
@@ -4541,7 +4656,7 @@ ts.resizable = {
|
|
4541
4656
|
var namespace = c.namespace + 'tsresize';
|
4542
4657
|
wo.$resizable_container.children().bind( 'mousedown', function( event ) {
|
4543
4658
|
// save header cell and mouse position
|
4544
|
-
var column,
|
4659
|
+
var column,
|
4545
4660
|
vars = wo.resizable_,
|
4546
4661
|
$extras = $( c.namespace + '_extra_headers' ),
|
4547
4662
|
$header = $( event.target ).data( 'header' );
|
@@ -4560,11 +4675,7 @@ ts.resizable = {
|
|
4560
4675
|
vars.next = column;
|
4561
4676
|
|
4562
4677
|
vars.mouseXPosition = event.pageX;
|
4563
|
-
|
4564
|
-
for ( column = 0; column < c.columns; column++ ) {
|
4565
|
-
$this = c.$headerIndexed[ column ];
|
4566
|
-
vars.storedSizes[ column ] = $this.is(':visible') ? $this.width() : 0;
|
4567
|
-
}
|
4678
|
+
ts.resizable.updateStoredSizes( c, wo );
|
4568
4679
|
ts.resizable.toggleTextSelection( c, true );
|
4569
4680
|
});
|
4570
4681
|
|
@@ -4615,47 +4726,51 @@ ts.resizable = {
|
|
4615
4726
|
mouseMove : function( c, wo, event ) {
|
4616
4727
|
if ( wo.resizable_.mouseXPosition === 0 || !wo.resizable_.$target ) { return; }
|
4617
4728
|
// resize columns
|
4618
|
-
var
|
4729
|
+
var column,
|
4730
|
+
total = 0,
|
4731
|
+
vars = wo.resizable_,
|
4619
4732
|
$next = vars.$next,
|
4733
|
+
tar = vars.storedSizes[ vars.target ],
|
4620
4734
|
leftEdge = event.pageX - vars.mouseXPosition;
|
4621
|
-
if ( vars.
|
4622
|
-
|
4623
|
-
|
4624
|
-
|
4625
|
-
|
4626
|
-
|
4627
|
-
|
4628
|
-
|
4629
|
-
|
4735
|
+
if ( vars.overflow ) {
|
4736
|
+
if ( tar + leftEdge > 0 ) {
|
4737
|
+
vars.storedSizes[ vars.target ] += leftEdge;
|
4738
|
+
ts.resizable.setWidth( vars.$target, vars.storedSizes[ vars.target ], true );
|
4739
|
+
// update the entire table width
|
4740
|
+
for ( column = 0; column < c.columns; column++ ) {
|
4741
|
+
total += vars.storedSizes[ column ];
|
4742
|
+
}
|
4743
|
+
ts.resizable.setWidth( c.$table.add( $( c.namespace + '_extra_table' ) ), total );
|
4744
|
+
}
|
4630
4745
|
if ( !$next.length ) {
|
4631
4746
|
// if expanding right-most column, scroll the wrapper
|
4632
4747
|
vars.$wrap[0].scrollLeft = c.$table.width();
|
4633
4748
|
}
|
4749
|
+
} else if ( vars.fullWidth ) {
|
4750
|
+
vars.storedSizes[ vars.target ] += leftEdge;
|
4751
|
+
vars.storedSizes[ vars.next ] -= leftEdge;
|
4752
|
+
ts.resizable.setWidths( c, wo );
|
4634
4753
|
} else {
|
4635
4754
|
vars.storedSizes[ vars.target ] += leftEdge;
|
4636
4755
|
ts.resizable.setWidths( c, wo );
|
4637
4756
|
}
|
4638
4757
|
vars.mouseXPosition = event.pageX;
|
4758
|
+
// dynamically update sticky header widths
|
4759
|
+
c.$table.trigger('stickyHeadersUpdate');
|
4639
4760
|
},
|
4640
4761
|
|
4641
4762
|
stopResize : function( c, wo ) {
|
4642
|
-
var
|
4643
|
-
|
4644
|
-
vars.
|
4645
|
-
|
4646
|
-
vars.storedSizes
|
4647
|
-
|
4648
|
-
$this = c.$headerIndexed[ column ];
|
4649
|
-
vars.storedSizes[ column ] = $this.is(':visible') ? $this.width() : 0;
|
4650
|
-
}
|
4651
|
-
if ( wo.resizable !== false ) {
|
4652
|
-
// save all column widths
|
4653
|
-
ts.storage( c.table, ts.css.resizableStorage, vars.storedSizes );
|
4654
|
-
}
|
4763
|
+
var vars = wo.resizable_;
|
4764
|
+
ts.resizable.updateStoredSizes( c, wo );
|
4765
|
+
if ( vars.useStorage ) {
|
4766
|
+
// save all column widths
|
4767
|
+
ts.storage( c.table, ts.css.resizableStorage, vars.storedSizes );
|
4768
|
+
ts.storage( c.table, 'tablesorter-table-resized-width', c.$table.width() );
|
4655
4769
|
}
|
4656
4770
|
vars.mouseXPosition = 0;
|
4657
4771
|
vars.$target = vars.$next = null;
|
4658
|
-
|
4772
|
+
// will update stickyHeaders, just in case, see #912
|
4773
|
+
c.$table.trigger('stickyHeadersUpdate');
|
4659
4774
|
}
|
4660
4775
|
};
|
4661
4776
|
|
@@ -4666,11 +4781,12 @@ ts.addWidget({
|
|
4666
4781
|
id: "resizable",
|
4667
4782
|
priority: 40,
|
4668
4783
|
options: {
|
4669
|
-
resizable : true,
|
4784
|
+
resizable : true, // save column widths to storage
|
4670
4785
|
resizable_addLastColumn : false,
|
4671
4786
|
resizable_widths : [],
|
4672
4787
|
resizable_throttle : false, // set to true (5ms) or any number 0-10 range
|
4673
|
-
resizable_targetLast : false
|
4788
|
+
resizable_targetLast : false,
|
4789
|
+
resizable_fullWidth : null
|
4674
4790
|
},
|
4675
4791
|
init: function(table, thisWidget, c, wo) {
|
4676
4792
|
ts.resizable.init( c, wo );
|
@@ -4694,19 +4810,28 @@ ts.resizableReset = function( table, refreshing ) {
|
|
4694
4810
|
$( table ).each(function(){
|
4695
4811
|
var index, $t,
|
4696
4812
|
c = this.config,
|
4697
|
-
wo = c && c.widgetOptions
|
4813
|
+
wo = c && c.widgetOptions,
|
4814
|
+
vars = wo.resizable_;
|
4698
4815
|
if ( table && c && c.$headerIndexed.length ) {
|
4816
|
+
// restore the initial table width
|
4817
|
+
if ( vars.overflow && vars.tableWidth ) {
|
4818
|
+
ts.resizable.setWidth( c.$table, vars.tableWidth, true );
|
4819
|
+
if ( vars.useStorage ) {
|
4820
|
+
ts.storage( table, 'tablesorter-table-resized-width', 'auto' );
|
4821
|
+
}
|
4822
|
+
}
|
4699
4823
|
for ( index = 0; index < c.columns; index++ ) {
|
4700
4824
|
$t = c.$headerIndexed[ index ];
|
4701
4825
|
if ( wo.resizable_widths && wo.resizable_widths[ index ] ) {
|
4702
|
-
|
4826
|
+
ts.resizable.setWidth( $t, wo.resizable_widths[ index ], vars.overflow );
|
4703
4827
|
} else if ( !$t.hasClass( 'resizable-false' ) ) {
|
4704
4828
|
// don't clear the width of any column that is not resizable
|
4705
|
-
|
4829
|
+
ts.resizable.setWidth( $t, '', vars.overflow );
|
4706
4830
|
}
|
4707
4831
|
}
|
4832
|
+
|
4708
4833
|
// reset stickyHeader widths
|
4709
|
-
|
4834
|
+
c.$table.trigger( 'stickyHeadersUpdate' );
|
4710
4835
|
if ( ts.storage && !refreshing ) {
|
4711
4836
|
ts.storage( this, ts.css.resizableStorage, {} );
|
4712
4837
|
}
|