jquery-tablesorter 1.10.4 → 1.10.5

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