jquery-tablesorter 1.10.4 → 1.10.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e9c4b55e83f583df24a50e72e50dd3193625600
4
- data.tar.gz: 2242d68bf7499163fd6f4839b673655f703e9df8
3
+ metadata.gz: 6ae86c5a6be578e3345d4a9d6d360139e14f5117
4
+ data.tar.gz: 86e5f16bcbace09e8eab622aa11a1bc7403f7ba3
5
5
  SHA512:
6
- metadata.gz: 53eba97a412635392168b9375f97cd76ec45cc0e1c056ad3a07a17bde3fda060724577b03b0b1e923944aa441a674dabc4c37f01c295050819d74a0fd90fb3bf
7
- data.tar.gz: 702b8fb3e5342484899fa7938e68c4fd1c5be5d9f88c2bd40b8dae7ade36dcb90895c8c2955bd6a0693d501a7e9a50895f2aa3933a5296c54dc604cbb95a4ed5
6
+ metadata.gz: b86a226432a4b741a8b54e6f73180924524876e1a4a21b46f192f1c7e1f24fdd727c017cb1f05ff4a448944b88751177db793d1c95e765966a7809aae0beb441
7
+ data.tar.gz: 7898210ee3314a69b1c330bf9dfa9fc364288c59769f5976f6ccc4f293a9527d2dd7c22bd374e5269c03643a2cdda18ce5aecbb8444ae8ef6acb22afe3901a0f
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.15.6 (3/7/2014), [documentation]
7
+ Current tablesorter version: 2.15.7 (3/10/2014), [documentation]
8
8
 
9
9
  Any issue associate with the js/css files, please report to [Mottie's fork].
10
10
 
@@ -26,7 +26,7 @@ Or install it yourself as:
26
26
 
27
27
  Rails 3.1 and higher (tested up to 4.1)
28
28
 
29
- Tested with ruby 1.9.3 - 2.1.0
29
+ Tested with ruby 1.9.3 - 2.1.1
30
30
 
31
31
  ## Usage
32
32
 
@@ -1,3 +1,3 @@
1
1
  module JqueryTablesorter
2
- VERSION = "1.10.4"
2
+ VERSION = "1.10.5"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  /**!
2
- * TableSorter 2.15.6 - Client-side table sorting with ease!
2
+ * TableSorter 2.15.7 - 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.15.6";
27
+ ts.version = "2.15.7";
28
28
 
29
29
  ts.parsers = [];
30
30
  ts.widgets = [];
@@ -783,15 +783,15 @@
783
783
  $table = c.$table;
784
784
  // apply easy methods that trigger bound events
785
785
  $table
786
- .unbind('sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave '.split(' ').join('.tablesorter '))
787
- .bind("sortReset.tablesorter", function(e){
786
+ .unbind('sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave '.split(' ').join(c.namespace + ' '))
787
+ .bind("sortReset" + c.namespace, function(e){
788
788
  e.stopPropagation();
789
789
  c.sortList = [];
790
790
  setHeadersCss(table);
791
791
  multisort(table);
792
792
  appendToTable(table);
793
793
  })
794
- .bind("updateAll.tablesorter", function(e, resort, callback){
794
+ .bind("updateAll" + c.namespace, function(e, resort, callback){
795
795
  e.stopPropagation();
796
796
  table.isUpdating = true;
797
797
  ts.refreshWidgets(table, true, true);
@@ -801,14 +801,14 @@
801
801
  bindMethods(table);
802
802
  commonUpdate(table, resort, callback);
803
803
  })
804
- .bind("update.tablesorter updateRows.tablesorter", function(e, resort, callback) {
804
+ .bind("update" + c.namespace + " updateRows" + c.namespace, function(e, resort, callback) {
805
805
  e.stopPropagation();
806
806
  table.isUpdating = true;
807
807
  // update sorting (if enabled/disabled)
808
808
  updateHeader(table);
809
809
  commonUpdate(table, resort, callback);
810
810
  })
811
- .bind("updateCell.tablesorter", function(e, cell, resort, callback) {
811
+ .bind("updateCell" + c.namespace, function(e, cell, resort, callback) {
812
812
  e.stopPropagation();
813
813
  table.isUpdating = true;
814
814
  $table.find(c.selectorRemove).remove();
@@ -830,7 +830,7 @@
830
830
  checkResort($table, resort, callback);
831
831
  }
832
832
  })
833
- .bind("addRows.tablesorter", function(e, $row, resort, callback) {
833
+ .bind("addRows" + c.namespace, function(e, $row, resort, callback) {
834
834
  e.stopPropagation();
835
835
  table.isUpdating = true;
836
836
  if (isEmptyObject(c.cache)) {
@@ -863,10 +863,10 @@
863
863
  checkResort($table, resort, callback);
864
864
  }
865
865
  })
866
- .bind("updateComplete.tablesorter", function(){
866
+ .bind("updateComplete" + c.namespace, function(){
867
867
  table.isUpdating = false;
868
868
  })
869
- .bind("sorton.tablesorter", function(e, list, callback, init) {
869
+ .bind("sorton" + c.namespace, function(e, list, callback, init) {
870
870
  var c = table.config;
871
871
  e.stopPropagation();
872
872
  $table.trigger("sortStart", this);
@@ -885,14 +885,14 @@
885
885
  callback(table);
886
886
  }
887
887
  })
888
- .bind("appendCache.tablesorter", function(e, callback, init) {
888
+ .bind("appendCache" + c.namespace, function(e, callback, init) {
889
889
  e.stopPropagation();
890
890
  appendToTable(table, init);
891
891
  if (typeof callback === "function") {
892
892
  callback(table);
893
893
  }
894
894
  })
895
- .bind("updateCache.tablesorter", function(e, callback){
895
+ .bind("updateCache" + c.namespace, function(e, callback){
896
896
  // rebuild parsers
897
897
  if (!c.parsers) {
898
898
  buildParserCache(table);
@@ -903,20 +903,20 @@
903
903
  callback(table);
904
904
  }
905
905
  })
906
- .bind("applyWidgetId.tablesorter", function(e, id) {
906
+ .bind("applyWidgetId" + c.namespace, function(e, id) {
907
907
  e.stopPropagation();
908
908
  ts.getWidgetById(id).format(table, c, c.widgetOptions);
909
909
  })
910
- .bind("applyWidgets.tablesorter", function(e, init) {
910
+ .bind("applyWidgets" + c.namespace, function(e, init) {
911
911
  e.stopPropagation();
912
912
  // apply widgets
913
913
  ts.applyWidget(table, init);
914
914
  })
915
- .bind("refreshWidgets.tablesorter", function(e, all, dontapply){
915
+ .bind("refreshWidgets" + c.namespace, function(e, all, dontapply){
916
916
  e.stopPropagation();
917
917
  ts.refreshWidgets(table, all, dontapply);
918
918
  })
919
- .bind("destroy.tablesorter", function(e, c, cb){
919
+ .bind("destroy" + c.namespace, function(e, c, cb){
920
920
  e.stopPropagation();
921
921
  ts.destroy(table, c, cb);
922
922
  });
@@ -932,8 +932,9 @@
932
932
  if (!table.hasInitialized && ts.buildTable && this.tagName !== 'TABLE') {
933
933
  // return the table (in case the original target is the table's container)
934
934
  ts.buildTable(table, c);
935
+ } else {
936
+ ts.setup(table, c);
935
937
  }
936
- ts.setup(table, c);
937
938
  });
938
939
  };
939
940
 
@@ -972,11 +973,19 @@
972
973
  c.$table = $table
973
974
  .addClass(ts.css.table + ' ' + c.tableClass + k)
974
975
  .attr({ role : 'grid'});
976
+
977
+ // give the table a unique id, which will be used in namespace binding
978
+ if (!c.namespace) {
979
+ c.namespace = '.tablesorter' + Math.random().toString(16).slice(2);
980
+ } else {
981
+ // make sure namespace starts with a period & doesn't have weird characters
982
+ c.namespace = '.' + c.namespace.replace(/\W/g,'');
983
+ }
984
+
975
985
  c.$tbodies = $table.children('tbody:not(.' + c.cssInfoBlock + ')').attr({
976
986
  'aria-live' : 'polite',
977
987
  'aria-relevant' : 'all'
978
988
  });
979
- //
980
989
  if (c.$table.find('caption').length) {
981
990
  c.$table.attr('aria-labelledby', 'theCaption');
982
991
  }
@@ -1017,8 +1026,8 @@
1017
1026
  // show processesing icon
1018
1027
  if (c.showProcessing) {
1019
1028
  $table
1020
- .unbind('sortBegin.tablesorter sortEnd.tablesorter')
1021
- .bind('sortBegin.tablesorter sortEnd.tablesorter', function(e) {
1029
+ .unbind('sortBegin' + c.namespace + ' sortEnd' + c.namespace)
1030
+ .bind('sortBegin' + c.namespace + ' sortEnd' + c.namespace, function(e) {
1022
1031
  ts.isProcessing(table, e.type === 'sortBegin');
1023
1032
  });
1024
1033
  }
@@ -1084,8 +1093,8 @@
1084
1093
  $headers
1085
1094
  // http://stackoverflow.com/questions/5312849/jquery-find-self;
1086
1095
  .find(c.selectorSort).add( $headers.filter(c.selectorSort) )
1087
- .unbind('mousedown.tablesorter mouseup.tablesorter sort.tablesorter keyup.tablesorter')
1088
- .bind('mousedown.tablesorter mouseup.tablesorter sort.tablesorter keyup.tablesorter', function(e, external) {
1096
+ .unbind('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' '))
1097
+ .bind('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' '), function(e, external) {
1089
1098
  var cell, type = e.type;
1090
1099
  // only recognize left clicks or enter
1091
1100
  if ( ((e.which || e.button) !== 1 && !/sort|keyup/.test(type)) || (type === 'keyup' && e.which !== 13) ) {
@@ -1146,11 +1155,11 @@
1146
1155
  // disable tablesorter
1147
1156
  $t
1148
1157
  .removeData('tablesorter')
1149
- .unbind('sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd '.split(' ').join('.tablesorter '));
1158
+ .unbind('sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd '.split(' ').join(c.namespace + ' '));
1150
1159
  c.$headers.add($f)
1151
1160
  .removeClass( [ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone].join(' ') )
1152
1161
  .removeAttr('data-column');
1153
- $r.find(c.selectorSort).unbind('mousedown.tablesorter mouseup.tablesorter keypress.tablesorter');
1162
+ $r.find(c.selectorSort).unbind('mousedown mouseup keypress '.split(' ').join(c.namespace + ' '));
1154
1163
  ts.restoreHeaders(table);
1155
1164
  if (removeClasses !== false) {
1156
1165
  $t.removeClass(ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme);
@@ -1166,8 +1175,7 @@
1166
1175
  // regex used in natural sort
1167
1176
  ts.regex = {
1168
1177
  chunk : /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi, // chunk/tokenize numbers & letters
1169
- schunk: /^\\0/, // start chunk
1170
- echunk: /\\0$/, // end chunk
1178
+ chunks: /(^\\0|\\0$)/, // replace chunks @ ends
1171
1179
  hex: /^0x[0-9a-f]+$/i // hex
1172
1180
  };
1173
1181
 
@@ -1184,8 +1192,8 @@
1184
1192
  if ( xD > yD ) { return 1; }
1185
1193
  }
1186
1194
  // chunk/tokenize
1187
- xN = a.replace(r.chunk, '\\0$1\\0').replace(r.echunk, '').replace(r.schunk, '').split('\\0');
1188
- yN = b.replace(r.chunk, '\\0$1\\0').replace(r.echunk, '').replace(r.schunk, '').split('\\0');
1195
+ xN = a.replace(r.chunk, '\\0$1\\0').replace(r.chunks, '').split('\\0');
1196
+ yN = b.replace(r.chunk, '\\0$1\\0').replace(r.chunks, '').split('\\0');
1189
1197
  mx = Math.max(xN.length, yN.length);
1190
1198
  // natural sorting through split numeric strings and default strings
1191
1199
  for (i = 0; i < mx; i++) {
@@ -1,4 +1,4 @@
1
- /*! Filter widget formatter functions - updated 2/19/2014 (v2.15)
1
+ /*! Filter widget formatter functions - updated 3/9/2014 (v2.15.7)
2
2
  * requires: tableSorter 2.15+ and jQuery 1.4.3+
3
3
  *
4
4
  * uiSpinner (jQuery UI spinner)
@@ -73,8 +73,8 @@ tsff = ts.filterFormatter = {
73
73
  // Add a hidden input to hold the range values
74
74
  $input = $('<input class="filter" type="hidden">')
75
75
  .appendTo($cell)
76
- // hidden filter update (.tsfilter) namespace trigger by filter widget
77
- .bind('change.tsfilter', function(){
76
+ // hidden filter update namespace trigger by filter widget
77
+ .bind('change' + c.namespace + 'filter', function(){
78
78
  updateSpinner({ value: this.value, delayed: false });
79
79
  }),
80
80
  $shcell = [],
@@ -230,8 +230,8 @@ tsff = ts.filterFormatter = {
230
230
  // Add a hidden input to hold the range values
231
231
  $input = $('<input class="filter" type="hidden">')
232
232
  .appendTo($cell)
233
- // hidden filter update (.tsfilter) namespace trigger by filter widget
234
- .bind('change.tsfilter', function(){
233
+ // hidden filter update namespace trigger by filter widget
234
+ .bind('change' + c.namespace + 'filter', function(){
235
235
  updateSlider({ value: this.value });
236
236
  }),
237
237
  $shcell = [],
@@ -368,8 +368,8 @@ tsff = ts.filterFormatter = {
368
368
  // Add a hidden input to hold the range values
369
369
  $input = $('<input class="filter" type="hidden">')
370
370
  .appendTo($cell)
371
- // hidden filter update (.tsfilter) namespace trigger by filter widget
372
- .bind('change.tsfilter', function(){
371
+ // hidden filter update namespace trigger by filter widget
372
+ .bind('change' + c.namespace + 'filter', function(){
373
373
  getRange();
374
374
  }),
375
375
  $shcell = [],
@@ -500,8 +500,8 @@ tsff = ts.filterFormatter = {
500
500
  // Add a hidden input to hold the range values
501
501
  $input = $('<input class="dateCompare" type="hidden">')
502
502
  .appendTo($cell)
503
- // hidden filter update (.tsfilter) namespace trigger by filter widget
504
- .bind('change.tsfilter', function(){
503
+ // hidden filter update namespace trigger by filter widget
504
+ .bind('change' + c.namespace + 'filter', function(){
505
505
  var v = this.value;
506
506
  if (v) {
507
507
  o.onClose(v);
@@ -632,8 +632,8 @@ tsff = ts.filterFormatter = {
632
632
  // Add a hidden input to hold the range values
633
633
  $input = $('<input class="dateRange" type="hidden">')
634
634
  .appendTo($cell)
635
- // hidden filter update (.tsfilter) namespace trigger by filter widget
636
- .bind('change.tsfilter', function(){
635
+ // hidden filter update namespace trigger by filter widget
636
+ .bind('change' + c.namespace + 'filter', function(){
637
637
  var v = this.value;
638
638
  if (v.match(' - ')) {
639
639
  v = v.split(' - ');
@@ -940,8 +940,8 @@ tsff = ts.filterFormatter = {
940
940
  .addClass('filter-parsed') // get exact numbers from column
941
941
  // add span to header for the current slider value
942
942
  .find('.tablesorter-header-inner').append('<span class="curvalue" />');
943
- // hidden filter update (.tsfilter) namespace trigger by filter widget
944
- $input = $cell.find('input[type=hidden]').bind('change.tsfilter', function(){
943
+ // hidden filter update namespace trigger by filter widget
944
+ $input = $cell.find('input[type=hidden]').bind('change' + c.namespace + 'filter', function(){
945
945
  /*jshint eqeqeq:false */
946
946
  var v = this.value,
947
947
  compare = ($.isArray(o.compare) ? $cell.find(compareSelect).val() || o.compare[ o.selected || 0] : o.compare) || '';
@@ -1085,8 +1085,8 @@ tsff = ts.filterFormatter = {
1085
1085
  updateColor( $cell.find('.colorpicker').val() );
1086
1086
  });
