jquery-tablesorter 1.23.3 → 1.23.4

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 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