jquery-tablesorter 1.18.3 → 1.18.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: a142ba049c8283ad5701ebc22af25c6f2a0a186e
4
- data.tar.gz: 01d9fbb2e17cd989c67376e6f71aa809ed3c3639
3
+ metadata.gz: 7f25b2d1c32020eb01d61f3b5b36078ea6c6ac85
4
+ data.tar.gz: 3d8e1b92751a59e9f79aaa7989bd0303fec33118
5
5
  SHA512:
6
- metadata.gz: f0dafc07d7437a3af57ab0542226dd55d5cd0f1cbb4ad86290d1326644337a091b597cf03f98b20ab7cf8c3fbb8327024f16c4dbe59f226b1ea3a527e69337cd
7
- data.tar.gz: 0c23865e29959b6c0ea505cb026ed5635d39e1b760b902bd25a2f0dc29c6553875a1b07899349353afc907d0d356fd716119cbb0d4e3799643a0bf4a78469f4c
6
+ metadata.gz: 2abcb7450f22141441bb95ca5044426d0041d3430e2fb96a5fd6421ee2fc5ce0e45798d253366c7a4641a0e3735c94ba28b0bbe45a55ff0978ae323864fc0198
7
+ data.tar.gz: c7ec726ac20494eceb26014dcfb791b47c256ee8f6ffe86a6765ccae79c071c6483ea4a9832edcd95bd9a1a607e911612de52845d5d0382e2b15e69a9a94c6bc
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  Simple integration of jquery-tablesorter into the asset pipeline.
6
6
 
7
- Current tablesorter version: 2.23.3 (9/1/2015), [documentation]
7
+ Current tablesorter version: 2.23.4 (9/23/2015), [documentation]
8
8
 
9
9
  Any issue associated with the js/css files, please report to [Mottie's fork].
10
10
 
@@ -1,3 +1,3 @@
1
1
  module JqueryTablesorter
2
- VERSION = '1.18.3'
2
+ VERSION = '1.18.4'
3
3
  end
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) - updated 09-01-2015 (v2.23.3)*/
7
+ /*! tablesorter (FORK) - updated 09-23-2015 (v2.23.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($) {
18
18
 
19
- /*! TableSorter (FORK) v2.23.3 *//*
19
+ /*! TableSorter (FORK) v2.23.4 *//*
20
20
  * Client-side table sorting with ease!
21
21
  * @requires jQuery v1.2.6+
22
22
  *
@@ -43,7 +43,7 @@
43
43
 
44
44
  var ts = this;
45
45
 
46
- ts.version = '2.23.3';
46
+ ts.version = '2.23.4';
47
47
 
48
48
  ts.parsers = [];
49
49
  ts.widgets = [];
@@ -1606,7 +1606,7 @@
1606
1606
 
1607
1607
  // *** sort functions ***
1608
1608
  // regex used in natural sort
1609
- ts.regex.chunk = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi; // chunk/tokenize numbers & letters
1609
+ ts.regex.chunk = /(^([+\-]?(?:\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi; // chunk/tokenize numbers & letters
1610
1610
  ts.regex.chunks = /(^\\0|\\0$)/; // replace chunks @ ends
1611
1611
  ts.regex.hex = /^0x[0-9a-f]+$/i; // hex
1612
1612
 
@@ -1810,13 +1810,12 @@
1810
1810
 
1811
1811
  ts.applyWidgetOptions = function( table, c ){
1812
1812
  var indx, widget,
1813
- len = c.widgets.length,
1814
- wo = c.widgetOptions;
1813
+ len = c.widgets.length;
1815
1814
  if (len) {
1816
1815
  for (indx = 0; indx < len; indx++) {
1817
1816
  widget = ts.getWidgetById( c.widgets[indx] );
1818
1817
  if ( widget && 'options' in widget ) {
1819
- wo = table.config.widgetOptions = $.extend( true, {}, widget.options, wo );
1818
+ c.widgetOptions = $.extend( true, {}, widget.options, c.widgetOptions );
1820
1819
  }
1821
1820
  }
1822
1821
  }
@@ -1826,7 +1825,6 @@
1826
1825
  table = $(table)[0]; // in case this is called externally
1827
1826
  var indx, len, names, widget, name, applied,
1828
1827
  c = table.config,
1829
- wo = c.widgetOptions,
1830
1828
  tableClass = ' ' + c.table.className + ' ',
1831
1829
  widgets = [],
1832
1830
  time, time2, w, wd;
@@ -1884,14 +1882,14 @@
1884
1882
  c.widgetInit[ name ] = true;
1885
1883
  if (table.hasInitialized) {
1886
1884
  // don't reapply widget options on tablesorter init
1887
- ts.applyWidgetOptions( table, c );
1885
+ ts.applyWidgetOptions( table, table.config );
1888
1886
  }
1889
1887
  if ( 'init' in widget ) {
1890
1888
  applied = true;
1891
1889
  if (c.debug) {
1892
1890
  console[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' );
1893
1891
  }
1894
- widget.init(table, widget, c, wo);
1892
+ widget.init(table, widget, table.config, table.config.widgetOptions);
1895
1893
  }
1896
1894
  }
1897
1895
  if ( !init && 'format' in widget ) {
@@ -1899,7 +1897,7 @@
1899
1897
  if (c.debug) {
1900
1898
  console[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' );
1901
1899
  }
1902
- widget.format(table, c, wo, false);
1900
+ widget.format(table, table.config, table.config.widgetOptions, false);
1903
1901
  }
1904
1902
  if (c.debug) {
1905
1903
  if (applied) {
@@ -2109,7 +2107,7 @@
2109
2107
  });
2110
2108
 
2111
2109
  // set up debug logs
2112
- if ( !( console && console.log ) ) {
2110
+ if ( !( window.console && window.console.log ) ) {
2113
2111
  ts.logs = [];
2114
2112
  /*jshint -W020 */
2115
2113
  console = {};
@@ -2718,7 +2716,7 @@
2718
2716
 
2719
2717
  })(jQuery);
2720
2718
 
