jquery-tablesorter 1.23.0 → 1.23.1

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: 9354d6adb18c718f952bf701152ed24f3dca112c
4
- data.tar.gz: fe90cbcbe7d5d38667662d69725912be77c23f72
3
+ metadata.gz: 9c5ec1ea040208bd492a6ddb95fc04d7b567b5d3
4
+ data.tar.gz: b0d4cc516082b7c9f6141b70bf50479267ef27fc
5
5
  SHA512:
6
- metadata.gz: 9bed90e7d4e0bb29b5996e7d84bcb51bcf6bb32844b338412ea4b66881c23c89818bf4e70c9387132672776402795151ab72a09ebb563581e94bf94c827f8ed8
7
- data.tar.gz: 57448fb255b2cfb211720cdb7f5fb2b904f2ac5c7ad8f7224a3beedef4be1515da77843e530215c8133978ca66b1d23ab04c5516bceaf641d602d59f8e4a4be8
6
+ metadata.gz: 964dcab9c0d02504d586dd7d991b8e257c3eff0b879b2d8104b22d4bcbb512b91b904efe154ea64f3a30009fab0ce921f96e3946545f4e0cf2277ec80c862563
7
+ data.tar.gz: da9eaf1162c57209531534538c9cd4242ca6aa8a6a74f25495204888bf91cd6064ad1d3f92f489d96792d07988af706c3782a988320117c35ea786db504bb9c5
@@ -1,7 +1,7 @@
1
1
  module JqueryTablesorter
2
2
  MAJOR = 1
3
3
  MINOR = 23
4
- TINY = 0
4
+ TINY = 1
5
5
 
6
6
  VERSION = [MAJOR, MINOR, TINY].compact.join('.')
7
7
  end
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * tablesorter (FORK) pager plugin
3
- * updated 9/23/2016 (v2.27.7)
3
+ * updated 11/26/2016 (v2.28.0)
4
4
  */
5
5
  /*jshint browser:true, jquery:true, unused:false */
6
6
  ;(function($) {
@@ -128,16 +128,25 @@
128
128
 
129
129
  // hide arrows at extremes
130
130
  pagerArrows = function( table, p, disable ) {
131
- var a = 'addClass',
132
- r = 'removeClass',
133
- d = p.cssDisabled,
134
- dis = !!disable,
135
- first = ( dis || p.page === 0 ),
136
- tp = getTotalPages( table, p ),
137
- last = ( dis || (p.page === tp - 1) || tp === 0 );
131
+ var tmp,
132
+ a = 'addClass',
133
+ r = 'removeClass',
134
+ d = p.cssDisabled,
135
+ dis = !!disable,
136
+ first = ( dis || p.page === 0 ),
137
+ tp = getTotalPages( table, p ),
138
+ last = ( dis || (p.page === tp - 1) || tp === 0 );
138
139
  if ( p.updateArrows ) {
139
- p.$container.find(p.cssFirst + ',' + p.cssPrev)[ first ? a : r ](d).attr('aria-disabled', first);
140
- p.$container.find(p.cssNext + ',' + p.cssLast)[ last ? a : r ](d).attr('aria-disabled', last);
140
+ tmp = p.$container.find(p.cssFirst + ',' + p.cssPrev);
141
+ tmp[ first ? a : r ](d); // toggle disabled class
142
+ tmp.each(function(){
143
+ this.ariaDisabled = first;
144
+ });
145
+ tmp = p.$container.find(p.cssNext + ',' + p.cssLast);
146
+ tmp[ last ? a : r ](d);
147
+ tmp.each(function(){
148
+ this.ariaDisabled = last;
149
+ });
141
150
  }
142
151
  },
143
152
 
@@ -689,9 +698,8 @@
689
698
  .add( p.$container.find( '.ts-startRow, .ts-page' ) );
690
699
  len = $controls.length;
691
700
  for ( index = 0; index < len; index++ ) {
692
- $controls.eq( index )
693
- .attr( 'aria-disabled', 'true' )
694
- .addClass( p.cssDisabled )[0].disabled = true;
701
+ $controls.eq( index ).addClass( p.cssDisabled )[0].disabled = true;
702
+ $controls[ index ].ariaDisabled = true;
695
703
  }
696
704
  },
697
705
 
@@ -850,6 +858,12 @@
850
858
  updatePageDisplay(table, p);
851
859
  },
852
860
 
861
+ resetState = function(table, p) {
862
+ var c = table.config;
863
+ c.pager = $.extend( true, {}, $.tablesorterPager.defaults, p.settings );
864
+ init(table, p.settings);
865
+ },
866
+
853
867
  destroyPager = function(table, p) {
854
868
  var c = table.config,
855
869
  namespace = c.namespace + 'pager',
@@ -876,7 +890,9 @@
876
890
  p.$size.add(p.$goto).add(p.$container.find('.ts-startRow, .ts-page'))
877
891
  .removeClass(p.cssDisabled)
878
892
  .removeAttr('disabled')
879
- .attr('aria-disabled', 'false');
893
+ .each(function(){
894
+ this.ariaDisabled = false;
895
+ });
880
896
  p.isDisabled = false;
881
897
  p.page = $.data(table, 'pagerLastPage') || p.page || 0;
882
898
  size = p.$size.find('option[selected]').val();
@@ -904,6 +920,210 @@
904
920
  console.log('Pager: Enabled');
905
921
  }
906
922
  }
