added widget init function & updated saveSort widget

This commit is contained in:
Rob Garrison 2012-02-01 18:02:19 -06:00
parent 3a848676dd
commit 12cf4675b7
8 changed files with 89 additions and 20 deletions

View File

@ -34,6 +34,30 @@ Included all original [document pages](http://mottie.github.com/tablesorter/docs
View the [complete listing here](http://mottie.github.com/tablesorter/changelog.txt).
####Version 2.0.28 (2012-2-1)
* Added a new function to widgets called "init" which is called upon initialization, before any of the widgets are applied.
* I added it to allow the "saveSort" widget to get the saved sort data (localStorage or cookie) before the initial sort was applied.
* The "saveSort" widget is still compatible with the original tablesorter, but the original version will call all of the widgets twice on initialization, if using the "saveSort" widget.
* New add widget format is as follows:
```javascript
$.tablesorter.addWidget({
id: 'myWidget',
init: function(table, allWidgets, thisWidget){
// widget initialization code - this is only run ONCE
// but in this example I call the format function because
// I want to keep it backwards compatible with the original tablesorter
thisWidget.format(table, true);
},
format: function(table, initFlag) {
// widget code to apply to the table AFTER EACH SORT
// the initFlag is true when format is called for the first time, but
// only if it is called from the init function
}
});
```
####Version 2.0.27 (2012-1-31)
* Added `sortReset` option

View File

@ -1,5 +1,30 @@
TableSorter Change Log
Version 2.0.28 (2012-2-1)
============================
* Added a new function to widgets called "init" which is called upon initialization, before any of the widgets are applied.
* I added it to allow the "saveSort" widget to get the saved sort data (localStorage or cookie) before the initial sort was applied.
* The "saveSort" widget is still compatible with the original tablesorter, but the original version will call all of the widgets twice on initialization, if using the "saveSort" widget.
* New add widget format is as follows:
```javascript
$.tablesorter.addWidget({
id: 'myWidget',
init: function(table, allWidgets, thisWidget){
// widget initialization code - this is only run ONCE
// but in this example I call the format function because
// I want to keep it backwards compatible with the original tablesorter
thisWidget.format(table, true);
},
format: function(table, initFlag) {
// widget code to apply to the table AFTER EACH SORT
// the initFlag is true when format is called for the first time, but
// only if it is called from the init function
}
});
```
Version 2.0.27 (2012-1-31)
============================

View File

@ -24,7 +24,7 @@
$("table").tablesorter({
// use save sort widget
widgets: ["saveSort"]
widgets: ["saveSort", "zebra"]
});

View File

@ -1,6 +1,6 @@
/*
* TableSorter 2.0 - Client-side table sorting with ease!
* Version 2.0.27
* Version 2.0.28
* @requires jQuery v1.2.3
*
* Copyright (c) 2007 Christian Bach
@ -76,7 +76,7 @@
* @author Christian Bach/christian.bach@polyester.se
* @contributor Rob Garrison/https://github.com/Mottie/tablesorter
*/
(function($){
!(function($){
$.extend({
tablesorter: new function(){
@ -109,7 +109,7 @@
/* debuging utils */
function log(s) {
if (typeof console !== "undefined" && typeof console.debug !== "undefined") {
if (typeof console !== "undefined" && typeof console.log !== "undefined") {
console.log(s);
} else {
alert(s);
@ -266,6 +266,16 @@
return cache;
}
function initWidgets(table){
var i, w, l = widgets.length;
for (i = 0; i < l; i++) {
w = widgets[i];
if (w && w.hasOwnProperty('init')) {
w.init(table, widgets, w);
}
}
}
function getWidgetById(name) {
var i, w, l = widgets.length;
for (i = 0; i < l; i++) {
@ -774,6 +784,8 @@
if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) {
config.sortList = $(this).metadata().sortlist;
}
// initialize widgets
initWidgets(this);
// if user has supplied a sort list to constructor.
if (config.sortList.length > 0) {
$this.trigger("sorton", [config.sortList]);

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
/* TableSorter 2.0 Widgets - updated 1/31/2012
/* TableSorter 2.0 Widgets - updated 2/1/2012
*
* jQuery UI Theme
* Column Styles
@ -288,7 +288,11 @@ $.tablesorter.addWidget({
// **************************
$.tablesorter.addWidget({
id: 'saveSort',
format: function(table) {
init: function(table, allWidgets, thisWidget){
// run widget format before all other widgets are applied to the table
thisWidget.format(table, true);
},
format: function(table, init) {
var n, d, k, ls, time, c = table.config,
// older browsers don't support JSON.stringify (http://caniuse.com/#search=json)
// if you need it, then include https://github.com/douglascrockford/JSON-js
@ -329,13 +333,17 @@ $.tablesorter.addWidget({
}
// parse data
try { ls = $.parseJSON(ls); } catch(e) { ls = ''; }
sortList = (ls && ls.hasOwnProperty('sortList') && $.isArray(ls.sortList)) ? [ls.sortList] : '';
sortList = (ls && ls.hasOwnProperty('sortList') && $.isArray(ls.sortList)) ? ls.sortList : '';
if (c.debug) {
$.tablesorter.benchmark('saveSort: Last sort for "' + n + '" obtained from ' + (c.hasLocalStorage ? 'local storage' : 'a cookie'), time);
}
// update sort change
if (sortList && sortList.length > 0) {
$(table).trigger('sorton', sortList);
// init is true when widget init is run, this will run this widget before all other widgets have initialized
// this method allows using this widget in the original tablesorter plugin; but then it will run all widgets twice.
if (init && sortList && sortList.length > 0) {
c.sortList = sortList;
} else if (sortList && sortList.length > 0) {
// update sort change
$(table).trigger('sorton', [sortList]);
}
}
}

View File

@ -1,10 +1,10 @@
/* TableSorter 2.0 Widgets - updated 1/31/2012 */
/* TableSorter 2.0 Widgets - updated 2/1/2012 */
(function(b){
b.tablesorter.addWidget({id:"uitheme",format:function(f){var c,a,d,g,e,h=f.config,i=b(f),j=["ui-icon-arrowthick-2-n-s","ui-icon-arrowthick-1-s","ui-icon-arrowthick-1-n"];h.widgetUitheme&&h.widgetUitheme.hasOwnProperty("css")&&(j=h.widgetUitheme.css||j);d=j.join(" ");h.debug&&(c=new Date);i.is(".ui-theme")||(i.addClass("ui-widget ui-widget-content ui-corner-all ui-theme"),b.each(h.headerList,function(){b(this).addClass("ui-widget-header ui-corner-all").append('<span class="ui-icon"/>').wrapInner('<div class="inner"/>').hover(function(){b(this).addClass("ui-state-hover")}, function(){b(this).removeClass("ui-state-hover")})}));b.each(h.headerList,function(c){g=b(this);this.sortDisabled?g.find("span.ui-icon").removeClass(d+" ui-icon"):(a=g.hasClass(h.cssAsc)?j[1]:g.hasClass(h.cssDesc)?j[2]:g.hasClass(h.cssHeader)?j[0]:"",e=i.hasClass("hasStickyHeaders")?i.find("tr.stickyHeader").find("th").eq(c).add(g):g,e[a===j[0]?"removeClass":"addClass"]("ui-state-active").find("span.ui-icon").removeClass(d).addClass(a))});h.debug&&b.tablesorter.benchmark("Applying uitheme widget", c)}});
b.tablesorter.addWidget({id:"columns",format:function(f){var c,a,d,g,e=f.config,h=e.sortList,i=h.length,j=["primary","secondary","tertiary"];e.widgetColumns&&e.widgetColumns.hasOwnProperty("css")&&(j=e.widgetColumns.css||j);d=j.length-1;g=j.join(" ");e.debug&&(a=new Date);h&&h[0]&&b("tr:visible",f.tBodies[0]).each(function(a){c=b(this).children().removeClass(g);c.eq(h[0][0]).addClass(j[0]);if(1<i)for(a=1;a<i;a++)c.eq(h[a][0]).addClass(j[a]||j[d])});e.debug&&b.tablesorter.benchmark("Applying Columns widget", a)}});
b.tablesorter.addWidget({id:"filter",format:function(f){if(!f.config.filtering){var c,a,d,g,e,h,i=f.config,j=i.headerList.length,k=b(f),f='<tr class="filters">',l;i.debug&&(l=new Date);for(c=0;c<j;c++)f+='<td><input type="text" class="filter" data-col="'+c+'" style="',f+=i.headers[c]&&"filter"in i.headers[c]&&!1===i.headers[c].filter||b(i.headerList[c]).is(".filter-false")?"display:none":"",f+='"></td>';k.find("thead").append(f+="</tr>").find(".filter").bind("keyup",function(){a=k.find(".filter").map(function(){return(b(this).val()|| "").toLowerCase()}).get();""===a.join("")?k.find("tr").show():k.find("tbody").find("tr:not(.expand-child)").each(function(){d=!0;e=b(this).nextUntil("tr:not(.expand-child)");g=e.length&&("undefined"!==typeof i.widgetFilterChildRows?i.widgetFilterChildRows:1)?e.text():"";h=b(this).find("td");for(c=0;c<j;c++)""!==a[c]&&0<=(h.eq(c).text()+g).toLowerCase().indexOf(a[c])?d=d?!0:!1:""!==a[c]&&(d=!1);b(this)[d?"show":"hide"]();if(e.length)e[d?"show":"hide"]()});k.trigger("applyWidgets")});i.filtering=!0; i.debug&&b.tablesorter.benchmark("Applying Filter widget",l)}}});
b.tablesorter.addWidget({id:"stickyHeaders",format:function(f){if(!b(f).hasClass("hasStickyHeaders")){var c=b(f).addClass("hasStickyHeaders"),a=b(window),d=b(f).find("thead"),g=d.find("tr").children(),e=g.eq(0),h=parseInt(g.eq(0).css("border-left-width"),10),i=d.find("tr:not(.filters)").clone().addClass("stickyHeader").css({width:d.outerWidth()+2*h,position:"fixed",left:e.offset().left,marginLeft:-h,top:0,visibility:"hidden",zIndex:10}), j=i.children(),k;c.bind("sortEnd",function(a,c){var e=b(c).find("thead tr"),d=e.filter(".stickyHeader").children();e.filter(":not(.stickyHeader)").children().each(function(a){d.eq(a).attr("class",b(this).attr("class"))})}).bind("pagerComplete",function(){a.resize()});g.each(function(a){var c=b(this);j.eq(a).width(c.width()).bind("click",function(a){c.trigger(a)}).bind("mousedown",function(){this.onselectstart=function(){return!1};return!1})});d.prepend(i);a.scroll(function(){var b=e.offset(),d=a.scrollTop(), d=d>b.top&&d<b.top+c.find("tbody").height()?"visible":"hidden";i.css({left:b.left-a.scrollLeft(),visibility:d});d!==k&&(a.resize(),k=d)}).resize(function(){i.css({left:e.offset().left-a.scrollLeft(),width:d.outerWidth()+2*h});j.each(function(a){b(this).width(g.eq(a).width())})})}}});
b.tablesorter.addWidget({id:"resizable",format:function(f){if(!f.config.resizable){var c,a=f.config,d=a.headerList,g=d.length,e=function(){a.resizable_position=0;a.resizable_target=null;b(window).trigger("resize")};a.resizable_target= null;a.resizable_position=0;for(c=1;c<g;c++)b(d[c]).append('<div class="resizer" style="cursor:w-resize;position:absolute;height:100%;width:20px;left:-20px;top:0;z-index:1;"></div>').wrapInner('<div style="position:relative;height:100%;width:100%"></div>').find(".resizer").bind("mousedown",function(c){a.resizable_target=b(c.target).closest("th");a.resizable_position=c.pageX}).end().bind("mousemove",function(c){if(!(0===a.resizable_position||null===typeof a.resizable_target)){var b=c.pageX-a.resizable_position, d=a.resizable_target.closest("th").prev();a.resizable_target.width()<-b||d&&d.width()<=b||(d.width(d.width()+b),a.resizable_position=c.pageX)}}).bind("mouseup",function(){e();return!1});b(f).find("thead").bind("mouseup mouseleave",function(){e()});a.resizable=!0}}});
b.tablesorter.addWidget({id:"saveSort",format:function(f){var c,a,d,g,e=f.config;d='{"sortList":'+JSON.stringify(e.sortList)+"}";e.debug&&(g=new Date);if(e.widgetsavesort)c="tablesorter"+(e.tableIndex||0)+f.id,e.hasLocalStorage?localStorage[c]= d:(a=new Date,a.setTime(a.getTime()+31536E6),document.cookie=c+"="+d+"; expires="+a.toGMTString()+"; path=/"),e.debug&&b.tablesorter.benchmark('saveSort: Saving sort to "'+c+'" in '+(e.hasLocalStorage?"local storage":"a cookie"),g);else{e.widgetsavesort=!0;e.hasLocalStorage=!1;try{localStorage.getItem&&(e.hasLocalStorage=!0)}catch(h){}e.tableIndex=b(".tablesorter").index(b(f));c="tablesorter"+(e.tableIndex||0)+f.id;e.hasLocalStorage?a=localStorage[c]:(d=document.cookie.split(/[;\s|=]/),a=b.inArray(c, d)+1,a=0!==a?d[a]:"");try{a=b.parseJSON(a)}catch(i){a=""}d=a&&a.hasOwnProperty("sortList")&&b.isArray(a.sortList)?[a.sortList]:"";e.debug&&b.tablesorter.benchmark('saveSort: Last sort for "'+c+'" obtained from '+(e.hasLocalStorage?"local storage":"a cookie"),g);d&&0<d.length&&b(f).trigger("sorton",d)}}})
b.tablesorter.addWidget({id:"uitheme",format:function(e){var g,a,d,f,h,c=e.config,i=b(e),j=["ui-icon-arrowthick-2-n-s","ui-icon-arrowthick-1-s","ui-icon-arrowthick-1-n"];c.widgetUitheme&&c.widgetUitheme.hasOwnProperty("css")&&(j=c.widgetUitheme.css||j);d=j.join(" ");c.debug&&(g=new Date);i.is(".ui-theme")||(i.addClass("ui-widget ui-widget-content ui-corner-all ui-theme"),b.each(c.headerList,function(){b(this).addClass("ui-widget-header ui-corner-all").append('<span class="ui-icon"/>').wrapInner('<div class="inner"/>').hover(function(){b(this).addClass("ui-state-hover")}, function(){b(this).removeClass("ui-state-hover")})}));b.each(c.headerList,function(e){f=b(this);this.sortDisabled?f.find("span.ui-icon").removeClass(d+" ui-icon"):(a=f.hasClass(c.cssAsc)?j[1]:f.hasClass(c.cssDesc)?j[2]:f.hasClass(c.cssHeader)?j[0]:"",h=i.hasClass("hasStickyHeaders")?i.find("tr.stickyHeader").find("th").eq(e).add(f):f,h[a===j[0]?"removeClass":"addClass"]("ui-state-active").find("span.ui-icon").removeClass(d).addClass(a))});c.debug&&b.tablesorter.benchmark("Applying uitheme widget", g)}});
b.tablesorter.addWidget({id:"columns",format:function(e){var g,a,d,f,h=e.config,c=h.sortList,i=c.length,j=["primary","secondary","tertiary"];h.widgetColumns&&h.widgetColumns.hasOwnProperty("css")&&(j=h.widgetColumns.css||j);d=j.length-1;f=j.join(" ");h.debug&&(a=new Date);c&&c[0]&&b("tr:visible",e.tBodies[0]).each(function(a){g=b(this).children().removeClass(f);g.eq(c[0][0]).addClass(j[0]);if(1<i)for(a=1;a<i;a++)g.eq(c[a][0]).addClass(j[a]||j[d])});h.debug&&b.tablesorter.benchmark("Applying Columns widget", a)}});
b.tablesorter.addWidget({id:"filter",format:function(e){if(!e.config.filtering){var g,a,d,f,h,c,i=e.config,j=i.headerList.length,k=b(e),e='<tr class="filters">',l;i.debug&&(l=new Date);for(g=0;g<j;g++)e+='<td><input type="text" class="filter" data-col="'+g+'" style="',e+=i.headers[g]&&"filter"in i.headers[g]&&!1===i.headers[g].filter||b(i.headerList[g]).is(".filter-false")?"display:none":"",e+='"></td>';k.find("thead").append(e+="</tr>").find(".filter").bind("keyup",function(){a=k.find(".filter").map(function(){return(b(this).val()|| "").toLowerCase()}).get();""===a.join("")?k.find("tr").show():k.find("tbody").find("tr:not(.expand-child)").each(function(){d=!0;h=b(this).nextUntil("tr:not(.expand-child)");f=h.length&&("undefined"!==typeof i.widgetFilterChildRows?i.widgetFilterChildRows:1)?h.text():"";c=b(this).find("td");for(g=0;g<j;g++)""!==a[g]&&0<=(c.eq(g).text()+f).toLowerCase().indexOf(a[g])?d=d?!0:!1:""!==a[g]&&(d=!1);b(this)[d?"show":"hide"]();if(h.length)h[d?"show":"hide"]()});k.trigger("applyWidgets")});i.filtering=!0; i.debug&&b.tablesorter.benchmark("Applying Filter widget",l)}}});
b.tablesorter.addWidget({id:"stickyHeaders",format:function(e){if(!b(e).hasClass("hasStickyHeaders")){var g=b(e).addClass("hasStickyHeaders"),a=b(window),d=b(e).find("thead"),f=d.find("tr").children(),h=f.eq(0),c=parseInt(f.eq(0).css("border-left-width"),10),i=d.find("tr:not(.filters)").clone().addClass("stickyHeader").css({width:d.outerWidth()+2*c,position:"fixed",left:h.offset().left,marginLeft:-c,top:0,visibility:"hidden",zIndex:10}), j=i.children(),k;g.bind("sortEnd",function(a,c){var d=b(c).find("thead tr"),e=d.filter(".stickyHeader").children();d.filter(":not(.stickyHeader)").children().each(function(a){e.eq(a).attr("class",b(this).attr("class"))})}).bind("pagerComplete",function(){a.resize()});f.each(function(a){var c=b(this);j.eq(a).width(c.width()).bind("click",function(a){c.trigger(a)}).bind("mousedown",function(){this.onselectstart=function(){return!1};return!1})});d.prepend(i);a.scroll(function(){var c=h.offset(),b=a.scrollTop(), b=b>c.top&&b<c.top+g.find("tbody").height()?"visible":"hidden";i.css({left:c.left-a.scrollLeft(),visibility:b});b!==k&&(a.resize(),k=b)}).resize(function(){i.css({left:h.offset().left-a.scrollLeft(),width:d.outerWidth()+2*c});j.each(function(a){b(this).width(f.eq(a).width())})})}}});
b.tablesorter.addWidget({id:"resizable",format:function(e){if(!e.config.resizable){var g,a=e.config,d=a.headerList,f=d.length,h=function(){a.resizable_position=0;a.resizable_target=null;b(window).trigger("resize")};a.resizable_target= null;a.resizable_position=0;for(g=1;g<f;g++)b(d[g]).append('<div class="resizer" style="cursor:w-resize;position:absolute;height:100%;width:20px;left:-20px;top:0;z-index:1;"></div>').wrapInner('<div style="position:relative;height:100%;width:100%"></div>').find(".resizer").bind("mousedown",function(c){a.resizable_target=b(c.target).closest("th");a.resizable_position=c.pageX}).end().bind("mousemove",function(c){if(!(0===a.resizable_position||null===typeof a.resizable_target)){var b=c.pageX-a.resizable_position, d=a.resizable_target.closest("th").prev();a.resizable_target.width()<-b||d&&d.width()<=b||(d.width(d.width()+b),a.resizable_position=c.pageX)}}).bind("mouseup",function(){h();return!1});b(e).find("thead").bind("mouseup mouseleave",function(){h()});a.resizable=!0}}});
b.tablesorter.addWidget({id:"saveSort",init:function(b,g,a){a.format(b,!0)},format:function(e,g){var a,d,f,h,c=e.config;f='{"sortList":'+JSON.stringify(c.sortList)+"}";c.debug&&(h=new Date);if(c.widgetsavesort)a="tablesorter"+(c.tableIndex|| 0)+e.id,c.hasLocalStorage?localStorage[a]=f:(d=new Date,d.setTime(d.getTime()+31536E6),document.cookie=a+"="+f+"; expires="+d.toGMTString()+"; path=/"),c.debug&&b.tablesorter.benchmark('saveSort: Saving sort to "'+a+'" in '+(c.hasLocalStorage?"local storage":"a cookie"),h);else{c.widgetsavesort=!0;c.hasLocalStorage=!1;try{localStorage.getItem&&(c.hasLocalStorage=!0)}catch(i){}c.tableIndex=b(".tablesorter").index(b(e));a="tablesorter"+(c.tableIndex||0)+e.id;c.hasLocalStorage?d=localStorage[a]:(f=document.cookie.split(/[;\s|=]/), d=b.inArray(a,f)+1,d=0!==d?f[d]:"");try{d=b.parseJSON(d)}catch(j){d=""}f=d&&d.hasOwnProperty("sortList")&&b.isArray(d.sortList)?d.sortList:"";c.debug&&b.tablesorter.benchmark('saveSort: Last sort for "'+a+'" obtained from '+(c.hasLocalStorage?"local storage":"a cookie"),h);g&&f&&0<f.length?c.sortList=f:f&&0<f.length&&b(e).trigger("sorton",[f])}}})
})(jQuery);

View File

@ -1,6 +1,6 @@
{
"name": "tablesorter",
"version": "2.0.27",
"version": "2.0.28",
"title": "tablesorter",
"author": {
"name": "Christian Bach",