jquery-tablesorter 1.16.2 → 1.16.3
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 +8 -6
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +30 -20
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +343 -193
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +4 -4
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +3 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-select2.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +26 -23
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +2 -3
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +11 -5
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +277 -139
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +543 -220
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +3 -10
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-storage.js +28 -15
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-uitheme.js +7 -4
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.black-ice.css +5 -4
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.blue.css +8 -5
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap.css +5 -4
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap_2.css +6 -5
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.dark.css +6 -5
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.default.css +6 -5
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.dropbox.css +5 -5
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.green.css +13 -8
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.grey.css +8 -5
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.ice.css +16 -9
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.jui.css +4 -3
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.metro-dark.css +5 -4
- metadata +3 -3
@@ -1,5 +1,5 @@
|
|
1
|
-
/*! input & select
|
2
|
-
*
|
1
|
+
/*! parser: input & select - updated 3/26/2015 (v2.21.3) *//*
|
2
|
+
* for jQuery 1.7+ & tablesorter 2.7.11+
|
3
3
|
* Demo: http://mottie.github.com/tablesorter/docs/example-widget-grouping.html
|
4
4
|
*/
|
5
5
|
/*jshint browser: true, jquery:true, unused:false */
|
@@ -111,7 +111,7 @@
|
|
111
111
|
// bind to .tablesorter (default class name)
|
112
112
|
$(this).children('tbody')
|
113
113
|
.on('mouseleave', function(e){
|
114
|
-
restoreValue(e.target.
|
114
|
+
restoreValue(e.target.nodeName === 'TBODY');
|
115
115
|
})
|
116
116
|
.on('focus', 'select, input, textarea', function(){
|
117
117
|
$(this).data('ts-original-value', this.value);
|
@@ -129,7 +129,7 @@
|
|
129
129
|
}
|
130
130
|
// Update cell cache using... select: change, input: enter or textarea: alt + enter
|
131
131
|
if ( ( e.type === 'change' ) ||
|
132
|
-
( e.type === 'keyup' && e.which === 13 && ( e.target.
|
132
|
+
( e.type === 'keyup' && e.which === 13 && ( e.target.nodeName === 'INPUT' || e.target.nodeName === 'TEXTAREA' && e.altKey ) ) ) {
|
133
133
|
var undef,
|
134
134
|
$tar = $(e.target),
|
135
135
|
$cell = $tar.closest('td'),
|
@@ -1,4 +1,5 @@
|
|
1
|
-
/*! Build Table
|
1
|
+
/*! Widget: Build Table - updated 3/26/2015 (v2.21.3) *//*
|
2
|
+
* for tableSorter v2.16.0+
|
2
3
|
* by Rob Garrison
|
3
4
|
*/
|
4
5
|
/*jshint browser:true, jquery:true, unused:false */
|
@@ -12,7 +13,7 @@ var ts = $.tablesorter = $.tablesorter || {},
|
|
12
13
|
// data.rows contains an array of rows which contains an array of cells
|
13
14
|
bt = ts.buildTable = function(tar, c){
|
14
15
|
// add table if one doesn't exist
|
15
|
-
var $tbl = tar.
|
16
|
+
var $tbl = tar.nodeName === 'TABLE' ? $(tar) : $('<table>').appendTo(tar),
|
16
17
|
table = $tbl[0],
|
17
18
|
wo = c.widgetOptions = $.extend( true, {}, bt.defaults, c.widgetOptions ),
|
18
19
|
p = wo.build_processing,
|
data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-select2.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! Filter
|
1
|
+
/*! Widget: Filter formatter function select2 - updated 3/26/2015 (v2.21.3) *//*
|
2
2
|
* requires: jQuery 1.7.2+, tableSorter (FORK) 2.16+, filter widget 2.16+ and select2 v3.4.6+ plugin
|
3
3
|
*/
|
4
4
|
/*jshint browser:true, jquery:true, unused:false */
|
@@ -52,7 +52,7 @@ ts.filterFormatter.select2 = function($cell, indx, select2Def) {
|
|
52
52
|
v = v.join('\u0000');
|
53
53
|
}
|
54
54
|
// escape special regex characters (http://stackoverflow.com/a/9310752/145346)
|
55
|
-
v = v.replace(/[-[\]{}()
|
55
|
+
v = v.replace(/[-[\]{}()*+?.,/\\^$|#\s]/g, '\\$&');
|
56
56
|
// convert string back into an array
|
57
57
|
if (arry) {
|
58
58
|
v = v.split('\u0000');
|
@@ -1,14 +1,17 @@
|
|
1
|
-
/*! Widget: filter - updated 3/
|
1
|
+
/*! Widget: filter - updated 3/26/2015 (v2.21.3) *//*
|
2
2
|
* Requires tablesorter v2.8+ and jQuery 1.7+
|
3
3
|
* by Rob Garrison
|
4
4
|
*/
|
5
5
|
;(function ($) {
|
6
6
|
'use strict';
|
7
|
-
var ts = $.tablesorter = $.tablesorter || {}
|
7
|
+
var ts = $.tablesorter = $.tablesorter || {},
|
8
|
+
tscss = ts.css;
|
8
9
|
|
9
|
-
$.extend(
|
10
|
-
filterRow
|
11
|
-
filter
|
10
|
+
$.extend(tscss, {
|
11
|
+
filterRow : 'tablesorter-filter-row',
|
12
|
+
filter : 'tablesorter-filter',
|
13
|
+
filterDisabled : 'disabled',
|
14
|
+
filterRowHide : 'hideme'
|
12
15
|
});
|
13
16
|
|
14
17
|
ts.addWidget({
|
@@ -58,7 +61,7 @@ ts.addWidget({
|
|
58
61
|
// add .tsfilter namespace to all BUT search
|
59
62
|
.unbind( events.replace(/\s+/g, ' ') )
|
60
63
|
// remove the filter row even if refreshing, because the column might have been moved
|
61
|
-
.find('.' +
|
64
|
+
.find('.' + tscss.filterRow).remove();
|
62
65
|
if (refreshing) { return; }
|
63
66
|
for (tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {
|
64
67
|
$tbody = ts.processTbody(table, $tbodies.eq(tbodyIndex), true); // remove tbody
|
@@ -286,13 +289,13 @@ ts.filter = {
|
|
286
289
|
c.$table.bind( txt, function(event, filter) {
|
287
290
|
val = (wo.filter_hideEmpty && $.isEmptyObject(c.cache) && !(c.delayInit && event.type === 'appendCache'));
|
288
291
|
// hide filter row using the "filtered" class name
|
289
|
-
c.$table.find('.' +
|
292
|
+
c.$table.find('.' + tscss.filterRow).toggleClass(wo.filter_filteredRow, val ); // fixes #450
|
290
293
|
if ( !/(search|filter)/.test(event.type) ) {
|
291
294
|
event.stopPropagation();
|
292
295
|
ts.filter.buildDefault(table, true);
|
293
296
|
}
|
294
297
|
if (event.type === 'filterReset') {
|
295
|
-
c.$table.find('.' +
|
298
|
+
c.$table.find('.' + tscss.filter).add(wo.filter_$externalFilters).val('');
|
296
299
|
ts.filter.searching(table, []);
|
297
300
|
} else if (event.type === 'filterEnd') {
|
298
301
|
ts.filter.buildDefault(table, true);
|
@@ -355,7 +358,7 @@ ts.filter = {
|
|
355
358
|
options += '<option ' + (txt === val ? '' : 'data-function-name="' + string + '" ') + 'value="' + val + '">' + txt + '</option>';
|
356
359
|
}
|
357
360
|
}
|
358
|
-
c.$table.find('thead').find('select.' +
|
361
|
+
c.$table.find('thead').find('select.' + tscss.filter + '[data-column="' + column + '"]').append(options);
|
359
362
|
}
|
360
363
|
}
|
361
364
|
}
|
@@ -364,7 +367,7 @@ ts.filter = {
|
|
364
367
|
// it would append the same options twice.
|
365
368
|
ts.filter.buildDefault(table, true);
|
366
369
|
|
367
|
-
ts.filter.bindSearch( table, c.$table.find('.' +
|
370
|
+
ts.filter.bindSearch( table, c.$table.find('.' + tscss.filter), true );
|
368
371
|
if (wo.filter_external) {
|
369
372
|
ts.filter.bindSearch( table, wo.filter_external );
|
370
373
|
}
|
@@ -379,7 +382,7 @@ ts.filter = {
|
|
379
382
|
.unbind( ('filterStart filterEnd '.split(' ').join(c.namespace + 'filter ')).replace(/\s+/g, ' ') )
|
380
383
|
.bind( 'filterStart filterEnd '.split(' ').join(c.namespace + 'filter '), function(event, columns) {
|
381
384
|
// only add processing to certain columns to all columns
|
382
|
-
$header = (columns) ? c.$table.find('.' +
|
385
|
+
$header = (columns) ? c.$table.find('.' + tscss.header).filter('[data-column]').filter(function() {
|
383
386
|
return columns[$(this).data('column')] !== '';
|
384
387
|
}) : '';
|
385
388
|
ts.isProcessing(table, event.type === 'filterStart', columns ? $header : '');
|
@@ -493,7 +496,7 @@ ts.filter = {
|
|
493
496
|
// c.columns defined in computeThIndexes()
|
494
497
|
columns = c.columns,
|
495
498
|
arry = $.isArray(wo.filter_cellFilter),
|
496
|
-
buildFilter = '<tr role="row" class="' +
|
499
|
+
buildFilter = '<tr role="row" class="' + tscss.filterRow + ' ' + c.cssIgnoreRow + '">';
|
497
500
|
for (column = 0; column < columns; column++) {
|
498
501
|
if (arry) {
|
499
502
|
buildFilter += '<td' + ( wo.filter_cellFilter[column] ? ' class="' + wo.filter_cellFilter[column] + '"' : '' ) + '></td>';
|
@@ -542,9 +545,9 @@ ts.filter = {
|
|
542
545
|
name = ( $.isArray(wo.filter_cssFilter) ?
|
543
546
|
(typeof wo.filter_cssFilter[column] !== 'undefined' ? wo.filter_cssFilter[column] || '' : '') :
|
544
547
|
wo.filter_cssFilter ) || '';
|
545
|
-
buildFilter.addClass(
|
548
|
+
buildFilter.addClass( tscss.filter + ' ' + name ).attr('data-column', column);
|
546
549
|
if (disabled) {
|
547
|
-
buildFilter.attr('placeholder', '').addClass(
|
550
|
+
buildFilter.attr('placeholder', '').addClass(tscss.filterDisabled)[0].disabled = true; // disabled!
|
548
551
|
}
|
549
552
|
}
|
550
553
|
}
|
@@ -638,7 +641,7 @@ ts.filter = {
|
|
638
641
|
}
|
639
642
|
if (wo.filter_hideFilters) {
|
640
643
|
// show/hide filter row as needed
|
641
|
-
c.$table.find('.' +
|
644
|
+
c.$table.find('.' + tscss.filterRow).trigger( combinedFilters === '' ? 'mouseleave' : 'mouseenter' );
|
642
645
|
}
|
643
646
|
// return if the last search is the same; but filter === false when updating the search
|
644
647
|
// see example-widget-filter.html filter toggle buttons
|
@@ -664,8 +667,8 @@ ts.filter = {
|
|
664
667
|
hideFilters: function(table, c) {
|
665
668
|
var $filterRow, $filterRow2, timer;
|
666
669
|
$(table)
|
667
|
-
.find('.' +
|
668
|
-
.addClass(
|
670
|
+
.find('.' + tscss.filterRow)
|
671
|
+
.addClass(tscss.filterRowHide)
|
669
672
|
.bind('mouseenter mouseleave', function(e) {
|
670
673
|
// save event object - http://bugs.jquery.com/ticket/12140
|
671
674
|
var event = e;
|
@@ -673,14 +676,14 @@ ts.filter = {
|
|
673
676
|
clearTimeout(timer);
|
674
677
|
timer = setTimeout(function() {
|
675
678
|
if ( /enter|over/.test(event.type) ) {
|
676
|
-
$filterRow.removeClass(
|
679
|
+
$filterRow.removeClass(tscss.filterRowHide);
|
677
680
|
} else {
|
678
681
|
// don't hide if input has focus
|
679
682
|
// $(':focus') needs jQuery 1.6+
|
680
683
|
if ( $(document.activeElement).closest('tr')[0] !== $filterRow[0] ) {
|
681
684
|
// don't hide row if any filter has a value
|
682
685
|
if (c.lastCombinedFilter === '') {
|
683
|
-
$filterRow.addClass(
|
686
|
+
$filterRow.addClass(tscss.filterRowHide);
|
684
687
|
}
|
685
688
|
}
|
686
689
|
}
|
@@ -693,7 +696,7 @@ ts.filter = {
|
|
693
696
|
timer = setTimeout(function() {
|
694
697
|
// don't hide row if any filter has a value
|
695
698
|
if (ts.getFilters(c.$table).join('') === '') {
|
696
|
-
$filterRow2[ event.type === 'focus' ? 'removeClass' : 'addClass'](
|
699
|
+
$filterRow2[ event.type === 'focus' ? 'removeClass' : 'addClass'](tscss.filterRowHide);
|
697
700
|
}
|
698
701
|
}, 200);
|
699
702
|
});
|
@@ -1181,7 +1184,7 @@ ts.filter = {
|
|
1181
1184
|
// t.data('placeholder') won't work in jQuery older than 1.4.3
|
1182
1185
|
options = '<option value="">' + ( node.data('placeholder') || node.attr('data-placeholder') || wo.filter_placeholder.select || '' ) + '</option>',
|
1183
1186
|
// Get curent filter value
|
1184
|
-
currentValue = c.$table.find('thead').find('select.' +
|
1187
|
+
currentValue = c.$table.find('thead').find('select.' + tscss.filter + '[data-column="' + column + '"]').val();
|
1185
1188
|
// nothing included in arry (external source), so get the options from filter_selectSource or column data
|
1186
1189
|
if (typeof arry === 'undefined' || arry === '') {
|
1187
1190
|
arry = ts.filter.getOptionSource(table, column, onlyAvail);
|
@@ -1208,7 +1211,7 @@ ts.filter = {
|
|
1208
1211
|
}
|
1209
1212
|
|
1210
1213
|
// update all selects in the same column (clone thead in sticky headers & any external selects) - fixes 473
|
1211
|
-
$filters = ( c.$filters ? c.$filters : c.$table.children('thead') ).find('.' +
|
1214
|
+
$filters = ( c.$filters ? c.$filters : c.$table.children('thead') ).find('.' + tscss.filter);
|
1212
1215
|
if (wo.filter_$externalFilters) {
|
1213
1216
|
$filters = $filters && $filters.length ? $filters.add(wo.filter_$externalFilters) : wo.filter_$externalFilters;
|
1214
1217
|
}
|
@@ -1252,7 +1255,7 @@ ts.getFilters = function(table, getRaw, setFilters, skipFirst) {
|
|
1252
1255
|
}
|
1253
1256
|
if (c) {
|
1254
1257
|
if (c.$filters) {
|
1255
|
-
$filters = c.$filters.find('.' +
|
1258
|
+
$filters = c.$filters.find('.' + tscss.filter);
|
1256
1259
|
}
|
1257
1260
|
if (wo.filter_$externalFilters) {
|
1258
1261
|
$filters = $filters && $filters.length ? $filters.add(wo.filter_$externalFilters) : wo.filter_$externalFilters;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
/*! Widget: Output - updated 3/26/2015 (v2.21.3) *//*
|
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?)
|
@@ -160,7 +160,7 @@ output = ts.output = {
|
|
160
160
|
// callback; if true returned, continue processing
|
161
161
|
if ($.isFunction(wo.output_callback) && !wo.output_callback(c, mydata)) { return; }
|
162
162
|
|
163
|
-
if ( /p
|
163
|
+
if ( /p/i.test( wo.output_delivery || '' ) ) {
|
164
164
|
output.popup(mydata, wo.output_popupStyle, outputJSON || outputArray);
|
165
165
|
} else {
|
166
166
|
output.download(wo, mydata);
|
@@ -314,7 +314,6 @@ ts.addWidget({
|
|
314
314
|
output_callbackJSON : function($cell, txt, cellIndex) { return txt + '(' + (cellIndex) + ')'; },
|
315
315
|
// the need to modify this for Excel no longer exists
|
316
316
|
output_encoding : 'data:application/octet-stream;charset=utf8,'
|
317
|
-
|
318
317
|
},
|
319
318
|
init: function(table, thisWidget, c) {
|
320
319
|
output.init(c);
|
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
/*! Widget: Pager - updated 3/26/2015 (v2.21.3) */
|
2
|
+
/* Requires tablesorter v2.8+ and jQuery 1.7+
|
3
|
+
* by Rob Garrison
|
4
|
+
*/
|
2
5
|
/*jshint browser:true, jquery:true, unused:false */
|
3
6
|
;(function($){
|
4
7
|
"use strict";
|
@@ -143,7 +146,7 @@ tsp = ts.pager = {
|
|
143
146
|
setSize: wo.pager_size,
|
144
147
|
setPage: wo.pager_startPage,
|
145
148
|
events: 'filterInit filterStart filterEnd sortEnd disable enable destroy updateComplete ' +
|
146
|
-
'pageSize pageSet pageAndSize pagerUpdate '
|
149
|
+
'pageSize pageSet pageAndSize pagerUpdate refreshComplete '
|
147
150
|
}, c.pager);
|
148
151
|
|
149
152
|
// pager initializes multiple times before table has completed initialization
|
@@ -296,9 +299,12 @@ tsp = ts.pager = {
|
|
296
299
|
})
|
297
300
|
.on('pageSet.pager pagerUpdate.pager', function(e,v){
|
298
301
|
e.stopPropagation();
|
299
|
-
p.page = (parseInt(v, 10) || 1) - 1;
|
300
302
|
// force pager refresh
|
301
|
-
if (e.type === 'pagerUpdate') {
|
303
|
+
if (e.type === 'pagerUpdate') {
|
304
|
+
v = typeof v === 'undefined' ? p.page + 1 : v;
|
305
|
+
p.last.page = true;
|
306
|
+
}
|
307
|
+
p.page = (parseInt(v, 10) || 1) - 1;
|
302
308
|
tsp.moveToPage(table, p, true);
|
303
309
|
tsp.updatePageDisplay(table, c, false);
|
304
310
|
})
|
@@ -454,7 +460,7 @@ tsp = ts.pager = {
|
|
454
460
|
p.$goto.html(t).val( p.page + 1 );
|
455
461
|
}
|
456
462
|
if ($out.length) {
|
457
|
-
$out[ ($out[0].
|
463
|
+
$out[ ($out[0].nodeName === 'INPUT') ? 'val' : 'html' ](s);
|
458
464
|
// rebind startRow/page inputs
|
459
465
|
$out.find('.ts-startRow, .ts-page').off('change.pager').on('change.pager', function(){
|
460
466
|
var v = $(this).val(),
|
@@ -1,176 +1,314 @@
|
|
1
|
-
/*! Widget: resizable */
|
1
|
+
/*! Widget: resizable - updated 3/26/2015 (v2.21.3) */
|
2
2
|
;(function ($, window) {
|
3
3
|
'use strict';
|
4
4
|
var ts = $.tablesorter = $.tablesorter || {};
|
5
5
|
|
6
6
|
$.extend(ts.css, {
|
7
|
-
|
7
|
+
resizableContainer : 'tablesorter-resizable-container',
|
8
|
+
resizableHandle : 'tablesorter-resizable-handle',
|
9
|
+
resizableNoSelect : 'tablesorter-disableSelection',
|
10
|
+
resizableStorage : 'tablesorter-resizable'
|
8
11
|
});
|
9
12
|
|
10
|
-
//
|
11
|
-
|
12
|
-
|
13
|
-
ts.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
// Add extra scroller css
|
14
|
+
$(function(){
|
15
|
+
var s = '<style>' +
|
16
|
+
'body.' + ts.css.resizableNoSelect + ' { -ms-user-select: none; -moz-user-select: -moz-none;' +
|
17
|
+
'-khtml-user-select: none; -webkit-user-select: none; user-select: none; }' +
|
18
|
+
'.' + ts.css.resizableContainer + ' { position: relative; height: 1px; }' +
|
19
|
+
// make handle z-index > than stickyHeader z-index, so the handle stays above sticky header
|
20
|
+
'.' + ts.css.resizableHandle + ' { position: absolute; display: inline-block; width: 8px; top: 1px;' +
|
21
|
+
'cursor: ew-resize; z-index: 3; user-select: none; -moz-user-select: none; }' +
|
22
|
+
'</style>';
|
23
|
+
$(s).appendTo('body');
|
24
|
+
});
|
25
|
+
|
26
|
+
ts.resizable = {
|
27
|
+
init : function( c, wo ) {
|
28
|
+
if ( c.$table.hasClass( 'hasResizable' ) ) { return; }
|
29
|
+
c.$table.addClass( 'hasResizable' );
|
30
|
+
ts.resizableReset( c.table, true ); // set default widths
|
31
|
+
|
32
|
+
// internal variables
|
33
|
+
wo.resizable_ = {
|
34
|
+
$wrap : c.$table.parent(),
|
35
|
+
mouseXPosition : 0,
|
36
|
+
$target : null,
|
37
|
+
$next : null,
|
38
|
+
overflow : c.$table.parent().css('overflow') === 'auto',
|
39
|
+
fullWidth : Math.abs(c.$table.parent().width() - c.$table.width()) < 20,
|
40
|
+
storedSizes : []
|
41
|
+
};
|
42
|
+
|
43
|
+
var noResize, $header, column, storedSizes,
|
44
|
+
marginTop = parseInt( c.$table.css( 'margin-top' ), 10 );
|
45
|
+
|
46
|
+
wo.resizable_.storedSizes = storedSizes = ( ( ts.storage && wo.resizable !== false ) ?
|
47
|
+
ts.storage( c.table, ts.css.resizableStorage ) :
|
48
|
+
[] ) || [];
|
49
|
+
ts.resizable.setWidths( c, wo, storedSizes );
|
50
|
+
|
51
|
+
wo.$resizable_container = $( '<div class="' + ts.css.resizableContainer + '">' )
|
52
|
+
.css({ top : marginTop })
|
53
|
+
.insertBefore( c.$table );
|
54
|
+
// add container
|
55
|
+
for ( column = 0; column < c.columns; column++ ) {
|
56
|
+
$header = c.$headerIndexed[ column ];
|
57
|
+
noResize = ts.getData( $header, ts.getColumnData( c.table, c.headers, column ), 'resizable' ) === 'false';
|
58
|
+
if ( !noResize ) {
|
59
|
+
$( '<div class="' + ts.css.resizableHandle + '">' )
|
60
|
+
.appendTo( wo.$resizable_container )
|
61
|
+
.attr({
|
62
|
+
'data-column' : column,
|
63
|
+
'unselectable' : 'on'
|
64
|
+
})
|
65
|
+
.data( 'header', $header )
|
66
|
+
.bind( 'selectstart', false );
|
67
|
+
}
|
68
|
+
}
|
69
|
+
c.$table.one('tablesorter-initialized', function() {
|
70
|
+
ts.resizable.setHandlePosition( c, wo );
|
71
|
+
ts.resizable.bindings( this.config, this.config.widgetOptions );
|
72
|
+
});
|
21
73
|
},
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
$
|
34
|
-
|
35
|
-
|
36
|
-
if (mouseXPosition === 0 || !$target) { return; }
|
37
|
-
// resize columns
|
38
|
-
var leftEdge = event.pageX - mouseXPosition,
|
39
|
-
targetWidth = $target.width();
|
40
|
-
$target.width( targetWidth + leftEdge );
|
41
|
-
if ($target.width() !== targetWidth && fullWidth) {
|
42
|
-
$next.width( $next.width() - leftEdge );
|
43
|
-
} else if (overflow) {
|
44
|
-
$table.width(function(i, w){
|
45
|
-
return w + leftEdge;
|
46
|
-
});
|
47
|
-
if (!$next.length) {
|
48
|
-
// if expanding right-most column, scroll the wrapper
|
49
|
-
$wrap[0].scrollLeft = $table.width();
|
50
|
-
}
|
51
|
-
}
|
52
|
-
mouseXPosition = event.pageX;
|
53
|
-
},
|
54
|
-
stopResize = function() {
|
55
|
-
if (ts.storage && $target && $next) {
|
56
|
-
storedSizes = {};
|
57
|
-
storedSizes[$target.index()] = $target.width();
|
58
|
-
storedSizes[$next.index()] = $next.width();
|
59
|
-
$target.width( storedSizes[$target.index()] );
|
60
|
-
$next.width( storedSizes[$next.index()] );
|
61
|
-
if (wo.resizable !== false) {
|
62
|
-
// save all column widths
|
63
|
-
ts.storage(table, 'tablesorter-resizable', c.$headers.map(function(){ return $(this).width(); }).get() );
|
64
|
-
}
|
65
|
-
}
|
66
|
-
mouseXPosition = 0;
|
67
|
-
$target = $next = null;
|
68
|
-
$(window).trigger('resize'); // will update stickyHeaders, just in case
|
69
|
-
};
|
70
|
-
storedSizes = (ts.storage && wo.resizable !== false) ? ts.storage(table, 'tablesorter-resizable') : {};
|
74
|
+
|
75
|
+
setWidth : function( $el, width ) {
|
76
|
+
$el.css({
|
77
|
+
'width' : width,
|
78
|
+
'min-width' : '',
|
79
|
+
'max-width' : ''
|
80
|
+
});
|
81
|
+
},
|
82
|
+
|
83
|
+
setWidths : function( c, wo, storedSizes ) {
|
84
|
+
var column,
|
85
|
+
$extra = $( c.namespace + '_extra_headers' ),
|
86
|
+
$col = c.$table.children( 'colgroup' ).children( 'col' );
|
87
|
+
storedSizes = storedSizes || wo.resizable_.storedSizes || [];
|
71
88
|
// process only if table ID or url match
|
72
|
-
if (storedSizes) {
|
73
|
-
for (column
|
74
|
-
|
75
|
-
|
89
|
+
if ( storedSizes.length ) {
|
90
|
+
for ( column = 0; column < c.columns; column++ ) {
|
91
|
+
// set saved resizable widths
|
92
|
+
c.$headers.eq( column ).width( storedSizes[ column ] );
|
93
|
+
if ( $extra.length ) {
|
94
|
+
// stickyHeaders needs to modify min & max width as well
|
95
|
+
ts.resizable.setWidth( $extra.eq( column ).add( $col.eq( column ) ), storedSizes[ column ] );
|
76
96
|
}
|
77
97
|
}
|
98
|
+
if ( $( c.namespace + '_extra_table' ).length && !ts.hasWidget( c.table, 'scroller' ) ) {
|
99
|
+
ts.resizable.setWidth( $( c.namespace + '_extra_table' ), c.$table.outerWidth() );
|
100
|
+
}
|
78
101
|
}
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
$
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
//
|
93
|
-
$
|
102
|
+
},
|
103
|
+
|
104
|
+
setHandlePosition : function( c, wo ) {
|
105
|
+
var tableWidth = c.$table.outerWidth(),
|
106
|
+
hasScroller = ts.hasWidget( c.table, 'scroller' ),
|
107
|
+
tableHeight = c.$table.height(),
|
108
|
+
$handles = wo.$resizable_container.children(),
|
109
|
+
handleCenter = Math.floor( $handles.width() / 2 - parseFloat( c.$headers.css( 'border-right-width' ) ) * 2 );
|
110
|
+
|
111
|
+
if ( hasScroller ) {
|
112
|
+
tableHeight = 0;
|
113
|
+
c.$table.closest( '.' + ts.css.scrollerWrap ).children().each(function(){
|
114
|
+
var $this = $(this);
|
115
|
+
// center table has a max-height set
|
116
|
+
tableHeight += $this.filter('[style*="height"]').length ? $this.height() : $this.children('table').height();
|
117
|
+
});
|
118
|
+
}
|
119
|
+
$handles.each( function() {
|
120
|
+
var $this = $(this),
|
121
|
+
column = parseInt( $this.attr( 'data-column' ), 10 ),
|
122
|
+
columns = c.columns - 1,
|
123
|
+
$header = $this.data( 'header' );
|
124
|
+
if ( column < columns || column === columns && wo.resizable_addLastColumn ) {
|
125
|
+
$this.css({
|
126
|
+
height : tableHeight,
|
127
|
+
left : $header.position().left + $header.width() - handleCenter
|
128
|
+
});
|
94
129
|
}
|
95
|
-
// don't include the last column of the row
|
96
|
-
if (!wo.resizable_addLastColumn) { $column = $column.slice(0,-1); }
|
97
|
-
$columns = $columns ? $columns.add($column) : $column;
|
98
130
|
});
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
131
|
+
},
|
132
|
+
|
133
|
+
// prevent text selection while dragging resize bar
|
134
|
+
toggleTextSelection : function( c, toggle ) {
|
135
|
+
var namespace = c.namespace + 'tsresize';
|
136
|
+
c.widgetOptions.resizable_.disabled = toggle;
|
137
|
+
$( 'body' ).toggleClass( ts.css.resizableNoSelect, toggle );
|
138
|
+
if ( toggle ) {
|
139
|
+
$( 'body' )
|
140
|
+
.attr( 'unselectable', 'on' )
|
141
|
+
.bind( 'selectstart' + namespace, false );
|
142
|
+
} else {
|
143
|
+
$( 'body' )
|
144
|
+
.removeAttr( 'unselectable' )
|
145
|
+
.unbind( 'selectstart' + namespace );
|
146
|
+
}
|
147
|
+
},
|
148
|
+
|
149
|
+
bindings : function( c, wo ) {
|
150
|
+
var namespace = c.namespace + 'tsresize';
|
151
|
+
wo.$resizable_container.children().bind( 'mousedown', function( event ) {
|
110
152
|
// save header cell and mouse position
|
111
|
-
|
112
|
-
|
113
|
-
|
153
|
+
var column,
|
154
|
+
vars = wo.resizable_,
|
155
|
+
$extras = $( c.namespace + '_extra_headers' ),
|
156
|
+
$header = $( event.target ).data( 'header' );
|
157
|
+
|
158
|
+
column = parseInt( $header.attr( 'data-column' ), 10 );
|
159
|
+
vars.$target = $header = $header.add( $extras.filter('[data-column="' + column + '"]') );
|
160
|
+
vars.target = column;
|
161
|
+
|
114
162
|
// if table is not as wide as it's parent, then resize the table
|
115
|
-
|
116
|
-
|
163
|
+
vars.$next = event.shiftKey || wo.resizable_targetLast ?
|
164
|
+
$header.parent().children().not( '.resizable-false' ).filter( ':last' ) :
|
165
|
+
$header.nextAll( ':not(.resizable-false)' ).eq( 0 );
|
166
|
+
|
167
|
+
column = parseInt( vars.$next.attr( 'data-column' ), 10 );
|
168
|
+
vars.$next = vars.$next.add( $extras.filter('[data-column="' + column + '"]') );
|
169
|
+
vars.next = column;
|
170
|
+
|
171
|
+
vars.mouseXPosition = event.pageX;
|
172
|
+
vars.storedSizes = c.$headers.map(function(){ return $(this).width(); }).get();
|
173
|
+
ts.resizable.toggleTextSelection( c, true );
|
117
174
|
});
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
175
|
+
|
176
|
+
$( document )
|
177
|
+
.bind( 'mousemove' + namespace, function( event ) {
|
178
|
+
var vars = wo.resizable_;
|
179
|
+
// ignore mousemove if no mousedown
|
180
|
+
if ( !vars.disabled || vars.mouseXPosition === 0 || !vars.$target ) { return; }
|
181
|
+
if ( wo.resizable_throttle ) {
|
182
|
+
clearTimeout( vars.timer );
|
183
|
+
vars.timer = setTimeout( function() {
|
184
|
+
ts.resizable.mouseMove( c, wo, event );
|
185
|
+
}, isNaN( wo.resizable_throttle ) ? 5 : wo.resizable_throttle );
|
186
|
+
} else {
|
187
|
+
ts.resizable.mouseMove( c, wo, event );
|
188
|
+
}
|
189
|
+
})
|
190
|
+
.bind( 'mouseup' + namespace, function() {
|
191
|
+
if (!wo.resizable_.disabled) { return; }
|
192
|
+
ts.resizable.toggleTextSelection( c, false );
|
193
|
+
ts.resizable.stopResize( c, wo );
|
194
|
+
ts.resizable.setHandlePosition( c, wo );
|
195
|
+
});
|
196
|
+
|
197
|
+
// resizeEnd event triggered by scroller widget
|
198
|
+
$( window ).bind( 'resize' + namespace + ' resizeEnd' + namespace, function() {
|
199
|
+
ts.resizable.setHandlePosition( c, wo );
|
133
200
|
});
|
134
201
|
|
135
202
|
// right click to reset columns to default widths
|
136
|
-
|
137
|
-
|
203
|
+
c.$table.find( 'thead:first' ).add( $( c.namespace + '_extra_table' ).find( 'thead:first' ) )
|
204
|
+
.bind( 'contextmenu' + namespace, function() {
|
138
205
|
// $.isEmptyObject() needs jQuery 1.4+; allow right click if already reset
|
139
|
-
var allowClick =
|
140
|
-
|
206
|
+
var allowClick = wo.resizable_.storedSizes.length === 0;
|
207
|
+
ts.resizableReset( c.table );
|
208
|
+
ts.resizable.setHandlePosition( c, wo );
|
209
|
+
wo.resizable_.storedSizes = [];
|
141
210
|
return allowClick;
|
142
211
|
});
|
212
|
+
|
143
213
|
},
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
214
|
+
|
215
|
+
mouseMove : function( c, wo, event ) {
|
216
|
+
if ( wo.resizable_.mouseXPosition === 0 || !wo.resizable_.$target ) { return; }
|
217
|
+
// resize columns
|
218
|
+
var vars = wo.resizable_,
|
219
|
+
$target = vars.$target,
|
220
|
+
$next = vars.$next,
|
221
|
+
leftEdge = event.pageX - vars.mouseXPosition,
|
222
|
+
targetWidth = $target.width();
|
223
|
+
if ( vars.fullWidth ) {
|
224
|
+
vars.storedSizes[ vars.target ] += leftEdge;
|
225
|
+
vars.storedSizes[ vars.next ] -= leftEdge;
|
226
|
+
ts.resizable.setWidths( c, wo );
|
227
|
+
|
228
|
+
} else if ( vars.overflow ) {
|
229
|
+
c.$table.add( $( c.namespace + '_extra_table' ) ).width(function(i, w){
|
230
|
+
return w + leftEdge;
|
231
|
+
});
|
232
|
+
if ( !$next.length ) {
|
233
|
+
// if expanding right-most column, scroll the wrapper
|
234
|
+
vars.$wrap[0].scrollLeft = c.$table.width();
|
235
|
+
}
|
236
|
+
} else {
|
237
|
+
vars.storedSizes[ vars.target ] += leftEdge;
|
238
|
+
ts.resizable.setWidths( c, wo );
|
239
|
+
}
|
240
|
+
vars.mouseXPosition = event.pageX;
|
241
|
+
},
|
242
|
+
|
243
|
+
stopResize : function( c, wo ) {
|
244
|
+
var vars = wo.resizable_;
|
245
|
+
vars.storedSizes = [];
|
246
|
+
if ( ts.storage ) {
|
247
|
+
vars.storedSizes = c.$headers.map(function(){ return $(this).width(); }).get();
|
248
|
+
if ( wo.resizable !== false ) {
|
249
|
+
// save all column widths
|
250
|
+
ts.storage( c.table, ts.css.resizableStorage, vars.storedSizes );
|
251
|
+
}
|
252
|
+
}
|
253
|
+
vars.mouseXPosition = 0;
|
254
|
+
vars.$target = vars.$next = null;
|
255
|
+
$(window).trigger('resize'); // will update stickyHeaders, just in case
|
256
|
+
}
|
257
|
+
};
|
258
|
+
|
259
|
+
// this widget saves the column widths if
|
260
|
+
// $.tablesorter.storage function is included
|
261
|
+
// **************************
|
262
|
+
ts.addWidget({
|
263
|
+
id: "resizable",
|
264
|
+
priority: 40,
|
265
|
+
options: {
|
266
|
+
resizable : true,
|
267
|
+
resizable_addLastColumn : false,
|
268
|
+
resizable_widths : [],
|
269
|
+
resizable_throttle : false, // set to true (5ms) or any number 0-10 range
|
270
|
+
resizable_targetLast : false
|
271
|
+
},
|
272
|
+
init: function(table, thisWidget, c, wo) {
|
273
|
+
ts.resizable.init( c, wo );
|
274
|
+
},
|
275
|
+
remove: function( table, c, wo ) {
|
276
|
+
if (wo.$resizable_container) {
|
277
|
+
var namespace = c.namespace + 'tsresize';
|
278
|
+
c.$table.add( $( c.namespace + '_extra_table' ) )
|
279
|
+
.removeClass('hasResizable')
|
280
|
+
.children( 'thead' ).unbind( 'contextmenu' + namespace );
|
281
|
+
|
282
|
+
wo.$resizable_container.remove();
|
283
|
+
ts.resizable.toggleTextSelection( c, false );
|
284
|
+
ts.resizableReset( table );
|
285
|
+
$( document ).unbind( 'mousemove' + namespace + ' mouseup' + namespace );
|
286
|
+
}
|
154
287
|
}
|
155
288
|
});
|
156
|
-
|
157
|
-
|
289
|
+
|
290
|
+
ts.resizableReset = function( table, nosave ) {
|
291
|
+
$( table ).each(function(){
|
158
292
|
var $t,
|
159
293
|
c = this.config,
|
160
294
|
wo = c && c.widgetOptions;
|
161
|
-
if (table && c) {
|
162
|
-
c.$headers.each(function(i){
|
295
|
+
if ( table && c ) {
|
296
|
+
c.$headers.each( function( i ) {
|
163
297
|
$t = $(this);
|
164
|
-
if (wo.resizable_widths && wo.resizable_widths[i]) {
|
165
|
-
$t.css('width', wo.resizable_widths[i]);
|
166
|
-
} else if (!$t.hasClass('resizable-false')) {
|
298
|
+
if ( wo.resizable_widths && wo.resizable_widths[ i ] ) {
|
299
|
+
$t.css( 'width', wo.resizable_widths[ i ] );
|
300
|
+
} else if ( !$t.hasClass( 'resizable-false' ) ) {
|
167
301
|
// don't clear the width of any column that is not resizable
|
168
|
-
$t.css('width','');
|
302
|
+
$t.css( 'width', '' );
|
169
303
|
}
|
170
304
|
});
|
171
|
-
|
305
|
+
// reset stickyHeader widths
|
306
|
+
$( window ).trigger( 'resize' );
|
307
|
+
if ( ts.storage && !nosave ) {
|
308
|
+
ts.storage( this, ts.css.resizableStorage, {} );
|
309
|
+
}
|
172
310
|
}
|
173
311
|
});
|
174
312
|
};
|
175
313
|
|
176
|
-
})(jQuery, window);
|
314
|
+
})( jQuery, window );
|