923
+ },
924
+
925
+ init = function(table, settings) {
926
+ var t, ctrls, fxn, size,
927
+ c = table.config,
928
+ wo = c.widgetOptions,
929
+ p = c.pager = $.extend( true, {}, $.tablesorterPager.defaults, settings ),
930
+ $t = c.$table,
931
+ namespace = c.namespace + 'pager',
932
+ // added in case the pager is reinitialized after being destroyed.
933
+ pager = p.$container = $(p.container).addClass('tablesorter-pager').show();
934
+ // save a copy of the original settings
935
+ p.settings = $.extend( true, {}, $.tablesorterPager.defaults, settings );
936
+ if (c.debug) {
937
+ console.log('Pager: Initializing');
938
+ }
939
+ p.oldAjaxSuccess = p.oldAjaxSuccess || p.ajaxObject.success;
940
+ c.appender = $this.appender;
941
+ p.initializing = true;
942
+ if (p.savePages && ts.storage) {
943
+ t = ts.storage(table, p.storageKey) || {}; // fixes #387
944
+ p.page = isNaN(t.page) ? p.page : t.page;
945
+ p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
946
+ $.data(table, 'pagerLastSize', p.size);
947
+ pager.find(p.cssPageSize).val(p.size);
948
+ }
949
+ // skipped rows
950
+ p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')');
951
+ p.regexFiltered = new RegExp(wo.filter_filteredRow || 'filtered');
952
+
953
+ $t
954
+ // .unbind( namespace ) adding in jQuery 1.4.3 ( I think )
955
+ .unbind( pagerEvents.split(' ').join(namespace + ' ').replace(/\s+/g, ' ') )
956
+ .bind('filterInit filterStart '.split(' ').join(namespace + ' '), function(e, filters) {
957
+ p.currentFilters = $.isArray(filters) ? filters : c.$table.data('lastSearch');
958
+ // don't change page if filters are the same (pager updating, etc)
959
+ if (e.type === 'filterStart' && p.pageReset !== false && (c.lastCombinedFilter || '') !== (p.currentFilters || []).join('')) {
960
+ p.page = p.pageReset; // fixes #456 & #565
961
+ }
962
+ })
963
+ // update pager after filter widget completes
964
+ .bind('filterEnd sortEnd '.split(' ').join(namespace + ' '), function() {
965
+ p.currentFilters = c.$table.data('lastSearch');
966
+ if (p.initialized || p.initializing) {
967
+ if (c.delayInit && c.rowsCopy && c.rowsCopy.length === 0) {
968
+ // make sure we have a copy of all table rows once the cache has been built
969
+ updateCache(table);
970
+ }
971
+ updatePageDisplay(table, p, false);
972
+ moveToPage(table, p, false);
973
+ ts.applyWidget( table );
974
+ }
975
+ })
976
+ .bind('disablePager' + namespace, function(e){
977
+ e.stopPropagation();
978
+ showAllRows(table, p);
979
+ })
980
+ .bind('enablePager' + namespace, function(e){
981
+ e.stopPropagation();
982
+ enablePager(table, p, true);
983
+ })
984
+ .bind('destroyPager' + namespace, function(e){
985
+ e.stopPropagation();
986
+ destroyPager(table, p);
987
+ })
988
+ .bind('resetToLoadState' + namespace, function(e){
989
+ e.stopPropagation();
990
+ resetState(table, p);
991
+ })
992
+ .bind('updateComplete' + namespace, function(e, table, triggered){
993
+ e.stopPropagation();
994
+ // table can be unintentionally undefined in tablesorter v2.17.7 and earlier
995
+ // don't recalculate total rows/pages if using ajax
996
+ if ( !table || triggered || p.ajax ) { return; }
997
+ var $rows = c.$tbodies.eq(0).children('tr').not(c.selectorRemove);
998
+ p.totalRows = $rows.length - ( p.countChildRows ? 0 : $rows.filter('.' + c.cssChildRow).length );
999
+ p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
1000
+ if ($rows.length && c.rowsCopy && c.rowsCopy.length === 0) {
1001
+ // make a copy of all table rows once the cache has been built
1002
+ updateCache(table);
1003
+ }
1004
+ if ( p.page >= p.totalPages ) {
1005
+ moveToLastPage(table, p);
1006
+ }
1007
+ hideRows(table, p);
1008
+ changeHeight(table, p);
1009
+ updatePageDisplay(table, p, true);
1010
+ })
1011
+ .bind('pageSize refreshComplete '.split(' ').join(namespace + ' '), function(e, size){
1012
+ e.stopPropagation();
1013
+ setPageSize(table, parsePageSize( p, size, 'get' ), p);
1014
+ hideRows(table, p);
1015
+ updatePageDisplay(table, p, false);
1016
+ })
1017
+ .bind('pageSet pagerUpdate '.split(' ').join(namespace + ' '), function(e, num){
1018
+ e.stopPropagation();
1019
+ // force pager refresh
1020
+ if (e.type === 'pagerUpdate') {
1021
+ num = typeof num === 'undefined' ? p.page + 1 : num;
1022
+ p.last.page = true;
1023
+ }
1024
+ p.page = (parseInt(num, 10) || 1) - 1;
1025
+ moveToPage(table, p, true);
1026
+ updatePageDisplay(table, p, false);
1027
+ })
1028
+ .bind('pageAndSize' + namespace, function(e, page, size){
1029
+ e.stopPropagation();
1030
+ p.page = (parseInt(page, 10) || 1) - 1;
1031
+ setPageSize(table, parsePageSize( p, size, 'get' ), p);
1032
+ moveToPage(table, p, true);
1033
+ hideRows(table, p);
1034
+ updatePageDisplay(table, p, false);
1035
+ });
1036
+
1037
+ // clicked controls
1038
+ ctrls = [ p.cssFirst, p.cssPrev, p.cssNext, p.cssLast ];
1039
+ fxn = [ moveToFirstPage, moveToPrevPage, moveToNextPage, moveToLastPage ];
1040
+ if (c.debug && !pager.length) {
1041
+ console.warn('Pager: >> Container not found');
1042
+ }
1043
+ pager.find(ctrls.join(','))
1044
+ .attr('tabindex', 0)
1045
+ .unbind('click' + namespace)
1046
+ .bind('click' + namespace, function(e){
1047
+ e.stopPropagation();
1048
+ var i, $t = $(this), l = ctrls.length;
1049
+ if ( !$t.hasClass(p.cssDisabled) ) {
1050
+ for (i = 0; i < l; i++) {
1051
+ if ($t.is(ctrls[i])) {
1052
+ fxn[i](table, p);
1053
+ break;
1054
+ }
1055
+ }
1056
+ }
1057
+ });
1058
+
1059
+ // goto selector
1060
+ p.$goto = pager.find(p.cssGoto);
1061
+ if ( p.$goto.length ) {
1062
+ p.$goto
1063
+ .unbind('change' + namespace)
1064
+ .bind('change' + namespace, function(){
1065
+ p.page = $(this).val() - 1;
1066
+ moveToPage(table, p, true);
1067
+ updatePageDisplay(table, p, false);
1068
+ });
1069
+ } else if (c.debug) {
1070
+ console.warn('Pager: >> Goto selector not found');
1071
+ }
1072
+ // page size selector
1073
+ p.$size = pager.find(p.cssPageSize);
1074
+ if ( p.$size.length ) {
1075
+ // setting an option as selected appears to cause issues with initial page size
1076
+ p.$size.find('option').removeAttr('selected');
1077
+ p.$size.unbind('change' + namespace).bind('change' + namespace, function() {
1078
+ if ( !$(this).hasClass(p.cssDisabled) ) {
1079
+ var size = $(this).val();
1080
+ p.$size.val( size ); // in case there are more than one pagers
1081
+ setPageSize(table, size, p);
1082
+ changeHeight(table, p);
1083
+ }
1084
+ return false;
1085
+ });
1086
+ } else if (c.debug) {
1087
+ console.warn('Pager: >> Size selector not found');
1088
+ }
1089
+
1090
+ // clear initialized flag
1091
+ p.initialized = false;
1092
+ // before initialization event
1093
+ $t.triggerHandler('pagerBeforeInitialized', p);
1094
+
1095
+ enablePager(table, p, false);
1096
+ if ( typeof p.ajaxUrl === 'string' ) {
1097
+ // ajax pager; interact with database
1098
+ p.ajax = true;
1099
+ // When filtering with ajax, allow only custom filtering function, disable default
1100
+ // filtering since it will be done server side.
1101
+ c.widgetOptions.filter_serversideFiltering = true;
1102
+ c.serverSideSorting = true;
1103
+ moveToPage(table, p);
1104
+ } else {
1105
+ p.ajax = false;
1106
+ // Regular pager; all rows stored in memory
1107
+ ts.appendCache( c, true ); // true = don't apply widgets
1108
+ hideRowsSetup(table, p);
1109
+ }
1110
+
1111
+ // pager initialized
1112
+ if (!p.ajax && !p.initialized) {
1113
+ p.initializing = false;
1114
+ p.initialized = true;
1115
+ moveToPage(table, p);
1116
+ if (c.debug) {
1117
+ console.log('Pager: Triggering pagerInitialized');
1118
+ }
1119
+ c.$table.triggerHandler( 'pagerInitialized', p );
1120
+ if ( !( c.widgetOptions.filter_initialized && ts.hasWidget(table, 'filter') ) ) {
1121
+ updatePageDisplay(table, p, false);
1122
+ }
1123
+ }
1124
+
1125
+ // make the hasWidget function think that the pager widget is being used
1126
+ c.widgetInit.pager = true;
907
1127
  };
