jquery-tablesorter 1.12.3 → 1.12.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: a5253701a4f87cd7b7d769b85e70b40516e1c2d5
4
- data.tar.gz: 3d6374f8bb6c3f2b75d727831bfa1177f2e2ef05
3
+ metadata.gz: 5b3086b10974536212d92994bb1a07c53305fb0d
4
+ data.tar.gz: a8a53ba9dda00df5fda43382fd4996c4ef50d5cc
5
5
  SHA512:
6
- metadata.gz: 7831c01cbf8d368c9b17ba7a5846c382d8291f1526fd81c7548545d235c273032dad16613f6566c7192fa5b83ccda5b4220544233ef82cc6ded89598a70287ad
7
- data.tar.gz: 604e4f8511ce3f449d615fca60e02a8745fb8178e59dae3f13499975a8ff6caa4849a0bbf26ac7cc3a4e7af4046c05b0834fcee1953395ae209e9a1bbc83e0dd
6
+ metadata.gz: 54887be0d4abdfba84a5c6c01b724a34756e95618369b6078a51dbaef6afa2edafb3ee5ed5f43cea7bf67941b732db7238c2f33f62a24a8cc18c679dd7ec52ac
7
+ data.tar.gz: a51d74004a0ea5f3aa2fb7fe710d2f23665a5b846f0749eb3e36b232b696cbaaae150e31b8d5773d735fe2d3d56c787fda1f18328bf883bf5f9a1a82d2fe7101
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.17.3 (6/28/2014), [documentation]
7
+ Current tablesorter version: 2.17.4 (7/4/2014), [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.12.3'
2
+ VERSION = '1.12.4'
3
3
  end
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * tablesorter pager plugin
3
- * updated 6/28/2014 (v2.17.3)
3
+ * updated 7/4/2014 (v2.17.4)
4
4
  */
5
5
  /*jshint browser:true, jquery:true, unused:false */
6
6
  ;(function($) {
@@ -146,6 +146,8 @@
146
146
  } else if (!f) {
147
147
  p.filteredRows = p.totalRows;
148
148
  }
149
+ c.totalRows = p.totalRows;
150
+ c.filteredRows = p.filteredRows;
149
151
  p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
150
152
  if ( Math.min( p.totalPages, p.filteredPages ) >= 0 ) {
151
153
  t = (p.size * p.page > p.filteredRows);
@@ -296,8 +298,8 @@
296
298
  // process ajax object
297
299
  if (!$.isArray(result)) {
298
300
  p.ajaxData = result;
299
- p.totalRows = result.total;
300
- p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total;
301
+ c.totalRows = p.totalRows = result.total;
302
+ c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total;
301
303
  th = result.headers;
302
304
  d = result.rows;
303
305
  } else {
@@ -306,10 +308,12 @@
306
308
  // ensure a zero returned row count doesn't fail the logical ||
307
309
  rr_count = result[t ? 1 : 0];
308
310
  p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count;
311
+ // can't set filtered rows when returning an array
312
+ c.totalRows = c.filteredRows = p.filteredRows = p.totalRows;
309
313
  d = p.totalRows === 0 ? [""] : result[t ? 0 : 1] || []; // row data
310
314
  th = result[2]; // headers
311
315
  }
312
- l = d.length;
316
+ l = d && d.length;
313
317
  if (d instanceof jQuery) {
314
318
  if (p.processAjaxOnInit) {
315
319
  // append jQuery object
@@ -1,5 +1,5 @@
1
1
  /**!
2
- * TableSorter 2.17.3 - Client-side table sorting with ease!
2
+ * TableSorter 2.17.4 - Client-side table sorting with ease!
3
3
  * @requires jQuery v1.2.6+
4
4
  *
5
5
  * Copyright (c) 2007 Christian Bach
@@ -24,7 +24,7 @@
24
24
 
25
25
  var ts = this;
26
26
 
27
- ts.version = "2.17.3";
27
+ ts.version = "2.17.4";
28
28
 
29
29
  ts.parsers = [];
30
30
  ts.widgets = [];
@@ -1487,6 +1487,11 @@
1487
1487
  ts.widgets.push(widget);
1488
1488
  };
1489
1489
 
1490
+ ts.hasWidget = function(table, name){
1491
+ table = $(table);
1492
+ return table.length && table[0].config && table[0].config.widgetInit[name] || false;
1493
+ };
1494
+
1490
1495
  ts.getWidgetById = function(name) {
1491
1496
  var i, w, l = ts.widgets.length;
1492
1497
  for (i = 0; i < l; i++) {
@@ -1,4 +1,4 @@
1
- /*! tableSorter 2.16+ widgets - updated 6/28/2014 (v2.17.3)
1
+ /*! tableSorter 2.16+ widgets - updated 7/4/2014 (v2.17.4)
2
2
  *
3
3
  * Column Styles
4
4
  * Column Filters
@@ -176,7 +176,7 @@ ts.addWidget({
176
176
  id: "uitheme",
177
177
  priority: 10,
178
178
  format: function(table, c, wo) {
179
- var i, time, classes, $header, $icon, $tfoot,
179
+ var i, time, classes, $header, $icon, $tfoot, $h,
180
180
  themesAll = ts.themes,
181
181
  $table = c.$table,
182
182
  $headers = c.$headers,
@@ -225,17 +225,20 @@ ts.addWidget({
225
225
  for (i = 0; i < c.columns; i++) {
226
226
  $header = c.$headers.add(c.$extraHeaders).filter('[data-column="' + i + '"]');
227
227
  $icon = (ts.css.icon) ? $header.find('.' + ts.css.icon) : $header;
228
- if (c.$headers.filter('[data-column="' + i + '"]:last')[0].sortDisabled) {
229
- // no sort arrows for disabled columns!
230
- $header.removeClass(remove);
231
- $icon.removeClass(remove + ' ' + themes.icons);
232
- } else {
233
- classes = ($header.hasClass(ts.css.sortAsc)) ?
234
- themes.sortAsc :
235
- ($header.hasClass(ts.css.sortDesc)) ? themes.sortDesc :
236
- $header.hasClass(ts.css.header) ? themes.sortNone : '';
237
- $header[classes === themes.sortNone ? 'removeClass' : 'addClass'](themes.active);
238
- $icon.removeClass(remove).addClass(classes);
228
+ $h = c.$headers.filter('[data-column="' + i + '"]:last');
229
+ if ($h.length) {
230
+ if ($h[0].sortDisabled) {
231
+ // no sort arrows for disabled columns!
232
+ $header.removeClass(remove);
233
+ $icon.removeClass(remove + ' ' + themes.icons);
234
+ } else {
235
+ classes = ($header.hasClass(ts.css.sortAsc)) ?
236
+ themes.sortAsc :
237
+ ($header.hasClass(ts.css.sortDesc)) ? themes.sortDesc :
238
+ $header.hasClass(ts.css.header) ? themes.sortNone : '';
239
+ $header[classes === themes.sortNone ? 'removeClass' : 'addClass'](themes.active);
240
+ $icon.removeClass(remove).addClass(classes);
241
+ }
239
242
  }
240
243
  }
241
244
  if (c.debug) {
@@ -364,6 +367,7 @@ ts.addWidget({
364
367
  filter_reset : null, // jQuery selector string of an element used to reset the filters
365
368
  filter_saveFilters : false, // Use the $.tablesorter.storage utility to save the most recent filters
366
369
  filter_searchDelay : 300, // typing delay in milliseconds before starting a search
370
+ filter_searchFiltered: true, // allow searching through already filtered rows in special circumstances; will speed up searching in large tables if true
367
371
  filter_selectSource : null, // include a function to return an array of values to be added to the column filter select
368
372
  filter_startsWith : false, // if true, filter start from the beginning of the cell contents
369
373
  filter_useParsedData : false, // filter all data using parsed content
@@ -681,7 +685,9 @@ ts.filter = {
681
685
  ts.benchmark("Applying Filter widget", time);
682
686
  }
683
687
  // add default values
684
- c.$table.bind('tablesorter-initialized pagerInitialized', function() {
688
+ c.$table.bind('tablesorter-initialized pagerInitialized', function(e) {
689
+ // redefine "wo" as it does not update properly inside this callback
690
+ var wo = this.config.widgetOptions;
685
691
  filters = ts.filter.setDefaults(table, c, wo) || [];
686
692
  if (filters.length) {
687
693
  ts.setFilters(table, filters, true);
@@ -691,9 +697,16 @@ ts.filter = {
691
697
  if (!wo.filter_initialized) {
692
698
  // filter widget initialized
693
699
  wo.filter_initialized = true;
694
- c.$table.trigger('filterInit');
700
+ c.$table.trigger('filterInit', c);
695
701
  }
696
702
  });
703
+ // if filter widget is added after pager has initialized; then set filter init flag
704
+ if (c.pager && c.pager.initialized && !wo.filter_initialized) {
705
+ wo.filter_initialized = true;
706
+ c.$table
707
+ .trigger('filterFomatterUpdate')
708
+ .trigger('filterInit', c);
709
+ }
697
710
 
698
711
  },
699
712
  setDefaults: function(table, c, wo) {
@@ -815,6 +828,7 @@ ts.filter = {
815
828
  if (event.which === 13 || event.type === 'search' || event.type === 'change') {
816
829
  event.preventDefault();
817
830
  // init search with no delay
831
+ $(this).attr('data-lastSearchTime', new Date().getTime());
818
832
  ts.filter.searching( table, false, true );
819
833
  }
820
834
  });
@@ -928,6 +942,9 @@ ts.filter = {
928
942
  $(this).hasClass('filter-parsed');
929
943
  }).get();
930
944
  if (c.debug) { time = new Date(); }
945
+ // filtered rows count
946
+ c.filteredRows = 0;
947
+ c.totalRows = 0;
931
948
  for (tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {
932
949
  if ($tbodies.eq(tbodyIndex).hasClass(c.cssInfoBlock || ts.css.info)) { continue; } // ignore info blocks, issue #264
933
950
  $tbody = ts.processTbody(table, $tbodies.eq(tbodyIndex), true);
@@ -944,24 +961,27 @@ ts.filter = {
944
961
  $rows = $rows.not('.' + c.cssChildRow);
945
962
  len = $rows.length;
946
963
  // optimize searching only through already filtered rows - see #313
947
- searchFiltered = true;
964
+ searchFiltered = wo.filter_searchFiltered;
948
965
  lastSearch = c.lastSearch || c.$table.data('lastSearch') || [];
949
- for (indx = 0; indx < columnIndex; indx++) {
950
- val = filters[indx] || '';
951
- // break out of loop if we've already determined not to search filtered rows
952
- if (!searchFiltered) { indx = columnIndex; }
953
- // search already filtered rows if...
954
- searchFiltered = searchFiltered && lastSearch.length &&
955
- // there are no changes from beginning of filter
956
- val.indexOf(lastSearch[indx] || '') === 0 &&
957
- // if there is NOT a logical "or", or range ("to" or "-") in the string
958
- !regex.alreadyFiltered.test(val) &&
959
- // if we are not doing exact matches, using "|" (logical or) or not "!"
960
- !/[=\"\|!]/.test(val) &&
961
- // don't search only filtered if the value is negative ('> -10' => '> -100' will ignore hidden rows)
962
- !(/(>=?\s*-\d)/.test(val) || /(<=?\s*\d)/.test(val)) &&
963
- // if filtering using a select without a "filter-match" class (exact match) - fixes #593
964
- !( val !== '' && c.$filters && c.$filters.eq(indx).find('select').length && !c.$headers.filter('[data-column="' + indx + '"]:last').hasClass('filter-match') );
966
+ if (searchFiltered) {
967
+ // cycle through all filters; include last (columnIndex + 1 = match any column). Fixes #669
968
+ for (indx = 0; indx < columnIndex + 1; indx++) {
969
+ val = filters[indx] || '';
970
+ // break out of loop if we've already determined not to search filtered rows
971
+ if (!searchFiltered) { indx = columnIndex; }
972
+ // search already filtered rows if...
973
+ searchFiltered = searchFiltered && lastSearch.length &&
974
+ // there are no changes from beginning of filter
975
+ val.indexOf(lastSearch[indx] || '') === 0 &&
976
+ // if there is NOT a logical "or", or range ("to" or "-") in the string
977
+ !regex.alreadyFiltered.test(val) &&
978
+ // if we are not doing exact matches, using "|" (logical or) or not "!"
979
+ !/[=\"\|!]/.test(val) &&
980
+ // don't search only filtered if the value is negative ('> -10' => '> -100' will ignore hidden rows)
981
+ !(/(>=?\s*-\d)/.test(val) || /(<=?\s*\d)/.test(val)) &&
982
+ // if filtering using a select without a "filter-match" class (exact match) - fixes #593
983
+ !( val !== '' && c.$filters && c.$filters.eq(indx).find('select').length && !c.$headers.filter('[data-column="' + indx + '"]:last').hasClass('filter-match') );
984
+ }
965
985
  }
966
986
  notFiltered = $rows.not('.' + wo.filter_filteredRow).length;
967
987
  // can't search when all rows are hidden - this happens when looking for exact matches
@@ -1087,6 +1107,8 @@ ts.filter = {
1087
1107
  }
1088
1108
  }
1089
1109
  }
1110
+ c.filteredRows += $rows.not('.' + wo.filter_filteredRow).length;
1111
+ c.totalRows += $rows.length;
1090
1112
  ts.processTbody(table, $tbody, false);
1091
1113
  }
1092
1114
  c.lastCombinedFilter = combinedFilters; // save last search
@@ -1098,7 +1120,7 @@ ts.filter = {
1098
1120
  if (c.debug) {
1099
1121
  ts.benchmark("Completed filter widget search", time);
1100
1122
  }
1101
- if (wo.filter_initialized) { c.$table.trigger('filterEnd'); }
1123
+ if (wo.filter_initialized) { c.$table.trigger('filterEnd', c ); }
1102
1124
  setTimeout(function(){
1103
1125
  c.$table.trigger('applyWidgets'); // make sure zebra widget is applied
1104
1126
  }, 0);
@@ -1484,19 +1506,31 @@ ts.addWidget({
1484
1506
  options: {
1485
1507
  resizable : true,
1486
1508
  resizable_addLastColumn : false,
1487
- resizable_widths : []
1509
+ resizable_widths : [],
1510
+ resizable_throttle : false // set to true (5ms) or any number 0-10 range
1488
1511
  },
1489
1512
  format: function(table, c, wo) {
1490
1513
  if (c.$table.hasClass('hasResizable')) { return; }
1491
1514
  c.$table.addClass('hasResizable');
1492
1515
  ts.resizableReset(table, true); // set default widths
1493
- var $rows, $columns, $column, column,
1516
+ var $rows, $columns, $column, column, timer,
1494
1517
  storedSizes = {},
1495
1518
  $table = c.$table,
1496
1519
  mouseXPosition = 0,
1497
1520
  $target = null,
1498
1521
  $next = null,
1499
1522
  fullWidth = Math.abs($table.parent().width() - $table.width()) < 20,
1523
+ mouseMove = function(event){
1524
+ if (mouseXPosition === 0 || !$target) { return; }
1525
+ // resize columns
1526
+ var leftEdge = event.pageX - mouseXPosition,
1527
+ targetWidth = $target.width();
1528
+ $target.width( targetWidth + leftEdge );
1529
+ if ($target.width() !== targetWidth && fullWidth) {
1530
+ $next.width( $next.width() - leftEdge );
1531
+ }
1532
+ mouseXPosition = event.pageX;
1533
+ },
1500
1534
  stopResize = function() {
1501
1535
  if (ts.storage && $target && $next) {
1502
1536
  storedSizes = {};
@@ -1551,21 +1585,6 @@ ts.addWidget({
1551
1585
  .append('<div class="' + ts.css.resizer + '" style="cursor:w-resize;position:absolute;z-index:1;right:-' +
1552
1586
  padding + 'px;top:0;height:100%;width:20px;"></div>');
1553
1587
  })
1554
- .bind('mousemove.tsresize', function(event) {
1555
- // ignore mousemove if no mousedown
1556
- if (mouseXPosition === 0 || !$target) { return; }
1557
- // resize columns
1558
- var leftEdge = event.pageX - mouseXPosition,
1559
- targetWidth = $target.width();
1560
- $target.width( targetWidth + leftEdge );
1561
- if ($target.width() !== targetWidth && fullWidth) {
1562
- $next.width( $next.width() - leftEdge );
1563
- }
1564
- mouseXPosition = event.pageX;
1565
- })
1566
- .bind('mouseup.tsresize', function() {
1567
- stopResize();
1568
- })
1569
1588
  .find('.' + ts.css.resizer + ',.' + ts.css.grip)
1570
1589
  .bind('mousedown', function(event) {
1571
1590
  // save header cell and mouse position
@@ -1576,17 +1595,30 @@ ts.addWidget({
1576
1595
  $next = event.shiftKey ? $target.parent().find('th').not('.resizable-false').filter(':last') : $target.nextAll(':not(.resizable-false)').eq(0);
1577
1596
  mouseXPosition = event.pageX;
1578
1597
  });
1579
- $table.find('thead:first')
1580
- .bind('mouseup.tsresize mouseleave.tsresize', function() {
1581
- stopResize();
1598
+ $(document)
1599
+ .bind('mousemove.tsresize', function(event) {
1600
+ // ignore mousemove if no mousedown
1601
+ if (mouseXPosition === 0 || !$target) { return; }
1602
+ if (wo.resizable_throttle) {
1603
+ clearTimeout(timer);
1604
+ timer = setTimeout(function(){
1605
+ mouseMove(event);
1606
+ }, isNaN(wo.resizable_throttle) ? 5 : wo.resizable_throttle );
1607
+ } else {
1608
+ mouseMove(event);
1609
+ }
1582
1610
  })
1611
+ .bind('mouseup.tsresize', function() {
1612
+ stopResize();
1613
+ });
1614
+
1583
1615
  // right click to reset columns to default widths
1584
- .bind('contextmenu.tsresize', function() {
1585
- ts.resizableReset(table);
1586
- // $.isEmptyObject() needs jQuery 1.4+; allow right click if already reset
1587
- var allowClick = $.isEmptyObject ? $.isEmptyObject(storedSizes) : true;
1588
- storedSizes = {};
1589
- return allowClick;
1616
+ $table.find('thead:first').bind('contextmenu.tsresize', function() {
1617
+ ts.resizableReset(table);
1618
+ // $.isEmptyObject() needs jQuery 1.4+; allow right click if already reset
1619
+ var allowClick = $.isEmptyObject ? $.isEmptyObject(storedSizes) : true;
1620
+ storedSizes = {};
1621
+ return allowClick;
1590
1622
  });
1591
1623
  },
1592
1624
  remove: function(table, c) {
@@ -1,4 +1,4 @@
1
- /* Pager widget (beta) for TableSorter 6/28/2014 (v2.17.3) */
1
+ /* Pager widget for TableSorter 7/4/2014 (v2.17.4) */
2
2
  /*jshint browser:true, jquery:true, unused:false */
3
3
  ;(function($){
4
4
  "use strict";
@@ -205,7 +205,7 @@ tsp = ts.pager = {
205
205
  p.isInitializing = false;
206
206
  tsp.setPageSize(table, 0, c); // page size 0 is ignored
207
207
  c.$table.trigger('pagerInitialized', c);
208
-
208
+ tsp.updatePageDisplay(table, c);
209
209
  },
210
210
 
211
211
  bindEvents: function(table, c){
@@ -351,6 +351,8 @@ tsp = ts.pager = {
351
351
  } else if (!f) {
352
352
  p.filteredRows = p.totalRows;
353
353
  }
354
+ c.totalRows = p.totalRows;
355
+ c.filteredRows = p.filteredRows;
354
356
  p.filteredPages = Math.ceil( p.filteredRows / sz ) || 0;
355
357
  if ( Math.min( p.totalPages, p.filteredPages ) >= 0 ) {
356
358
  t = (p.size * p.page > p.filteredRows);
@@ -498,8 +500,8 @@ tsp = ts.pager = {
498
500
  // process ajax object
499
501
  if (!$.isArray(result)) {
500
502
  p.ajaxData = result;
501
- p.totalRows = result.total;
502
- p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total;
503
+ c.totalRows = p.totalRows = result.total;
504
+ c.filteredRows = p.filteredRows = typeof result.filteredRows !== 'undefined' ? result.filteredRows : result.total;
503
505
  th = result.headers;
504
506
  d = result.rows;
505
507
  } else {
@@ -508,10 +510,12 @@ tsp = ts.pager = {
508
510
  // ensure a zero returned row count doesn't fail the logical ||
509
511
  rr_count = result[t ? 1 : 0];
510
512
  p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count;
513
+ // can't set filtered rows when returning an array
514
+ c.totalRows = c.filteredRows = p.filteredRows = p.totalRows;
511
515
  d = p.totalRows === 0 ? [""] : result[t ? 0 : 1] || []; // row data
512
516
  th = result[2]; // headers
513
517
  }
514
- l = d.length;
518
+ l = d && d.length;
515
519
  if (d instanceof jQuery) {
516
520
  if (wo.pager_processAjaxOnInit) {
517
521
  // append jQuery object
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.12.3
4
+ version: 1.12.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: 2014-06-30 00:00:00.000000000 Z
12
+ date: 2014-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties