jquery-tablesorter 1.23.3 → 1.23.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e9c0d9a4d6e4769ef2ac103238497f8b9699c8c
4
- data.tar.gz: 80782010232bbb530597479542a5aa8a745305eb
3
+ metadata.gz: f9247933d8634de84e4c4805ac838bde8d415fe6
4
+ data.tar.gz: d166022a1720295b3144139a48ce7bf09842f103
5
5
  SHA512:
6
- metadata.gz: 982e0c312651b560d163cd42baa36c304f0aa3d39066efc4da635dbc66bb9641463c596d0e46a8dd8d7bbb843b8e562073df787be8fbaeb42b14c6805e35a920
7
- data.tar.gz: 2954925bfb324f7003d62f5dbdcc07663c4d52ff2ec2a69637854012b2920fdb005debcad795f19c2981520bc732c4941cab3be9a6e4cc620a436049f8a52691
6
+ metadata.gz: 28448268a71de63840eeb66ee5d771653cd25270e9a67d3c27d6da5762829170107bdac946e329be250cb7b6ec512e093ebe63a86b5ea28d6b15da396107da31
7
+ data.tar.gz: c303f1cd056f23d74976e5643ab8ee31a9279f23ee8fe2693162b73d8183ec9b26a5184d6edc3553e1e529255ed3eb6ad01ec497a8c3a7f9307a6389acc22bd3
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Simple integration of jQuery tablesorter ([Mottie's fork]) into the asset pipeline.
6
6
 
7
- Current tablesorter version: 2.28.3 (12/16/2016), [documentation]
7
+ Current tablesorter version: 2.28.4 (1/6/2017), [documentation]
8
8
 
9
9
  Any issue associated with the js/css files, please report to [Mottie's fork].
10
10
 
@@ -1,7 +1,7 @@
1
1
  module JqueryTablesorter
2
2
  MAJOR = 1
3
3
  MINOR = 23
4
- TINY = 3
4
+ TINY = 4
5
5
 
6
6
  VERSION = [MAJOR, MINOR, TINY].compact.join('.')
7
7
  end
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * tablesorter (FORK) pager plugin
3
- * updated 11/26/2016 (v2.28.0)
3
+ * updated 1/6/2017 (v2.28.4)
4
4
  */
5
5
  /*jshint browser:true, jquery:true, unused:false */
6
6
  ;(function($) {
@@ -173,7 +173,7 @@
173
173
 
174
174
  updatePageDisplay = function(table, p, completed) {
175
175
  if ( p.initializing ) { return; }
176
- var s, t, $out, indx, len, options,
176
+ var s, t, $out, $el, indx, len, options, output,
177
177
  c = table.config,
178
178
  namespace = c.namespace + 'pager',
179
179
  sz = parsePageSize( p, p.size, 'get' ); // don't allow dividing by zero
@@ -196,8 +196,12 @@
196
196
  if (typeof p.output === 'function') {
197
197
  s = p.output(table, p);
198
198
  } else {
199
+ output = $out
200
+ // get output template from data-pager-output or data-pager-output-filtered
201
+ .attr('data-pager-output' + (p.filteredRows < p.totalRows ? '-filtered' : '')) ||
202
+ p.output;
199
203
  // form the output string (can now get a new output string from the server)
200
- s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || p.output : p.output )
204
+ s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || output : output )
201
205
  // {page} = one-based index; {page+#} = zero based index +/- value
202
206
  .replace(/\{page([\-+]\d+)?\}/gi, function(m, n){
203
207
  return p.totalPages ? p.page + (n ? parseInt(n, 10) : 1) : 0;
@@ -218,7 +222,8 @@
218
222
  return extra.length > 1 && data && data[extra[0]] ? data[extra[0]][extra[1]] : p[str] || (data ? data[str] : deflt) || deflt;
219
223
  });
220
224
  }
221
- if ( p.$goto.length ) {
225
+ $el = p.$container.find(p.cssGoto);
226
+ if ( $el.length ) {
222
227
  t = '';
223
228
  options = buildPageSelect( table, p );
224
229
  len = options.length;
@@ -226,7 +231,7 @@
226
231
  t += '<option value="' + options[indx] + '">' + options[indx] + '</option>';
227
232
  }
228
233
  // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228
229
- p.$goto.html(t).val( p.page + 1 );
234
+ $el.html(t).val( p.page + 1 );
230
235
  }
231
236
  if ($out.length) {
232
237
  $out[ ($out[0].nodeName === 'INPUT') ? 'val' : 'html' ](s);
@@ -388,8 +393,9 @@
388
393
  },
389
394
 
390
395
  hideRowsSetup = function(table, p){
391
- p.size = parsePageSize( p, p.$size.val(), 'get' );
392
- p.$size.val( p.size );
396
+ var $el = p.$container.find(p.cssPageSize);
397
+ p.size = parsePageSize( p, $el.val(), 'get' );
398
+ $el.val( p.size );
393
399
  $.data(table, 'pagerLastSize', p.size);
394
400
  pagerArrows( table, p );
395
401
  if ( !p.removeRows ) {
@@ -470,10 +476,12 @@
470
476
  }
471
477
  }
472
478
  p.processAjaxOnInit = true;
473
- // only add new header text if the length matches
474
- if ( th && th.length === hl ) {
479
+ // update new header text
480
+ if ( th ) {
475
481
  hsh = $table.hasClass('hasStickyHeaders');
476
- $sh = hsh ? c.widgetOptions.$sticky.children('thead:first').children('tr').children() : '';
482
+ $sh = hsh ?
483
+ c.widgetOptions.$sticky.children('thead:first').children('tr:not(.' + c.cssIgnoreRow + ')').children() :
484
+ '';
477
485
  $f = $table.find('tfoot tr:first').children();
478
486
  // don't change td headers (may contain pager)
479
487
  $headers = c.$headers.filter( 'th ' );
@@ -483,15 +491,17 @@
483
491
  // add new test within the first span it finds, or just in the header
484
492
  if ( $h.find('.' + ts.css.icon).length ) {
485
493
  icon = $h.find('.' + ts.css.icon).clone(true);
486
- $h.find('.tablesorter-header-inner').html( th[j] ).append(icon);
494
+ $h.find('.' + ts.css.headerIn).html( th[j] ).append(icon);
487
495
  if ( hsh && $sh.length ) {
488
496
  icon = $sh.eq(j).find('.' + ts.css.icon).clone(true);
489
- $sh.eq(j).find('.tablesorter-header-inner').html( th[j] ).append(icon);
497
+ $sh.eq(j).find('.' + ts.css.headerIn).html( th[j] ).append(icon);
490
498
  }
491
499
  } else {
492
- $h.find('.tablesorter-header-inner').html( th[j] );
500
+ $h.find('.' + ts.css.headerIn).html( th[j] );
493
501
  if (hsh && $sh.length) {
494
- $sh.eq(j).find('.tablesorter-header-inner').html( th[j] );
502
+ // add sticky header to container just in case it contains pager controls
503
+ p.$container = p.$container.add( c.widgetOptions.$sticky );
504
+ $sh.eq(j).find('.' + ts.css.headerIn).html( th[j] );
495
505
  }
496
506
  }
497
507
  $f.eq(j).html( th[j] );
@@ -693,9 +703,7 @@
693
703
  }
694
704
  }
695
705
  // disable size selector
696
- $controls = p.$size
697
- .add( p.$goto )
698
- .add( p.$container.find( '.ts-startRow, .ts-page' ) );
706
+ $controls = p.$container.find( p.cssGoto + ',' + p.cssPageSize + ', .ts-startRow, .ts-page' );
699
707
  len = $controls.length;
700
708
  for ( index = 0; index < len; index++ ) {
701
709
  $controls.eq( index ).addClass( p.cssDisabled )[0].disabled = true;
@@ -798,7 +806,7 @@
798
806
  parsePageSize = function( p, size, mode ) {
799
807
  var s = parseInt( size, 10 ) || p.size || p.settings.size || 10;
800
808
  return p.initialized && (/all/i.test( size ) || s === p.totalRows) ?
801
- // "get" to get `p.size` or "set" to set `p.$size.val()`
809
+ // "get" to get `p.size` or "set" to set `pageSize.val()`
802
810
  'all' : ( mode === 'get' ? s : p.size );
803
811
  },
804
812
 
@@ -812,7 +820,7 @@
812
820
 
813
821
  setPageSize = function(table, size, p) {
814
822
  p.size = parsePageSize( p, size, 'get' );
815
- p.$size.val( parsePageSize( p, p.size, 'set' ) );
823
+ p.$container.find(p.cssPageSize).val( parsePageSize( p, p.size, 'set' ) );
816
824
  $.data(table, 'pagerLastPage', parsePageNumber( table, p ) );
817
825
  $.data(table, 'pagerLastSize', p.size);
818
826
  p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
@@ -887,7 +895,7 @@
887
895
  enablePager = function(table, p, triggered) {
888
896
  var info, size, $el,
889
897
  c = table.config;
890
- p.$size.add(p.$goto).add(p.$container.find('.ts-startRow, .ts-page'))
898
+ p.$container.find(p.cssGoto + ',' + p.cssPageSize + ',.ts-startRow, .ts-page')
891
899
  .removeClass(p.cssDisabled)
892
900
  .removeAttr('disabled')
893
901
  .each(function(){
@@ -895,9 +903,10 @@
895
903
  });
896
904
  p.isDisabled = false;
897
905
  p.page = $.data(table, 'pagerLastPage') || p.page || 0;
898
- size = p.$size.find('option[selected]').val();
906
+ $el = p.$container.find(p.cssPageSize);
907
+ size = $el.find('option[selected]').val();
899
908
  p.size = $.data(table, 'pagerLastSize') || parsePageSize( p, size, 'get' );
900
- p.$size.val( p.size ); // set page size
909
+ $el.val( p.size ); // set page size
901
910
  p.totalPages = p.size === 'all' ? 1 : Math.ceil( getTotalPages( table, p ) / p.size );
902
911
  // if table id exists, include page display with aria info
903
912
  if ( table.id && !c.$table.attr( 'aria-describedby' ) ) {
@@ -923,7 +932,7 @@
923
932
  },
924
933
 
925
934
  init = function(table, settings) {
926
- var t, ctrls, fxn, size,
935
+ var t, ctrls, fxn, size, $el,
927
936
  c = table.config,
928
937
  wo = c.widgetOptions,
929
938
  p = c.pager = $.extend( true, {}, $.tablesorterPager.defaults, settings ),
@@ -1057,9 +1066,9 @@
1057
1066
  });
1058
1067
 
1059
1068
  // goto selector
1060
- p.$goto = pager.find(p.cssGoto);
1061
- if ( p.$goto.length ) {
1062
- p.$goto
1069
+ $el = pager.find(p.cssGoto);
1070
+ if ( $el.length ) {
1071
+ $el
1063
1072
  .unbind('change' + namespace)
1064
1073
  .bind('change' + namespace, function(){
1065
1074
  p.page = $(this).val() - 1;
@@ -1070,14 +1079,15 @@
1070
1079
  console.warn('Pager: >> Goto selector not found');
1071
1080
  }
1072
1081
  // page size selector
1073
- p.$size = pager.find(p.cssPageSize);
1074
- if ( p.$size.length ) {
1082
+ $el = pager.find(p.cssPageSize);
1083
+ if ( $el.length ) {
1075
1084
  // setting an option as selected appears to cause issues with initial page size
1076
- p.$size.find('option').removeAttr('selected');
1077
- p.$size.unbind('change' + namespace).bind('change' + namespace, function() {
1085
+ $el.find('option').removeAttr('selected');
1086
+ $el.unbind('change' + namespace).bind('change' + namespace, function() {
1078
1087
  if ( !$(this).hasClass(p.cssDisabled) ) {
1079
1088
  var size = $(this).val();
1080
- p.$size.val( size ); // in case there are more than one pagers
1089
+ // in case there are more than one pager
1090
+ p.$container.find(p.cssGoto).val( size );
1081
1091
  setPageSize(table, size, p);
1082
1092
  changeHeight(table, p);
1083
1093
  }
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) - updated 12-16-2016 (v2.28.3)*/
7
+ /*! tablesorter (FORK) - updated 01-06-2017 (v2.28.4)*/
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(jQuery) {
18
18
 
19
- /*! TableSorter (FORK) v2.28.3 *//*
19
+ /*! TableSorter (FORK) v2.28.4 *//*
20
20
  * Client-side table sorting with ease!
21
21
  * @requires jQuery v1.2.6+
22
22
  *
@@ -40,7 +40,7 @@
40
40
  'use strict';
41
41
  var ts = $.tablesorter = {
42
42
 
43
- version : '2.28.3',
43
+ version : '2.28.4',
44
44
 
45
45
  parsers : [],
46
46
  widgets : [],
@@ -5071,7 +5071,7 @@
5071
5071
 
5072
5072
  })( jQuery );
5073
5073
 
5074
- /*! Widget: stickyHeaders - updated 7/31/2016 (v2.27.0) *//*
5074
+ /*! Widget: stickyHeaders - updated 1/6/2017 (v2.28.4) *//*
5075
5075
  * Requires tablesorter v2.8+ and jQuery 1.4.3+
5076
5076
  * by Rob Garrison
5077
5077
  */
@@ -5134,7 +5134,7 @@
5134
5134
  // **************************
5135
5135
  ts.addWidget({
5136
5136
  id: 'stickyHeaders',
5137
- priority: 55, // sticky widget must be initialized after the filter widget!
5137
+ priority: 54, // sticky widget must be initialized after the filter & before pager widget!
5138
5138
  options: {
5139
5139
  stickyHeaders : '', // extra class name added to the sticky header row
5140
5140
  stickyHeaders_appendTo : null, // jQuery selector or object to phycially attach the sticky headers
@@ -1,4 +1,4 @@
1
- /*! TableSorter (FORK) v2.28.3 *//*
1
+ /*! TableSorter (FORK) v2.28.4 *//*
2
2
  * Client-side table sorting with ease!
3
3
  * @requires jQuery v1.2.6+
4
4
  *
@@ -22,7 +22,7 @@
22
22
  'use strict';
23
23
  var ts = $.tablesorter = {
24
24
 
25
- version : '2.28.3',
25
+ version : '2.28.4',
26
26
 
27
27
  parsers : [],
28
28
  widgets : [],
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) - updated 12-16-2016 (v2.28.3)*/
7
+ /*! tablesorter (FORK) - updated 01-06-2017 (v2.28.4)*/
8
8
  /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
9
9
  (function(factory) {
10
10
  if (typeof define === 'function' && define.amd) {
@@ -2276,7 +2276,7 @@
2276
2276
 
2277
2277
  })( jQuery );
2278
2278
 
2279
- /*! Widget: stickyHeaders - updated 7/31/2016 (v2.27.0) *//*
2279
+ /*! Widget: stickyHeaders - updated 1/6/2017 (v2.28.4) *//*
2280
2280
  * Requires tablesorter v2.8+ and jQuery 1.4.3+
2281
2281
  * by Rob Garrison
2282
2282
  */
@@ -2339,7 +2339,7 @@
2339
2339
  // **************************
2340
2340
  ts.addWidget({
2341
2341
  id: 'stickyHeaders',
2342
- priority: 55, // sticky widget must be initialized after the filter widget!
2342
+ priority: 54, // sticky widget must be initialized after the filter & before pager widget!
2343
2343
  options: {
2344
2344
  stickyHeaders : '', // extra class name added to the sticky header row
2345
2345
  stickyHeaders_appendTo : null, // jQuery selector or object to phycially attach the sticky headers
@@ -152,7 +152,7 @@
152
152
  if ($container.length) {
153
153
  // set default col title
154
154
  name = $header.attr(wo.columnSelector_name) || $header.text().trim();
155
- if (typeof wo.columnSelector_layoutCustomizer === "function") {
155
+ if (typeof wo.columnSelector_layoutCustomizer === 'function') {
156
156
  $el = $header.find('.' + ts.css.headerIn);
157
157
  name = wo.columnSelector_layoutCustomizer( $el.length ? $el : $header, name, parseInt(colId, 10) );
158
158
  }
@@ -1,8 +1,9 @@
1
- /*! Widget: output - updated 7/31/2016 (v2.27.0) *//*
1
+ /*! Widget: output - updated 1/6/2017 (v2.28.4) *//*
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?)
5
5
  * Download-File-JS: https://github.com/PixelsCommander/Download-File-JS (http://www.apache.org/licenses/LICENSE-2.0)
6
+ * FileSaver.js: https://github.com/eligrey/FileSaver.js (MIT)
6
7
  */
7
8
  /*jshint browser:true, jquery:true, unused:false */
8
9
  /*global jQuery:false, alert:false */
@@ -25,7 +26,7 @@
25
26
  replaceTab : '\x09',
26
27
 
27
28
  popupTitle : 'Output',
28
- popupStyle : 'width:100%;height:100%;', // for textarea
29
+ popupStyle : 'width:100%;height:100%;margin:0;resize:none;', // for textarea
29
30
  message : 'Your device does not support downloading. Please try again in desktop browser.',
30
31
 
31
32
  init : function(c) {
@@ -162,7 +163,6 @@
162
163
 
163
164
  // process to array of arrays
164
165
  csvData = output.processRow(c, $rows);
165
-
166
166
  if (wo.output_includeFooter) {
167
167
  // clone, to force the tfoot rows to the end of this selection of rows
168
168
  // otherwise they appear after the thead (the order in the HTML)
@@ -183,9 +183,13 @@
183
183
  // requires JSON stringify; if it doesn't exist, the output will show [object Object],... in the output window
184
184
  mydata = hasStringify ? JSON.stringify(tmpData) : tmpData;
185
185
  } else {
186
- tmp = [ headers[ ( len > 1 && wo.output_headerRows ) ? indx % len : len - 1 ] ];
187
- tmpData = output.row2CSV(wo, wo.output_headerRows ? headers : tmp, outputArray)
188
- .concat( output.row2CSV(wo, csvData, outputArray) );
186
+ if (wo.output_includeHeader) {
187
+ tmp = [ headers[ ( len > 1 && wo.output_headerRows ) ? indx % len : len - 1 ] ];
188
+ tmpData = output.row2CSV(wo, wo.output_headerRows ? headers : tmp, outputArray)
189
+ .concat( output.row2CSV(wo, csvData, outputArray) );
190
+ } else {
191
+ tmpData = output.row2CSV(wo, csvData, outputArray);
192
+ }
189
193
 
190
194
  // stringify the array; if stringify doesn't exist the array will be flattened
191
195
  mydata = outputArray && hasStringify ? JSON.stringify(tmpData) : tmpData.join('\n');
@@ -204,7 +208,7 @@
204
208
  if ( /p/i.test( wo.output_delivery || '' ) ) {
205
209
  output.popup(mydata, wo.output_popupStyle, outputJSON || outputArray);
206
210
  } else {
207
- output.download(wo, mydata);
211
+ output.download(c, wo, mydata);
208
212
  }
209
213
 
210
214
  }, // end process
@@ -274,13 +278,20 @@
274
278
 
275
279
  popup : function(data, style, wrap) {
276
280
  var generator = window.open('', output.popupTitle, style);
277
- generator.document.write(
278
- '<html><head><title>' + output.popupTitle + '</title></head><body>' +
279
- '<textarea wrap="' + (wrap ? 'on' : 'off') + '" style="' + output.popupStyle + '">' + data + '\n</textarea>' +
280
- '</body></html>'
281
- );
282
- generator.document.close();
283
- generator.focus();
281
+ try {
282
+ generator.document.write(
283
+ '<html><head><title>' + output.popupTitle + '</title></head><body>' +
284
+ '<textarea wrap="' + (wrap ? 'on' : 'off') + '" style="' +
285
+ output.popupStyle + '">' + data + '\n</textarea>' +
286
+ '</body></html>'
287
+ );
288
+ generator.document.close();
289
+ generator.focus();
290
+ } catch (e) {
291
+ // popup already open
292
+ generator.close();
293
+ return output.popup(data, style, wrap);
294
+ }
284
295
  // select all text and focus within the textarea in the popup
285
296
  // $(generator.document).find('textarea').select().focus();
286
297
  return true;
@@ -288,13 +299,18 @@
288
299
 
289
300
  // modified from https://github.com/PixelsCommander/Download-File-JS
290
301
  // & http://html5-demos.appspot.com/static/a.download.html
291
- download : function (wo, data){
302
+ download : function (c, wo, data) {
303
+
304
+ if (typeof wo.output_savePlugin === 'function') {
305
+ return wo.output_savePlugin(c, wo, data);
306
+ }
292
307
 
293
- var e, blob, gotBlob,
308
+ var e, blob, gotBlob, bom,
294
309
  nav = window.navigator,
295
310
  link = document.createElement('a');
296
311
 
297
- // iOS devices do not support downloading. We have to inform user about this.
312
+ // iOS devices do not support downloading. We have to inform user about
313
+ // this limitation.
298
314
  if (/(iP)/g.test(nav.userAgent)) {
299
315
  alert(output.message);
300
316
  return false;
@@ -311,8 +327,12 @@
311
327
  if ( gotBlob ) {
312
328
 
313
329
  window.URL = window.URL || window.webkitURL;
314
- // prepend BOM for utf-8 encoding - see https://github.com/eligrey/FileSaver.js/blob/master/FileSaver.js#L140
315
- blob = new Blob( [ '\ufeff', data ], { type: wo.output_encoding } );
330
+ // prepend BOM for UTF-8 XML and text/* types (including HTML)
331
+ // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
332
+ // see https://github.com/eligrey/FileSaver.js/blob/master/FileSaver.js#L68
333
+ bom = (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(wo.output_encoding)) ?
334
+ [ '\ufeff', data ] : [ data ];
335
+ blob = new Blob( bom, { type: wo.output_encoding } );
316
336
 
317
337
  if (nav.msSaveBlob) {
318
338
  // IE 10+
@@ -353,8 +373,9 @@
353
373
  output_ignoreColumns : [], // columns to ignore [0, 1,... ] (zero-based index)
354
374
  output_hiddenColumns : false, // include hidden columns in the output
355
375
  output_includeFooter : false, // include footer rows in the output
376
+ output_includeHeader : true, // include header rows in the output
377
+ output_headerRows : false, // if true, include multiple header rows
356
378
  output_dataAttrib : 'data-name', // header attrib containing modified header name
357
- output_headerRows : false, // if true, include multiple header rows (JSON only)
358
379
  output_delivery : 'popup', // popup, download
359
380
  output_saveRows : 'filtered', // (a)ll, (v)isible, (f)iltered or jQuery filter selector
360
381
  output_duplicateSpans : true, // duplicate output data in tbody colspan/rowspan
@@ -373,7 +394,13 @@
373
394
  // JSON callback executed when a colspan is encountered in the header
374
395
  output_callbackJSON : function($cell, txt, cellIndex) { return txt + '(' + (cellIndex) + ')'; },
375
396
  // the need to modify this for Excel no longer exists
376
- output_encoding : 'data:application/octet-stream;charset=utf8,'
397
+ output_encoding : 'data:application/octet-stream;charset=utf8,',
398
+ // override internal save file code and use an external plugin such as
399
+ // https://github.com/eligrey/FileSaver.js
400
+ output_savePlugin : null /* function(c, wo, data) {
401
+ var blob = new Blob([data], {type: wo.output_encoding});
402
+ saveAs(blob, wo.output_saveFileName);
403
+ } */
377
404
  },
378
405
  init: function(table, thisWidget, c) {
379
406
  output.init(c);
@@ -1,4 +1,4 @@
1
- /*! Widget: Pager - updated 11/26/2016 (v2.28.0) */
1
+ /*! Widget: Pager - updated 1/6/2017 (v2.28.4) */
2
2
  /* Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -109,6 +109,7 @@
109
109
  prev : '.prev', // previous page arrow
110
110
  next : '.next', // next page arrow
111
111
  last : '.last', // go to last page arrow
112
+ // goto is a reserved word #657
112
113
  gotoPage : '.gotoPage', // go to page selector - select dropdown that sets the current page
113
114
  pageDisplay : '.pagedisplay', // location of where the 'output' is displayed
114
115
  pageSize : '.pagesize' // page size selector - select dropdown that sets the 'size' option
@@ -168,10 +169,6 @@
168
169
  p.size = $.data( table, 'pagerLastSize' ) || wo.pager_size;
169
170
  // added in case the pager is reinitialized after being destroyed.
170
171
  p.$container = $( s.container ).addClass( wo.pager_css.container ).show();
171
- // goto selector
172
- p.$goto = p.$container.find( s.gotoPage ); // goto is a reserved word #657
173
- // page size selector
174
- p.$size = p.$container.find( s.pageSize );
175
172
  p.totalRows = c.$tbodies.eq( 0 )
176
173
  .children( 'tr' )
177
174
  .not( wo.pager_countChildRows ? '' : '.' + c.cssChildRow )
@@ -184,7 +181,7 @@
184
181
  p.page = ( isNaN( t.page ) ? p.page : t.page ) || p.setPage || 0;
185
182
  p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
186
183
  $.data( table, 'pagerLastSize', p.size );
187
- p.$size.val( p.size );
184
+ p.$container.find( s.pageSize ).val( p.size );
188
185
  }
189
186
 
190
187
  // skipped rows
@@ -243,7 +240,7 @@
243
240
  },
244
241
 
245
242
  bindEvents: function( c ) {
246
- var ctrls, fxn,
243
+ var ctrls, fxn, tmp,
247
244
  p = c.pager,
248
245
  wo = c.widgetOptions,
249
246
  namespace = c.namespace + 'pager',
@@ -359,8 +356,9 @@
359
356
  }
360
357
  });
361
358
 
362
- if ( p.$goto.length ) {
363
- p.$goto
359
+ tmp = p.$container.find( wo.pager_selectors.gotoPage );
360
+ if ( tmp.length ) {
361
+ tmp
364
362
  .off( 'change' + namespace )
365
363
  .on( 'change' + namespace, function() {
366
364
  p.page = $( this ).val() - 1;
@@ -371,15 +369,17 @@
371
369
  console.warn( 'Pager: >> Goto selector not found' );
372
370
  }
373
371
 
374
- if ( p.$size.length ) {
372
+ tmp = p.$container.find( wo.pager_selectors.pageSize );
373
+ if ( tmp.length ) {
375
374
  // setting an option as selected appears to cause issues with initial page size
376
- p.$size.find( 'option' ).removeAttr( 'selected' );
377
- p.$size
375
+ tmp.find( 'option' ).removeAttr( 'selected' );
376
+ tmp
378
377
  .off( 'change' + namespace )
379
378
  .on( 'change' + namespace, function() {
380
379
  if ( !$( this ).hasClass( wo.pager_css.disabled ) ) {
381
380
  var size = $( this ).val();
382
- p.$size.val( size ); // in case there are more than one pagers
381
+ // in case there are more than one pager
382
+ p.$container.find( wo.pager_selectors.pageSize ).val( size );
383
383
  tsp.setPageSize( c, size );
384
384
  tsp.changeHeight( c );
385
385
  }
@@ -439,7 +439,7 @@
439
439
 
440
440
  updatePageDisplay: function( c, completed ) {
441
441
  if ( c.pager && c.pager.initializing ) { return; }
442
- var s, t, $out, options, indx, len,
442
+ var s, t, $out, options, indx, len, output,
443
443
  table = c.table,
444
444
  wo = c.widgetOptions,
445
445
  p = c.pager,
@@ -447,8 +447,7 @@
447
447
  sz = tsp.parsePageSize( c, p.size, 'get' ); // don't allow dividing by zero
448
448
  if ( sz === 'all' ) { sz = p.totalRows; }
449
449
  if ( wo.pager_countChildRows ) { t[ t.length ] = c.cssChildRow; }
450
- p.$size
451
- .add( p.$goto )
450
+ p.$container.find( wo.pager_selectors.pageSize + ',' + wo.pager_selectors.gotoPage )
452
451
  .removeClass( wo.pager_css.disabled )
453
452
  .removeAttr( 'disabled' )
454
453
  .prop( 'aria-disabled', 'false' );
@@ -469,8 +468,12 @@
469
468
  if ( typeof wo.pager_output === 'function' ) {
470
469
  s = wo.pager_output( table, p );
471
470
  } else {
471
+ output = $out
472
+ // get output template from data-pager-output or data-pager-output-filtered
473
+ .attr('data-pager-output' + (p.filteredRows < p.totalRows ? '-filtered' : '')) ||
474
+ wo.pager_output;
472
475
  // form the output string (can now get a new output string from the server)
473
- s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || wo.pager_output : wo.pager_output )
476
+ s = ( p.ajaxData && p.ajaxData.output ? p.ajaxData.output || output : output )
474
477
  // {page} = one-based index; {page+#} = zero based index +/- value
475
478
  .replace( /\{page([\-+]\d+)?\}/gi, function( m, n ) {
476
479
  return p.totalPages ? p.page + ( n ? parseInt( n, 10 ) : 1 ) : 0;
@@ -494,7 +497,7 @@
494
497
  p[ str ] || ( data ? data[ str ] : deflt ) || deflt;
495
498
  });
496
499
  }
497
- if ( p.$goto.length ) {
500
+ if ( p.$container.find( wo.pager_selectors.gotoPage ).length ) {
498
501
  t = '';
499
502
  options = tsp.buildPageSelect( c, p );
500
503
  len = options.length;
@@ -502,7 +505,7 @@
502
505
  t += '<option value="' + options[ indx ] + '">' + options[ indx ] + '</option>';
503
506
  }
504
507
  // innerHTML doesn't work in IE9 - http://support2.microsoft.com/kb/276228
505
- p.$goto.html( t ).val( p.page + 1 );
508
+ p.$container.find( wo.pager_selectors.gotoPage ).html( t ).val( p.page + 1 );
506
509
  }
507
510
  if ( $out.length ) {
508
511
  $out[ ($out[ 0 ].nodeName === 'INPUT' ) ? 'val' : 'html' ]( s );
@@ -687,9 +690,10 @@
687
690
  hideRowsSetup: function( c ) {
688
691
  var p = c.pager,
689
692
  namespace = c.namespace + 'pager',
690
- size = p.$size.val();
693
+ $el = p.$container.find( c.widgetOptions.pager_selectors.pageSize ),
694
+ size = $el.val();
691
695
  p.size = tsp.parsePageSize( c, size, 'get' );
692
- p.$size.val( p.size );
696
+ $el.val( p.size );
693
697
  $.data( c.table, 'pagerLastSize', p.size );
694
698
  tsp.pagerArrows( c );
695
699
  if ( !c.widgetOptions.pager_removeRows ) {
@@ -774,10 +778,12 @@
774
778
  }
775
779
  }
776
780
  wo.pager_processAjaxOnInit = true;
777
- // only add new header text if the length matches
778
- if ( th && th.length === hl ) {
781
+ // update new header text
782
+ if ( th ) {
779
783
  hsh = $table.hasClass( 'hasStickyHeaders' );
780
- $sh = hsh ? wo.$sticky.children( 'thead:first' ).children( 'tr' ).children() : '';
784
+ $sh = hsh ?
785
+ wo.$sticky.children( 'thead:first' ).children( 'tr:not(.' + c.cssIgnoreRow + ')' ).children() :
786
+ '';
781
787
  $f = $table.find( 'tfoot tr:first' ).children();
782
788
  // don't change td headers (may contain pager)
783
789
  $headers = c.$headers.filter( 'th' );
@@ -787,19 +793,24 @@
787
793
  // add new test within the first span it finds, or just in the header
788
794
  if ( $h.find( '.' + ts.css.icon ).length ) {
789
795
  icon = $h.find( '.' + ts.css.icon ).clone( true );
790
- $h.find( '.tablesorter-header-inner' ).html( th[ j ] ).append( icon );
796
+ $h.find( '.' + ts.css.headerIn ).html( th[ j ] ).append( icon );
791
797
  if ( hsh && $sh.length ) {
792
798
  icon = $sh.eq( j ).find( '.' + ts.css.icon ).clone( true );
793
- $sh.eq( j ).find( '.tablesorter-header-inner' ).html( th[ j ] ).append( icon );
799
+ $sh.eq( j ).find( '.' + ts.css.headerIn ).html( th[ j ] ).append( icon );
794
800
  }
795
801
  } else {
796
- $h.find( '.tablesorter-header-inner' ).html( th[ j ] );
802
+ $h.find( '.' + ts.css.headerIn ).html( th[ j ] );
797
803
  if ( hsh && $sh.length ) {
798
- $sh.eq( j ).find( '.tablesorter-header-inner' ).html( th[ j ] );
804
+ // add sticky header to container just in case it contains pager controls
805
+ p.$container = p.$container.add( wo.$sticky );
806
+ $sh.eq( j ).find( '.' + ts.css.headerIn ).html( th[ j ] );
799
807
  }
800
808
  }
801
809
  $f.eq( j ).html( th[ j ] );
802
810
  }
811
+ if ( hsh ) {
812
+ tsp.bindEvents( c );
813
+ }
803
814
  }
804
815
  }
805
816
  if ( c.showProcessing ) {
@@ -1006,9 +1017,11 @@
1006
1017
  }
1007
1018
  }
1008
1019
  // disable size selector
1009
- $controls = p.$size
1010
- .add( p.$goto )
1011
- .add( p.$container.find( '.ts-startRow, .ts-page ' ) );
1020
+ $controls = p.$container.find(
1021
+ wo.pager_selectors.pageSize + ',' +
1022
+ wo.pager_selectors.gotoPage + ',' +
1023
+ '.ts-startRow, .ts-page'
1024
+ );
1012
1025
  len = $controls.length;
1013
1026
  for ( index = 0; index < len; index++ ) {
1014
1027
  $controls.eq( index )
@@ -1122,7 +1135,7 @@
1122
1135
  var p = c.pager,
1123
1136
  s = parseInt( size, 10 ) || p.size || c.widgetOptions.pager_size || 10;
1124
1137
  return p.initialized && (/all/i.test( size ) || s === p.totalRows) ?
1125
- // "get" to set `p.size` or "set" to set `p.$size.val()`
1138
+ // "get" to set `p.size` or "set" to set `pageSize.val()`
1126
1139
  'all' : ( mode === 'get' ? s : p.size );
1127
1140
  },
1128
1141
 
@@ -1138,7 +1151,9 @@
1138
1151
  var p = c.pager,
1139
1152
  table = c.table;
1140
1153
  p.size = tsp.parsePageSize( c, size, 'get' );
1141
- p.$size.val( tsp.parsePageSize( c, p.size, 'set' ) );
1154
+ p.$container
1155
+ .find( c.widgetOptions.pager_selectors.pageSize )
1156
+ .val( tsp.parsePageSize( c, p.size, 'set' ) );
1142
1157
  $.data( table, 'pagerLastPage', tsp.parsePageNumber( c, p ) );
1143
1158
  $.data( table, 'pagerLastSize', p.size );
1144
1159
  p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
@@ -1197,27 +1212,27 @@
1197
1212
  ts.storage( table, c.widgetOptions.pager_storageKey, '' );
1198
1213
  }
1199
1214
  p.$container = null;
1200
- p.$goto = null;
1201
- p.$size = null;
1202
1215
  c.pager = null;
1203
1216
  c.rowsCopy = null;
1204
1217
  }
1205
1218
  },
1206
1219
 
1207
1220
  enablePager: function( c, triggered ) {
1208
- var info, size, $el,
1221
+ var info, size,
1209
1222
  table = c.table,
1210
- p = c.pager;
1223
+ p = c.pager,
1224
+ wo = c.widgetOptions,
1225
+ $el = p.$container.find( wo.pager_selectors.pageSize );
1211
1226
  p.isDisabled = false;
1212
1227
  p.page = $.data( table, 'pagerLastPage' ) || p.page || 0;
1213
- size = p.$size.find( 'option[selected]' ).val();
1228
+ size = $el.find('option[selected]' ).val();
1214
1229
  p.size = $.data( table, 'pagerLastSize' ) || tsp.parsePageSize( c, size, 'get' );
1215
- p.$size.val( p.size ); // set page size
1230
+ $el.val( p.size ); // set page size
1216
1231
  p.totalPages = p.size === 'all' ? 1 : Math.ceil( tsp.getTotalPages( c, p ) / p.size );
1217
1232
  c.$table.removeClass( 'pagerDisabled' );
1218
1233
  // if table id exists, include page display with aria info
1219
1234
  if ( table.id && !c.$table.attr( 'aria-describedby' ) ) {
1220
- $el = p.$container.find( c.widgetOptions.pager_selectors.pageDisplay );
1235
+ $el = p.$container.find( wo.pager_selectors.pageDisplay );
1221
1236
  info = $el.attr( 'id' );
1222
1237
  if ( !info ) {
1223
1238
  // only add pageDisplay id if it doesn't exist - see #1288
@@ -1,4 +1,4 @@
1
- /*! Widget: stickyHeaders - updated 7/31/2016 (v2.27.0) *//*
1
+ /*! Widget: stickyHeaders - updated 1/6/2017 (v2.28.4) *//*
2
2
  * Requires tablesorter v2.8+ and jQuery 1.4.3+
3
3
  * by Rob Garrison
4
4
  */
@@ -61,7 +61,7 @@
61
61
  // **************************
62
62
  ts.addWidget({
63
63
  id: 'stickyHeaders',
64
- priority: 55, // sticky widget must be initialized after the filter widget!
64
+ priority: 54, // sticky widget must be initialized after the filter & before pager widget!
65
65
  options: {
66
66
  stickyHeaders : '', // extra class name added to the sticky header row
67
67
  stickyHeaders_appendTo : null, // jQuery selector or object to phycially attach the sticky headers
@@ -1,7 +1,9 @@
1
- /*************
2
- Bootstrap theme
3
- *************/
4
- /* jQuery Bootstrap Theme */
1
+ /**
2
+ * Bootstrap theme v3.x
3
+ *
4
+ * WARNING!... once a stable Bootstrap v4.x is released,
5
+ * this file will be removed; use theme.bootstrap_3.css
6
+ */
5
7
  .tablesorter-bootstrap {
6
8
  width: 100%;
7
9
  }
@@ -83,6 +85,29 @@
83
85
  background-repeat: no-repeat !important;
84
86
  }
85
87
 
88
+ /* Column Widget - column sort colors */
89
+ .tablesorter-bootstrap > tbody > tr.odd td.primary {
90
+ background-color: #bfbfbf;
91
+ }
92
+ .tablesorter-bootstrap > tbody > tr td.primary,
93
+ .tablesorter-bootstrap > tbody > tr.even td.primary {
94
+ background-color: #d9d9d9;
95
+ }
96
+ .tablesorter-bootstrap > tbody > tr.odd td.secondary {
97
+ background-color: #d9d9d9;
98
+ }
99
+ .tablesorter-bootstrap > tbody > tr td.secondary,
100
+ .tablesorter-bootstrap > tbody > tr.even td.secondary {
101
+ background-color: #e6e6e6;
102
+ }
103
+ .tablesorter-bootstrap > tbody > tr.odd td.tertiary {
104
+ background-color: #e6e6e6;
105
+ }
106
+ .tablesorter-bootstrap > tbody > tr td.tertiary,
107
+ .tablesorter-bootstrap > tbody > tr.even td.tertiary {
108
+ background-color: #f2f2f2;
109
+ }
110
+
86
111
  /* caption */
87
112
  .caption {
88
113
  background-color: #fff;
@@ -143,7 +168,7 @@
143
168
  opacity: 0;
144
169
  filter: alpha(opacity=0);
145
170
  }
146
- /* rows hidden by filtering (needed for child rows) */
171
+ /* rows hidden by filtering */
147
172
  .tablesorter .filtered {
148
173
  display: none;
149
174
  }
@@ -1,7 +1,6 @@
1
- /*************
2
- Bootstrap 2 Theme
3
- *************/
4
- /* jQuery Bootstrap 2 Theme */
1
+ /**
2
+ * Bootstrap theme v2.x
3
+ */
5
4
  .tablesorter-bootstrap {
6
5
  width: 100%;
7
6
  }
@@ -89,6 +88,29 @@
89
88
  z-index: 1000;
90
89
  }
91
90
 
91
+ /* Column Widget - column sort colors */
92
+ .tablesorter-bootstrap > tbody > tr.odd td.primary {
93
+ background-color: #bfbfbf;
94
+ }
95
+ .tablesorter-bootstrap > tbody > tr td.primary,
96
+ .tablesorter-bootstrap > tbody > tr.even td.primary {
97
+ background-color: #d9d9d9;
98
+ }
99
+ .tablesorter-bootstrap > tbody > tr.odd td.secondary {
100
+ background-color: #d9d9d9;
101
+ }
102
+ .tablesorter-bootstrap > tbody > tr td.secondary,
103
+ .tablesorter-bootstrap > tbody > tr.even td.secondary {
104
+ background-color: #e6e6e6;
105
+ }
106
+ .tablesorter-bootstrap > tbody > tr.odd td.tertiary {
107
+ background-color: #e6e6e6;
108
+ }
109
+ .tablesorter-bootstrap > tbody > tr td.tertiary,
110
+ .tablesorter-bootstrap > tbody > tr.even td.tertiary {
111
+ background-color: #f2f2f2;
112
+ }
113
+
92
114
  /* caption */
93
115
  caption {
94
116
  background-color: #fff;
@@ -145,7 +167,7 @@ caption {
145
167
  opacity: 0;
146
168
  filter: alpha(opacity=0);
147
169
  }
148
- /* rows hidden by filtering (needed for child rows) */
170
+ /* rows hidden by filtering */
149
171
  .tablesorter .filtered {
150
172
  display: none;
151
173
  }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Bootstrap theme v3.x
3
+ */
4
+ .tablesorter-bootstrap {
5
+ width: 100%;
6
+ }
7
+ .tablesorter-bootstrap thead th,
8
+ .tablesorter-bootstrap thead td,
9
+ .tablesorter-bootstrap tfoot th,
10
+ .tablesorter-bootstrap tfoot td {
11
+ font: 14px/20px Arial, Sans-serif;
12
+ font-weight: bold;
13
+ padding: 4px;
14
+ margin: 0 0 18px;
15
+ background-color: #eee;
16
+ }
17
+
18
+ .tablesorter-bootstrap .tablesorter-header {
19
+ cursor: pointer;
20
+ }
21
+ .tablesorter-bootstrap .sorter-false {
22
+ cursor: default;
23
+ }
24
+
25
+ .tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon {
26
+ display: none;
27
+ }
28
+
29
+ .tablesorter-bootstrap .tablesorter-header-inner {
30
+ position: relative;
31
+ padding: 4px 18px 4px 4px;
32
+ }
33
+ .tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
34
+ padding: 4px;
35
+ }
36
+
37
+ /* bootstrap uses <i> for icons */
38
+ .tablesorter-bootstrap .tablesorter-header i.tablesorter-icon {
39
+ font-size: 11px;
40
+ position: absolute;
41
+ right: 2px;
42
+ top: 50%;
43
+ margin-top: -7px; /* half the icon height; older IE doesn't like this */
44
+ width: 14px;
45
+ height: 14px;
46
+ background-repeat: no-repeat;
47
+ line-height: 14px;
48
+ display: inline-block;
49
+ }
50
+
51
+ /* black unsorted icon */
52
+ .tablesorter-bootstrap .bootstrap-icon-unsorted {
53
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAA20lEQVR4AWJABpKSkoxALCstLb0aUAsZaCAMhVEY6B0amx8YZWDDEDSBa2AGe7XeIiAAClYwVGBvsAcIllsf/mvcC9DgOOd8h90fxWvngVEUbZIkuWRZZlE8eQjcisgZMM9zi+LJ6ZfwegmWZflZDugdHMfxTcGqql7TNBlUB/QObtv2VBSFrev6OY7jngzFk9OT/fn73fWYpqnlXNyXDMWT0zuYx/Bvel9ej+LJ6R08DMOu67q7DkTkrSA5vYPneV71fX/QASdTkJwezhs0TfMARn0wMDDGXEPgF4oijqwM5YjNAAAAAElFTkSuQmCC);
54
+ }
55
+
56
+ /* white unsorted icon */
57
+ .tablesorter-bootstrap .icon-white.bootstrap-icon-unsorted {
58
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC);
59
+ }
60
+
61
+ /* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
62
+ .tablesorter-bootstrap > tbody > tr.odd > td,
63
+ .tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
64
+ background-color: #f9f9f9;
65
+ }
66
+ .tablesorter-bootstrap > tbody > tr.hover > td,
67
+ .tablesorter-bootstrap > tbody > tr.odd:hover > td,
68
+ .tablesorter-bootstrap > tbody > tr.even:hover > td,
69
+ .tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td,
70
+ .tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td {
71
+ background-color: #f5f5f5;
72
+ }
73
+ .tablesorter-bootstrap > tbody > tr.even > td,
74
+ .tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
75
+ background-color: #fff;
76
+ }
77
+
78
+ /* processing icon */
79
+ .tablesorter-bootstrap .tablesorter-processing {
80
+ background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
81
+ background-position: center center !important;
82
+ background-repeat: no-repeat !important;
83
+ }
84
+
85
+ /* Column Widget - column sort colors */
86
+ .tablesorter-bootstrap > tbody > tr.odd td.primary {
87
+ background-color: #bfbfbf;
88
+ }
89
+ .tablesorter-bootstrap > tbody > tr td.primary,
90
+ .tablesorter-bootstrap > tbody > tr.even td.primary {
91
+ background-color: #d9d9d9;
92
+ }
93
+ .tablesorter-bootstrap > tbody > tr.odd td.secondary {
94
+ background-color: #d9d9d9;
95
+ }
96
+ .tablesorter-bootstrap > tbody > tr td.secondary,
97
+ .tablesorter-bootstrap > tbody > tr.even td.secondary {
98
+ background-color: #e6e6e6;
99
+ }
100
+ .tablesorter-bootstrap > tbody > tr.odd td.tertiary {
101
+ background-color: #e6e6e6;
102
+ }
103
+ .tablesorter-bootstrap > tbody > tr td.tertiary,
104
+ .tablesorter-bootstrap > tbody > tr.even td.tertiary {
105
+ background-color: #f2f2f2;
106
+ }
107
+
108
+ /* caption */
109
+ .caption {
110
+ background-color: #fff;
111
+ }
112
+
113
+ /* filter widget */
114
+ .tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,
115
+ .tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
116
+ width: 98%;
117
+ margin: 0;
118
+ padding: 4px 6px;
119
+ color: #333;
120
+ -webkit-box-sizing: border-box;
121
+ -moz-box-sizing: border-box;
122
+ box-sizing: border-box;
123
+ -webkit-transition: height 0.1s ease;
124
+ -moz-transition: height 0.1s ease;
125
+ -o-transition: height 0.1s ease;
126
+ transition: height 0.1s ease;
127
+ }
128
+ .tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
129
+ background-color: #eee;
130
+ color: #555;
131
+ cursor: not-allowed;
132
+ border: 1px solid #ccc;
133
+ border-radius: 4px;
134
+ box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
135
+ box-sizing: border-box;
136
+ transition: height 0.1s ease;
137
+ }
138
+ .tablesorter-bootstrap .tablesorter-filter-row {
139
+ background-color: #efefef;
140
+ }
141
+ .tablesorter-bootstrap .tablesorter-filter-row td {
142
+ background-color: #efefef;
143
+ line-height: normal;
144
+ text-align: center;
145
+ padding: 4px 6px;
146
+ vertical-align: middle;
147
+ -webkit-transition: line-height 0.1s ease;
148
+ -moz-transition: line-height 0.1s ease;
149
+ -o-transition: line-height 0.1s ease;
150
+ transition: line-height 0.1s ease;
151
+ }
152
+ /* hidden filter row */
153
+ .tablesorter-bootstrap .tablesorter-filter-row.hideme td {
154
+ padding: 2px; /* change this to modify the thickness of the closed border row */
155
+ margin: 0;
156
+ line-height: 0;
157
+ }
158
+ .tablesorter-bootstrap .tablesorter-filter-row.hideme * {
159
+ height: 1px;
160
+ min-height: 0;
161
+ border: 0;
162
+ padding: 0;
163
+ margin: 0;
164
+ /* don't use visibility: hidden because it disables tabbing */
165
+ opacity: 0;
166
+ filter: alpha(opacity=0);
167
+ }
168
+ /* rows hidden by filtering */
169
+ .tablesorter .filtered {
170
+ display: none;
171
+ }
172
+
173
+ /* pager plugin */
174
+ .tablesorter-bootstrap .tablesorter-pager select {
175
+ padding: 4px 6px;
176
+ }
177
+ .tablesorter-bootstrap .tablesorter-pager .pagedisplay {
178
+ border: 0;
179
+ }
180
+ /* tfoot i for pager controls */
181
+ .tablesorter-bootstrap tfoot i {
182
+ font-size: 11px;
183
+ }
184
+
185
+ /* ajax error row */
186
+ .tablesorter .tablesorter-errorRow td {
187
+ text-align: center;
188
+ cursor: pointer;
189
+ background-color: #e6bf99;
190
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Bootstrap theme v4.x
3
+ */
4
+ .tablesorter-bootstrap {
5
+ width: 100%;
6
+ }
7
+ .tablesorter-bootstrap thead th,
8
+ .tablesorter-bootstrap thead td,
9
+ .tablesorter-bootstrap tfoot th,
10
+ .tablesorter-bootstrap tfoot td {
11
+ font: 14px/20px Arial, Sans-serif;
12
+ font-weight: bold;
13
+ padding: 4px;
14
+ margin: 0 0 18px;
15
+ }
16
+
17
+ .tablesorter-bootstrap thead .tablesorter-header {
18
+ background-position: right 5px center;
19
+ background-repeat: no-repeat;
20
+ cursor: pointer;
21
+ white-space: normal;
22
+ }
23
+ .tablesorter-bootstrap:not(.table-inverse) thead:not(.thead-inverse) .tablesorter-header,
24
+ .tablesorter-bootstrap:not(.table-inverse) tfoot th,
25
+ .tablesorter-bootstrap:not(.table-inverse) tfoot td {
26
+ background-color: #eee;
27
+ }
28
+
29
+ .tablesorter-bootstrap thead .sorter-false {
30
+ cursor: default;
31
+ background-image: none;
32
+ }
33
+
34
+ .tablesorter-bootstrap .tablesorter-header-inner {
35
+ position: relative;
36
+ padding: 4px 18px 4px 4px;
37
+ }
38
+ .tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
39
+ padding: 4px;
40
+ }
41
+
42
+ /* black icons */
43
+ .tablesorter-bootstrap thead .tablesorter-headerUnSorted:not(.sorter-false) {
44
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=);
45
+ }
46
+ .tablesorter-bootstrap thead .tablesorter-headerAsc {
47
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=);
48
+ }
49
+ .tablesorter-bootstrap thead .tablesorter-headerDesc {
50
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+);
51
+ }
52
+
53
+ /* white icons */
54
+ .tablesorter-bootstrap thead.thead-inverse .tablesorter-headerUnSorted:not(.sorter-false),
55
+ .tablesorter-bootstrap.table-inverse thead .tablesorter-headerUnSorted:not(.sorter-false) {
56
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=);
57
+ }
58
+ .tablesorter-bootstrap thead.thead-inverse .tablesorter-headerAsc,
59
+ .tablesorter-bootstrap.table-inverse thead .tablesorter-headerAsc {
60
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=);
61
+ }
62
+ .tablesorter-bootstrap thead.thead-inverse .tablesorter-headerDesc,
63
+ .tablesorter-bootstrap.table-inverse thead .tablesorter-headerDesc {
64
+ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+);
65
+ }
66
+
67
+ /* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
68
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.odd > td,
69
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
70
+ background-color: #f9f9f9;
71
+ }
72
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.hover > td,
73
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.odd:hover > td,
74
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.even:hover > td,
75
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td,
76
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td {
77
+ background-color: #f5f5f5;
78
+ }
79
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.even > td,
80
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
81
+ background-color: #fff;
82
+ }
83
+
84
+ /* processing icon */
85
+ .tablesorter-bootstrap .tablesorter-processing {
86
+ background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
87
+ background-position: center center !important;
88
+ background-repeat: no-repeat !important;
89
+ }
90
+
91
+ /* Column Widget - column sort colors */
92
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.odd td.primary {
93
+ background-color: #bfbfbf;
94
+ }
95
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr td.primary,
96
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.even td.primary {
97
+ background-color: #d9d9d9;
98
+ }
99
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.odd td.secondary {
100
+ background-color: #d9d9d9;
101
+ }
102
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr td.secondary,
103
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.even td.secondary {
104
+ background-color: #e6e6e6;
105
+ }
106
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.odd td.tertiary {
107
+ background-color: #e6e6e6;
108
+ }
109
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr td.tertiary,
110
+ .tablesorter-bootstrap:not(.table-inverse) > tbody > tr.even td.tertiary {
111
+ background-color: #f2f2f2;
112
+ }
113
+
114
+ /* caption */
115
+ .tablesorter-bootstrap:not(.table-inverse) .caption {
116
+ background-color: #fff;
117
+ }
118
+
119
+ /* filter widget */
120
+ .tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,
121
+ .tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
122
+ width: 98%;
123
+ margin: 0;
124
+ -webkit-box-sizing: border-box;
125
+ -moz-box-sizing: border-box;
126
+ box-sizing: border-box;
127
+ -webkit-transition: height 0.1s ease;
128
+ -moz-transition: height 0.1s ease;
129
+ -o-transition: height 0.1s ease;
130
+ transition: height 0.1s ease;
131
+ }
132
+ .tablesorter-bootstrap:not(.table-inverse) .tablesorter-filter-row {
133
+ background-color: #efefef;
134
+ }
135
+ .tablesorter-bootstrap:not(.table-inverse) .tablesorter-filter-row input.tablesorter-filter,
136
+ .tablesorter-bootstrap:not(.table-inverse) .tablesorter-filter-row select.tablesorter-filter {
137
+ color: #333;
138
+ }
139
+
140
+ .tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
141
+ cursor: not-allowed;
142
+ box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
143
+ box-sizing: border-box;
144
+ transition: height 0.1s ease;
145
+ }
146
+
147
+ .tablesorter-bootstrap:not(.table-inverse) .tablesorter-filter-row td {
148
+ line-height: normal;
149
+ text-align: center;
150
+ padding: 4px 6px;
151
+ vertical-align: middle;
152
+ -webkit-transition: line-height 0.1s ease;
153
+ -moz-transition: line-height 0.1s ease;
154
+ -o-transition: line-height 0.1s ease;
155
+ transition: line-height 0.1s ease;
156
+ }
157
+ /* hidden filter row */
158
+ .tablesorter-bootstrap .tablesorter-filter-row.hideme td {
159
+ padding: 2px; /* change this to modify the thickness of the closed border row */
160
+ margin: 0;
161
+ line-height: 0;
162
+ }
163
+ .tablesorter-bootstrap .tablesorter-filter-row.hideme * {
164
+ height: 1px;
165
+ min-height: 0;
166
+ border: 0;
167
+ padding: 0;
168
+ margin: 0;
169
+ /* don't use visibility: hidden because it disables tabbing */
170
+ opacity: 0;
171
+ filter: alpha(opacity=0);
172
+ }
173
+ /* rows hidden by filtering */
174
+ .tablesorter .filtered {
175
+ display: none;
176
+ }
177
+
178
+ /* pager plugin */
179
+
180
+ .tablesorter-bootstrap .tablesorter-pager .pagedisplay {
181
+ border: 0;
182
+ }
183
+
184
+ /* ajax error row */
185
+ .tablesorter:not(.table-inverse) .tablesorter-errorRow td {
186
+ text-align: center;
187
+ cursor: pointer;
188
+ background-color: #e6bf99;
189
+ }
@@ -0,0 +1,38 @@
1
+ /* Grouping widget css */
2
+ tr.group-header td {
3
+ background: #eee;
4
+ }
5
+ .group-name {
6
+ text-transform: uppercase;
7
+ font-weight: bold;
8
+ }
9
+ .group-count {
10
+ color: #999;
11
+ }
12
+ .group-hidden {
13
+ display: none !important;
14
+ }
15
+ .group-header, .group-header td {
16
+ user-select: none;
17
+ -moz-user-select: none;
18
+ }
19
+ /* collapsed arrow */
20
+ tr.group-header td i {
21
+ display: inline-block;
22
+ width: 0;
23
+ height: 0;
24
+ border-top: 4px solid transparent;
25
+ border-bottom: 4px solid #888;
26
+ border-right: 4px solid #888;
27
+ border-left: 4px solid transparent;
28
+ margin-right: 7px;
29
+ user-select: none;
30
+ -moz-user-select: none;
31
+ }
32
+ tr.group-header.collapsed td i {
33
+ border-top: 5px solid transparent;
34
+ border-bottom: 5px solid transparent;
35
+ border-left: 5px solid #888;
36
+ border-right: 0;
37
+ margin-right: 10px;
38
+ }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jquery-tablesorter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.23.3
4
+ version: 1.23.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jun Lin
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-12-19 00:00:00.000000000 Z
12
+ date: 2017-01-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -149,6 +149,8 @@ files:
149
149
  - vendor/assets/stylesheets/jquery-tablesorter/theme.blue.css
150
150
  - vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap.css
151
151
  - vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap_2.css
152
+ - vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap_3.css
153
+ - vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap_4.css
152
154
  - vendor/assets/stylesheets/jquery-tablesorter/theme.dark.css
153
155
  - vendor/assets/stylesheets/jquery-tablesorter/theme.default.css
154
156
  - vendor/assets/stylesheets/jquery-tablesorter/theme.dropbox.css
@@ -158,6 +160,7 @@ files:
158
160
  - vendor/assets/stylesheets/jquery-tablesorter/theme.jui.css
159
161
  - vendor/assets/stylesheets/jquery-tablesorter/theme.materialize.css
160
162
  - vendor/assets/stylesheets/jquery-tablesorter/theme.metro-dark.css
163
+ - vendor/assets/stylesheets/jquery-tablesorter/widget.grouping.css
161
164
  homepage: https://github.com/themilkman/jquery-tablesorter-rails
162
165
  licenses:
163
166
  - MIT