908
1128
 
909
1129
  $this.appender = function(table, rows) {
@@ -924,204 +1144,7 @@
924
1144
  return this.each(function() {
925
1145
  // check if tablesorter has initialized
926
1146
  if (!(this.config && this.hasInitialized)) { return; }
927
- var t, ctrls, fxn, size,
928
- table = this,
929
- c = table.config,
930
- wo = c.widgetOptions,
931
- p = c.pager = $.extend( true, {}, $.tablesorterPager.defaults, settings ),
932
- $t = c.$table,
933
- namespace = c.namespace + 'pager',
934
- // added in case the pager is reinitialized after being destroyed.
935
- pager = p.$container = $(p.container).addClass('tablesorter-pager').show();
936
- // save a copy of the original settings
937
- p.settings = $.extend( true, {}, $.tablesorterPager.defaults, settings );
938
- if (c.debug) {
939
- console.log('Pager: Initializing');
940
- }
941
- p.oldAjaxSuccess = p.oldAjaxSuccess || p.ajaxObject.success;
942
- c.appender = $this.appender;
943
- p.initializing = true;
944
- if (p.savePages && ts.storage) {
945
- t = ts.storage(table, p.storageKey) || {}; // fixes #387
946
- p.page = isNaN(t.page) ? p.page : t.page;
947
- p.size = t.size === 'all' ? t.size : ( isNaN( t.size ) ? p.size : t.size ) || p.setSize || 10;
948
- $.data(table, 'pagerLastSize', p.size);
949
- pager.find(p.cssPageSize).val(p.size);
950
- }
951
- // skipped rows
952
- p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')');
953
- p.regexFiltered = new RegExp(wo.filter_filteredRow || 'filtered');
954
-
955
- $t
956
- // .unbind( namespace ) adding in jQuery 1.4.3 ( I think )
957
- .unbind( pagerEvents.split(' ').join(namespace + ' ').replace(/\s+/g, ' ') )
958
- .bind('filterInit filterStart '.split(' ').join(namespace + ' '), function(e, filters) {
959
- p.currentFilters = $.isArray(filters) ? filters : c.$table.data('lastSearch');
960
- // don't change page if filters are the same (pager updating, etc)
961
- if (e.type === 'filterStart' && p.pageReset !== false && (c.lastCombinedFilter || '') !== (p.currentFilters || []).join('')) {
962
- p.page = p.pageReset; // fixes #456 & #565
963
- }
964
- })
965
- // update pager after filter widget completes
966
- .bind('filterEnd sortEnd '.split(' ').join(namespace + ' '), function() {
967
- p.currentFilters = c.$table.data('lastSearch');
968
- if (p.initialized || p.initializing) {
969
- if (c.delayInit && c.rowsCopy && c.rowsCopy.length === 0) {
970
- // make sure we have a copy of all table rows once the cache has been built
971
- updateCache(table);
972
- }
973
- updatePageDisplay(table, p, false);
974
- moveToPage(table, p, false);
975
- ts.applyWidget( table );
976
- }
977
- })
978
- .bind('disablePager' + namespace, function(e){
979
- e.stopPropagation();
980
- showAllRows(table, p);
981
- })
982
- .bind('enablePager' + namespace, function(e){
983
- e.stopPropagation();
984
- enablePager(table, p, true);
985
- })
986
- .bind('destroyPager' + namespace, function(e){
987
- e.stopPropagation();
988
- destroyPager(table, p);
989
- })
990
- .bind('updateComplete' + namespace, function(e, table, triggered){
991
- e.stopPropagation();
992
- // table can be unintentionally undefined in tablesorter v2.17.7 and earlier
993
- // don't recalculate total rows/pages if using ajax
994
- if ( !table || triggered || p.ajax ) { return; }
995
- var $rows = c.$tbodies.eq(0).children('tr').not(c.selectorRemove);
996
- p.totalRows = $rows.length - ( p.countChildRows ? 0 : $rows.filter('.' + c.cssChildRow).length );
997
- p.totalPages = p.size === 'all' ? 1 : Math.ceil( p.totalRows / p.size );
998
- if ($rows.length && c.rowsCopy && c.rowsCopy.length === 0) {
999
- // make a copy of all table rows once the cache has been built
1000
- updateCache(table);
1001
- }
1002
- if ( p.page >= p.totalPages ) {
1003
- moveToLastPage(table, p);
1004
- }
1005
- hideRows(table, p);
1006
- changeHeight(table, p);
1007
- updatePageDisplay(table, p, true);
1008
- })
1009
- .bind('pageSize refreshComplete '.split(' ').join(namespace + ' '), function(e, size){
1010
- e.stopPropagation();
1011
- setPageSize(table, parsePageSize( p, size, 'get' ), p);
1012
- hideRows(table, p);
1013
- updatePageDisplay(table, p, false);
1014
- })
1015
- .bind('pageSet pagerUpdate '.split(' ').join(namespace + ' '), function(e, num){
1016
- e.stopPropagation();
1017
- // force pager refresh
1018
- if (e.type === 'pagerUpdate') {
1019
- num = typeof num === 'undefined' ? p.page + 1 : num;
1020
- p.last.page = true;
1021
- }
1022
- p.page = (parseInt(num, 10) || 1) - 1;
1023
- moveToPage(table, p, true);
1024
- updatePageDisplay(table, p, false);
1025
- })
1026
- .bind('pageAndSize' + namespace, function(e, page, size){
1027
- e.stopPropagation();
1028
- p.page = (parseInt(page, 10) || 1) - 1;
1029
- setPageSize(table, parsePageSize( p, size, 'get' ), p);
1030
- moveToPage(table, p, true);
1031
- hideRows(table, p);
1032
- updatePageDisplay(table, p, false);
1033
- });
1034
-
1035
- // clicked controls
1036
- ctrls = [ p.cssFirst, p.cssPrev, p.cssNext, p.cssLast ];
1037
- fxn = [ moveToFirstPage, moveToPrevPage, moveToNextPage, moveToLastPage ];
1038
- if (c.debug && !pager.length) {
1039
- console.warn('Pager: >> Container not found');
1040
- }
1041
- pager.find(ctrls.join(','))
1042
- .attr('tabindex', 0)
1043
- .unbind('click' + namespace)
1044
- .bind('click' + namespace, function(e){
1045
- e.stopPropagation();
1046
- var i, $t = $(this), l = ctrls.length;
1047
- if ( !$t.hasClass(p.cssDisabled) ) {
1048
- for (i = 0; i < l; i++) {
1049
- if ($t.is(ctrls[i])) {
1050
- fxn[i](table, p);
1051
- break;
1052
- }
1053
- }
1054
- }
1055
- });
1056
-
1057
- // goto selector
1058
- p.$goto = pager.find(p.cssGoto);
1059
- if ( p.$goto.length ) {
1060
- p.$goto
1061
- .unbind('change' + namespace)
1062
- .bind('change' + namespace, function(){
1063
- p.page = $(this).val() - 1;
1064
- moveToPage(table, p, true);
1065
- updatePageDisplay(table, p, false);
1066
- });
1067
- } else if (c.debug) {
1068
- console.warn('Pager: >> Goto selector not found');
1069
- }
1070
- // page size selector
1071
- p.$size = pager.find(p.cssPageSize);
1072
- if ( p.$size.length ) {
1073
- // setting an option as selected appears to cause issues with initial page size
1074
- p.$size.find('option').removeAttr('selected');
1075
- p.$size.unbind('change' + namespace).bind('change' + namespace, function() {
1076
- if ( !$(this).hasClass(p.cssDisabled) ) {
1077
- var size = $(this).val();
1078
- p.$size.val( size ); // in case there are more than one pagers
1079
- setPageSize(table, size, p);
1080
- changeHeight(table, p);
1081
- }
1082
- return false;
1083
- });
1084
- } else if (c.debug) {
1085
- console.warn('Pager: >> Size selector not found');
1086
- }
1087
-
1088
- // clear initialized flag
1089
- p.initialized = false;
1090
- // before initialization event
1091
- $t.triggerHandler('pagerBeforeInitialized', p);
1092
-
1093
- enablePager(table, p, false);
1094
- if ( typeof p.ajaxUrl === 'string' ) {
1095
- // ajax pager; interact with database
1096
- p.ajax = true;
1097
- // When filtering with ajax, allow only custom filtering function, disable default
1098
- // filtering since it will be done server side.
1099
- c.widgetOptions.filter_serversideFiltering = true;
1100
- c.serverSideSorting = true;
1101
- moveToPage(table, p);
1102
- } else {
1103
- p.ajax = false;
1104
- // Regular pager; all rows stored in memory
1105
- ts.appendCache( c, true ); // true = don't apply widgets
1106
- hideRowsSetup(table, p);
1107
- }
1108
-
1109
- // pager initialized
1110
- if (!p.ajax && !p.initialized) {
1111
- p.initializing = false;
1112
- p.initialized = true;
1113
- moveToPage(table, p);
1114
- if (c.debug) {
1115
- console.log('Pager: Triggering pagerInitialized');
1116
- }
1117
- c.$table.triggerHandler( 'pagerInitialized', p );
1118
- if ( !( c.widgetOptions.filter_initialized && ts.hasWidget(table, 'filter') ) ) {
1119
- updatePageDisplay(table, p, false);
1120
- }
1121
- }
1122
-
1123
- // make the hasWidget function think that the pager widget is being used
1124
- c.widgetInit.pager = true;
1147
+ init(this, settings);
1125
1148
  });
1126
1149
  };
1127
1150
 
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) - updated 09-28-2016 (v2.27.8)*/
7
+ /*! tablesorter (FORK) - updated 11-26-2016 (v2.28.0)*/
8
8
  /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
9
9
  (function(factory) {
10
10
  if (typeof define === 'function' && define.amd) {
@@ -16,7 +16,7 @@
16
16
  }
17
17
  }(function(jQuery) {
18
18
 
19
- /*! TableSorter (FORK) v2.27.8 *//*
19
+ /*! TableSorter (FORK) v2.28.0 *//*
20
20
  * Client-side table sorting with ease!
21
21
  * @requires jQuery v1.2.6+
22
22
  *
@@ -40,7 +40,7 @@
40
40
  'use strict';
41
41
  var ts = $.tablesorter = {
42
42
 
43
- version : '2.27.8',
43
+ version : '2.28.0',
44
44
 
45
45
  parsers : [],
46
46
  widgets : [],
@@ -134,7 +134,11 @@
134
134
  headerList: [],
135
135
  empties: {},
136
136
  strings: {},
137
- parsers: []
137
+ parsers: [],
138
+
139
+ // *** parser options for validator; values must be falsy!
140
+ globalize: 0,
141
+ imgAttr: 0
138
142
 
139
143
  // removed: widgetZebra: { css: ['even', 'odd'] }
140
144
 
@@ -308,6 +312,7 @@
308
312
  ts.setupParsers( c );
309
313
  // start total row count at zero
310
314
  c.totalRows = 0;
315
+ ts.validateOptions( c );
311
316
  // build the cache for the tbody cells
312
317
  // delayInit will delay building the cache until the user starts a sort
313
318
  if ( !c.delayInit ) { ts.buildCache( c ); }
@@ -441,9 +446,11 @@
441
446
  e.stopPropagation();
442
447
  // remove all widgets
443
448
  ts.removeWidget( this, true, false );
449
+ var tmp = $.extend( true, {}, c.originalSettings );
444
450
  // restore original settings; this clears out current settings, but does not clear
445
451
  // values saved to storage.
446
- c = $.extend( true, ts.defaults, c.originalSettings );
452
+ c = $.extend( true, ts.defaults, tmp );
453
+ c.originalSettings = tmp;
447
454
  this.hasInitialized = false;
448
455
  // setup the entire table again
449
456
  ts.setup( this, c );
@@ -1086,6 +1093,7 @@
1086
1093
  .removeClass( css.join( ' ' ) );
1087
1094
  // remove all header information
1088
1095
  c.$headers
1096
+ .add( $( 'thead ' + c.namespace + '_extra_headers' ) )
1089
1097
  .removeClass( css.join( ' ' ) )
1090
1098
  .addClass( none )
1091
1099
  .attr( 'aria-sort', 'none' )
@@ -1928,6 +1936,8 @@
1928
1936
  widget = ts.getWidgetById( c.widgets[ indx ] );
1929
1937
  if ( widget && widget.options ) {
1930
1938
  c.widgetOptions = $.extend( true, {}, widget.options, c.widgetOptions );
1939
+ // add widgetOptions to defaults for option validator
1940
+ $.extend( true, ts.defaults.widgetOptions, widget.options );
1931
1941
  }
1932
1942
  }
1933
1943
  }
@@ -2300,7 +2310,9 @@
2300
2310
  },
2301
2311
 
2302
2312
  getColumnData : function( table, obj, indx, getCell, $headers ) {
2303
- if ( typeof obj === 'undefined' || obj === null ) { return; }
2313
+ if ( typeof obj !== 'object' || obj === null ) {
2314
+ return obj;
2315
+ }
2304
2316
  table = $( table )[ 0 ];
2305
2317
  var $header, key,
2306
2318
  c = table.config,
@@ -2411,6 +2423,34 @@
2411
2423
  return str;
2412
2424
  },
2413
2425
 
2426
+ validateOptions : function( c ) {
2427
+ var setting, setting2, typ, timer,
2428
+ // ignore options containing an array
2429
+ ignore = 'sortForce sortList sortAppend widgets'.split( ' ' ),
2430
+ orig = c.originalSettings;
2431
+ if ( orig ) {
2432
+ if ( c.debug ) {
2433
+ timer = new Date();
2434
+ }
2435
+ for ( setting in orig ) {
2436
+ typ = typeof ts.defaults[setting];
2437
+ if ( typ === 'undefined' ) {
2438
+ console.warn( 'Tablesorter Warning! "table.config.' + setting + '" option not recognized' );
2439
+ } else if ( typ === 'object' ) {
2440
+ for ( setting2 in orig[setting] ) {
2441
+ typ = typeof ts.defaults[setting][setting2];
2442
+ if ( $.inArray( setting, ignore ) < 0 && typ === 'undefined' ) {
2443
+ console.warn( 'Tablesorter Warning! "table.config.' + setting + '.' + setting2 + '" option not recognized' );
2444
+ }
2445
+ }
2446
+ }
2447
+ }
2448
+ if ( c.debug ) {
2449
+ console.log( 'validate options time:' + ts.benchmark( timer ) );
2450
+ }
2451
+ }
2452
+ },
2453
+
2414
2454
  // restore headers
2415
2455
  restoreHeaders : function( table ) {
2416
2456
  var index, $cell,
@@ -2771,7 +2811,7 @@
2771
2811
 
2772
2812
  })( jQuery );
2773
2813
 
2774
- /*! Widget: storage - updated 3/1/2016 (v2.25.5) */
2814
+ /*! Widget: storage - updated 11/26/2016 (v2.28.0) */
2775
2815
  /*global JSON:false */
2776
2816
  ;(function ($, window, document) {
2777
2817
  'use strict';
@@ -2816,6 +2856,17 @@
2816
2856
  url = options && options.url ||
2817
2857
  $table.attr(options && options.page || wo && wo.storage_page || 'data-table-page') ||
2818
2858
  wo && wo.storage_fixedUrl || c && c.fixedUrl || window.location.pathname;
2859
+ // update defaults for validator; these values must be falsy!
2860
+ $.extend(true, ts.defaults, {
2861
+ fixedUrl: '',
2862
+ widgetOptions: {
2863
+ storage_fixedUrl: '',
2864
+ storage_group: '',
2865
+ storage_page: '',
2866
+ storage_tableId: '',
2867
+ storage_useSessionStorage: ''
2868
+ }
2869
+ });
2819
2870
  // https://gist.github.com/paulirish/5558557
2820
2871
  if (storageType in window) {
2821
2872
  try {
@@ -3137,7 +3188,7 @@
3137
3188
 
3138
3189
  })(jQuery);
3139
3190
 
3140
- /*! Widget: filter - updated 9/23/2016 (v2.27.7) *//*
3191
+ /*! Widget: filter - updated 11/26/2016 (v2.28.0) *//*
3141
3192
  * Requires tablesorter v2.8+ and jQuery 1.7+
3142
3193
  * by Rob Garrison
3143
3194
  */
@@ -3966,11 +4017,15 @@
3966
4017
  // include change for select - fixes #473
3967
4018
  .bind( 'search change keypress input '.split( ' ' ).join( namespace + ' ' ), function( event ) {
3968
4019
  // don't get cached data, in case data-column changes dynamically
3969
- var column = parseInt( $( this ).attr( 'data-column' ), 10 );
4020
+ var column = parseInt( $( this ).attr( 'data-column' ), 10 ),
4021
+ liveSearch = typeof wo.filter_liveSearch === 'boolean' ?
4022
+ wo.filter_liveSearch :
4023
+ ts.getColumnData( table, wo.filter_liveSearch, column );
3970
4024
  // don't allow 'change' event to process if the input value is the same - fixes #685
3971
4025
  if ( table.config.widgetOptions.filter_initialized &&
3972
4026
  ( event.which === tskeyCodes.enter || event.type === 'search' ||
3973
- ( event.type === 'change' || event.type === 'input' ) &&
4027
+ ( event.type === 'change' ||
4028
+ ( event.type === 'input' && liveSearch === true ) ) &&
3974
4029
  this.value !== c.lastSearch[column] )
3975
4030
  ) {
3976
4031
  event.preventDefault();
@@ -1,4 +1,4 @@
1
- /*! TableSorter (FORK) v2.27.8 *//*
1
+ /*! TableSorter (FORK) v2.28.0 *//*
2
2
  * Client-side table sorting with ease!
3
3
  * @requires jQuery v1.2.6+
4
4
  *
@@ -22,7 +22,7 @@
22
22
  'use strict';
23
23
  var ts = $.tablesorter = {
24
24
 
25
- version : '2.27.8',
25
+ version : '2.28.0',
26
26
 
27
27
  parsers : [],
28
28
  widgets : [],
@@ -116,7 +116,11 @@
116
116
  headerList: [],
117
117
  empties: {},
118
118
  strings: {},
119
- parsers: []
119
+ parsers: [],
120
+
121
+ // *** parser options for validator; values must be falsy!
122
+ globalize: 0,
123
+ imgAttr: 0
120
124
 
121
125
  // removed: widgetZebra: { css: ['even', 'odd'] }
122
126
 
@@ -290,6 +294,7 @@
290
294
  ts.setupParsers( c );
291
295
  // start total row count at zero
292
296
  c.totalRows = 0;
297
+ ts.validateOptions( c );
293
298
  // build the cache for the tbody cells
294
299
  // delayInit will delay building the cache until the user starts a sort
295
300
  if ( !c.delayInit ) { ts.buildCache( c ); }
@@ -423,9 +428,11 @@
423
428
  e.stopPropagation();
424
429
  // remove all widgets
425
430
  ts.removeWidget( this, true, false );
431
+ var tmp = $.extend( true, {}, c.originalSettings );
426
432
  // restore original settings; this clears out current settings, but does not clear
427
433
  // values saved to storage.
428
- c = $.extend( true, ts.defaults, c.originalSettings );
434
+ c = $.extend( true, ts.defaults, tmp );
435
+ c.originalSettings = tmp;
429
436
  this.hasInitialized = false;
430
437
  // setup the entire table again
431
438
  ts.setup( this, c );
@@ -1068,6 +1075,7 @@
1068
1075
  .removeClass( css.join( ' ' ) );
1069
1076
  // remove all header information
1070
1077
  c.$headers
1078
+ .add( $( 'thead ' + c.namespace + '_extra_headers' ) )
1071
1079
  .removeClass( css.join( ' ' ) )
1072
1080
  .addClass( none )
1073
1081
  .attr( 'aria-sort', 'none' )
@@ -1910,6 +1918,8 @@
1910
1918
  widget = ts.getWidgetById( c.widgets[ indx ] );
1911
1919
  if ( widget && widget.options ) {
1912
1920
  c.widgetOptions = $.extend( true, {}, widget.options, c.widgetOptions );
1921
+ // add widgetOptions to defaults for option validator
1922
+ $.extend( true, ts.defaults.widgetOptions, widget.options );
1913
1923
  }
1914
1924
  }
1915
1925
  }
@@ -2282,7 +2292,9 @@
2282
2292
  },
2283
2293
 
2284
2294
  getColumnData : function( table, obj, indx, getCell, $headers ) {
2285
- if ( typeof obj === 'undefined' || obj === null ) { return; }
2295
+ if ( typeof obj !== 'object' || obj === null ) {
2296
+ return obj;
2297
+ }
2286
2298
  table = $( table )[ 0 ];
2287
2299
  var $header, key,
2288
2300
  c = table.config,
@@ -2393,6 +2405,34 @@
2393
2405
  return str;
2394
2406
  },
2395
2407
 
2408
+ validateOptions : function( c ) {
2409
+ var setting, setting2, typ, timer,
2410
+ // ignore options containing an array
2411
+ ignore = 'headers sortForce sortList sortAppend widgets'.split( ' ' ),
2412
+ orig = c.originalSettings;
2413
+ if ( orig ) {
2414
+ if ( c.debug ) {
2415
+ timer = new Date();
2416
+ }
2417
+ for ( setting in orig ) {
2418
+ typ = typeof ts.defaults[setting];
2419
+ if ( typ === 'undefined' ) {
2420
+ console.warn( 'Tablesorter Warning! "table.config.' + setting + '" option not recognized' );
2421
+ } else if ( typ === 'object' ) {
2422
+ for ( setting2 in orig[setting] ) {
2423
+ typ = ts.defaults[setting] && typeof ts.defaults[setting][setting2];
2424
+ if ( $.inArray( setting, ignore ) < 0 && typ === 'undefined' ) {
2425
+ console.warn( 'Tablesorter Warning! "table.config.' + setting + '.' + setting2 + '" option not recognized' );
2426
+ }
2427
+ }
2428
+ }
2429
+ }
2430
+ if ( c.debug ) {
2431
+ console.log( 'validate options time:' + ts.benchmark( timer ) );
2432
+ }
2433
+ }
2434
+ },
2435
+
2396
2436
  // restore headers
2397
2437
  restoreHeaders : function( table ) {
2398
2438
  var index, $cell,
@@ -4,7 +4,7 @@
4
4
  ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██▀▀ ▀▀▀██
5
5
  █████▀ ▀████▀ ██ ██ ▀████▀ ██ ██ ██ ██ ▀████▀ █████▀ ██ ██ █████▀
6
6
  */
7
- /*! tablesorter (FORK) - updated 09-28-2016 (v2.27.8)*/
7
+ /*! tablesorter (FORK) - updated 11-26-2016 (v2.28.0)*/
8
8
  /* Includes widgets ( storage,uitheme,columns,filter,stickyHeaders,resizable,saveSort ) */
9
9
  (function(factory) {
10
10
  if (typeof define === 'function' && define.amd) {
@@ -16,7 +16,7 @@
16
16
  }
17
17
  }(function(jQuery) {
18
18
 
19
- /*! Widget: storage - updated 3/1/2016 (v2.25.5) */
19
+ /*! Widget: storage - updated 11/26/2016 (v2.28.0) */
20
20
  /*global JSON:false */
21
21
  ;(function ($, window, document) {
22
22
  'use strict';
@@ -61,6 +61,17 @@
61
61
  url = options && options.url ||
62
62
  $table.attr(options && options.page || wo && wo.storage_page || 'data-table-page') ||
63
63
  wo && wo.storage_fixedUrl || c && c.fixedUrl || window.location.pathname;
64
+ // update defaults for validator; these values must be falsy!
65
+ $.extend(true, ts.defaults, {
66
+ fixedUrl: '',
67
+ widgetOptions: {
68
+ storage_fixedUrl: '',
69
+ storage_group: '',
70
+ storage_page: '',
71
+ storage_tableId: '',
72
+ storage_useSessionStorage: ''
73
+ }
74
+ });
64
75
  // https://gist.github.com/paulirish/5558557
65
76
  if (storageType in window) {
66
77
  try {
@@ -382,7 +393,7 @@
382
393
 
383
394
  })(jQuery);
384
395
 
385
- /*! Widget: filter - updated 9/23/2016 (v2.27.7) *//*
396
+ /*! Widget: filter - updated 11/26/2016 (v2.28.0) *//*
386
397
  * Requires tablesorter v2.8+ and jQuery 1.7+
387
398
  * by Rob Garrison
388
399
  */
@@ -1211,11 +1222,15 @@
1211
1222
  // include change for select - fixes #473
1212
1223
  .bind( 'search change keypress input '.split( ' ' ).join( namespace + ' ' ), function( event ) {
1213
1224
  // don't get cached data, in case data-column changes dynamically
1214
- var column = parseInt( $( this ).attr( 'data-column' ), 10 );
1225
+ var column = parseInt( $( this ).attr( 'data-column' ), 10 ),
1226
+ liveSearch = typeof wo.filter_liveSearch === 'boolean' ?
1227
+ wo.filter_liveSearch :
1228
+ ts.getColumnData( table, wo.filter_liveSearch, column );
1215
1229
  // don't allow 'change' event to process if the input value is the same - fixes #685
1216
1230
  if ( table.config.widgetOptions.filter_initialized &&
1217
1231
  ( event.which === tskeyCodes.enter || event.type === 'search' ||
1218
- ( event.type === 'change' || event.type === 'input' ) &&
1232
+ ( event.type === 'change' ||
1233
+ ( event.type === 'input' && liveSearch === true ) ) &&
1219
1234
  this.value !== c.lastSearch[column] )
1220
1235
  ) {
1221
1236
  event.preventDefault();
@@ -1,4 +1,4 @@
1
- /*! Parser: two digit year - updated 11/22/2015 (v2.24.6) */
1
+ /*! Parser: two digit year - updated 11/26/2016 (v2.28.0) */
2
2
  /* Demo: http://mottie.github.io/tablesorter/docs/example-parsers-dates.html */
3
3
  /*jshint jquery:true */
4
4
  ;(function($){
@@ -13,6 +13,9 @@
13
13
  ts = $.tablesorter,
14
14
  now = new Date().getFullYear();
15
15
 
16
+ // add dateRange to defaults for validator; value must be falsy
17
+ ts.defaults.dataRange = '';
18
+
16
19
  if ( !ts.dates ) { ts.dates = {}; }
17
20
  ts.dates.regxxxxyy = /(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{2})/;
18
21
  ts.dates.regyyxxxx = /(\d{2})[\/\s](\d{1,2})[\/\s](\d{1,2})/;
@@ -1,4 +1,4 @@
1
- /*! Parser: input & select - updated 9/1/2016 (v2.27.6) *//*
1
+ /*! Parser: input & select - updated 11/26/2016 (v2.28.0) *//*
2
2
  * for jQuery 1.7+ & tablesorter 2.7.11+
3
3
  * Demo: http://mottie.github.com/tablesorter/docs/example-widget-grouping.html
4
4
  */
@@ -110,6 +110,10 @@
110
110
  type : 'text'
111
111
  });
112
112
 
113
+ // update defaults for validator; values must be falsy
114
+ $.tablesorter.defaults.checkboxClass = '';
115
+ $.tablesorter.defaults.checkboxVisible = '';
116
+
113
117
  // update select and all input types in the tablesorter cache when the change event fires.
114
118
  // This method only works with jQuery 1.7+
115
119
  // you can change it to use delegate (v1.4.3+) or live (v1.3+) as desired
@@ -1,4 +1,4 @@
1
- /*! Widget: Build Table - updated 3/26/2015 (v2.21.3) *//*
1
+ /*! Widget: Build Table - updated 11/26/2016 (v2.28.0) *//*
2
2
  * for tableSorter v2.16.0+
3
3
  * by Rob Garrison
4
4
  */
@@ -79,6 +79,9 @@
79
79
  }
80
80
  };
81
81
 
82
+ // add data to defaults for validator; value must be falsy!
83
+ ts.defaults.data = '';
84
+
82
85
  bt.defaults = {
83
86
  // *** build widget core ***
84
87
  build_type : '', // array, csv, object, json, html
@@ -1,4 +1,4 @@
1
- /*! Widget: filter - updated 9/23/2016 (v2.27.7) *//*
1
+ /*! Widget: filter - updated 11/26/2016 (v2.28.0) *//*
2
2
  * Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -827,11 +827,15 @@
827
827
  // include change for select - fixes #473
828
828
  .bind( 'search change keypress input '.split( ' ' ).join( namespace + ' ' ), function( event ) {
829
829
  // don't get cached data, in case data-column changes dynamically
830
- var column = parseInt( $( this ).attr( 'data-column' ), 10 );
830
+ var column = parseInt( $( this ).attr( 'data-column' ), 10 ),
831
+ liveSearch = typeof wo.filter_liveSearch === 'boolean' ?
832
+ wo.filter_liveSearch :
833
+ ts.getColumnData( table, wo.filter_liveSearch, column );
831
834
  // don't allow 'change' event to process if the input value is the same - fixes #685
832
835
  if ( table.config.widgetOptions.filter_initialized &&
833
836
  ( event.which === tskeyCodes.enter || event.type === 'search' ||
834
- ( event.type === 'change' || event.type === 'input' ) &&
837
+ ( event.type === 'change' ||
838
+ ( event.type === 'input' && liveSearch === true ) ) &&
835
839
  this.value !== c.lastSearch[column] )
836
840
  ) {
837
841
  event.preventDefault();
@@ -1,4 +1,4 @@
1
- /*! Widget: grouping - updated 9/1/2016 (v2.27.6) *//*
1
+ /*! Widget: grouping - updated 11/26/2016 (v2.28.0) *//*
2
2
  * Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -234,7 +234,8 @@
234
234
  if ( $.isFunction( wo.group_formatter ) ) {
235
235
  data.currentGroup = wo.group_formatter( ( data.group || '' ).toString(), data.column, c.table, c, wo, data ) || data.group;
236
236
  }
237
- data.$row.before( tsg.groupHeaderHTML( c, wo, data ) );
237
+ // add first() for grouping with childRows
238
+ data.$row.first().before( tsg.groupHeaderHTML( c, wo, data ) );
238
239
  if ( wo.group_saveGroups && !data.savedGroup && wo.group_collapsed && wo.group_collapsible ) {
239
240
  // all groups start collapsed; data.groupIndex is 1 more than the expected index.
240
241
  wo.group_collapsedGroups[ wo.group_collapsedGroup ].push( data.currentGroup + data.groupIndex );
@@ -1,4 +1,4 @@
1
- /*! Widget: math - updated 7/31/2016 (v2.27.0) *//*
1
+ /*! Widget: math - updated 11/26/2016 (v2.28.0) *//*
2
2
  * Requires tablesorter v2.16+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -29,7 +29,15 @@
29
29
  .split(' ').join('.tsmath '),
30
30
 
31
31
  processText : function( c, $cell ) {
32
- var txt = ts.getElementText( c, $cell, math.getCellIndex( $cell ) );
32
+ var tmp,
33
+ txt = ts.getElementText( c, $cell, math.getCellIndex( $cell ) ),
34
+ prefix = c.widgetOptions.math_prefix;
35
+ if ( /</.test( prefix ) ) {
36
+ // prefix contains HTML; remove it & any text before using formatFloat
37
+ tmp = $( '<div>' + prefix + '</div>' ).text()
38
+ .replace(/\{content\}/g, '').trim();
39
+ txt = txt.replace( tmp, '' );
40
+ }
33
41
  txt = ts.formatFloat( txt.replace( /[^\w,. \-()]/g, '' ), c.table ) || 0;
34
42
  // isNaN('') => false
35
43
  return isNaN( txt ) ? 0 : txt;
@@ -352,7 +360,7 @@
352
360
  prev = $cell.html(),
353
361
  mask = $cell.attr( 'data-' + wo.math_data + '-mask' ) || wo.math_mask,
354
362
  target = $cell.attr( 'data-' + wo.math_data + '-target' ) || '',
355
- result = ts.formatMask( mask, value, wo.math_wrapPrefix, wo.math_wrapSuffix );
363
+ result = ts.formatMask( mask, value, wo.math_prefix, wo.math_suffix );
356
364
  if (target) {
357
365
  $el = $cell.find(target);
358
366
  if ($el.length) {
@@ -403,8 +411,7 @@
403
411
  start = mask.search( /[0-9\-\+#]/ ),
404
412
  tmp = start > 0 ? mask.substring( 0, start ) : '',
405
413
  prefix = tmp;
406
-
407
- if ( start > 0 && tmpPrefix ) {
414
+ if ( tmpPrefix ) {
408
415
  if ( /\{content\}/.test( tmpPrefix || '' ) ) {
409
416
  prefix = ( tmpPrefix || '' ).replace( /\{content\}/g, tmp || '' );
410
417
  } else {
@@ -418,7 +425,7 @@
418
425
  index += ( mask.substring( index, index + 1 ) === '.' ) ? 1 : 0;
419
426
  tmp = end > 0 ? mask.substring( index, len ) : '';
420
427
  suffix = tmp;
421
- if ( tmp !== '' && tmpSuffix ) {
428
+ if ( tmpSuffix ) {
422
429
  if ( /\{content\}/.test( tmpSuffix || '' ) ) {
423
430
  suffix = ( tmpSuffix || '' ).replace( /\{content\}/g, tmp || '' );
424
431
  } else {
@@ -1,4 +1,4 @@
1
- /*! Widget: Pager - updated 9/23/2016 (v2.27.7) */
1
+ /*! Widget: Pager - updated 11/26/2016 (v2.28.0) */
2
2
  /* Requires tablesorter v2.8+ and jQuery 1.7+
3
3
  * by Rob Garrison
4
4
  */
@@ -404,11 +404,11 @@
404
404
  p.$container
405
405
  .find( s.first + ',' + s.prev )
406
406
  .toggleClass( wo.pager_css.disabled, first )
407
- .attr( 'aria-disabled', first );
407
+ .prop( 'aria-disabled', first );
408
408
  p.$container
409
409
  .find( s.next + ',' + s.last )
410
410
  .toggleClass( wo.pager_css.disabled, last )
411
- .attr( 'aria-disabled', last );
411
+ .prop( 'aria-disabled', last );
412
412
  }
413
413
  },
414
414
 
@@ -451,7 +451,7 @@
451
451
  .add( p.$goto )
452
452
  .removeClass( wo.pager_css.disabled )
453
453
  .removeAttr( 'disabled' )
454
- .attr( 'aria-disabled', 'false' );
454
+ .prop( 'aria-disabled', 'false' );
455
455
  p.totalPages = Math.ceil( p.totalRows / sz ); // needed for 'pageSize' method
456
456
  c.totalRows = p.totalRows;
457
457
  tsp.parsePageNumber( c, p );
@@ -1012,7 +1012,7 @@
1012
1012
  len = $controls.length;
1013
1013
  for ( index = 0; index < len; index++ ) {
1014
1014
  $controls.eq( index )
1015
- .attr( 'aria-disabled', 'true' )
1015
+ .prop( 'aria-disabled', 'true' )
1016
1016
  .addClass( wo.pager_css.disabled )[ 0 ].disabled = true;
1017
1017
  }
1018
1018
  },
@@ -1,6 +1,7 @@
1
- /*! tablesorter tbody sorting widget (BETA) - 11/22/2015 (v2.24.6)
1
+ /*! tablesorter tbody sorting widget (BETA) - 11/26/2016 (v2.28.0)
2
2
  * Requires tablesorter v2.22.2+ and jQuery 1.4+
3
3
  * by Rob Garrison
4
+ * Contributors: Chris Rogers
4
5
  */
5
6
  /*jshint browser:true, jquery:true, unused:false */
6
7
  /*global jQuery: false */
@@ -38,6 +39,15 @@
38
39
  // find parsers for each column
39
40
  ts.sortTbodies.setTbodies( c, wo );
40
41
  ts.updateCache( c, null, c.$tbodies );
42
+ })
43
+ .bind('sortEnd', function() {
44
+ // Moves the head row back to the top of the tbody
45
+ var primaryRow = wo.sortTbody_primaryRow;
46
+ if ( wo.sortTbody_lockHead && primaryRow ) {
47
+ c.$table.find( primaryRow ).each( function() {
48
+ $( this ).parents( 'tbody' ).prepend( this );
49
+ });
50
+ }
41
51
  });
42
52
 
43
53
  // detect parsers - in case the table contains only info-only tbodies
@@ -208,6 +218,8 @@
208
218
  // priority < 50 (filter widget), so c.$tbodies has the correct elements
209
219
  priority: 40,
210
220
  options: {
221
+ // lock primary row as a header when sorting
222
+ sortTbody_lockHead : false,
211
223
  // point to a row within the tbody that matches the number of header columns
212
224
  sortTbody_primaryRow : null,
213
225
  // sort tbody internal rows
@@ -1,4 +1,4 @@
1
- /*! Widget: storage - updated 3/1/2016 (v2.25.5) */
1
+ /*! Widget: storage - updated 11/26/2016 (v2.28.0) */
2
2
  /*global JSON:false */
3
3
  ;(function ($, window, document) {
4
4
  'use strict';
@@ -43,6 +43,17 @@
43
43
  url = options && options.url ||
44
44
  $table.attr(options && options.page || wo && wo.storage_page || 'data-table-page') ||
45
45
  wo && wo.storage_fixedUrl || c && c.fixedUrl || window.location.pathname;
46
+ // update defaults for validator; these values must be falsy!
47
+ $.extend(true, ts.defaults, {
48
+ fixedUrl: '',
49
+ widgetOptions: {
50
+ storage_fixedUrl: '',
51
+ storage_group: '',
52
+ storage_page: '',
53
+ storage_tableId: '',
54
+ storage_useSessionStorage: ''
55
+ }
56
+ });
46
57
  // https://gist.github.com/paulirish/5558557
47
58
  if (storageType in window) {
48
59
  try {
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.23.0
4
+ version: 1.23.1
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: 2016-11-28 00:00:00.000000000 Z
12
+ date: 2016-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties
@@ -178,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
178
  version: '0'
179
179
  requirements: []
180
180
  rubyforge_project:
181
- rubygems_version: 2.5.1
181
+ rubygems_version: 2.5.2
182
182
  signing_key:
183
183
  specification_version: 4
184
184
  summary: Simple integration of jquery-tablesorter (Mottie's fork) into the Rails asset