jquery-tablesorter 1.17.1 → 1.17.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (21) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/jquery-tablesorter/version.rb +1 -1
  4. data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +6 -2
  5. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +353 -228
  6. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +41 -37
  7. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +313 -192
  8. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +2 -1
  9. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +63 -48
  10. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +1 -1
  11. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +17 -12
  12. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +10 -5
  13. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +114 -71
  14. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +95 -66
  15. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +3 -2
  16. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js +1 -1
  17. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +120 -59
  18. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +510 -242
  19. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sortTbodies.js +228 -0
  20. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +76 -59
  21. metadata +3 -2
@@ -0,0 +1,228 @@
1
+ /*! tablesorter tbody sorting widget (BETA) - 6/10/2015 (core v2.22.2)
2
+ * Requires tablesorter v2.22.2+ and jQuery 1.4+
3
+ * by Rob Garrison
4
+ */
5
+ /*jshint browser:true, jquery:true, unused:false */
6
+ /*global jQuery: false */
7
+ ;( function( $ ) {
8
+ 'use strict';
9
+ var ts = $.tablesorter;
10
+
11
+ ts.sortTbodies = {
12
+ init: function( c, wo ) {
13
+
14
+ var index, rows, txt, max, $rows,
15
+ namespace = c.namespace + 'sortTbody',
16
+ $tbodies = c.$table.children( 'tbody' ),
17
+ len = $tbodies.length;
18
+
19
+ // save serverSideSorting value; use to toggle internal row sorting
20
+ wo.sortTbody_original_serverSideSorting = c.serverSideSorting;
21
+
22
+ // include info-only tbodies - we need parsed data from *all* tbodies
23
+ wo.sortTbody_original_cssInfoBlock = c.cssInfoBlock;
24
+ c.cssInfoBlock = wo.sortTbody_noSort;
25
+ ts.sortTbodies.setTbodies( c, wo );
26
+
27
+ // add original order index for stable sort
28
+ for ( index = 0; index < len; index++ ) {
29
+ $tbodies.eq( index ).attr( 'data-ts-original-order', index );
30
+ }
31
+
32
+ c.$table
33
+ .unbind( 'sortBegin updateComplete '.split( ' ' ).join( namespace + ' ' ) )
34
+ .bind( 'sortBegin' + namespace, function() {
35
+ ts.sortTbodies.sorter( c );
36
+ })
37
+ .bind( 'updateComplete' + namespace, function() {
38
+ // find parsers for each column
39
+ ts.sortTbodies.setTbodies( c, wo );
40
+ c.$table.trigger( 'updateCache', [ null, c.$tbodies ] );
41
+ });
42
+
43
+ // detect parsers - in case the table contains only info-only tbodies
44
+ if ( $.isEmptyObject( c.parsers ) || c.$tbodies.length !== $tbodies.length ) {
45
+ ts.sortTbodies.setTbodies( c, wo );
46
+ c.$table.trigger( 'updateCache', [ null, c.$tbodies ] );
47
+ }
48
+
49
+ // find colMax; this only matter for numeric columns
50
+ $rows = $tbodies.children( 'tr' );
51
+ len = $rows.length;
52
+ for ( index = 0; index < c.columns; index++ ) {
53
+ max = 0;
54
+ if ( c.parsers[ index ].type === 'numeric' ) {
55
+ for ( rows = 0; rows < len; rows++ ) {
56
+ // update column max value (ignore sign)
57
+ txt = ts.getParsedText( c, $rows.eq( rows ).children()[ index ], index );
58
+ max = Math.max( Math.abs( txt ) || 0, max );
59
+ }
60
+ }
61
+ c.$headerIndexed[ index ].attr( 'data-ts-col-max-value', max );
62
+ }
63
+
64
+ },
65
+
66
+ // make sure c.$tbodies is up-to-date (init & after updates)
67
+ setTbodies: function( c, wo ) {
68
+ c.$tbodies = c.$table.children( 'tbody' ).not( '.' + wo.sortTbody_noSort );
69
+ },
70
+
71
+ sorter: function( c ) {
72
+ var $table = c.$table,
73
+ wo = c.widgetOptions;
74
+
75
+ // prevent multiple calls while processing
76
+ if ( wo.sortTbody_busy !== true ) {
77
+ wo.sortTbody_busy = true;
78
+ var $tbodies = $table.children( 'tbody' ).not( '.' + wo.sortTbody_noSort ),
79
+ primary = wo.sortTbody_primaryRow || 'tr:eq(0)',
80
+ sortList = c.sortList || [],
81
+ len = sortList.length;
82
+
83
+ if ( len ) {
84
+
85
+ // toggle internal row sorting
86
+ c.serverSideSorting = !wo.sortTbody_sortRows;
87
+
88
+ $tbodies.sort( function( a, b ) {
89
+ var sortListIndex, txt, dir, num, colMax, sort, col, order, colA, colB, x, y,
90
+ table = c.table,
91
+ parsers = c.parsers,
92
+ cts = c.textSorter || '',
93
+ $tbodyA = $( a ),
94
+ $tbodyB = $( b ),
95
+ $a = $tbodyA.find( primary ).children( 'td, th' ),
96
+ $b = $tbodyB.find( primary ).children( 'td, th' );
97
+ for ( sortListIndex = 0; sortListIndex < len; sortListIndex++ ) {
98
+ col = sortList[ sortListIndex ][0];
99
+ order = sortList[ sortListIndex ][1];
100
+ // sort direction, true = asc, false = desc
101
+ dir = order === 0;
102
+ // column txt - tbody A
103
+ txt = ts.getElementText( c, $a.eq( col ), col );
104
+ colA = parsers[ col ].format( txt, table, $a[ col ], col );
105
+ // column txt - tbody B
106
+ txt = ts.getElementText( c, $b.eq( col ), col );
107
+ colB = parsers[ col ].format( txt, table, $b[ col ], col );
108
+
109
+ if (c.sortStable && colA === colB && len === 1) {
110
+ return $tbodyA.attr( 'data-ts-original-order' ) - $tbodyB.attr( 'data-ts-original-order' );
111
+ }
112
+
113
+ // fallback to natural sort since it is more robust
114
+ num = /n/i.test( parsers && parsers[ col ] ? parsers[ col ].type || '' : '' );
115
+ if ( num && c.strings[ col ] ) {
116
+ colMax = c.$headerIndexed[ col ].attr( 'data-ts-col-max-value' ) ||
117
+ 1.79E+308; // close to Number.MAX_VALUE
118
+ // sort strings in numerical columns
119
+ if ( typeof ( c.string[ c.strings[ col ] ] ) === 'boolean' ) {
120
+ num = ( dir ? 1 : -1 ) * ( c.string[ c.strings[ col ] ] ? -1 : 1 );
121
+ } else {
122
+ num = ( c.strings[ col ] ) ? c.string[ c.strings[ col ] ] || 0 : 0;
123
+ }
124
+ // fall back to built-in numeric sort
125
+ // var sort = $.tablesorter['sort' + s](a, b, dir, colMax, table);
126
+ sort = c.numberSorter ? c.numberSorter( colA, colB, dir, colMax, table ) :
127
+ ts[ 'sortNumeric' + ( dir ? 'Asc' : 'Desc' ) ]( colA, colB, num, colMax, col, table );
128
+ } else {
129
+ // set a & b depending on sort direction
130
+ x = dir ? colA : colB;
131
+ y = dir ? colB : colA;
132
+ // text sort function
133
+ if ( typeof ( cts ) === 'function' ) {
134
+ // custom OVERALL text sorter
135
+ sort = cts( x, y, dir, col, table );
136
+ } else if ( typeof ( cts ) === 'object' && cts.hasOwnProperty( col ) ) {
137
+ // custom text sorter for a SPECIFIC COLUMN
138
+ sort = cts[ col ]( x, y, dir, col, table );
139
+ } else {
140
+ // fall back to natural sort
141
+ sort = ts[ 'sortNatural' + ( dir ? 'Asc' : 'Desc' ) ]( colA, colB, col, table, c );
142
+ }
143
+ }
144
+ if ( sort ) { return sort; }
145
+ }
146
+ return $tbodyA.attr( 'data-ts-original-order' ) - $tbodyB.attr( 'data-ts-original-order' );
147
+ });
148
+
149
+ ts.sortTbodies.restoreTbodies ( c, wo, $tbodies );
150
+ wo.sortTbody_busy = false;
151
+ }
152
+ }
153
+ },
154
+
155
+ restoreTbodies : function ( c, wo, $sortedTbodies ) {
156
+ var $nosort, $tbodies, $thisTbody, tbLen, nsLen, index, targetIndex,
157
+ $table = c.$table,
158
+ hasShuffled = true,
159
+ indx = 0;
160
+
161
+ // hide entire table to improve sort performance
162
+ $table.hide();
163
+ $sortedTbodies.appendTo( $table );
164
+
165
+ // reposition no-sort tbodies
166
+ $tbodies = $table.children( 'tbody' );
167
+ tbLen = $tbodies.length;
168
+ $nosort = $tbodies.filter( '.' + wo.sortTbody_noSort ).appendTo( $table );
169
+ nsLen = $nosort.length;
170
+
171
+ if ( nsLen ) {
172
+ // don't allow the while loop to cycle more times than the set number of no-sort tbodies
173
+ while ( hasShuffled && indx < nsLen ) {
174
+ hasShuffled = false;
175
+ for ( index = 0; index < nsLen; index++ ) {
176
+ targetIndex = parseInt( $nosort.eq( index ).attr( 'data-ts-original-order' ), 10 );
177
+ // if target index > number of tbodies, make it last
178
+ targetIndex = targetIndex >= tbLen ? tbLen : targetIndex < 0 ? 0 : targetIndex;
179
+
180
+ if ( targetIndex !== $nosort.eq( index ).index() ) {
181
+ hasShuffled = true;
182
+ $thisTbody = $nosort.eq( index ).detach();
183
+
184
+ if ( targetIndex >= tbLen ) {
185
+ // Are we trying to be the last tbody?
186
+ $thisTbody.appendTo( $table );
187
+ } else if ( targetIndex === 0 ) {
188
+ // Are we trying to be the first tbody?
189
+ $thisTbody.prependTo( $table );
190
+ } else {
191
+ // No, we want to be somewhere in the middle!
192
+ $thisTbody.insertBefore( $table.children( 'tbody:eq(' + targetIndex + ')' ) );
193
+ }
194
+
195
+ }
196
+ }
197
+ indx++;
198
+ }
199
+ }
200
+
201
+ $table.show();
202
+ }
203
+
204
+ };
205
+
206
+ ts.addWidget({
207
+ id: 'sortTbody',
208
+ // priority < 50 (filter widget), so c.$tbodies has the correct elements
209
+ priority: 40,
210
+ options: {
211
+ // point to a row within the tbody that matches the number of header columns
212
+ sortTbody_primaryRow : null,
213
+ // sort tbody internal rows
214
+ sortTbody_sortRows : false,
215
+ // static tbodies (like static rows)
216
+ sortTbody_noSort : 'tablesorter-no-sort-tbody'
217
+ },
218
+ init : function( table, thisWidget, c, wo ) {
219
+ ts.sortTbodies.init( c, wo );
220
+ },
221
+ remove : function( table, c, wo, refreshing ) {
222
+ c.$table.unbind( 'sortBegin updateComplete '.split( ' ' ).join( c.namespace + 'sortTbody ' ) );
223
+ c.serverSideSorting = wo.sortTbody_original_serverSideSorting;
224
+ c.cssInfoBlock = wo.sortTbody_original_cssInfoBlock;
225
+ }
226
+ });
227
+
228
+ })( jQuery );
@@ -16,32 +16,34 @@ $.extend(ts.css, {
16
16
  // Add a resize event to table headers
17
17
  ts.addHeaderResizeEvent = function(table, disable, settings) {
18
18
  table = $(table)[0]; // make sure we're using a dom element
19
- var headers,
20
- defaults = {
19
+ if ( !table.config ) { return; }
20
+ var defaults = {
21
21
  timer : 250
22
22
  },
23
23
  options = $.extend({}, defaults, settings),
24
24
  c = table.config,
25
25
  wo = c.widgetOptions,
26
- checkSizes = function(triggerEvent) {
26
+ checkSizes = function( triggerEvent ) {
27
+ var index, headers, $header, sizes, width, height,
28
+ len = c.$headers.length;
27
29
  wo.resize_flag = true;
28
30
  headers = [];
29
- c.$headers.each(function() {
30
- var $header = $(this),
31
- sizes = $header.data('savedSizes') || [0,0], // fixes #394
32
- width = this.offsetWidth,
33
- height = this.offsetHeight;
34
- if (width !== sizes[0] || height !== sizes[1]) {
35
- $header.data('savedSizes', [ width, height ]);
36
- headers.push(this);
31
+ for ( index = 0; index < len; index++ ) {
32
+ $header = c.$headers.eq( index );
33
+ sizes = $header.data( 'savedSizes' ) || [ 0,0 ]; // fixes #394
34
+ width = $header[0].offsetWidth;
35
+ height = $header[0].offsetHeight;
36
+ if ( width !== sizes[0] || height !== sizes[1] ) {
37
+ $header.data( 'savedSizes', [ width, height ] );
38
+ headers.push( $header[0] );
37
39
  }
38
- });
39
- if (headers.length && triggerEvent !== false) {
40
- c.$table.trigger('resize', [ headers ]);
40
+ }
41
+ if ( headers.length && triggerEvent !== false ) {
42
+ c.$table.trigger( 'resize', [ headers ] );
41
43
  }
42
44
  wo.resize_flag = false;
43
45
  };
44
- checkSizes(false);
46
+ checkSizes( false );
45
47
  clearInterval(wo.resize_timer);
46
48
  if (disable) {
47
49
  wo.resize_flag = false;
@@ -77,7 +79,8 @@ ts.addWidget({
77
79
  if ( c.$table.hasClass('hasStickyHeaders') || ($.inArray('filter', c.widgets) >= 0 && !c.$table.hasClass('hasFilters')) ) {
78
80
  return;
79
81
  }
80
- var $table = c.$table,
82
+ var index, len, $t,
83
+ $table = c.$table,
81
84
  // add position: relative to attach element, hopefully it won't cause trouble.
82
85
  $attach = $(wo.stickyHeaders_attachTo),
83
86
  namespace = c.namespace + 'stickyheaders ',
@@ -112,17 +115,19 @@ ts.addWidget({
112
115
  laststate = '',
113
116
  spacing = 0,
114
117
  setWidth = function($orig, $clone){
115
- $orig.filter(':visible').each(function(i) {
116
- var width, border,
117
- $cell = $clone.filter(':visible').eq(i),
118
- $this = $(this);
118
+ var index, width, border, $cell, $this,
119
+ $cells = $orig.filter(':visible'),
120
+ len = $cells.length;
121
+ for ( index = 0; index < len; index++ ) {
122
+ $cell = $clone.filter(':visible').eq(index);
123
+ $this = $cells.eq(index);
119
124
  // code from https://github.com/jmosbech/StickyTableHeaders
120
125
  if ($this.css('box-sizing') === 'border-box') {
121
126
  width = $this.outerWidth();
122
127
  } else {
123
128
  if ($cell.css('border-collapse') === 'collapse') {
124
129
  if (window.getComputedStyle) {
125
- width = parseFloat( window.getComputedStyle(this, null).width );
130
+ width = parseFloat( window.getComputedStyle($this[0], null).width );
126
131
  } else {
127
132
  // ie8 only
128
133
  border = parseFloat( $this.css('border-width') );
@@ -133,10 +138,11 @@ ts.addWidget({
133
138
  }
134
139
  }
135
140
  $cell.css({
141
+ 'width': width,
136
142
  'min-width': width,
137
143
  'max-width': width
138
144
  });
139
- });
145
+ }
140
146
  },
141
147
  resizeHeader = function() {
142
148
  stickyOffset = $stickyOffset.length ? $stickyOffset.height() || 0 : parseInt(wo.stickyHeaders_offset, 10) || 0;
@@ -148,6 +154,39 @@ ts.addWidget({
148
154
  });
149
155
  setWidth( $table, $stickyTable );
150
156
  setWidth( $header, $stickyCells );
157
+ },
158
+ scrollSticky = function( resizing ) {
159
+ if (!$table.is(':visible')) { return; } // fixes #278
160
+ // Detect nested tables - fixes #724
161
+ nestedStickyTop = $nestedSticky.length ? $nestedSticky.offset().top - $yScroll.scrollTop() + $nestedSticky.height() : 0;
162
+ var offset = $table.offset(),
163
+ yWindow = $.isWindow( $yScroll[0] ), // $.isWindow needs jQuery 1.4.3
164
+ xWindow = $.isWindow( $xScroll[0] ),
165
+ // scrollTop = ( $attach.length ? $attach.offset().top : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
166
+ scrollTop = ( $attach.length ? ( yWindow ? $yScroll.scrollTop() : $yScroll.offset().top ) : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
167
+ tableHeight = $table.height() - ($stickyWrap.height() + ($tfoot.height() || 0)),
168
+ isVisible = ( scrollTop > offset.top ) && ( scrollTop < offset.top + tableHeight ) ? 'visible' : 'hidden',
169
+ cssSettings = { visibility : isVisible };
170
+
171
+ if ($attach.length) {
172
+ cssSettings.top = yWindow ? scrollTop - $attach.offset().top : $attach.scrollTop();
173
+ }
174
+ if (xWindow) {
175
+ // adjust when scrolling horizontally - fixes issue #143
176
+ cssSettings.left = $table.offset().left - parseInt($table.css('margin-left'), 10) - $xScroll.scrollLeft() - spacing;
177
+ }
178
+ if ($nestedSticky.length) {
179
+ cssSettings.top = ( cssSettings.top || 0 ) + stickyOffset + nestedStickyTop;
180
+ }
181
+ $stickyWrap
182
+ .removeClass( ts.css.stickyVis + ' ' + ts.css.stickyHide )
183
+ .addClass( isVisible === 'visible' ? ts.css.stickyVis : ts.css.stickyHide )
184
+ .css(cssSettings);
185
+ if (isVisible !== laststate || resizing) {
186
+ // make sure the column widths match
187
+ resizeHeader();
188
+ laststate = isVisible;
189
+ }
151
190
  };
152
191
  // only add a position relative if a position isn't already defined
153
192
  if ($attach.length && !$attach.css('position')) {
@@ -179,48 +218,26 @@ ts.addWidget({
179
218
 
180
219
  // onRenderHeader is defined, we need to do something about it (fixes #641)
181
220
  if (c.onRenderHeader) {
182
- $stickyThead.children('tr').children().each(function(index){
221
+ $t = $stickyThead.children('tr').children();
222
+ len = $t.length;
223
+ for ( index = 0; index < len; index++ ) {
183
224
  // send second parameter
184
- c.onRenderHeader.apply( $(this), [ index, c, $stickyTable ] );
185
- });
225
+ c.onRenderHeader.apply( $t.eq( index ), [ index, c, $stickyTable ] );
226
+ }
186
227
  }
187
228
 
188
229
  // make it sticky!
189
230
  $xScroll.add($yScroll)
190
- .unbind( ('scroll resize '.split(' ').join( namespace )).replace(/\s+/g, ' ') )
191
- .bind('scroll resize '.split(' ').join( namespace ), function(event) {
192
- if (!$table.is(':visible')) { return; } // fixes #278
193
- // Detect nested tables - fixes #724
194
- nestedStickyTop = $nestedSticky.length ? $nestedSticky.offset().top - $yScroll.scrollTop() + $nestedSticky.height() : 0;
195
- var offset = $table.offset(),
196
- yWindow = $.isWindow( $yScroll[0] ), // $.isWindow needs jQuery 1.4.3
197
- xWindow = $.isWindow( $xScroll[0] ),
198
- // scrollTop = ( $attach.length ? $attach.offset().top : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
199
- scrollTop = ( $attach.length ? ( yWindow ? $yScroll.scrollTop() : $yScroll.offset().top ) : $yScroll.scrollTop() ) + stickyOffset + nestedStickyTop,
200
- tableHeight = $table.height() - ($stickyWrap.height() + ($tfoot.height() || 0)),
201
- isVisible = ( scrollTop > offset.top ) && ( scrollTop < offset.top + tableHeight ) ? 'visible' : 'hidden',
202
- cssSettings = { visibility : isVisible };
231
+ .unbind( ('scroll resize '.split(' ').join( namespace )).replace(/\s+/g, ' ') )
232
+ .bind('scroll resize '.split(' ').join( namespace ), function( event ) {
233
+ scrollSticky( event.type === 'resize' );
234
+ });
235
+ c.$table
236
+ .unbind('stickyHeadersUpdate' + namespace)
237
+ .bind('stickyHeadersUpdate' + namespace, function(){
238
+ scrollSticky( true );
239
+ });
203
240
 
204
- if ($attach.length) {
205
- cssSettings.top = yWindow ? scrollTop - $attach.offset().top : $attach.scrollTop();
206
- }
207
- if (xWindow) {
208
- // adjust when scrolling horizontally - fixes issue #143
209
- cssSettings.left = $table.offset().left - parseInt($table.css('margin-left'), 10) - $xScroll.scrollLeft() - spacing;
210
- }
211
- if ($nestedSticky.length) {
212
- cssSettings.top = ( cssSettings.top || 0 ) + stickyOffset + nestedStickyTop;
213
- }
214
- $stickyWrap
215
- .removeClass( ts.css.stickyVis + ' ' + ts.css.stickyHide )
216
- .addClass( isVisible === 'visible' ? ts.css.stickyVis : ts.css.stickyHide )
217
- .css(cssSettings);
218
- if (isVisible !== laststate || event.type === 'resize') {
219
- // make sure the column widths match
220
- resizeHeader();
221
- laststate = isVisible;
222
- }
223
- });
224
241
  if (wo.stickyHeaders_addResizeEvent) {
225
242
  ts.addHeaderResizeEvent(table);
226
243
  }
@@ -256,7 +273,7 @@ ts.addWidget({
256
273
  var namespace = c.namespace + 'stickyheaders ';
257
274
  c.$table
258
275
  .removeClass('hasStickyHeaders')
259
- .unbind( ('pagerComplete filterEnd '.split(' ').join(namespace)).replace(/\s+/g, ' ') )
276
+ .unbind( ('pagerComplete filterEnd stickyHeadersUpdate '.split(' ').join(namespace)).replace(/\s+/g, ' ') )
260
277
  .next('.' + ts.css.stickyWrap).remove();
261
278
  if (wo.$sticky && wo.$sticky.length) { wo.$sticky.remove(); } // remove cloned table
262
279
  $(window)
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.17.1
4
+ version: 1.17.2
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-05-18 00:00:00.000000000 Z
12
+ date: 2015-07-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -129,6 +129,7 @@ files:
129
129
  - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js
130
130
  - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-saveSort.js
131
131
  - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js
132
+ - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sortTbodies.js
132
133
  - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-staticRow.js
133
134
  - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js
134
135
  - vendor/assets/javascripts/jquery-tablesorter/widgets/widget-storage.js