1087
1087
 
1088
- // hidden filter update (.tsfilter) namespace trigger by filter widget
1089
- $input = $cell.find('input[type=hidden]').bind('change.tsfilter', function(){
1088
+ // hidden filter update namespace trigger by filter widget
1089
+ $input = $cell.find('input[type=hidden]').bind('change' + c.namespace + 'filter', function(){
1090
1090
  updateColor( this.value );
1091
1091
  });
1092
1092
 
@@ -1,4 +1,4 @@
1
- /*! tableSorter 2.8+ widgets - updated 3/7/2014 (v2.15.6)
1
+ /*! tableSorter 2.15+ widgets - updated 3/9/2014 (v2.15.7)
2
2
  *
3
3
  * Column Styles
4
4
  * Column Filters
@@ -125,7 +125,7 @@ ts.storage = function(table, key, value, options) {
125
125
  document.cookie = key + '=' + (JSON.stringify(values)).replace(/\"/g,'\"') + '; expires=' + date.toGMTString() + '; path=/';
126
126
  }
127
127
  } else {
128
- return values && values[url] ? values[url][id] : {};
128
+ return values && values[url] ? values[url][id] : '';
129
129
  }
130
130
  };
131
131
 
@@ -380,7 +380,7 @@ ts.addWidget({
380
380
  $table
381
381
  .removeClass('hasFilters')
382
382
  // add .tsfilter namespace to all BUT search
383
- .unbind('addRows updateCell update updateRows updateComplete appendCache filterReset filterEnd search '.split(' ').join('.tsfilter '))
383
+ .unbind('addRows updateCell update updateRows updateComplete appendCache filterReset filterEnd search '.split(' ').join(c.namespace + 'filter '))
384
384
  .find('.' + ts.css.filterRow).remove();
385
385
  for (tbodyIndex = 0; tbodyIndex < $tbodies.length; tbodyIndex++ ) {
386
386
  $tbody = ts.processTbody(table, $tbodies.eq(tbodyIndex), true); // remove tbody
@@ -558,7 +558,7 @@ ts.filter = {
558
558
  ts.filter.buildRow(table, c, wo);
559
559
  }
560
560
 
561
- c.$table.bind('addRows updateCell update updateRows updateComplete appendCache filterReset filterEnd search '.split(' ').join('.tsfilter '), function(event, filter) {
561
+ c.$table.bind('addRows updateCell update updateRows updateComplete appendCache filterReset filterEnd search '.split(' ').join(c.namespace + 'filter '), function(event, filter) {
562
562
  c.$table.find('.' + ts.css.filterRow).toggle( !(wo.filter_hideEmpty && $.isEmptyObject(c.cache)) ); // fixes #450
563
563
  if ( !/(search|filter)/.test(event.type) ) {
564
564
  event.stopPropagation();
@@ -628,7 +628,7 @@ ts.filter = {
628
628
 
629
629
  // show processing icon
630
630
  if (c.showProcessing) {
631
- c.$table.bind('filterStart.tsfilter filterEnd.tsfilter', function(event, columns) {
631
+ c.$table.bind('filterStart' + c.namespace + 'filter filterEnd' + c.namespace + 'filter', function(event, columns) {
632
632
  // only add processing to certain columns to all columns
633
633
  $header = (columns) ? c.$table.find('.' + ts.css.header).filter('[data-column]').filter(function() {
634
634
  return columns[$(this).data('column')] !== '';
@@ -751,9 +751,9 @@ ts.filter = {
751
751
  $el
752
752
  // use data attribute instead of jQuery data since the head is cloned without including the data/binding
753
753
  .attr('data-lastSearchTime', new Date().getTime())
754
- .unbind('keyup search change')
754
+ .unbind('keyup search change '.split(' ').join(c.namespace + 'filter '))
755
755
  // include change for select - fixes #473
756
- .bind('keyup search change', function(event, filters) {
756
+ .bind('keyup search change '.split(' ').join(c.namespace + 'filter '), function(event, filters) {
757
757
  $(this).attr('data-lastSearchTime', new Date().getTime());
758
758
  // emulate what webkit does.... escape clears the filter
759
759
  if (event.which === 27) {
@@ -32,14 +32,18 @@ tsColSel = ts.columnSelector = {
32
32
 
33
33
  // build column selector/state array
34
34
  colSel = c.selector = { $container : $(wo.columnSelector_container || '<div>') };
35
+ colSel.$style = $('<style></style>').prop('disabled', true).appendTo('head');
36
+ colSel.$breakpoints = $('<style></style>').prop('disabled', true).appendTo('head');
37
+
38
+ colSel.isInitializing = true;
35
39
  tsColSel.setupSelector(table, c, wo);
36
40
 
37
41
  if (wo.columnSelector_mediaquery) {
38
42
  tsColSel.setupBreakpoints(c, wo);
39
43
  }
40
44
 
45
+ colSel.isInitializing = false;
41
46
  if (colSel.$container.length) {
42
- colSel.$style = $('<style></style>').prop('disabled', true).appendTo('head');
43
47
  tsColSel.updateCols(c, wo);
44
48
  }
45
49
 
@@ -49,10 +53,13 @@ tsColSel = ts.columnSelector = {
49
53
  var name,
50
54
  colSel = c.selector,
51
55
  $container = colSel.$container,
56
+ useStorage = wo.columnSelector_saveColumns && ts.storage,
52
57
  // get stored column states
53
- saved = wo.columnSelector_saveColumns && ts.storage ? ts.storage( table, 'tablesorter-columnSelector' ) : [];
58
+ saved = useStorage ? ts.storage( table, 'tablesorter-columnSelector' ) : [],
59
+ state = useStorage ? ts.storage( table, 'tablesorter-columnSelector-auto') : {};
54
60
 
55
61
  // initial states
62
+ colSel.auto = $.isEmptyObject(state) || $.type(state.auto) !== "boolean" ? wo.columnSelector_mediaqueryState : state.auto;
56
63
  colSel.states = [];
57
64
  colSel.$column = [];
58
65
  colSel.$wrapper = [];
@@ -99,14 +106,13 @@ tsColSel = ts.columnSelector = {
99
106
  },
100
107
 
101
108
  setupBreakpoints: function(c, wo){
102
- var $auto, colSel = c.selector;
109
+ var colSel = c.selector;
103
110
 
104
111
  // add responsive breakpoints
105
112
  if (wo.columnSelector_mediaquery) {
106
113
  // used by window resize function
107
114
  colSel.lastIndex = -1;
108
115
  wo.columnSelector_breakpoints.sort();
109
- colSel.$breakpoints = $('<style></style>').prop('disabled', true).appendTo('head');
110
116
  tsColSel.updateBreakpoints(c, wo);
111
117
  c.$table.unbind('updateAll' + namespace).bind('updateAll' + namespace, function(){
112
118
  tsColSel.updateBreakpoints(c, wo);
@@ -116,22 +122,24 @@ tsColSel = ts.columnSelector = {
116
122
 
117
123
  if (colSel.$container.length) {
118
124
  // Add media queries toggle
119
- if (wo.columnSelector_mediaquery && wo.columnSelector_mediaquery) {
120
- $auto = $( wo.columnSelector_layout.replace(/\{name\}/g, wo.columnSelector_mediaqueryName) ).prependTo(colSel.$container);
121
- $auto
125
+ if (wo.columnSelector_mediaquery) {
126
+ colSel.$auto = $( wo.columnSelector_layout.replace(/\{name\}/g, wo.columnSelector_mediaqueryName) ).prependTo(colSel.$container);
127
+ colSel.$auto
122
128
  // needed in case the input in the layout is not wrapped
123
- .find('input').add( $auto.filter('input') )
129
+ .find('input').add( colSel.$auto.filter('input') )
124
130
  .attr('data-column', 'auto')
125
- .prop('checked', wo.columnSelector_mediaqueryState)
131
+ .prop('checked', colSel.auto)
126
132
  .bind('change', function(){
127
- wo.columnSelector_mediaqueryState = this.checked;
133
+ colSel.auto = this.checked;
128
134
  $.each( colSel.$checkbox, function(i, $cb){
129
135
  if ($cb) {
130
- $cb[0].disabled = wo.columnSelector_mediaqueryState;
131
- colSel.$wrapper[i].toggleClass('disabled', wo.columnSelector_mediaqueryState);
136
+ $cb[0].disabled = colSel.auto;
137
+ colSel.$wrapper[i].toggleClass('disabled', colSel.auto);
132
138
  }
133
139
  });
134
- tsColSel.updateBreakpoints(c, wo);
140
+ if (wo.columnSelector_mediaquery) {
141
+ tsColSel.updateBreakpoints(c, wo);
142
+ }
135
143
  tsColSel.updateCols(c, wo);
136
144
  // copy the column selector to a popup/tooltip
137
145
  if (c.selector.$popup) {
@@ -139,9 +147,12 @@ tsColSel = ts.columnSelector = {
139
147
  .html( colSel.$container.html() )
140
148
  .find('input').each(function(){
141
149
  var indx = $(this).attr('data-column');
142
- $(this).prop( 'checked', indx === 'auto' ? wo.columnSelector_mediaqueryState : colSel.states[indx] );
150
+ $(this).prop( 'checked', indx === 'auto' ? colSel.auto : colSel.states[indx] );
143
151
  });
144
152
  }
153
+ if (wo.columnSelector_saveColumns && ts.storage) {
154
+ ts.storage( c.$table[0], 'tablesorter-columnSelector-auto', { auto : colSel.auto } );
155
+ }
145
156
  }).change();
146
157
  }
147
158
  // Add a bind on update to re-run col setup
@@ -157,7 +168,7 @@ tsColSel = ts.columnSelector = {
157
168
  prefix = '.' + c.tableId,
158
169
  mediaAll = [],
159
170
  breakpts = '';
160
- if (wo.columnSelector_mediaquery && !wo.columnSelector_mediaqueryState) {
171
+ if (wo.columnSelector_mediaquery && !colSel.auto) {
161
172
  colSel.$breakpoints.prop('disabled', true);
162
173
  colSel.$style.prop('disabled', false);
163
174
  return;
@@ -188,13 +199,14 @@ tsColSel = ts.columnSelector = {
188
199
  },
189
200
 
190
201
  updateCols: function(c, wo) {
191
- if (wo.columnSelector_mediaquery && wo.columnSelector_mediaqueryState) {
202
+ if (wo.columnSelector_mediaquery && c.selector.auto || c.selector.isInitializing) {
192
203
  return;
193
204
  }
194
205
  var column,
206
+ colSel = c.selector,
195
207
  styles = [],
196
208
  prefix = '.' + c.tableId;
197
- c.selector.$container.find('input[data-column]').filter('[data-column!="auto"]').each(function(){
209
+ colSel.$container.find('input[data-column]').filter('[data-column!="auto"]').each(function(){
198
210
  if (!this.checked) {
199
211
  column = parseInt( $(this).attr('data-column'), 10 ) + 1;
200
212
  styles.push(prefix + ' tr th:nth-child(' + column + ')');
@@ -202,13 +214,13 @@ tsColSel = ts.columnSelector = {
202
214
  }
203
215
  });
204
216
  if (wo.columnSelector_mediaquery){
205
- c.selector.$breakpoints.prop('disabled', true);
217
+ colSel.$breakpoints.prop('disabled', true);
206
218
  }
207
- if (c.selector.$style) {
208
- c.selector.$style.prop('disabled', false).html( styles.length ? styles.join(',') + ' { display: none; }' : '' );
219
+ if (colSel.$style) {
220
+ colSel.$style.prop('disabled', false).html( styles.length ? styles.join(',') + ' { display: none; }' : '' );
209
221
  }
210
222
  if (wo.columnSelector_saveColumns && ts.storage) {
211
- ts.storage( c.$table[0], 'tablesorter-columnSelector', c.selector.states );
223
+ ts.storage( c.$table[0], 'tablesorter-columnSelector', colSel.states );
212
224
  }
213
225
  },
214
226
 
@@ -228,7 +240,7 @@ tsColSel = ts.columnSelector = {
228
240
  .html( colSel.$container.html() )
229
241
  .find('input').each(function(){
230
242
  var indx = $(this).attr('data-column');
231
- $(this).prop( 'checked', indx === 'auto' ? wo.columnSelector_mediaqueryState : colSel.states[indx] );
243
+ $(this).prop( 'checked', indx === 'auto' ? colSel.auto : colSel.states[indx] );
232
244
  });
233
245
  colSel.$popup = $popup.on('change', 'input', function(){
234
246
  // data input
@@ -6,26 +6,85 @@
6
6
  /*global jQuery: false */
7
7
  ;(function($){
8
8
  "use strict";
9
+ var ts = $.tablesorter;
9
10
 
10
- $.tablesorter.addWidget({
11
+ ts.addWidget({
11
12
  id: 'headerTitles',
12
13
  options: {
13
- headerTitle_prefix : 'Sort: ',
14
- headerTitle_text : [ 'A - Z', 'Z - A' ],
15
- headerTitle_numeric : [ '0 - 9', '9 - 0' ]
14
+ // use aria-label text
15
+ // e.g. "First Name: Ascending sort applied, activate to apply a descending sort"
16
+ headerTitle_useAria : false,
17
+ // add tooltip class
18
+ headerTitle_tooltip : '',
19
+ // custom titles [ ascending, descending, unsorted ]
20
+ headerTitle_cur_text : [ ' sort: A - Z', ' sort: Z - A', 'ly unsorted' ],
21
+ headerTitle_cur_numeric : [ ' sort: 0 - 9', ' sort: 9 - 0', 'ly unsorted' ],
22
+ headerTitle_nxt_text : [ ' sort: A - Z', ' sort: Z - A', 'remove sort' ],
23
+ headerTitle_nxt_numeric : [ ' sort: 0 - 9', ' sort: 9 - 0', 'remove sort' ],
24
+
25
+ // title display; {prefix} adds above prefix
26
+ // {type} adds the current sort order from above (text or numeric)
27
+ // {next} adds the next sort direction using the sort order above
28
+ headerTitle_output_sorted : 'current{current}; activate to {next}',
29
+ headerTitle_output_unsorted : 'current{current}; activate to {next} ',
30
+ headerTitle_output_nosort : 'No sort available',
31
+ // use this type to override the parser detection result
32
+ // e.g. use for numerically parsed columns (e.g. dates), but you
33
+ // want the user to see a text sort, e.g. [ 'text', 'numeric' ]
34
+ headerTitle_type : [],
35
+ // manipulate the title as desired
36
+ headerTitle_callback : null // function($cell, txt) { return txt; }
37
+ },
38
+ init: function(table, thisWidget, c, wo){
39
+ // force refresh
40
+ c.$table.on('refreshHeaderTitle', function(){
41
+ thisWidget.format(table, c, wo);
42
+ });
43
+ // add tooltip class
44
+ if ($.isArray(wo.headerTitle_tooltip)) {
45
+ c.$headers.each(function(){
46
+ $(this).addClass( wo.headerTitle_tooltip[this.column] || '' );
47
+ });
48
+ } else if (wo.headerTitle_tooltip !== '') {
49
+ c.$headers.addClass( wo.headerTitle_tooltip );
50
+ }
16
51
  },
17
52
  format: function (table, c, wo) {
18
53
  var txt;
19
- // clear out all titles
20
- c.$headers.attr('title', '');
21
- // only add titles to sorted columns
22
- $.each(c.sortList, function(indx, group) {
23
- txt = wo.headerTitle_prefix + wo['headerTitle_' + (c.parsers[ group[0] ].type || 'text')][ group[1] ];
24
- c.$headers.filter('[data-column="' + group[0] + '"]').attr('title', txt);
54
+ c.$headers.each(function(){
55
+ var t = this,
56
+ $this = $(this),
57
+ sortType = wo.headerTitle_type[t.column] || c.parsers[ t.column ].type || 'text',
58
+ sortDirection = $this.hasClass(ts.css.sortAsc) ? 0 : $this.hasClass(ts.css.sortDesc) ? 1 : 2,
59
+ sortNext = t.order[(t.count + 1) % (c.sortReset ? 3 : 2)];
60
+ if (wo.headerTitle_useAria) {
61
+ txt = $this.hasClass('sorter-false') ? wo.headerTitle_output_nosort : $this.attr('aria-label') || '';
62
+ } else {
63
+ txt = (wo.headerTitle_prefix || '') + // now deprecated
64
+ ($this.hasClass('sorter-false') ? wo.headerTitle_output_nosort :
65
+ ts.isValueInArray( t.column, c.sortList ) >= 0 ? wo.headerTitle_output_sorted : wo.headerTitle_output_unsorted);
66
+ txt = txt.replace(/\{(current|next|name)\}/gi, function(m){
67
+ return {
68
+ '{name}' : $this.text(),
69
+ '{current}' : wo[ 'headerTitle_cur_' + sortType ][ sortDirection ] || '',
70
+ '{next}' : wo[ 'headerTitle_nxt_' + sortType ][ sortNext ] || ''
71
+ }[m.toLowerCase()];
72
+ });
73
+ }
74
+ $this.attr('title', $.isFunction(wo.headerTitle_callback) ? wo.headerTitle_callback($this, txt) : txt);
25
75
  });
26
76
  },
27
- remove: function (table, c) {
77
+ remove: function (table, c, wo) {
28
78
  c.$headers.attr('title', '');
79
+ c.$table.off('refreshHeaderTitle');
80
+ // remove tooltip class
81
+ if ($.isArray(wo.headerTitle_tooltip)) {
82
+ c.$headers.each(function(){
83
+ $(this).removeClass( wo.headerTitle_tooltip[this.column] || '' );
84
+ });
85
+ } else if (wo.headerTitle_tooltip !== '') {
86
+ c.$headers.removeClass( wo.headerTitle_tooltip );
87
+ }
29
88
  }
30
89
  });
31
90
 
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.10.4
4
+ version: 1.10.5
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-03-08 00:00:00.000000000 Z
12
+ date: 2014-03-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties