jquery-tablesorter 1.17.1 → 1.17.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|