jquery-tablesorter 1.16.5 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/jquery-tablesorter/version.rb +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +38 -27
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +1104 -839
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +167 -123
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +938 -717
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date.js +5 -5
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-globalize.js +46 -0
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +96 -72
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-named-numbers.js +6 -5
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-network.js +26 -17
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columns.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +95 -42
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +921 -700
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +5 -3
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +22 -20
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +7 -5
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +40 -29
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +6 -6
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-saveSort.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +53 -31
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-storage.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-uitheme.js +1 -1
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.black-ice.css +2 -1
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.blue.css +2 -1
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap.css +2 -1
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap_2.css +8 -6
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.dark.css +2 -1
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.default.css +1 -1
- metadata +3 -2
@@ -110,7 +110,7 @@ ts.grouping = {
|
|
110
110
|
currentGroup = wo.group_formatter((currentGroup || '').toString(), column, table, c, wo) || currentGroup;
|
111
111
|
}
|
112
112
|
$rows.eq(rowIndex).before('<tr class="group-header ' + c.selectorRemove.slice(1) +
|
113
|
-
'" unselectable="on"><td colspan="' +
|
113
|
+
'" unselectable="on"' + ( c.tabIndex ? ' tabindex="0"' : '' ) + '><td colspan="' +
|
114
114
|
c.columns + '">' + (wo.group_collapsible ? '<i/>' : '') + '<span class="group-name">' +
|
115
115
|
currentGroup + '</span><span class="group-count"></span></td></tr>');
|
116
116
|
if (wo.group_saveGroups && !savedGroup && wo.group_collapsed && wo.group_collapsible) {
|
@@ -157,13 +157,15 @@ ts.grouping = {
|
|
157
157
|
if (wo.group_collapsible) {
|
158
158
|
wo.group_currentGroups = [];
|
159
159
|
// .on() requires jQuery 1.7+
|
160
|
-
c.$table.on('click toggleGroup', 'tr.group-header', function(event){
|
160
|
+
c.$table.on('click toggleGroup keyup', 'tr.group-header', function(event){
|
161
161
|
event.stopPropagation();
|
162
|
+
// pressing enter will toggle the group
|
163
|
+
if (event.type === 'keyup' && event.which !== 13) { return; }
|
162
164
|
var isCollapsed, $groups, indx,
|
163
165
|
$this = $(this),
|
164
166
|
name = $this.find('.group-name').text().toLowerCase();
|
165
167
|
// use shift-click to toggle ALL groups
|
166
|
-
if (event.type === 'click'
|
168
|
+
if (event.shiftKey && (event.type === 'click' || event.type ==='keyup')) {
|
167
169
|
$this.siblings('.group-header').trigger('toggleGroup');
|
168
170
|
}
|
169
171
|
$this.toggleClass('collapsed');
|
@@ -1,10 +1,10 @@
|
|
1
|
-
/*! Widget: math - updated
|
1
|
+
/*! Widget: math - updated 5/17/2015 (v2.22.0) *//*
|
2
2
|
* Requires tablesorter v2.16+ and jQuery 1.7+
|
3
3
|
* by Rob Garrison
|
4
4
|
*/
|
5
5
|
/*jshint browser:true, jquery:true, unused:false */
|
6
6
|
/*global jQuery: false */
|
7
|
-
;(function($){
|
7
|
+
;(function($) {
|
8
8
|
"use strict";
|
9
9
|
|
10
10
|
var ts = $.tablesorter,
|
@@ -20,10 +20,10 @@
|
|
20
20
|
c = table.config,
|
21
21
|
arry = [],
|
22
22
|
$row = $el.closest('tr'),
|
23
|
-
$cells = $row.children();
|
23
|
+
$cells = $row.children().not('[' + dataAttrib + '=ignore]');
|
24
24
|
if (!$row.hasClass(wo.filter_filteredRow || 'filtered')) {
|
25
25
|
if (wo.math_ignore.length) {
|
26
|
-
$cells = $cells.not('[
|
26
|
+
$cells = $cells.not('[data-column=' + wo.math_ignore.join('],[data-column=') + ']');
|
27
27
|
}
|
28
28
|
arry = $cells.not($el).map(function(){
|
29
29
|
$t = $(this);
|
@@ -31,7 +31,7 @@
|
|
31
31
|
if (typeof txt === "undefined") {
|
32
32
|
txt = this.textContent || $t.text();
|
33
33
|
}
|
34
|
-
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table);
|
34
|
+
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table) || 0;
|
35
35
|
return isNaN(txt) ? 0 : txt;
|
36
36
|
}).get();
|
37
37
|
}
|
@@ -39,7 +39,7 @@
|
|
39
39
|
},
|
40
40
|
|
41
41
|
// get all of the column numerical values in an arry
|
42
|
-
getColumn : function(table, wo, $el, type, dataAttrib){
|
42
|
+
getColumn : function(table, wo, $el, type, dataAttrib) {
|
43
43
|
var i, txt, $t, len, mathAbove,
|
44
44
|
arry = [],
|
45
45
|
c = table.config,
|
@@ -65,7 +65,7 @@
|
|
65
65
|
if (typeof txt === "undefined") {
|
66
66
|
txt = $t[0].textContent || $t.text();
|
67
67
|
}
|
68
|
-
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table);
|
68
|
+
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table) || 0;
|
69
69
|
arry.push(isNaN(txt) ? 0 : txt);
|
70
70
|
}
|
71
71
|
}
|
@@ -79,7 +79,8 @@
|
|
79
79
|
if (typeof txt === "undefined") {
|
80
80
|
txt = ($t[0] ? $t[0].textContent : '') || $t.text();
|
81
81
|
}
|
82
|
-
|
82
|
+
// isNaN('') => false
|
83
|
+
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table) || 0;
|
83
84
|
arry.push(isNaN(txt) ? 0 : txt);
|
84
85
|
}
|
85
86
|
});
|
@@ -88,7 +89,7 @@
|
|
88
89
|
},
|
89
90
|
|
90
91
|
// get all of the column numerical values in an arry
|
91
|
-
getAll : function(table, wo, dataAttrib){
|
92
|
+
getAll : function(table, wo, dataAttrib) {
|
92
93
|
var txt, $t, col,
|
93
94
|
arry = [],
|
94
95
|
c = table.config,
|
@@ -104,7 +105,7 @@
|
|
104
105
|
if (typeof txt === "undefined") {
|
105
106
|
txt = ($t[0] ? $t[0].textContent : '') || $t.text();
|
106
107
|
}
|
107
|
-
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table);
|
108
|
+
txt = ts.formatFloat(txt.replace(/[^\w,. \-()]/g, ""), table) || 0;
|
108
109
|
arry.push(isNaN(txt) ? 0 : txt);
|
109
110
|
}
|
110
111
|
});
|
@@ -113,7 +114,7 @@
|
|
113
114
|
return arry;
|
114
115
|
},
|
115
116
|
|
116
|
-
recalculate : function(table, c, wo, init){
|
117
|
+
recalculate : function(table, c, wo, init) {
|
117
118
|
if (c && (!wo.math_isUpdating || init)) {
|
118
119
|
|
119
120
|
// add data-column attributes to all table cells
|
@@ -364,7 +365,7 @@
|
|
364
365
|
return Math.sqrt( vars );
|
365
366
|
},
|
366
367
|
// standard deviation (population)
|
367
|
-
stdevp : function(arry){
|
368
|
+
stdevp : function(arry) {
|
368
369
|
var varp = ts.equations.variance(arry, true);
|
369
370
|
return Math.sqrt( varp );
|
370
371
|
}
|
@@ -391,28 +392,29 @@
|
|
391
392
|
math_suffix : '',
|
392
393
|
math_event : 'recalculate'
|
393
394
|
},
|
394
|
-
init : function(table, thisWidget, c, wo){
|
395
|
+
init : function(table, thisWidget, c, wo) {
|
395
396
|
c.$table
|
396
397
|
.off( (math.events + ' updateComplete.tsmath ' + wo.math_event).replace(/\s+/g, ' ') )
|
397
|
-
.on(math.events + ' ' + wo.math_event, function(e){
|
398
|
+
.on(math.events + ' ' + wo.math_event, function(e) {
|
398
399
|
var init = e.type === 'tablesorter-initialized';
|
399
|
-
if (
|
400
|
-
|
401
|
-
|
402
|
-
|
400
|
+
if ( !wo.math_isUpdating || init ) {
|
401
|
+
if ( !/filter/.test(e.type) ) {
|
402
|
+
// redo data-column indexes on update
|
403
|
+
ts.computeColumnIndex( c.$table.children('tbody').children() );
|
404
|
+
}
|
403
405
|
math.recalculate( table, c, wo, init );
|
404
406
|
}
|
405
407
|
})
|
406
408
|
.on('updateComplete.tsmath', function(){
|
407
409
|
setTimeout(function(){
|
408
410
|
wo.math_isUpdating = false;
|
409
|
-
},
|
411
|
+
}, 20);
|
410
412
|
});
|
411
413
|
wo.math_isUpdating = false;
|
412
414
|
},
|
413
415
|
// this remove function is called when using the refreshWidgets method or when destroying the tablesorter plugin
|
414
416
|
// this function only applies to tablesorter v2.4+
|
415
|
-
remove: function(table, c, wo, refreshing){
|
417
|
+
remove: function(table, c, wo, refreshing) {
|
416
418
|
if (refreshing) { return; }
|
417
419
|
$(table)
|
418
420
|
.off( (math.events + ' updateComplete.tsmath ' + wo.math_event).replace(/\s+/g, ' ') )
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! Widget: output - updated
|
1
|
+
/*! Widget: output - updated 5/17/2015 (v2.22.0) *//*
|
2
2
|
* Requires tablesorter v2.8+ and jQuery 1.7+
|
3
3
|
* Modified from:
|
4
4
|
* HTML Table to CSV: http://www.kunalbabre.com/projects/table2CSV.php (License unknown?)
|
@@ -79,8 +79,8 @@ output = ts.output = {
|
|
79
79
|
}
|
80
80
|
}
|
81
81
|
|
82
|
-
// don't include hidden columns
|
83
|
-
if ( $this.css('display') !== 'none' ) {
|
82
|
+
// don't include hidden columns, unless option is set
|
83
|
+
if ( !wo.output_hiddenColumns && $this.css('display') !== 'none' ) {
|
84
84
|
// skip column if already defined
|
85
85
|
while (typeof tmpRow[rowIndex][cellIndex] !== 'undefined') { cellIndex++; }
|
86
86
|
tmpRow[rowIndex][cellIndex] = tmpRow[rowIndex][cellIndex] ||
|
@@ -255,8 +255,9 @@ output = ts.output = {
|
|
255
255
|
// Use HTML5 Blob if browser supports it
|
256
256
|
if ( gotBlob ) {
|
257
257
|
|
258
|
-
window.URL = window.
|
259
|
-
|
258
|
+
window.URL = window.URL || window.webkitURL;
|
259
|
+
// prepend BOM for utf-8 encoding - see https://github.com/eligrey/FileSaver.js/blob/master/FileSaver.js#L140
|
260
|
+
blob = new Blob( [ '\ufeff', data ], { type: wo.output_encoding } );
|
260
261
|
|
261
262
|
if (nav.msSaveBlob) {
|
262
263
|
// IE 10+
|
@@ -294,6 +295,7 @@ ts.addWidget({
|
|
294
295
|
options: {
|
295
296
|
output_separator : ',', // set to "json", "array" or any separator
|
296
297
|
output_ignoreColumns : [], // columns to ignore [0, 1,... ] (zero-based index)
|
298
|
+
output_hiddenColumns : false, // include hidden columns in the output
|
297
299
|
output_includeFooter : false, // include footer rows in the output
|
298
300
|
output_dataAttrib : 'data-name', // header attrib containing modified header name
|
299
301
|
output_headerRows : false, // if true, include multiple header rows (JSON only)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! Widget: Pager - updated
|
1
|
+
/*! Widget: Pager - updated 5/17/2015 (v2.22.0) */
|
2
2
|
/* Requires tablesorter v2.8+ and jQuery 1.7+
|
3
3
|
* by Rob Garrison
|
4
4
|
*/
|
@@ -638,11 +638,11 @@ tsp = ts.pager = {
|
|
638
638
|
// process data
|
639
639
|
if ( $.isFunction(wo.pager_ajaxProcessing) ) {
|
640
640
|
// ajaxProcessing result: [ total, rows, headers ]
|
641
|
-
var i, j, t, hsh, $f, $sh, th, d, l, rr_count,
|
642
|
-
$
|
641
|
+
var i, j, t, hsh, $f, $sh, $headers, $h, icon, th, d, l, rr_count, len,
|
642
|
+
$table = c.$table,
|
643
643
|
tds = '',
|
644
644
|
result = wo.pager_ajaxProcessing(data, table, xhr) || [ 0, [] ],
|
645
|
-
hl = $
|
645
|
+
hl = $table.find('thead th').length;
|
646
646
|
|
647
647
|
// Clean up any previous error.
|
648
648
|
ts.showError(table);
|
@@ -698,28 +698,30 @@ tsp = ts.pager = {
|
|
698
698
|
wo.pager_processAjaxOnInit = true;
|
699
699
|
// only add new header text if the length matches
|
700
700
|
if ( th && th.length === hl ) {
|
701
|
-
hsh = $
|
701
|
+
hsh = $table.hasClass('hasStickyHeaders');
|
702
702
|
$sh = hsh ? wo.$sticky.children('thead:first').children('tr').children() : '';
|
703
|
-
$f = $
|
703
|
+
$f = $table.find('tfoot tr:first').children();
|
704
704
|
// don't change td headers (may contain pager)
|
705
|
-
c.$headers.filter('th')
|
706
|
-
|
705
|
+
$headers = c.$headers.filter( 'th ');
|
706
|
+
len = $headers.length;
|
707
|
+
for ( j = 0; j < len; j++ ) {
|
708
|
+
$h = $headers.eq( j );
|
707
709
|
// add new test within the first span it finds, or just in the header
|
708
|
-
if ( $
|
709
|
-
|
710
|
-
$
|
710
|
+
if ( $h.find('.' + ts.css.icon).length ) {
|
711
|
+
icon = $h.find('.' + ts.css.icon).clone(true);
|
712
|
+
$h.find('.tablesorter-header-inner').html( th[j] ).append(icon);
|
711
713
|
if ( hsh && $sh.length ) {
|
712
|
-
|
713
|
-
$sh.eq(j).find('.tablesorter-header-inner').html( th[j] ).append(
|
714
|
+
icon = $sh.eq(j).find('.' + ts.css.icon).clone(true);
|
715
|
+
$sh.eq(j).find('.tablesorter-header-inner').html( th[j] ).append(icon);
|
714
716
|
}
|
715
717
|
} else {
|
716
|
-
$
|
718
|
+
$h.find('.tablesorter-header-inner').html( th[j] );
|
717
719
|
if (hsh && $sh.length) {
|
718
720
|
$sh.eq(j).find('.tablesorter-header-inner').html( th[j] );
|
719
721
|
}
|
720
722
|
}
|
721
723
|
$f.eq(j).html( th[j] );
|
722
|
-
}
|
724
|
+
}
|
723
725
|
}
|
724
726
|
}
|
725
727
|
if (c.showProcessing) {
|
@@ -734,7 +736,7 @@ tsp = ts.pager = {
|
|
734
736
|
p.initializing = false;
|
735
737
|
// update display without triggering pager complete... before updating cache
|
736
738
|
tsp.updatePageDisplay(table, c, false);
|
737
|
-
$
|
739
|
+
$table.trigger('updateCache', [function(){
|
738
740
|
if (p.initialized) {
|
739
741
|
// apply widgets after table has rendered & after a delay to prevent
|
740
742
|
// multiple applyWidget blocking code from blocking this trigger
|
@@ -742,7 +744,7 @@ tsp = ts.pager = {
|
|
742
744
|
if (c.debug) {
|
743
745
|
ts.log('Pager: Triggering pagerChange');
|
744
746
|
}
|
745
|
-
$
|
747
|
+
$table
|
746
748
|
.trigger('applyWidgets')
|
747
749
|
.trigger('pagerChange', p);
|
748
750
|
tsp.updatePageDisplay(table, c);
|
@@ -898,7 +900,8 @@ tsp = ts.pager = {
|
|
898
900
|
},
|
899
901
|
|
900
902
|
showAllRows: function(table, c){
|
901
|
-
var
|
903
|
+
var index, $controls, len,
|
904
|
+
p = c.pager,
|
902
905
|
wo = c.widgetOptions;
|
903
906
|
if ( p.ajax ) {
|
904
907
|
tsp.pagerArrows(c, true);
|
@@ -920,9 +923,15 @@ tsp = ts.pager = {
|
|
920
923
|
}
|
921
924
|
}
|
922
925
|
// disable size selector
|
923
|
-
p.$size
|
924
|
-
|
925
|
-
|
926
|
+
$controls = p.$size
|
927
|
+
.add( p.$goto )
|
928
|
+
.add( p.$container.find( '.ts-startRow, .ts-page ' ) );
|
929
|
+
len = $controls.length;
|
930
|
+
for ( index = 0; index < len; index++ ) {
|
931
|
+
$controls.eq( index )
|
932
|
+
.attr( 'aria-disabled', 'true' )
|
933
|
+
.addClass( wo.pager_css.disabled )[0].disabled = true;
|
934
|
+
}
|
926
935
|
},
|
927
936
|
|
928
937
|
// updateCache if delayInit: true
|
@@ -1109,14 +1118,16 @@ tsp = ts.pager = {
|
|
1109
1118
|
};
|
1110
1119
|
|
1111
1120
|
// see #486
|
1112
|
-
ts.showError = function(table, message){
|
1113
|
-
$
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1121
|
+
ts.showError = function( table, message ) {
|
1122
|
+
var index, $row, c, wo, errorRow,
|
1123
|
+
$table = $( table ),
|
1124
|
+
len = $table.length;
|
1125
|
+
for ( index = 0; index < len; index++ ) {
|
1126
|
+
c = $table[ index ].config;
|
1127
|
+
if ( c ) {
|
1128
|
+
wo = c.widgetOptions;
|
1117
1129
|
errorRow = c.pager && c.pager.cssErrorRow || wo.pager_css && wo.pager_css.errorRow || 'tablesorter-errorRow';
|
1118
|
-
|
1119
|
-
if (typeof message === 'undefined') {
|
1130
|
+
if ( typeof message === 'undefined' ) {
|
1120
1131
|
c.$table.find('thead').find(c.selectorRemove).remove();
|
1121
1132
|
} else {
|
1122
1133
|
$row = ( /tr\>/.test(message) ? $(message) : $('<tr><td colspan="' + c.columns + '">' + message + '</td></tr>') )
|
@@ -1132,7 +1143,7 @@ ts.showError = function(table, message){
|
|
1132
1143
|
});
|
1133
1144
|
}
|
1134
1145
|
}
|
1135
|
-
}
|
1146
|
+
}
|
1136
1147
|
};
|
1137
1148
|
|
1138
1149
|
})(jQuery);
|
@@ -1,7 +1,7 @@
|
|
1
|
-
/*! Widget: resizable - updated
|
1
|
+
/*! Widget: resizable - updated 5/17/2015 (v2.22.0) */
|
2
2
|
;(function ($, window) {
|
3
3
|
'use strict';
|
4
|
-
var ts = $.tablesorter
|
4
|
+
var ts = $.tablesorter || {};
|
5
5
|
|
6
6
|
$.extend(ts.css, {
|
7
7
|
resizableContainer : 'tablesorter-resizable-container',
|
@@ -290,7 +290,7 @@ ts.addWidget({
|
|
290
290
|
init: function(table, thisWidget, c, wo) {
|
291
291
|
ts.resizable.init( c, wo );
|
292
292
|
},
|
293
|
-
remove: function( table, c, wo ) {
|
293
|
+
remove: function( table, c, wo, refreshing ) {
|
294
294
|
if (wo.$resizable_container) {
|
295
295
|
var namespace = c.namespace + 'tsresize';
|
296
296
|
c.$table.add( $( c.namespace + '_extra_table' ) )
|
@@ -299,13 +299,13 @@ ts.addWidget({
|
|
299
299
|
|
300
300
|
wo.$resizable_container.remove();
|
301
301
|
ts.resizable.toggleTextSelection( c, false );
|
302
|
-
ts.resizableReset( table );
|
302
|
+
ts.resizableReset( table, refreshing );
|
303
303
|
$( document ).unbind( 'mousemove' + namespace + ' mouseup' + namespace );
|
304
304
|
}
|
305
305
|
}
|
306
306
|
});
|
307
307
|
|
308
|
-
ts.resizableReset = function( table,
|
308
|
+
ts.resizableReset = function( table, refreshing ) {
|
309
309
|
$( table ).each(function(){
|
310
310
|
var index, $t,
|
311
311
|
c = this.config,
|
@@ -322,7 +322,7 @@ ts.resizableReset = function( table, nosave ) {
|
|
322
322
|
}
|
323
323
|
// reset stickyHeader widths
|
324
324
|
$( window ).trigger( 'resize' );
|
325
|
-
if ( ts.storage && !
|
325
|
+
if ( ts.storage && !refreshing ) {
|
326
326
|
ts.storage( this, ts.css.resizableStorage, {} );
|
327
327
|
}
|
328
328
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! Widget: scroller - updated
|
1
|
+
/*! Widget: scroller - updated 5/17/2015 (v2.22.0) *//*
|
2
2
|
Copyright (C) 2011 T. Connell & Associates, Inc.
|
3
3
|
|
4
4
|
Dual-licensed under the MIT and GPL licenses
|
@@ -40,14 +40,15 @@ var ts = $.tablesorter,
|
|
40
40
|
tscss = ts.css;
|
41
41
|
|
42
42
|
$.extend( ts.css, {
|
43
|
-
scrollerWrap
|
44
|
-
scrollerHeader
|
45
|
-
scrollerTable
|
46
|
-
scrollerFooter
|
47
|
-
scrollerFixed
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
scrollerWrap : 'tablesorter-scroller',
|
44
|
+
scrollerHeader : 'tablesorter-scroller-header',
|
45
|
+
scrollerTable : 'tablesorter-scroller-table',
|
46
|
+
scrollerFooter : 'tablesorter-scroller-footer',
|
47
|
+
scrollerFixed : 'tablesorter-scroller-fixed',
|
48
|
+
scrollerFixedPanel : 'tablesorter-scroller-fixed-panel',
|
49
|
+
scrollerHasFix : 'tablesorter-scroller-has-fixed-columns',
|
50
|
+
scrollerReset : 'tablesorter-scroller-reset',
|
51
|
+
scrollerRtl : 'tablesorter-scroller-rtl'
|
51
52
|
});
|
52
53
|
|
53
54
|
ts.addWidget({
|
@@ -61,6 +62,8 @@ ts.addWidget({
|
|
61
62
|
scroller_fixedColumns : 0,
|
62
63
|
// add hover highlighting to the fixed column (disable if it causes slowing)
|
63
64
|
scroller_rowHighlight : 'hover',
|
65
|
+
// add a fixed column overlay for styling
|
66
|
+
scroller_addFixedOverlay : false,
|
64
67
|
// bar width is now calculated; set a value to override
|
65
68
|
scroller_barWidth : null
|
66
69
|
},
|
@@ -95,6 +98,8 @@ $( function() {
|
|
95
98
|
'.' + tscss.scrollerReset + ' { width: auto !important; min-width: auto !important; max-width: auto !important; }' +
|
96
99
|
/* overall wrapper & table section wrappers */
|
97
100
|
'.' + tscss.scrollerWrap + ' { position: relative; overflow: hidden; }' +
|
101
|
+
/* add border-box sizing to all scroller widget tables; see #135 */
|
102
|
+
'.' + tscss.scrollerWrap + ' * { box-sizing: border-box; }' +
|
98
103
|
'.' + tscss.scrollerHeader + ', .' + tscss.scrollerFooter + ' { overflow: hidden; }' +
|
99
104
|
'.' + tscss.scrollerHeader + ' table.' + tscss.table + ' { margin-bottom: 0; }' +
|
100
105
|
'.' + tscss.scrollerFooter + ' table.' + tscss.table + ' thead { visibility: hidden, height: 0; overflow: hidden; }' +
|
@@ -104,17 +109,20 @@ $( function() {
|
|
104
109
|
/* hide filter row in clones */
|
105
110
|
'.' + tscss.scrollerTable + ' .' + ( tscss.filterRow || 'tablesorter-filter-row' ) + ',.' + tscss.scrollerFooter + ' .' +
|
106
111
|
( tscss.filterRow || 'tablesorter-filter-row' ) + ',.' + tscss.scrollerTable + ' tfoot { display: none; }' +
|
107
|
-
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixed + ' { position: absolute; top: 0; z-index: 1; left: 0 } ' +
|
108
|
-
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixed + '.' + tscss.scrollerRtl + ' { left: auto; right: 0 } ' +
|
109
112
|
/* visibly hide header rows in clones, so we can still set a width on it and still effect the rest of the column */
|
110
113
|
'.' + tscss.scrollerTable + ' table.' + tscss.table + ' thead tr.' + tscss.headerRow + ' *, .' + tscss.scrollerFooter +
|
111
114
|
' table.' + tscss.table + ' thead * { line-height: 0; height: 0; border: none; background-image: none; padding-top: 0;' +
|
112
115
|
' padding-bottom: 0; margin-top: 0; margin-bottom: 0; overflow: hidden; }' +
|
113
116
|
|
114
117
|
/*** fixed column ***/
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
+
/* disable pointer-events on fixed column wrapper or the user can't interact with the horizontal scrollbar */
|
119
|
+
'.' + tscss.scrollerFixed + ', .' + tscss.scrollerFixed + ' .' + tscss.scrollerFixedPanel + ' { pointer-events: none; }' +
|
120
|
+
/* enable pointer-events for fixed column children; see #135 & #878 */
|
121
|
+
'.' + tscss.scrollerFixed + ' > div { pointer-events: all; }' +
|
122
|
+
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixed + ' { position: absolute; top: 0; z-index: 1; left: 0 } ' +
|
123
|
+
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixed + '.' + tscss.scrollerRtl + ' { left: auto; right: 0 } ' +
|
124
|
+
/* add horizontal scroll bar; set to "auto", see #135 */
|
125
|
+
'.' + tscss.scrollerWrap + '.' + tscss.scrollerHasFix + ' > .' + tscss.scrollerTable + ' { overflow-x: auto; }' +
|
118
126
|
/* need to position the tbody & tfoot absolutely to hide the scrollbar & move the footer below the horizontal scrollbar */
|
119
127
|
'.' + tscss.scrollerFixed + ' .' + tscss.scrollerFooter + ' { position: absolute; bottom: 0; }' +
|
120
128
|
/* hide fixed tbody scrollbar - see http://goo.gl/VsLe6n */
|
@@ -123,6 +131,9 @@ $( function() {
|
|
123
131
|
/* remove right border of fixed header tables to hide the boundary */
|
124
132
|
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixed + ' table { border-right-color: transparent; padding-right: 0; }' +
|
125
133
|
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixed + '.' + tscss.scrollerRtl + ' table { border-left-color: transparent; padding-left: 0; }' +
|
134
|
+
|
135
|
+
/*** fixed column panel ***/
|
136
|
+
'.' + tscss.scrollerWrap + ' .' + tscss.scrollerFixedPanel + ' { position: absolute; top: 0; bottom: 0; z-index: 2; left: 0; right: 0; } ' +
|
126
137
|
'</style>';
|
127
138
|
$( style ).appendTo( 'body' );
|
128
139
|
});
|
@@ -131,6 +142,8 @@ ts.scroller = {
|
|
131
142
|
|
132
143
|
// Ugh.. Firefox misbehaves, so it needs to be detected
|
133
144
|
isFirefox : navigator.userAgent.toLowerCase().indexOf( 'firefox' ) > -1,
|
145
|
+
// old IE needs a wrap to hide the fixed column scrollbar; http://stackoverflow.com/a/24408672/145346
|
146
|
+
isOldIE : document.all && !window.atob,
|
134
147
|
|
135
148
|
hasScrollBar : function( $target ) {
|
136
149
|
return $target.get(0).scrollHeight > $target.height();
|
@@ -241,7 +254,7 @@ ts.scroller = {
|
|
241
254
|
|
242
255
|
// Sorting, so scroll to top
|
243
256
|
$table
|
244
|
-
.off( 'sortEnd'
|
257
|
+
.off( 'sortEnd setFixedColumnSize updateComplete '.split( ' ' ).join( namespace + ' ' ) )
|
245
258
|
.on( 'sortEnd' + namespace, function() {
|
246
259
|
if ( wo.scroller_upAfterSort ) {
|
247
260
|
$table.parent().animate({ scrollTop: 0 }, 'fast' );
|
@@ -253,11 +266,16 @@ ts.scroller = {
|
|
253
266
|
}
|
254
267
|
// remove fixed columns
|
255
268
|
wo.scroller_$container.find( '.' + tscss.scrollerFixed ).remove();
|
269
|
+
size = wo.scroller_fixedColumns;
|
256
270
|
if ( size > 0 && size < c.columns - 1 ) {
|
257
271
|
ts.scroller.setupFixed( c, wo );
|
258
272
|
} else {
|
259
273
|
wo.scroller_$container.removeClass( tscss.scrollerHasFix );
|
260
274
|
}
|
275
|
+
})
|
276
|
+
.on( 'updateComplete' + namespace, function() {
|
277
|
+
// adjust column sizes after an update
|
278
|
+
ts.scroller.resize( c, wo );
|
261
279
|
});
|
262
280
|
|
263
281
|
// Setup window.resizeEnd event
|
@@ -381,6 +399,9 @@ ts.scroller = {
|
|
381
399
|
.addClass( tscss.scrollerFixed )
|
382
400
|
.removeClass( tscss.scrollerWrap )
|
383
401
|
.attr( 'id', '' );
|
402
|
+
if ( wo.scroller_addFixedOverlay ) {
|
403
|
+
$fixedColumn.append( '<div class="' + tscss.scrollerFixedPanel + '">' );
|
404
|
+
}
|
384
405
|
$fixedTbody = $fixedColumn.find( '.' + tscss.scrollerTable );
|
385
406
|
$fixedTbody.find( 'table' )
|
386
407
|
.addClass( c.namespace.slice(1) + '_extra_table' )
|
@@ -414,14 +435,15 @@ ts.scroller = {
|
|
414
435
|
$el.eq( index ).prop( 'disabled', index < fixedColumns );
|
415
436
|
}
|
416
437
|
}
|
417
|
-
// enable visible fixed column filters
|
418
|
-
$fixedColumn.children( '.' + tscss.scrollerHeader ).find( '.' + tscss.filter ).css( 'pointer-events', 'all' );
|
419
438
|
}
|
420
439
|
|
421
440
|
// disable/enable tab indexes behind fixed column
|
422
|
-
c.$table
|
441
|
+
c.$table
|
442
|
+
.add( '.' + tscss.scrollerFooter + ' table' )
|
443
|
+
.children( 'thead' )
|
444
|
+
.children( 'tr.' + tscss.headerRow ).children().attr( 'tabindex', -1 );
|
423
445
|
$el = wo.scroller_$header
|
424
|
-
.add( $fixedColumn.find( '.' + tscss.scrollerTable + ' table
|
446
|
+
.add( $fixedColumn.find( '.' + tscss.scrollerTable + ' table' ) )
|
425
447
|
.children( 'thead' ).children( 'tr.' + tscss.headerRow );
|
426
448
|
len = $el.length;
|
427
449
|
for ( index = 0; index < len; index++ ) {
|
@@ -475,9 +497,9 @@ ts.scroller = {
|
|
475
497
|
});
|
476
498
|
}
|
477
499
|
|
478
|
-
/***
|
479
|
-
if ( ts.scroller.isFirefox ) {
|
480
|
-
$fixedTbody.wrap( '<div class="scroller-
|
500
|
+
/*** Scrollbar hack! Since we can't hide the scrollbar with css ***/
|
501
|
+
if ( ts.scroller.isFirefox || ts.scroller.isOldIE ) {
|
502
|
+
$fixedTbody.wrap( '<div class="scroller-scrollbar-hack" style="overflow:hidden;">' );
|
481
503
|
}
|
482
504
|
|
483
505
|
ts.scroller.updateFixed( c, wo, true );
|
@@ -508,7 +530,7 @@ ts.scroller = {
|
|
508
530
|
$fixedTbodies = $fixedTbodiesTable.children( 'tbody' ),
|
509
531
|
$fixedHeader = $fixedColumn.find( '.' + tscss.scrollerHeader ).children( 'table' ).children( 'thead' ),
|
510
532
|
// variables
|
511
|
-
|
533
|
+
tsScroller = ts.scroller,
|
512
534
|
scrollBarWidth = wo.scroller_barSetWidth,
|
513
535
|
fixedColumns = wo.scroller_fixedColumns,
|
514
536
|
// get dimensions
|
@@ -533,8 +555,8 @@ ts.scroller = {
|
|
533
555
|
}).get();
|
534
556
|
|
535
557
|
// set fixed column width
|
536
|
-
|
537
|
-
|
558
|
+
tsScroller.setWidth( $fixedColumn.add( $fixedColumn.children() ), totalWidth + borderRightWidth * 2 - borderSpacing );
|
559
|
+
tsScroller.setWidth( $fixedColumn.find( 'table' ), totalWidth + borderRightWidth );
|
538
560
|
|
539
561
|
// set fixed column height ( changes with filtering )
|
540
562
|
$fixedColumn.height( $wrapper.height() );
|
@@ -565,10 +587,10 @@ ts.scroller = {
|
|
565
587
|
$adjCol = $( $rows[ rowIndex ].outerHTML );
|
566
588
|
$adjCol.children( 'td, th' ).slice( fixedColumns ).remove();
|
567
589
|
// set row height
|
568
|
-
$adjCol.children().eq( 0 ).height( $rows.eq( rowIndex ).outerHeight() - ( isFirefox ? borderBottomWidth * 2 : 0 ) );
|
590
|
+
$adjCol.children().eq( 0 ).height( $rows.eq( rowIndex ).outerHeight() - ( tsScroller.isFirefox ? borderBottomWidth * 2 : 0 ) );
|
569
591
|
// still need to adjust tbody cell widths ( the previous row may now be filtered )
|
570
592
|
if ( rowIndex === 0 ) {
|
571
|
-
|
593
|
+
tsScroller.setWidth( $adjCol.children().eq( 0 ), widths[ 0 ] );
|
572
594
|
}
|
573
595
|
$fb.append( $adjCol );
|
574
596
|
}
|
@@ -576,7 +598,7 @@ ts.scroller = {
|
|
576
598
|
// adjust fixed header cell widths
|
577
599
|
$temp = $fixedColumn.find( 'thead' ).children( 'tr.' + tscss.headerRow );
|
578
600
|
for ( index = 0; index < fixedColumns; index++ ) {
|
579
|
-
|
601
|
+
tsScroller.setWidth( $temp.children( ':eq(' + index + ')' ), widths[ index ] );
|
580
602
|
}
|
581
603
|
|
582
604
|
// restore tbody
|
@@ -584,8 +606,8 @@ ts.scroller = {
|
|
584
606
|
}
|
585
607
|
}
|
586
608
|
|
587
|
-
/***
|
588
|
-
if ( isFirefox ) {
|
609
|
+
/*** scrollbar HACK! Since we can't hide the scrollbar with css ***/
|
610
|
+
if ( tsScroller.isFirefox || tsScroller.isOldIE ) {
|
589
611
|
$fixedTbodiesTable.parent().css({
|
590
612
|
'width' : totalWidth + scrollBarWidth + borderRightWidth
|
591
613
|
});
|
@@ -602,7 +624,7 @@ ts.scroller = {
|
|
602
624
|
.off( namespace )
|
603
625
|
.insertBefore( $wrap )
|
604
626
|
.find( 'thead' ).show().css( 'visibility', 'visible' )
|
605
|
-
.children( 'tr.' + tscss.headerRow
|
627
|
+
.children( 'tr.' + tscss.headerRow ).children().attr( 'tabindex', 0 )
|
606
628
|
.end()
|
607
629
|
.find( '.' + tscss.filterRow ).show().removeClass( tscss.filterRowHide );
|
608
630
|
$wrap.remove();
|