2721
- /*! Widget: filter - updated 9/1/2015 (v2.23.3) *//*
2719
+ /*! Widget: filter - updated 9/23/2015 (v2.23.4) *//*
2722
2720
  * Requires tablesorter v2.8+ and jQuery 1.7+
2723
2721
  * by Rob Garrison
2724
2722
  */
@@ -2741,6 +2739,7 @@
2741
2739
  options : {
2742
2740
  filter_childRows : false, // if true, filter includes child row content in the search
2743
2741
  filter_childByColumn : false, // ( filter_childRows must be true ) if true = search child rows by column; false = search all child row text grouped
2742
+ filter_childWithSibs : true, // if true, include matching child row siblings
2744
2743
  filter_columnFilters : true, // if true, a filter will be added to the top of each table column
2745
2744
  filter_columnAnyMatch: true, // if true, allows using '#:{query}' in AnyMatch searches ( column:query )
2746
2745
  filter_cellFilter : '', // css class name added to the filter cell ( string or array )
@@ -3077,7 +3076,7 @@
3077
3076
  c.$table.addClass( 'hasFilters' );
3078
3077
 
3079
3078
  // define timers so using clearTimeout won't cause an undefined error
3080
- wo.searchTimer = null;
3079
+ wo.filter_searchTimer = null;
3081
3080
  wo.filter_initTimer = null;
3082
3081
  wo.filter_formatterCount = 0;
3083
3082
  wo.filter_formatterInit = [];
@@ -3210,7 +3209,7 @@
3210
3209
  .find( 'select.' + tscss.filter + '[data-column="' + column + '"]' )
3211
3210
  .append( options );
3212
3211
  txt = wo.filter_selectSource;
3213
- fxn = $.isFunction( txt ) ? true : ts.getColumnData( table, txt, column );
3212
+ fxn = typeof txt === 'function' ? true : ts.getColumnData( table, txt, column );
3214
3213
  if ( fxn ) {
3215
3214
  // updating so the extra options are appended
3216
3215
  tsf.buildSelect( c.table, column, '', true, $header.hasClass( wo.filter_onlyAvail ) );
@@ -3229,7 +3228,7 @@
3229
3228
  }
3230
3229
 
3231
3230
  if ( wo.filter_hideFilters ) {
3232
- tsf.hideFilters( table, c );
3231
+ tsf.hideFilters( c );
3233
3232
  }
3234
3233
 
3235
3234
  // show processing icon
@@ -3356,7 +3355,7 @@
3356
3355
  return parsed ? c.parsers[column].format( filter, c.table, [], column ) : filter;
3357
3356
  },
