diff --git a/README.markdown b/README.markdown index a079a039..c5a34c45 100644 --- a/README.markdown +++ b/README.markdown @@ -34,6 +34,10 @@ 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.30 (2012-2-20) + +* Fixed the total mess I just made with the addWidget init functionality... I need a vacation :P + #### Version 2.0.29 (2012-2-20) * Fixed a problem with the addWidget init function which apparently was always being called, even if you didn't want it! Fix for [issue #28](https://github.com/Mottie/tablesorter/issues/28). Thanks to thezoggy for helping with troubleshooting! @@ -76,25 +80,3 @@ View the [complete listing here](http://mottie.github.com/tablesorter/changelog. * This widget will save the last sort to local storage, and will fallback to cookies. * The widget does use the `JSON.stringify` function which is [not fully supported](http://caniuse.com/#search=json) (IE7), so if you plan to support it and use this widget, please include this [JSON library](https://github.com/douglascrockford/JSON-js). * Fixed pager page size not sticking. Fix for [issue #24](https://github.com/Mottie/tablesorter/issues/24). - -#### Version 2.0.26 (2012-1-30) - -* Widgets should no longer be applied twice when an initial sort direction is added. Fix for [issue #21](https://github.com/Mottie/tablesorter/issues/21). -* Modified Green theme: - * The Green theme sort direction icon is now applied to only the first span it encounters inside the header. The UI theme adds a second span for it's icon. - * Essentially to fix [this demo](http://mottie.github.com/tablesorter/docs/example-widget-ui-theme.html) which allows switching between all of the themes. -* Modified the UI theme to now add a div that wraps all of the header cell content to allow positioning of the sort direction icon. - -#### Version 2.0.25.2 (2012-1-27) - -* Changed Blue theme to vertically align arrows. Fix for [issue #12](https://github.com/Mottie/tablesorter/issues/12). -* Fixed sticky header widget so varing width columns now update when the pager plugin changes pages. Thanks to locationRoura for reporting this issue. - -#### Version 2.0.25.1 (2011-12-15) - -* Fixed disabled column style for the ui theme widget. Thanks to [bbbco](https://github.com/bbbco) for the fix in [issue #17](https://github.com/Mottie/tablesorter/issues/17). - -#### Version 2.0.25 (2011-12-14) - -* The ui theme and sticky header widgets now work together and update the arrow direction. Fix for [issue #15](https://github.com/Mottie/tablesorter/issues/15). -* Empty cells with only a tab or space will now sort at the bottom. Thanks to [pursual](https://github.com/pursual) for the fix for [issue #16](https://github.com/Mottie/tablesorter/issues/16). diff --git a/changelog.txt b/changelog.txt index 3ea5756f..df896380 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,10 @@ TableSorter Change Log +Version 2.0.30 (2012-2-20) +============================ + +* Fixed the total mess I just made with the addWidget init functionality... I need a vacation :P + Version 2.0.29 (2012-2-20) ============================ diff --git a/js/jquery.tablesorter.js b/js/jquery.tablesorter.js index 3b589b99..3fabf4f1 100644 --- a/js/jquery.tablesorter.js +++ b/js/jquery.tablesorter.js @@ -1,6 +1,6 @@ /* * TableSorter 2.0 - Client-side table sorting with ease! -* Version 2.0.29 +* Version 2.0.30 * @requires jQuery v1.2.3 * * Copyright (c) 2007 Christian Bach @@ -117,10 +117,11 @@ } function benchmark(s, d) { - log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); + log(s + " (" + (new Date().getTime() - d.getTime()) + "ms)"); } this.benchmark = benchmark; + this.hasInitialized = false; function getElementText(config, node, cellIndex) { var text = "", te = config.textExtraction; @@ -178,7 +179,7 @@ node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex); nodeValue = trimAndGetNodeText(table.config, node, cellIndex); if (table.config.debug) { - log('Checking if value was empty on row:' + rowIndex); + log('Checking if value was empty on row ' + rowIndex + ', column:' + cellIndex + ": " + nodeValue); } } else { keepLooking = false; @@ -215,7 +216,7 @@ p = detectParserForColumn(table, rows, -1, i); } if (table.config.debug) { - parsersDebug += "column:" + i + " parser:" + p.id + "\n"; + parsersDebug += "column:" + i + "; parser:" + p.id + "\n"; } list.push(p); } @@ -260,21 +261,12 @@ cache.normalized.push(cols); } if (table.config.debug) { - benchmark("Building cache for " + totalRows + " rows:", cacheTime); + benchmark("Building cache for " + totalRows + " rows", cacheTime); } table.config.cache = cache; return cache; } - function initWidgets(table){ - var i, w = table.config.widgets, l = w.length; - for (i = 0; i < l; i++) { - if (w[i] && w[i].hasOwnProperty('init')) { - w[i].init(table, widgets, w[i]); - } - } - } - function getWidgetById(name) { var i, w, l = widgets.length; for (i = 0; i < l; i++) { @@ -285,13 +277,17 @@ } } - function applyWidget(table) { + function applyWidget(table, init) { var c = table.config.widgets, i, w, l = c.length; for (i = 0; i < l; i++) { w = getWidgetById(c[i]); - if ( w && w.hasOwnProperty('format') ) { - w.format(table); + if ( w ) { + if (init && w.hasOwnProperty('init')) { + w.init(table, widgets, w); + } else if (!init && w.hasOwnProperty('format')) { + w.format(table); + } } } } @@ -322,7 +318,7 @@ c.appender(table, rows); } if (c.debug) { - benchmark("Rebuilt table:", appendTime); + benchmark("Rebuilt table", appendTime); } // apply table widgets applyWidget(table); @@ -427,7 +423,7 @@ c.headerList[index] = this; }); if (c.debug) { - benchmark("Built headers:", time); + benchmark("Built headers", time); log($tableHeaders); } return $tableHeaders; @@ -534,7 +530,7 @@ dynamicExp += "}; "; eval(dynamicExp); cache.normalized.sort(sortWrapper); // sort using eval expression - if (tc.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); } + if (tc.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time", sortTime); } return cache; } @@ -781,15 +777,16 @@ if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { config.sortList = $(this).metadata().sortlist; } - // initialize widgets - initWidgets(this); + // apply widget init code + applyWidget(this, true); // if user has supplied a sort list to constructor. if (config.sortList.length > 0) { $this.trigger("sorton", [config.sortList]); } else { - // apply widgets + // apply widget format applyWidget(this); } + this.hasInitialized = true; }); }; this.addParser = function(parser) { diff --git a/js/jquery.tablesorter.min.js b/js/jquery.tablesorter.min.js index 1c08919d..aa7d5192 100644 --- a/js/jquery.tablesorter.min.js +++ b/js/jquery.tablesorter.min.js @@ -1,7 +1,7 @@ /* * TableSorter 2.0 - Client-side table sorting with ease! -* Version 2.0.29 Minified using http://dean.edwards.name/packer/ +* Version 2.0.30 Minified using http://dean.edwards.name/packer/ * Copyright (c) 2007 Christian Bach */ -!(function($){$.extend({tablesorter:new function(){var g=[],widgets=[],tbl;this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:false,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"mmddyyyy",onRenderHeader:null,selectorHeaders:'thead th',tableClass:'tablesorter',debug:false};function log(s){if(typeof console!=="undefined"&&typeof console.log!=="undefined"){console.log(s)}else{alert(s)}}function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms")}this.benchmark=benchmark;function getElementText(a,b,c){var d="",te=a.textExtraction;if(!b){return""}if(!a.supportsTextContent){a.supportsTextContent=b.textContent||false}if(te==="simple"){if(a.supportsTextContent){d=b.textContent}else{if(b.childNodes[0]&&b.childNodes[0].hasChildNodes()){d=b.childNodes[0].innerHTML}else{d=b.innerHTML}}}else{if(typeof(te)==="function"){d=te(b)}else if(typeof(te)==="object"&&te.hasOwnProperty(c)){d=te[c](b)}else{d=$(b).text()}}return d}function getParserById(a){var i,l=g.length;for(i=0;i").each(function(a){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(checkHeaderOrder(b,a));this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(b,a)||$(this).is('.sorter-false')){this.sortDisabled=true}this.lockedOrder=false;lock=checkHeaderLocked(b,a);if(typeof(lock)!=='undefined'&&lock!==false){this.order=this.lockedOrder=formatSortingOrder(lock)}if(!this.sortDisabled){$th=$(this).addClass(c.cssHeader);if(c.onRenderHeader){c.onRenderHeader.apply($th,[a])}}c.headerList[a]=this});if(c.debug){benchmark("Built headers:",time);log($tableHeaders)}return $tableHeaders}function checkCellColSpan(a,b,d){var i,cell,arr=[],r=a.tHead.rows,c=r[d].cells;for(i=0;i1){arr=arr.concat(checkCellColSpan(a,b,d++))}else{if(a.tHead.length===1||(cell.rowSpan>1||!r[d+1])){arr.push(cell)}}}return arr}function isValueInArray(v,a){var i,l=a.length;for(i=0;i');$("tr:first td",a.tBodies[0]).each(function(){c.append($('').css('width',$(this).width()))});$(a).prepend(c)}}function updateHeaderSortCount(a,b){var i,s,o,c=a.config,l=b.length;for(i=0;ib)?1:-1}catch(er){return 0}}function sortTextDesc(a,b){if(a===''){return 1}if(b===''){return-1}if(a===b){return 0}if($.data(tbl[0],"tablesorter").sortLocaleCompare){return b.localeCompare(a)}return-sortText(a,b)}function getTextValue(a,b,d){if(b){var i,l=a.length,n=b+d;for(i=0;i=2){config.sortList.splice(j,1);o.count=0}}}}else{if(this.order<2){config.sortList.push([i,this.order])}}}if(config.sortAppend!==null){a=config.sortAppend;for(j=0;j0){c.trigger("sorton",[config.sortList])}else{applyWidget(this)}})};this.addParser=function(b){var i,l=g.length,a=true;for(i=0;i").each(function(a){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(checkHeaderOrder(b,a));this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(b,a)||$(this).is('.sorter-false')){this.sortDisabled=true}this.lockedOrder=false;lock=checkHeaderLocked(b,a);if(typeof(lock)!=='undefined'&&lock!==false){this.order=this.lockedOrder=formatSortingOrder(lock)}if(!this.sortDisabled){$th=$(this).addClass(c.cssHeader);if(c.onRenderHeader){c.onRenderHeader.apply($th,[a])}}c.headerList[a]=this});if(c.debug){benchmark("Built headers",time);log($tableHeaders)}return $tableHeaders}function checkCellColSpan(a,b,d){var i,cell,arr=[],r=a.tHead.rows,c=r[d].cells;for(i=0;i1){arr=arr.concat(checkCellColSpan(a,b,d++))}else{if(a.tHead.length===1||(cell.rowSpan>1||!r[d+1])){arr.push(cell)}}}return arr}function isValueInArray(v,a){var i,l=a.length;for(i=0;i');$("tr:first td",a.tBodies[0]).each(function(){c.append($('').css('width',$(this).width()))});$(a).prepend(c)}}function updateHeaderSortCount(a,b){var i,s,o,c=a.config,l=b.length;for(i=0;ib)?1:-1}catch(er){return 0}}function sortTextDesc(a,b){if(a===''){return 1}if(b===''){return-1}if(a===b){return 0}if($.data(tbl[0],"tablesorter").sortLocaleCompare){return b.localeCompare(a)}return-sortText(a,b)}function getTextValue(a,b,d){if(b){var i,l=a.length,n=b+d;for(i=0;i=2){config.sortList.splice(j,1);o.count=0}}}}else{if(this.order<2){config.sortList.push([i,this.order])}}}if(config.sortAppend!==null){a=config.sortAppend;for(j=0;j0){c.trigger("sorton",[config.sortList])}else{applyWidget(this)}this.hasInitialized=true})};this.addParser=function(b){var i,l=g.length,a=true;for(i=0;i 0) { c.sortList = sortList; - } else if (sortList && sortList.length > 0) { + } else if (table.hasInitialized && sortList && sortList.length > 0) { // update sort change $(table).trigger('sorton', [sortList]); } diff --git a/js/jquery.tablesorter.widgets.min.js b/js/jquery.tablesorter.widgets.min.js index 706b4fc7..ed0530be 100644 --- a/js/jquery.tablesorter.widgets.min.js +++ b/js/jquery.tablesorter.widgets.min.js @@ -1,4 +1,4 @@ -/* TableSorter 2.0 Widgets - updated 2/1/2012 */ +/* TableSorter 2.0 Widgets - updated 2/20/2012 */ (function(b){ 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('').wrapInner('
').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)}}); @@ -6,5 +6,5 @@ b.tablesorter.addWidget({id:"columns",format:function(e){var g,a,d,f,h=e.config, 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='',l;i.debug&&(l=new Date);for(g=0;g';k.find("thead").append(e+="").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;gc.top&&b
').wrapInner('
').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