3358
3357
  buildRow: function( table, c, wo ) {
3359
- var col, column, $header, buildSelect, disabled, name, ffxn, tmp,
3358
+ var col, column, $header, makeSelect, disabled, name, ffxn, tmp,
3360
3359
  // c.columns defined in computeThIndexes()
3361
3360
  cellFilter = wo.filter_cellFilter,
3362
3361
  columns = c.columns,
@@ -3380,14 +3379,14 @@
3380
3379
  // assuming last cell of a column is the main column
3381
3380
  $header = c.$headerIndexed[ column ];
3382
3381
  ffxn = ts.getColumnData( table, wo.filter_functions, column );
3383
- buildSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
3382
+ makeSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
3384
3383
  $header.hasClass( 'filter-select' );
3385
3384
  // get data from jQuery data, metadata, headers option or header class name
3386
3385
  col = ts.getColumnData( table, c.headers, column );
3387
3386
  disabled = ts.getData( $header[0], col, 'filter' ) === 'false' ||
3388
3387
  ts.getData( $header[0], col, 'parser' ) === 'false';
3389
3388
 
3390
- if ( buildSelect ) {
3389
+ if ( makeSelect ) {
3391
3390
  buildFilter = $( '<select>' ).appendTo( c.$filters.eq( column ) );
3392
3391
  } else {
3393
3392
  ffxn = ts.getColumnData( table, wo.filter_formatter, column );
@@ -3489,10 +3488,10 @@
3489
3488
  },
3490
3489
  searching: function( table, filter, skipFirst ) {
3491
3490
  var wo = table.config.widgetOptions;
3492
- clearTimeout( wo.searchTimer );
3491
+ clearTimeout( wo.filter_searchTimer );
3493
3492
  if ( typeof filter === 'undefined' || filter === true ) {
3494
3493
  // delay filtering
3495
- wo.searchTimer = setTimeout( function() {
3494
+ wo.filter_searchTimer = setTimeout( function() {
3496
3495
  tsf.checkFilters( table, filter, skipFirst );
3497
3496
  }, wo.filter_liveSearch ? wo.filter_searchDelay : 10 );
3498
3497
  } else {
@@ -3550,7 +3549,7 @@
3550
3549
  return false;
3551
3550
  }
3552
3551
  },
3553
- hideFilters: function( table, c ) {
3552
+ hideFilters: function( c ) {
3554
3553
  var timer;
3555
3554
  c.$table
3556
3555
  .find( '.' + tscss.filterRow )
@@ -3627,7 +3626,7 @@
3627
3626
  targets = wo.filter_initialized || !$input.filter( wo.filter_anyColumnSelector ).length,
3628
3627
  columns = [],
3629
3628
  val = $.trim( tsf.getLatestSearch( $input ).attr( 'data-column' ) || '' );
3630
- if ( !/[,-]/.test(val) && val.length === 1 ) {
3629
+ if ( /^[0-9]+$/.test(val)) {
3631
3630
  return parseInt( val, 10 );
3632
3631
  }
3633
3632
  // process column range
@@ -3841,7 +3840,7 @@
3841
3840
  !table.config.widgetOptions.filter_initialized ) {
3842
3841
  return;
3843
3842
  }
3844
- var len, norm_rows, rowData, $rows, rowIndex, tbodyIndex, $tbody, columnIndex,
3843
+ var len, norm_rows, rowData, $rows, $row, rowIndex, tbodyIndex, $tbody, columnIndex,
3845
3844
  isChild, childRow, lastSearch, showRow, time, val, indx,
3846
3845
  notFiltered, searchFiltered, query, injected, res, id, txt,
3847
3846
  storedFilters = $.extend( [], filters ),
@@ -4029,24 +4028,37 @@
4029
4028
  '';
4030
4029
  }
4031
4030
 
4032
- showRow = tsf.processRow( c, data, vars );
4031
+ showRow = false;
4032
+ val = tsf.processRow( c, data, vars );
4033
4033
  childRow = rowData.$row.filter( ':gt( 0 )' );
4034
-
4035
4034
  if ( wo.filter_childRows && childRow.length ) {
4035
+ if ( !wo.filter_childWithSibs ) {
4036
+ // hide all child rows
4037
+ childRow.addClass( wo.filter_filteredRow );
4038
+ }
4036
4039
  if ( wo.filter_childByColumn ) {
4037
4040
  // cycle through each child row
4038
4041
  for ( indx = 0; indx < childRow.length; indx++ ) {
4039
4042
  data.$row = childRow.eq( indx );
4040
4043
  data.cacheArray = rowData.child[ indx ];
4041
4044
  data.rawArray = data.cacheArray;
4045
+ val = tsf.processRow( c, data, vars );
4042
4046
  // use OR comparison on child rows
4043
- showRow = showRow || tsf.processRow( c, data, vars );
4047
+ showRow = showRow || val;
4048
+ if ( !wo.filter_childWithSibs && val ) {
4049
+ childRow.eq( indx ).removeClass( wo.filter_filteredRow );
4050
+ }
4044
4051
  }
4045
4052
  }
4046
- childRow.toggleClass( wo.filter_filteredRow, !showRow );
4053
+ } else {
4054
+ showRow = val;
4047
4055
  }
4048
-
4049
- rowData.$row
4056
+ $row = rowData.$row;
4057
+ // if only showing resulting child row, only include parent
4058
+ if ( !wo.filter_childWithSibs ) {
4059
+ $row = $row.eq( 0 );
4060
+ }
4061
+ $row
4050
4062
  .toggleClass( wo.filter_filteredRow, !showRow )[0]
4051
4063
  .display = showRow ? '' : 'none';
4052
4064
  }
@@ -4074,14 +4086,12 @@
4074
4086
  },
4075
4087
  getOptionSource: function( table, column, onlyAvail ) {
4076
4088
  table = $( table )[0];
4077
- var cts, txt, indx, len,
4078
- c = table.config,
4089
+ var c = table.config,
4079
4090
  wo = c.widgetOptions,
4080
- parsed = [],
4081
4091
  arry = false,
4082
4092
  source = wo.filter_selectSource,
4083
4093
  last = c.$table.data( 'lastSearch' ) || [],
4084
- fxn = $.isFunction( source ) ? true : ts.getColumnData( table, source, column );
4094
+ fxn = typeof source === 'function' ? true : ts.getColumnData( table, source, column );
4085
4095
 
4086
4096
  if ( onlyAvail && last[column] !== '' ) {
4087
4097
  onlyAvail = false;
@@ -4100,11 +4110,25 @@
4100
4110
  // custom select source function for a SPECIFIC COLUMN
4101
4111
  arry = fxn( table, column, onlyAvail );
4102
4112
  }
4113
+
4103
4114
  if ( arry === false ) {
4104
4115
  // fall back to original method
4105
4116
  arry = tsf.getOptions( table, column, onlyAvail );
4106
4117
  }
4107
4118
 
4119
+ return tsf.processOptions( table, column, arry );
4120
+
4121
+ },
4122
+ processOptions: function( table, column, arry ) {
4123
+ if ( !$.isArray( arry ) ) {
4124
+ return false;
4125
+ }
4126
+ table = $( table )[0];
4127
+ var cts, txt, indx, len,
4128
+ c = table.config,
4129
+ validColumn = typeof column !== 'undefined' && column !== null && column >= 0 && column < c.columns,
4130
+ parsed = [];
4131
+
4108
4132
  // get unique elements and sort the list
4109
4133
  // if $.tablesorter.sortText exists ( not in the original tablesorter ),
4110
4134
  // then natural sort the list otherwise use a basic sort
@@ -4112,7 +4136,7 @@
4112
4136
  return $.inArray( value, arry ) === indx;
4113
4137
  });
4114
4138
 
4115
- if ( c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {
4139
+ if ( validColumn && c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {
4116
4140
  // unsorted select options
4117
4141
  return arry;
4118
4142
  } else {
@@ -4125,7 +4149,8 @@
4125
4149
  parsed.push({
4126
4150
  t : txt,
4127
4151
  // check parser length - fixes #934
4128
- p : c.parsers && c.parsers.length && c.parsers[ column ].format( txt, table, [], column ) || txt
4152
+ p : validColumn && c.parsers && c.parsers.length &&
4153
+ c.parsers[ column ].format( txt, table, [], column ) || txt
4129
4154
  });
4130
4155
  }
4131
4156
 
@@ -4135,10 +4160,10 @@
4135
4160
  // sortNatural breaks if you don't pass it strings
4136
4161
  var x = a.p.toString(),
4137
4162
  y = b.p.toString();
4138
- if ( $.isFunction( cts ) ) {
4163
+ if ( validColumn && typeof cts === 'function' ) {
4139
4164
  // custom OVERALL text sorter
4140
4165
  return cts( x, y, true, column, table );
4141
- } else if ( typeof cts === 'object' && cts.hasOwnProperty( column ) ) {
4166
+ } else if ( validColumn && typeof cts === 'object' && cts.hasOwnProperty( column ) ) {
4142
4167
  // custom text sorter for a SPECIFIC COLUMN
4143
4168
  return cts[column]( x, y, true, column, table );
4144
4169
  } else if ( ts.sortNatural ) {
@@ -4196,6 +4221,7 @@
4196
4221
  if ( !table.config.cache || $.isEmptyObject( table.config.cache ) ) {
4197
4222
  return;
4198
4223
  }
4224
+
4199
4225
  var indx, val, txt, t, $filters, $filter,
4200
4226
  c = table.config,
4201
4227
  wo = c.widgetOptions,
@@ -4211,6 +4237,7 @@
4211
4237
  .find( 'thead' )
4212
4238
  .find( 'select.' + tscss.filter + '[data-column="' + column + '"]' )
4213
4239
  .val();
4240
+
4214
4241
  // nothing included in arry ( external source ), so get the options from
4215
4242
  // filter_selectSource or column data
4216
4243
  if ( typeof arry === 'undefined' || arry === '' ) {
@@ -1,4 +1,4 @@
1
- /*! TableSorter (FORK) v2.23.3 *//*
1
+ /*! TableSorter (FORK) v2.23.4 *//*
2
2
  * Client-side table sorting with ease!
3
3
  * @requires jQuery v1.2.6+
4
4
  *
@@ -25,7 +25,7 @@
25
25
 
26
26
  var ts = this;
27
27
 
28
- ts.version = '2.23.3';
28
+ ts.version = '2.23.4';
29
29
 
30
30
  ts.parsers = [];
31
31
  ts.widgets = [];
@@ -1588,7 +1588,7 @@
1588
1588
 
1589
1589
  // *** sort functions ***
1590
1590
  // regex used in natural sort
1591
- ts.regex.chunk = /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi; // chunk/tokenize numbers & letters
1591
+ ts.regex.chunk = /(^([+\-]?(?:\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi; // chunk/tokenize numbers & letters
1592
1592
  ts.regex.chunks = /(^\\0|\\0$)/; // replace chunks @ ends
1593
1593
  ts.regex.hex = /^0x[0-9a-f]+$/i; // hex
1594
1594
 
@@ -1792,13 +1792,12 @@
1792
1792
 
1793
1793
  ts.applyWidgetOptions = function( table, c ){
1794
1794
  var indx, widget,
1795
- len = c.widgets.length,
1796
- wo = c.widgetOptions;
1795
+ len = c.widgets.length;
1797
1796
  if (len) {
1798
1797
  for (indx = 0; indx < len; indx++) {
1799
1798
  widget = ts.getWidgetById( c.widgets[indx] );
1800
1799
  if ( widget && 'options' in widget ) {
1801
- wo = table.config.widgetOptions = $.extend( true, {}, widget.options, wo );
1800
+ c.widgetOptions = $.extend( true, {}, widget.options, c.widgetOptions );
1802
1801
  }
1803
1802
  }
1804
1803
  }
@@ -1808,7 +1807,6 @@
1808
1807
  table = $(table)[0]; // in case this is called externally
1809
1808
  var indx, len, names, widget, name, applied,
1810
1809
  c = table.config,
1811
- wo = c.widgetOptions,
1812
1810
  tableClass = ' ' + c.table.className + ' ',
1813
1811
  widgets = [],
1814
1812
  time, time2, w, wd;
@@ -1866,14 +1864,14 @@
1866
1864
  c.widgetInit[ name ] = true;
1867
1865
  if (table.hasInitialized) {
1868
1866
  // don't reapply widget options on tablesorter init
1869
- ts.applyWidgetOptions( table, c );
1867
+ ts.applyWidgetOptions( table, table.config );
1870
1868
  }
1871
1869
  if ( 'init' in widget ) {
1872
1870
  applied = true;
1873
1871
  if (c.debug) {
1874
1872
  console[ console.group ? 'group' : 'log' ]( 'Initializing ' + name + ' widget' );
1875
1873
  }
1876
- widget.init(table, widget, c, wo);
1874
+ widget.init(table, widget, table.config, table.config.widgetOptions);
1877
1875
  }
1878
1876
  }
1879
1877
  if ( !init && 'format' in widget ) {
@@ -1881,7 +1879,7 @@
1881
1879
  if (c.debug) {
1882
1880
  console[ console.group ? 'group' : 'log' ]( 'Updating ' + name + ' widget' );
1883
1881
  }
1884
- widget.format(table, c, wo, false);
1882
+ widget.format(table, table.config, table.config.widgetOptions, false);
1885
1883
  }
1886
1884
  if (c.debug) {
1887
1885
  if (applied) {
@@ -2091,7 +2089,7 @@
2091
2089
  });
2092
2090
 
2093
2091
  // set up debug logs
2094
- if ( !( console && console.log ) ) {
2092
+ if ( !( window.console && window.console.log ) ) {
2095
2093
  ts.logs = [];
2096
2094
  /*jshint -W020 */
2097
2095
  console = {};
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) - updated 09-01-2015 (v2.23.3)*/
7
+ /*! tablesorter (FORK) - updated 09-23-2015 (v2.23.4)*/
8
8
  /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
9
9
  (function(factory) {
10
10
  if (typeof define === 'function' && define.amd) {
@@ -372,7 +372,7 @@
372
372
 
373
373
  })(jQuery);
374
374
 
375
- /*! Widget: filter - updated 9/1/2015 (v2.23.3) *//*
375
+ /*! Widget: filter - updated 9/23/2015 (v2.23.4) *//*
376
376
  * Requires tablesorter v2.8+ and jQuery 1.7+
377
377
  * by Rob Garrison
378
378
  */
@@ -395,6 +395,7 @@
395
395
  options : {
396
396
  filter_childRows : false, // if true, filter includes child row content in the search
397
397
  filter_childByColumn : false, // ( filter_childRows must be true ) if true = search child rows by column; false = search all child row text grouped
398
+ filter_childWithSibs : true, // if true, include matching child row siblings
398
399
  filter_columnFilters : true, // if true, a filter will be added to the top of each table column
399
400
  filter_columnAnyMatch: true, // if true, allows using '#:{query}' in AnyMatch searches ( column:query )
400
401
  filter_cellFilter : '', // css class name added to the filter cell ( string or array )
@@ -731,7 +732,7 @@
731
732
  c.$table.addClass( 'hasFilters' );
732
733
 
733
734
  // define timers so using clearTimeout won't cause an undefined error
734
- wo.searchTimer = null;
735
+ wo.filter_searchTimer = null;
735
736
  wo.filter_initTimer = null;
736
737
  wo.filter_formatterCount = 0;
737
738
  wo.filter_formatterInit = [];
@@ -864,7 +865,7 @@
864
865
  .find( 'select.' + tscss.filter + '[data-column="' + column + '"]' )
865
866
  .append( options );
866
867
  txt = wo.filter_selectSource;
867
- fxn = $.isFunction( txt ) ? true : ts.getColumnData( table, txt, column );
868
+ fxn = typeof txt === 'function' ? true : ts.getColumnData( table, txt, column );
868
869
  if ( fxn ) {
869
870
  // updating so the extra options are appended
870
871
  tsf.buildSelect( c.table, column, '', true, $header.hasClass( wo.filter_onlyAvail ) );
@@ -883,7 +884,7 @@
883
884
  }
884
885
 
885
886
  if ( wo.filter_hideFilters ) {
886
- tsf.hideFilters( table, c );
887
+ tsf.hideFilters( c );
887
888
  }
888
889
 
889
890
  // show processing icon
@@ -1010,7 +1011,7 @@
1010
1011
  return parsed ? c.parsers[column].format( filter, c.table, [], column ) : filter;
1011
1012
  },
1012
1013
  buildRow: function( table, c, wo ) {
1013
- var col, column, $header, buildSelect, disabled, name, ffxn, tmp,
1014
+ var col, column, $header, makeSelect, disabled, name, ffxn, tmp,
1014
1015
  // c.columns defined in computeThIndexes()
1015
1016
  cellFilter = wo.filter_cellFilter,
1016
1017
  columns = c.columns,
@@ -1034,14 +1035,14 @@
1034
1035
  // assuming last cell of a column is the main column
1035
1036
  $header = c.$headerIndexed[ column ];
1036
1037
  ffxn = ts.getColumnData( table, wo.filter_functions, column );
1037
- buildSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
1038
+ makeSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
1038
1039
  $header.hasClass( 'filter-select' );
1039
1040
  // get data from jQuery data, metadata, headers option or header class name
1040
1041
  col = ts.getColumnData( table, c.headers, column );
1041
1042
  disabled = ts.getData( $header[0], col, 'filter' ) === 'false' ||
1042
1043
  ts.getData( $header[0], col, 'parser' ) === 'false';
1043
1044
 
1044
- if ( buildSelect ) {
1045
+ if ( makeSelect ) {
1045
1046
  buildFilter = $( '<select>' ).appendTo( c.$filters.eq( column ) );
1046
1047
  } else {
1047
1048
  ffxn = ts.getColumnData( table, wo.filter_formatter, column );
@@ -1143,10 +1144,10 @@
1143
1144
  },
1144
1145
  searching: function( table, filter, skipFirst ) {
1145
1146
  var wo = table.config.widgetOptions;
1146
- clearTimeout( wo.searchTimer );
1147
+ clearTimeout( wo.filter_searchTimer );
1147
1148
  if ( typeof filter === 'undefined' || filter === true ) {
1148
1149
  // delay filtering
1149
- wo.searchTimer = setTimeout( function() {
1150
+ wo.filter_searchTimer = setTimeout( function() {
1150
1151
  tsf.checkFilters( table, filter, skipFirst );
1151
1152
  }, wo.filter_liveSearch ? wo.filter_searchDelay : 10 );
1152
1153
  } else {
@@ -1204,7 +1205,7 @@
1204
1205
  return false;
1205
1206
  }
1206
1207
  },
1207
- hideFilters: function( table, c ) {
1208
+ hideFilters: function( c ) {
1208
1209
  var timer;
1209
1210
  c.$table
1210
1211
  .find( '.' + tscss.filterRow )
@@ -1281,7 +1282,7 @@
1281
1282
  targets = wo.filter_initialized || !$input.filter( wo.filter_anyColumnSelector ).length,
1282
1283
  columns = [],
1283
1284
  val = $.trim( tsf.getLatestSearch( $input ).attr( 'data-column' ) || '' );
1284
- if ( !/[,-]/.test(val) && val.length === 1 ) {
1285
+ if ( /^[0-9]+$/.test(val)) {
1285
1286
  return parseInt( val, 10 );
1286
1287
  }
1287
1288
  // process column range
@@ -1495,7 +1496,7 @@
1495
1496
  !table.config.widgetOptions.filter_initialized ) {
1496
1497
  return;
1497
1498
  }
1498
- var len, norm_rows, rowData, $rows, rowIndex, tbodyIndex, $tbody, columnIndex,
1499
+ var len, norm_rows, rowData, $rows, $row, rowIndex, tbodyIndex, $tbody, columnIndex,
1499
1500
  isChild, childRow, lastSearch, showRow, time, val, indx,
1500
1501
  notFiltered, searchFiltered, query, injected, res, id, txt,
1501
1502
  storedFilters = $.extend( [], filters ),
@@ -1683,24 +1684,37 @@
1683
1684
  '';
1684
1685
  }
1685
1686
 
1686
- showRow = tsf.processRow( c, data, vars );
1687
+ showRow = false;
1688
+ val = tsf.processRow( c, data, vars );
1687
1689
  childRow = rowData.$row.filter( ':gt( 0 )' );
1688
-
1689
1690
  if ( wo.filter_childRows && childRow.length ) {
1691
+ if ( !wo.filter_childWithSibs ) {
1692
+ // hide all child rows
1693
+ childRow.addClass( wo.filter_filteredRow );
1694
+ }
1690
1695
  if ( wo.filter_childByColumn ) {
1691
1696
  // cycle through each child row
1692
1697
  for ( indx = 0; indx < childRow.length; indx++ ) {
1693
1698
  data.$row = childRow.eq( indx );
1694
1699
  data.cacheArray = rowData.child[ indx ];
1695
1700
  data.rawArray = data.cacheArray;
1701
+ val = tsf.processRow( c, data, vars );
1696
1702
  // use OR comparison on child rows
1697
- showRow = showRow || tsf.processRow( c, data, vars );
1703
+ showRow = showRow || val;
1704
+ if ( !wo.filter_childWithSibs && val ) {
1705
+ childRow.eq( indx ).removeClass( wo.filter_filteredRow );
1706
+ }
1698
1707
  }
1699
1708
  }
1700
- childRow.toggleClass( wo.filter_filteredRow, !showRow );
1709
+ } else {
1710
+ showRow = val;
1701
1711
  }
1702
-
1703
- rowData.$row
1712
+ $row = rowData.$row;
1713
+ // if only showing resulting child row, only include parent
1714
+ if ( !wo.filter_childWithSibs ) {
1715
+ $row = $row.eq( 0 );
1716
+ }
1717
+ $row
1704
1718
  .toggleClass( wo.filter_filteredRow, !showRow )[0]
1705
1719
  .display = showRow ? '' : 'none';
1706
1720
  }
@@ -1728,14 +1742,12 @@
1728
1742
  },
1729
1743
  getOptionSource: function( table, column, onlyAvail ) {
1730
1744
  table = $( table )[0];
1731
- var cts, txt, indx, len,
1732
- c = table.config,
1745
+ var c = table.config,
1733
1746
  wo = c.widgetOptions,
1734
- parsed = [],
1735
1747
  arry = false,
1736
1748
  source = wo.filter_selectSource,
1737
1749
  last = c.$table.data( 'lastSearch' ) || [],
1738
- fxn = $.isFunction( source ) ? true : ts.getColumnData( table, source, column );
1750
+ fxn = typeof source === 'function' ? true : ts.getColumnData( table, source, column );
1739
1751
 
1740
1752
  if ( onlyAvail && last[column] !== '' ) {
1741
1753
  onlyAvail = false;
@@ -1754,11 +1766,25 @@
1754
1766
  // custom select source function for a SPECIFIC COLUMN
1755
1767
  arry = fxn( table, column, onlyAvail );
1756
1768
  }
1769
+
1757
1770
  if ( arry === false ) {
1758
1771
  // fall back to original method
1759
1772
  arry = tsf.getOptions( table, column, onlyAvail );
1760
1773
  }
1761
1774
 
1775
+ return tsf.processOptions( table, column, arry );
1776
+
1777
+ },
1778
+ processOptions: function( table, column, arry ) {
1779
+ if ( !$.isArray( arry ) ) {
1780
+ return false;
1781
+ }
1782
+ table = $( table )[0];
1783
+ var cts, txt, indx, len,
1784
+ c = table.config,
1785
+ validColumn = typeof column !== 'undefined' && column !== null && column >= 0 && column < c.columns,
1786
+ parsed = [];
1787
+
1762
1788
  // get unique elements and sort the list
1763
1789
  // if $.tablesorter.sortText exists ( not in the original tablesorter ),
1764
1790
  // then natural sort the list otherwise use a basic sort
@@ -1766,7 +1792,7 @@
1766
1792
  return $.inArray( value, arry ) === indx;
1767
1793
  });
1768
1794
 
1769
- if ( c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {
1795
+ if ( validColumn && c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {
1770
1796
  // unsorted select options
1771
1797
  return arry;
1772
1798
  } else {
@@ -1779,7 +1805,8 @@
1779
1805
  parsed.push({
1780
1806
  t : txt,
1781
1807
  // check parser length - fixes #934
1782
- p : c.parsers && c.parsers.length && c.parsers[ column ].format( txt, table, [], column ) || txt
1808
+ p : validColumn && c.parsers && c.parsers.length &&
1809
+ c.parsers[ column ].format( txt, table, [], column ) || txt
1783
1810
  });
1784
1811
  }
1785
1812
 
@@ -1789,10 +1816,10 @@
1789
1816
  // sortNatural breaks if you don't pass it strings
1790
1817
  var x = a.p.toString(),
1791
1818
  y = b.p.toString();
1792
- if ( $.isFunction( cts ) ) {
1819
+ if ( validColumn && typeof cts === 'function' ) {
1793
1820
  // custom OVERALL text sorter
1794
1821
  return cts( x, y, true, column, table );
1795
- } else if ( typeof cts === 'object' && cts.hasOwnProperty( column ) ) {
1822
+ } else if ( validColumn && typeof cts === 'object' && cts.hasOwnProperty( column ) ) {
1796
1823
  // custom text sorter for a SPECIFIC COLUMN
1797
1824
  return cts[column]( x, y, true, column, table );
1798
1825
  } else if ( ts.sortNatural ) {
@@ -1850,6 +1877,7 @@
1850
1877
  if ( !table.config.cache || $.isEmptyObject( table.config.cache ) ) {
1851
1878
  return;
1852
1879
  }
1880
+
1853
1881
  var indx, val, txt, t, $filters, $filter,
1854
1882
  c = table.config,
1855
1883
  wo = c.widgetOptions,
@@ -1865,6 +1893,7 @@
1865
1893
  .find( 'thead' )
1866
1894
  .find( 'select.' + tscss.filter + '[data-column="' + column + '"]' )
1867
1895
  .val();
1896
+
1868
1897
  // nothing included in arry ( external source ), so get the options from
1869
1898
  // filter_selectSource or column data
1870
1899
  if ( typeof arry === 'undefined' || arry === '' ) {
@@ -1,4 +1,4 @@
1
- /*! Widget: filter - updated 9/1/2015 (v2.23.3) *//*
1
+ /*! Widget: filter - updated 9/23/2015 (v2.23.4) *//*
2
2
  * Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -21,6 +21,7 @@
21
21
  options : {
22
22
  filter_childRows : false, // if true, filter includes child row content in the search
23
23
  filter_childByColumn : false, // ( filter_childRows must be true ) if true = search child rows by column; false = search all child row text grouped
24
+ filter_childWithSibs : true, // if true, include matching child row siblings
24
25
  filter_columnFilters : true, // if true, a filter will be added to the top of each table column
25
26
  filter_columnAnyMatch: true, // if true, allows using '#:{query}' in AnyMatch searches ( column:query )
26
27
  filter_cellFilter : '', // css class name added to the filter cell ( string or array )
@@ -357,7 +358,7 @@
357
358
  c.$table.addClass( 'hasFilters' );
358
359
 
359
360
  // define timers so using clearTimeout won't cause an undefined error
360
- wo.searchTimer = null;
361
+ wo.filter_searchTimer = null;
361
362
  wo.filter_initTimer = null;
362
363
  wo.filter_formatterCount = 0;
363
364
  wo.filter_formatterInit = [];
@@ -490,7 +491,7 @@
490
491
  .find( 'select.' + tscss.filter + '[data-column="' + column + '"]' )
491
492
  .append( options );
492
493
  txt = wo.filter_selectSource;
493
- fxn = $.isFunction( txt ) ? true : ts.getColumnData( table, txt, column );
494
+ fxn = typeof txt === 'function' ? true : ts.getColumnData( table, txt, column );
494
495
  if ( fxn ) {
495
496
  // updating so the extra options are appended
496
497
  tsf.buildSelect( c.table, column, '', true, $header.hasClass( wo.filter_onlyAvail ) );
@@ -509,7 +510,7 @@
509
510
  }
510
511
 
511
512
  if ( wo.filter_hideFilters ) {
512
- tsf.hideFilters( table, c );
513
+ tsf.hideFilters( c );
513
514
  }
514
515
 
515
516
  // show processing icon
@@ -636,7 +637,7 @@
636
637
  return parsed ? c.parsers[column].format( filter, c.table, [], column ) : filter;
637
638
  },
638
639
  buildRow: function( table, c, wo ) {
639
- var col, column, $header, buildSelect, disabled, name, ffxn, tmp,
640
+ var col, column, $header, makeSelect, disabled, name, ffxn, tmp,
640
641
  // c.columns defined in computeThIndexes()
641
642
  cellFilter = wo.filter_cellFilter,
642
643
  columns = c.columns,
@@ -660,14 +661,14 @@
660
661
  // assuming last cell of a column is the main column
661
662
  $header = c.$headerIndexed[ column ];
662
663
  ffxn = ts.getColumnData( table, wo.filter_functions, column );
663
- buildSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
664
+ makeSelect = ( wo.filter_functions && ffxn && typeof ffxn !== 'function' ) ||
664
665
  $header.hasClass( 'filter-select' );
665
666
  // get data from jQuery data, metadata, headers option or header class name
666
667
  col = ts.getColumnData( table, c.headers, column );
667
668
  disabled = ts.getData( $header[0], col, 'filter' ) === 'false' ||
668
669
  ts.getData( $header[0], col, 'parser' ) === 'false';
669
670
 
670
- if ( buildSelect ) {
671
+ if ( makeSelect ) {
671
672
  buildFilter = $( '<select>' ).appendTo( c.$filters.eq( column ) );
672
673
  } else {
673
674
  ffxn = ts.getColumnData( table, wo.filter_formatter, column );
@@ -769,10 +770,10 @@
769
770
  },
770
771
  searching: function( table, filter, skipFirst ) {
771
772
  var wo = table.config.widgetOptions;
772
- clearTimeout( wo.searchTimer );
773
+ clearTimeout( wo.filter_searchTimer );
773
774
  if ( typeof filter === 'undefined' || filter === true ) {
774
775
  // delay filtering
775
- wo.searchTimer = setTimeout( function() {
776
+ wo.filter_searchTimer = setTimeout( function() {
776
777
  tsf.checkFilters( table, filter, skipFirst );
777
778
  }, wo.filter_liveSearch ? wo.filter_searchDelay : 10 );
778
779
  } else {
@@ -830,7 +831,7 @@
830
831
  return false;
831
832
  }
832
833
  },
833
- hideFilters: function( table, c ) {
834
+ hideFilters: function( c ) {
834
835
  var timer;
835
836
  c.$table
836
837
  .find( '.' + tscss.filterRow )
@@ -907,7 +908,7 @@
907
908
  targets = wo.filter_initialized || !$input.filter( wo.filter_anyColumnSelector ).length,
908
909
  columns = [],
909
910
  val = $.trim( tsf.getLatestSearch( $input ).attr( 'data-column' ) || '' );
910
- if ( !/[,-]/.test(val) && val.length === 1 ) {
911
+ if ( /^[0-9]+$/.test(val)) {
911
912
  return parseInt( val, 10 );
912
913
  }
913
914
  // process column range
@@ -1121,7 +1122,7 @@
1121
1122
  !table.config.widgetOptions.filter_initialized ) {
1122
1123
  return;
1123
1124
  }
1124
- var len, norm_rows, rowData, $rows, rowIndex, tbodyIndex, $tbody, columnIndex,
1125
+ var len, norm_rows, rowData, $rows, $row, rowIndex, tbodyIndex, $tbody, columnIndex,
1125
1126
  isChild, childRow, lastSearch, showRow, time, val, indx,
1126
1127
  notFiltered, searchFiltered, query, injected, res, id, txt,
1127
1128
  storedFilters = $.extend( [], filters ),
@@ -1309,24 +1310,37 @@
1309
1310
  '';
1310
1311
  }
1311
1312
 
1312
- showRow = tsf.processRow( c, data, vars );
1313
+ showRow = false;
1314
+ val = tsf.processRow( c, data, vars );
1313
1315
  childRow = rowData.$row.filter( ':gt( 0 )' );
1314
-
1315
1316
  if ( wo.filter_childRows && childRow.length ) {
1317
+ if ( !wo.filter_childWithSibs ) {
1318
+ // hide all child rows
1319
+ childRow.addClass( wo.filter_filteredRow );
1320
+ }
1316
1321
  if ( wo.filter_childByColumn ) {
1317
1322
  // cycle through each child row
1318
1323
  for ( indx = 0; indx < childRow.length; indx++ ) {
1319
1324
  data.$row = childRow.eq( indx );
1320
1325
  data.cacheArray = rowData.child[ indx ];
1321
1326
  data.rawArray = data.cacheArray;
1327
+ val = tsf.processRow( c, data, vars );
1322
1328
  // use OR comparison on child rows
1323
- showRow = showRow || tsf.processRow( c, data, vars );
1329
+ showRow = showRow || val;
1330
+ if ( !wo.filter_childWithSibs && val ) {
1331
+ childRow.eq( indx ).removeClass( wo.filter_filteredRow );
1332
+ }
1324
1333
  }
1325
1334
  }
1326
- childRow.toggleClass( wo.filter_filteredRow, !showRow );
1335
+ } else {
1336
+ showRow = val;
1327
1337
  }
1328
-
1329
- rowData.$row
1338
+ $row = rowData.$row;
1339
+ // if only showing resulting child row, only include parent
1340
+ if ( !wo.filter_childWithSibs ) {
1341
+ $row = $row.eq( 0 );
1342
+ }
1343
+ $row
1330
1344
  .toggleClass( wo.filter_filteredRow, !showRow )[0]
1331
1345
  .display = showRow ? '' : 'none';
1332
1346
  }
@@ -1354,14 +1368,12 @@
1354
1368
  },
1355
1369
  getOptionSource: function( table, column, onlyAvail ) {
1356
1370
  table = $( table )[0];
1357
- var cts, txt, indx, len,
1358
- c = table.config,
1371
+ var c = table.config,
1359
1372
  wo = c.widgetOptions,
1360
- parsed = [],
1361
1373
  arry = false,
1362
1374
  source = wo.filter_selectSource,
1363
1375
  last = c.$table.data( 'lastSearch' ) || [],
1364
- fxn = $.isFunction( source ) ? true : ts.getColumnData( table, source, column );
1376
+ fxn = typeof source === 'function' ? true : ts.getColumnData( table, source, column );
1365
1377
 
1366
1378
  if ( onlyAvail && last[column] !== '' ) {
1367
1379
  onlyAvail = false;
@@ -1380,11 +1392,25 @@
1380
1392
  // custom select source function for a SPECIFIC COLUMN
1381
1393
  arry = fxn( table, column, onlyAvail );
1382
1394
  }
1395
+
1383
1396
  if ( arry === false ) {
1384
1397
  // fall back to original method
1385
1398
  arry = tsf.getOptions( table, column, onlyAvail );
1386
1399
  }
1387
1400
 
1401
+ return tsf.processOptions( table, column, arry );
1402
+
1403
+ },
1404
+ processOptions: function( table, column, arry ) {
1405
+ if ( !$.isArray( arry ) ) {
1406
+ return false;
1407
+ }
1408
+ table = $( table )[0];
1409
+ var cts, txt, indx, len,
1410
+ c = table.config,
1411
+ validColumn = typeof column !== 'undefined' && column !== null && column >= 0 && column < c.columns,
1412
+ parsed = [];
1413
+
1388
1414
  // get unique elements and sort the list
1389
1415
  // if $.tablesorter.sortText exists ( not in the original tablesorter ),
1390
1416
  // then natural sort the list otherwise use a basic sort
@@ -1392,7 +1418,7 @@
1392
1418
  return $.inArray( value, arry ) === indx;
1393
1419
  });
1394
1420
 
1395
- if ( c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {
1421
+ if ( validColumn && c.$headerIndexed[ column ].hasClass( 'filter-select-nosort' ) ) {
1396
1422
  // unsorted select options
1397
1423
  return arry;
1398
1424
  } else {
@@ -1405,7 +1431,8 @@
1405
1431
  parsed.push({
1406
1432
  t : txt,
1407
1433
  // check parser length - fixes #934
1408
- p : c.parsers && c.parsers.length && c.parsers[ column ].format( txt, table, [], column ) || txt
1434
+ p : validColumn && c.parsers && c.parsers.length &&
1435
+ c.parsers[ column ].format( txt, table, [], column ) || txt
1409
1436
  });
1410
1437
  }
1411
1438
 
@@ -1415,10 +1442,10 @@
1415
1442
  // sortNatural breaks if you don't pass it strings
1416
1443
  var x = a.p.toString(),
1417
1444
  y = b.p.toString();
1418
- if ( $.isFunction( cts ) ) {
1445
+ if ( validColumn && typeof cts === 'function' ) {
1419
1446
  // custom OVERALL text sorter
1420
1447
  return cts( x, y, true, column, table );
1421
- } else if ( typeof cts === 'object' && cts.hasOwnProperty( column ) ) {
1448
+ } else if ( validColumn && typeof cts === 'object' && cts.hasOwnProperty( column ) ) {
1422
1449
  // custom text sorter for a SPECIFIC COLUMN
1423
1450
  return cts[column]( x, y, true, column, table );
1424
1451
  } else if ( ts.sortNatural ) {
@@ -1476,6 +1503,7 @@
1476
1503
  if ( !table.config.cache || $.isEmptyObject( table.config.cache ) ) {
1477
1504
  return;
1478
1505
  }
1506
+
1479
1507
  var indx, val, txt, t, $filters, $filter,
1480
1508
  c = table.config,
1481
1509
  wo = c.widgetOptions,
@@ -1491,6 +1519,7 @@
1491
1519
  .find( 'thead' )
1492
1520
  .find( 'select.' + tscss.filter + '[data-column="' + column + '"]' )
1493
1521
  .val();
1522
+
1494
1523
  // nothing included in arry ( external source ), so get the options from
1495
1524
  // filter_selectSource or column data
1496
1525
  if ( typeof arry === 'undefined' || arry === '' ) {
@@ -465,6 +465,10 @@
465
465
  }, 40 );
466
466
  });
467
467
  wo.math_isUpdating = false;
468
+ // math widget initialized after table - see #946
469
+ if ( table.hasInitialized ) {
470
+ math.recalculate( c, wo, true );
471
+ }
468
472
  },
469
473
  // this remove function is called when using the refreshWidgets method or when destroying the tablesorter plugin
470
474
  // this function only applies to tablesorter v2.4+
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.18.3
4
+ version: 1.18.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: 2015-09-01 00:00:00.000000000 Z
12
+ date: 2015-09-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties