Skip to content

Instantly share code, notes, and snippets.

@libreliodev
Created February 28, 2015 17:14
Show Gist options
  • Save libreliodev/14444a9a3955f801977c to your computer and use it in GitHub Desktop.
Save libreliodev/14444a9a3955f801977c to your computer and use it in GitHub Desktop.
bug fix for pivottable.js
table.pvtTable{font-family:arial;font-size:8pt;text-align:left;border-collapse:collapse}table.pvtTable tr th,table.pvtTable tr th{background-color:#e6eeee;border:1px solid #cdcdcd;font-size:8pt;padding:5px}table.pvtTable .pvtColLabel{text-align:center}table.pvtTable .pvtTotalLabel{text-align:right}table.pvtTable tr td{color:#3d3d3d;padding:5px;background-color:#FFF;border:1px solid #cdcdcd;vertical-align:top;text-align:right}.pvtTotal,.pvtGrandTotal{font-weight:bold}.pvtVals{text-align:center}.pvtAggregator{margin-bottom:5px}.pvtAxisContainer,.pvtVals{border:1px solid gray;background:#EEE;padding:5px;min-width:20px;min-height:20px}.pvtAxisContainer li{padding:8px 6px;list-style-type:none;cursor:move}.pvtAxisContainer li.pvtPlaceholder{-webkit-border-radius:5px;padding:3px 15px;-moz-border-radius:5px;border-radius:5px;border:1px dashed #aaa}.pvtAxisContainer li span.pvtAttr{background:#f3f3f3;border:1px solid #dedede;padding:2px 5px;white-space:nowrap;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.pvtTriangle{cursor:pointer;color:grey}.pvtHorizList li{display:inline}.pvtVertList{vertical-align:top}.pvtFilteredAttribute{font-style:italic}.pvtColLI{position:relative}.pvtColLI .pvtFilterBox{z-index:100;width:280px;border:1px solid gray;background-color:#fff;position:absolute;left:75px;top:10px;padding:20px;text-align:center}.pvtFilterBox h4{margin:0}.pvtCheckContainer{text-align:left;overflow:scroll;width:100%;max-height:200px}.pvtCheckContainer p{margin:5px}.pvtSearch{display:block;width:150px;margin:5px auto 0}
(function(){var callWithJQuery,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;i<l;i++){if(i in this&&this[i]===item)return i}return-1},slice=[].slice,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},hasProp={}.hasOwnProperty;callWithJQuery=function(pivotModule){if(typeof exports==="object"&&typeof module==="object"){return pivotModule(require("jquery"))}else if(typeof define==="function"&&define.amd){return define(["jquery"],pivotModule)}else{return pivotModule(jQuery)}};callWithJQuery(function($){var PivotData,addSeparators,aggregatorTemplates,aggregators,dayNamesEn,derivers,locales,mthNamesEn,naturalSort,numberFormat,pivotTableRenderer,renderers,usFmt,usFmtInt,usFmtPct,zeroPad;addSeparators=function(nStr,thousandsSep,decimalSep){var rgx,x,x1,x2;nStr+="";x=nStr.split(".");x1=x[0];x2=x.length>1?decimalSep+x[1]:"";rgx=/(\d+)(\d{3})/;while(rgx.test(x1)){x1=x1.replace(rgx,"$1"+thousandsSep+"$2")}return x1+x2};numberFormat=function(opts){var defaults;defaults={digitsAfterDecimal:2,scaler:1,thousandsSep:",",decimalSep:".",prefix:"",suffix:"",showZero:false};opts=$.extend(defaults,opts);return function(x){var result;if(isNaN(x)||!isFinite(x)){return""}if(x===0&&!opts.showZero){return""}result=addSeparators((opts.scaler*x).toFixed(opts.digitsAfterDecimal),opts.thousandsSep,opts.decimalSep);return""+opts.prefix+result+opts.suffix}};usFmt=numberFormat();usFmtInt=numberFormat({digitsAfterDecimal:0});usFmtPct=numberFormat({digitsAfterDecimal:1,scaler:100,suffix:"%"});aggregatorTemplates={count:function(formatter){if(formatter==null){formatter=usFmtInt}return function(){return function(data,rowKey,colKey){return{count:0,push:function(){return this.count++},value:function(){return this.count},format:formatter}}}},countUnique:function(formatter){if(formatter==null){formatter=usFmtInt}return function(arg){var attr;attr=arg[0];return function(data,rowKey,colKey){return{uniq:[],push:function(record){var ref;if(ref=record[attr],indexOf.call(this.uniq,ref)<0){return this.uniq.push(record[attr])}},value:function(){return this.uniq.length},format:formatter,numInputs:attr!=null?0:1}}}},listUnique:function(sep){return function(arg){var attr;attr=arg[0];return function(data,rowKey,colKey){return{uniq:[],push:function(record){var ref;if(ref=record[attr],indexOf.call(this.uniq,ref)<0){return this.uniq.push(record[attr])}},value:function(){return this.uniq.join(sep)},format:function(x){return x},numInputs:attr!=null?0:1}}}},sum:function(formatter){if(formatter==null){formatter=usFmt}return function(arg){var attr;attr=arg[0];return function(data,rowKey,colKey){return{sum:0,push:function(record){if(!isNaN(parseFloat(record[attr]))){return this.sum+=parseFloat(record[attr])}},value:function(){return this.sum},format:formatter,numInputs:attr!=null?0:1}}}},average:function(formatter){if(formatter==null){formatter=usFmt}return function(arg){var attr;attr=arg[0];return function(data,rowKey,colKey){return{sum:0,len:0,push:function(record){if(!isNaN(parseFloat(record[attr]))){this.sum+=parseFloat(record[attr]);return this.len++}},value:function(){return this.sum/this.len},format:formatter,numInputs:attr!=null?0:1}}}},sumOverSum:function(formatter){if(formatter==null){formatter=usFmt}return function(arg){var denom,num;num=arg[0],denom=arg[1];return function(data,rowKey,colKey){return{sumNum:0,sumDenom:0,push:function(record){if(!isNaN(parseFloat(record[num]))){this.sumNum+=parseFloat(record[num])}if(!isNaN(parseFloat(record[denom]))){return this.sumDenom+=parseFloat(record[denom])}},value:function(){return this.sumNum/this.sumDenom},format:formatter,numInputs:num!=null&&denom!=null?0:2}}}},sumOverSumBound80:function(upper,formatter){if(upper==null){upper=true}if(formatter==null){formatter=usFmt}return function(arg){var denom,num;num=arg[0],denom=arg[1];return function(data,rowKey,colKey){return{sumNum:0,sumDenom:0,push:function(record){if(!isNaN(parseFloat(record[num]))){this.sumNum+=parseFloat(record[num])}if(!isNaN(parseFloat(record[denom]))){return this.sumDenom+=parseFloat(record[denom])}},value:function(){var sign;sign=upper?1:-1;return(.821187207574908/this.sumDenom+this.sumNum/this.sumDenom+1.2815515655446004*sign*Math.sqrt(.410593603787454/(this.sumDenom*this.sumDenom)+this.sumNum*(1-this.sumNum/this.sumDenom)/(this.sumDenom*this.sumDenom)))/(1+1.642374415149816/this.sumDenom)},format:formatter,numInputs:num!=null&&denom!=null?0:2}}}},fractionOf:function(wrapped,type,formatter){if(type==null){type="total"}if(formatter==null){formatter=usFmtPct}return function(){var x;x=1<=arguments.length?slice.call(arguments,0):[];return function(data,rowKey,colKey){return{selector:{total:[[],[]],row:[rowKey,[]],col:[[],colKey]}[type],inner:wrapped.apply(null,x)(data,rowKey,colKey),push:function(record){return this.inner.push(record)},format:formatter,value:function(){return this.inner.value()/data.getAggregator.apply(data,this.selector).inner.value()},numInputs:wrapped.apply(null,x)().numInputs}}}}};aggregators=function(tpl){return{Count:tpl.count(usFmtInt),"Count Unique Values":tpl.countUnique(usFmtInt),"List Unique Values":tpl.listUnique(", "),Sum:tpl.sum(usFmt),"Integer Sum":tpl.sum(usFmtInt),Average:tpl.average(usFmt),"Sum over Sum":tpl.sumOverSum(usFmt),"80% Upper Bound":tpl.sumOverSumBound80(true,usFmt),"80% Lower Bound":tpl.sumOverSumBound80(false,usFmt),"Sum as Fraction of Total":tpl.fractionOf(tpl.sum(),"total",usFmtPct),"Sum as Fraction of Rows":tpl.fractionOf(tpl.sum(),"row",usFmtPct),"Sum as Fraction of Columns":tpl.fractionOf(tpl.sum(),"col",usFmtPct),"Count as Fraction of Total":tpl.fractionOf(tpl.count(),"total",usFmtPct),"Count as Fraction of Rows":tpl.fractionOf(tpl.count(),"row",usFmtPct),"Count as Fraction of Columns":tpl.fractionOf(tpl.count(),"col",usFmtPct)}}(aggregatorTemplates);renderers={Table:function(pvtData,opts){return pivotTableRenderer(pvtData,opts)},"Table Barchart":function(pvtData,opts){return $(pivotTableRenderer(pvtData,opts)).barchart()},Heatmap:function(pvtData,opts){return $(pivotTableRenderer(pvtData,opts)).heatmap()},"Row Heatmap":function(pvtData,opts){return $(pivotTableRenderer(pvtData,opts)).heatmap("rowheatmap")},"Col Heatmap":function(pvtData,opts){return $(pivotTableRenderer(pvtData,opts)).heatmap("colheatmap")}};locales={en:{aggregators:aggregators,renderers:renderers,localeStrings:{renderError:"An error occurred rendering the PivotTable results.",computeError:"An error occurred computing the PivotTable results.",uiRenderError:"An error occurred rendering the PivotTable UI.",selectAll:"Select All",selectNone:"Select None",tooMany:"(too many to list)",filterResults:"Filter results",totals:"Totals",vs:"vs",by:"by"}}};mthNamesEn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];dayNamesEn=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];zeroPad=function(number){return("0"+number).substr(-2,2)};derivers={bin:function(col,binWidth){return function(record){return record[col]-record[col]%binWidth}},dateFormat:function(col,formatString,mthNames,dayNames){if(mthNames==null){mthNames=mthNamesEn}if(dayNames==null){dayNames=dayNamesEn}return function(record){var date;date=new Date(Date.parse(record[col]));if(isNaN(date)){return""}return formatString.replace(/%(.)/g,function(m,p){switch(p){case"y":return date.getFullYear();case"m":return zeroPad(date.getMonth()+1);case"n":return mthNames[date.getMonth()];case"d":return zeroPad(date.getDate());case"w":return dayNames[date.getDay()];case"x":return date.getDay();case"H":return zeroPad(date.getHours());case"M":return zeroPad(date.getMinutes());case"S":return zeroPad(date.getSeconds());default:return"%"+p}})}}};naturalSort=function(_this){return function(as,bs){var a,a1,b,b1,rd,rx,rz;rx=/(\d+)|(\D+)/g;rd=/\d/;rz=/^0/;if(typeof as==="number"||typeof bs==="number"){if(isNaN(as)){return 1}if(isNaN(bs)){return-1}return as-bs}a=String(as).toLowerCase();b=String(bs).toLowerCase();if(a===b){return 0}if(!(rd.test(a)&&rd.test(b))){return a>b?1:-1}a=a.match(rx);b=b.match(rx);while(a.length&&b.length){a1=a.shift();b1=b.shift();if(a1!==b1){if(rd.test(a1)&&rd.test(b1)){return a1.replace(rz,".0")-b1.replace(rz,".0")}else{return a1>b1?1:-1}}}return a.length-b.length}}(this);$.pivotUtilities={aggregatorTemplates:aggregatorTemplates,aggregators:aggregators,renderers:renderers,derivers:derivers,locales:locales,naturalSort:naturalSort,numberFormat:numberFormat};PivotData=function(){function PivotData(input,opts){this.getAggregator=bind(this.getAggregator,this);this.getRowKeys=bind(this.getRowKeys,this);this.getColKeys=bind(this.getColKeys,this);this.sortKeys=bind(this.sortKeys,this);this.arrSort=bind(this.arrSort,this);this.natSort=bind(this.natSort,this);this.aggregator=opts.aggregator;this.aggregatorName=opts.aggregatorName;this.colAttrs=opts.cols;this.rowAttrs=opts.rows;this.valAttrs=opts.vals;this.tree={};this.rowKeys=[];this.colKeys=[];this.rowTotals={};this.colTotals={};this.allTotal=this.aggregator(this,[],[]);this.sorted=false;PivotData.forEachRecord(input,opts.derivedAttributes,function(_this){return function(record){if(opts.filter(record)){return _this.processRecord(record)}}}(this))}PivotData.forEachRecord=function(input,derivedAttributes,f){var addRecord,compactRecord,i,j,k,l,len1,record,ref,results,results1,tblCols;if($.isEmptyObject(derivedAttributes)){addRecord=f}else{addRecord=function(record){var k,ref,v;for(k in derivedAttributes){v=derivedAttributes[k];record[k]=(ref=v(record))!=null?ref:record[k]}return f(record)}}if($.isFunction(input)){return input(addRecord)}else if($.isArray(input)){if($.isArray(input[0])){results=[];for(i in input){if(!hasProp.call(input,i))continue;compactRecord=input[i];if(!(i>0)){continue}record={};ref=input[0];for(j in ref){if(!hasProp.call(ref,j))continue;k=ref[j];record[k]=compactRecord[j]}results.push(addRecord(record))}return results}else{results1=[];for(l=0,len1=input.length;l<len1;l++){record=input[l];results1.push(addRecord(record))}return results1}}else if(input instanceof jQuery){tblCols=[];$("thead > tr > th",input).each(function(i){return tblCols.push($(this).text())});return $("tbody > tr",input).each(function(i){record={};$("td",this).each(function(j){return record[tblCols[j]]=$(this).text()});return addRecord(record)})}else{throw new Error("unknown input format")}};PivotData.convertToArray=function(input){var result;result=[];PivotData.forEachRecord(input,{},function(record){return result.push(record)});return result};PivotData.prototype.natSort=function(as,bs){return naturalSort(as,bs)};PivotData.prototype.arrSort=function(a,b){return this.natSort(a.join(),b.join())};PivotData.prototype.sortKeys=function(){if(!this.sorted){this.rowKeys.sort(this.arrSort);this.colKeys.sort(this.arrSort)}return this.sorted=true};PivotData.prototype.getColKeys=function(){this.sortKeys();return this.colKeys};PivotData.prototype.getRowKeys=function(){this.sortKeys();return this.rowKeys};PivotData.prototype.processRecord=function(record){var colKey,flatColKey,flatRowKey,l,len1,len2,n,ref,ref1,ref2,ref3,rowKey,x;colKey=[];rowKey=[];ref=this.colAttrs;for(l=0,len1=ref.length;l<len1;l++){x=ref[l];colKey.push((ref1=record[x])!=null?ref1:"null")}ref2=this.rowAttrs;for(n=0,len2=ref2.length;n<len2;n++){x=ref2[n];rowKey.push((ref3=record[x])!=null?ref3:"null")}flatRowKey=rowKey.join(String.fromCharCode(0));flatColKey=colKey.join(String.fromCharCode(0));this.allTotal.push(record);if(rowKey.length!==0){if(!this.rowTotals[flatRowKey]){this.rowKeys.push(rowKey);this.rowTotals[flatRowKey]=this.aggregator(this,rowKey,[])}this.rowTotals[flatRowKey].push(record)}if(colKey.length!==0){if(!this.colTotals[flatColKey]){this.colKeys.push(colKey);this.colTotals[flatColKey]=this.aggregator(this,[],colKey)}this.colTotals[flatColKey].push(record)}if(colKey.length!==0&&rowKey.length!==0){if(!this.tree[flatRowKey]){this.tree[flatRowKey]={}}if(!this.tree[flatRowKey][flatColKey]){this.tree[flatRowKey][flatColKey]=this.aggregator(this,rowKey,colKey)}return this.tree[flatRowKey][flatColKey].push(record)}};PivotData.prototype.getAggregator=function(rowKey,colKey){var agg,flatColKey,flatRowKey;flatRowKey=rowKey.join(String.fromCharCode(0));flatColKey=colKey.join(String.fromCharCode(0));if(rowKey.length===0&&colKey.length===0){agg=this.allTotal}else if(rowKey.length===0){agg=this.colTotals[flatColKey]}else if(colKey.length===0){agg=this.rowTotals[flatRowKey]}else{agg=this.tree[flatRowKey][flatColKey]}return agg!=null?agg:{value:function(){return null},format:function(){return""}}};return PivotData}();pivotTableRenderer=function(pivotData,opts){var aggregator,c,colAttrs,colKey,colKeys,defaults,i,j,r,result,rowAttrs,rowKey,rowKeys,spanSize,td,th,totalAggregator,tr,txt,val,x;defaults={localeStrings:{totals:"Totals"}};opts=$.extend(defaults,opts);colAttrs=pivotData.colAttrs;rowAttrs=pivotData.rowAttrs;rowKeys=pivotData.getRowKeys();colKeys=pivotData.getColKeys();result=document.createElement("table");result.className="pvtTable";spanSize=function(arr,i,j){var l,len,n,noDraw,ref,ref1,stop,x;if(i!==0){noDraw=true;for(x=l=0,ref=j;0<=ref?l<=ref:l>=ref;x=0<=ref?++l:--l){if(arr[i-1][x]!==arr[i][x]){noDraw=false}}if(noDraw){return-1}}len=0;while(i+len<arr.length){stop=false;for(x=n=0,ref1=j;0<=ref1?n<=ref1:n>=ref1;x=0<=ref1?++n:--n){if(arr[i][x]!==arr[i+len][x]){stop=true}}if(stop){break}len++}return len};for(j in colAttrs){if(!hasProp.call(colAttrs,j))continue;c=colAttrs[j];tr=document.createElement("tr");if(parseInt(j)===0&&rowAttrs.length!==0){th=document.createElement("th");th.setAttribute("colspan",rowAttrs.length);th.setAttribute("rowspan",colAttrs.length);tr.appendChild(th)}th=document.createElement("th");th.className="pvtAxisLabel";th.textContent=c;tr.appendChild(th);for(i in colKeys){if(!hasProp.call(colKeys,i))continue;colKey=colKeys[i];x=spanSize(colKeys,parseInt(i),parseInt(j));if(x!==-1){th=document.createElement("th");th.className="pvtColLabel";th.textContent=colKey[j];th.setAttribute("colspan",x);if(parseInt(j)===colAttrs.length-1&&rowAttrs.length!==0){th.setAttribute("rowspan",2)}tr.appendChild(th)}}if(parseInt(j)===0){th=document.createElement("th");th.className="pvtTotalLabel";th.innerHTML=opts.localeStrings.totals;th.setAttribute("rowspan",colAttrs.length+(rowAttrs.length===0?0:1));tr.appendChild(th)}result.appendChild(tr)}if(rowAttrs.length!==0){tr=document.createElement("tr");for(i in rowAttrs){if(!hasProp.call(rowAttrs,i))continue;r=rowAttrs[i];th=document.createElement("th");th.className="pvtAxisLabel";th.textContent=r;tr.appendChild(th)}th=document.createElement("th");if(colAttrs.length===0){th.className="pvtTotalLabel";th.innerHTML=opts.localeStrings.totals}tr.appendChild(th);result.appendChild(tr)}for(i in rowKeys){if(!hasProp.call(rowKeys,i))continue;rowKey=rowKeys[i];tr=document.createElement("tr");for(j in rowKey){if(!hasProp.call(rowKey,j))continue;txt=rowKey[j];x=spanSize(rowKeys,parseInt(i),parseInt(j));if(x!==-1){th=document.createElement("th");th.className="pvtRowLabel";th.textContent=txt;th.setAttribute("rowspan",x);if(parseInt(j)===rowAttrs.length-1&&colAttrs.length!==0){th.setAttribute("colspan",2)}tr.appendChild(th)}}for(j in colKeys){if(!hasProp.call(colKeys,j))continue;colKey=colKeys[j];aggregator=pivotData.getAggregator(rowKey,colKey);val=aggregator.value();td=document.createElement("td");td.className="pvtVal row"+i+" col"+j;td.innerHTML=aggregator.format(val);td.setAttribute("data-value",val);tr.appendChild(td)}totalAggregator=pivotData.getAggregator(rowKey,[]);val=totalAggregator.value();td=document.createElement("td");td.className="pvtTotal rowTotal";td.innerHTML=totalAggregator.format(val);td.setAttribute("data-value",val);td.setAttribute("data-for","row"+i);tr.appendChild(td);result.appendChild(tr)}tr=document.createElement("tr");th=document.createElement("th");th.className="pvtTotalLabel";th.innerHTML=opts.localeStrings.totals;th.setAttribute("colspan",rowAttrs.length+(colAttrs.length===0?0:1));tr.appendChild(th);for(j in colKeys){if(!hasProp.call(colKeys,j))continue;colKey=colKeys[j];totalAggregator=pivotData.getAggregator([],colKey);val=totalAggregator.value();td=document.createElement("td");td.className="pvtTotal colTotal";td.innerHTML=totalAggregator.format(val);td.setAttribute("data-value",val);td.setAttribute("data-for","col"+j);tr.appendChild(td)}totalAggregator=pivotData.getAggregator([],[]);val=totalAggregator.value();td=document.createElement("td");td.className="pvtGrandTotal";td.innerHTML=totalAggregator.format(val);td.setAttribute("data-value",val);tr.appendChild(td);result.appendChild(tr);result.setAttribute("data-numrows",rowKeys.length);result.setAttribute("data-numcols",colKeys.length);return result};$.fn.pivot=function(input,opts){var defaults,e,pivotData,result,x;defaults={cols:[],rows:[],filter:function(){return true},aggregator:aggregatorTemplates.count()(),aggregatorName:"Count",derivedAttributes:{},renderer:pivotTableRenderer,rendererOptions:null,localeStrings:locales.en.localeStrings};opts=$.extend(defaults,opts);result=null;try{pivotData=new PivotData(input,opts);try{result=opts.renderer(pivotData,opts.rendererOptions)}catch(_error){e=_error;if(typeof console!=="undefined"&&console!==null){console.error(e.stack)}result=$("<span>").html(opts.localeStrings.renderError)}}catch(_error){e=_error;if(typeof console!=="undefined"&&console!==null){console.error(e.stack)}result=$("<span>").html(opts.localeStrings.computeError)}x=this[0];while(x.hasChildNodes()){x.removeChild(x.lastChild)}return this.append(result)};$.fn.pivotUI=function(input,inputOpts,overwrite,locale){var a,aggregator,attrLength,axisValues,c,colList,defaults,e,existingOpts,fn,i,initialRender,k,l,len1,len2,len3,len4,n,o,opts,pivotTable,q,ref,ref1,ref2,ref3,ref4,refresh,refreshDelayed,renderer,rendererControl,shownAttributes,tblCols,tr1,tr2,uiTable,unusedAttrsVerticalAutoOverride,x;if(overwrite==null){overwrite=false}if(locale==null){locale="en"}defaults={derivedAttributes:{},aggregators:locales[locale].aggregators,renderers:locales[locale].renderers,hiddenAttributes:[],menuLimit:200,cols:[],rows:[],vals:[],exclusions:{},unusedAttrsVertical:"auto",autoSortUnusedAttrs:false,rendererOptions:{localeStrings:locales[locale].localeStrings},onRefresh:null,filter:function(){return true},localeStrings:locales[locale].localeStrings};existingOpts=this.data("pivotUIOptions");if(existingOpts==null||overwrite){opts=$.extend(defaults,inputOpts)}else{opts=existingOpts}try{input=PivotData.convertToArray(input);tblCols=function(){var ref,results;ref=input[0];results=[];for(k in ref){if(!hasProp.call(ref,k))continue;results.push(k)}return results}();ref=opts.derivedAttributes;for(c in ref){if(!hasProp.call(ref,c))continue;if(indexOf.call(tblCols,c)<0){tblCols.push(c)}}axisValues={};for(l=0,len1=tblCols.length;l<len1;l++){x=tblCols[l];axisValues[x]={}}PivotData.forEachRecord(input,opts.derivedAttributes,function(record){var base,results,v;results=[];for(k in record){if(!hasProp.call(record,k))continue;v=record[k];if(!opts.filter(record)){continue}if(v==null){v="null"}if((base=axisValues[k])[v]==null){base[v]=0}results.push(axisValues[k][v]++)}return results});uiTable=$("<table cellpadding='5'>");rendererControl=$("<td>");renderer=$("<select class='pvtRenderer'>").appendTo(rendererControl).bind("change",function(){return refresh()});ref1=opts.renderers;for(x in ref1){if(!hasProp.call(ref1,x))continue;$("<option>").val(x).html(x).appendTo(renderer)}colList=$("<td class='pvtAxisContainer pvtUnused'>");shownAttributes=function(){var len2,n,results;results=[];for(n=0,len2=tblCols.length;n<len2;n++){c=tblCols[n];if(indexOf.call(opts.hiddenAttributes,c)<0){results.push(c)}}return results}();unusedAttrsVerticalAutoOverride=false;if(opts.unusedAttrsVertical==="auto"){attrLength=0;for(n=0,len2=shownAttributes.length;n<len2;n++){a=shownAttributes[n];attrLength+=a.length}unusedAttrsVerticalAutoOverride=attrLength>120}if(opts.unusedAttrsVertical===true||unusedAttrsVerticalAutoOverride){colList.addClass("pvtVertList")}else{colList.addClass("pvtHorizList")}fn=function(c){var attrElem,btns,checkContainer,filterItem,filterItemExcluded,hasExcludedItem,keys,len3,o,ref2,showFilterList,triangleLink,updateFilter,v,valueList,valueListCtr;keys=function(){var results;results=[];for(k in axisValues[c]){results.push(k)}return results}();hasExcludedItem=false;valueList=$("<div>").addClass("pvtFilterBox").hide();valueList.append($("<h4>").text(c+" ("+keys.length+")"));if(keys.length>opts.menuLimit){valueList.append($("<p>").html(opts.localeStrings.tooMany))}else{btns=$("<p>").appendTo(valueList);btns.append($("<button>").html(opts.localeStrings.selectAll).bind("click",function(){return valueList.find("input:visible").prop("checked",true)}));btns.append($("<button>").html(opts.localeStrings.selectNone).bind("click",function(){return valueList.find("input:visible").prop("checked",false)}));btns.append($("<input>").addClass("pvtSearch").attr("placeholder",opts.localeStrings.filterResults).bind("keyup",function(){var filter;filter=$(this).val().toLowerCase();return $(this).parents(".pvtFilterBox").find("label span").each(function(){var testString;testString=$(this).text().toLowerCase().indexOf(filter);if(testString!==-1){return $(this).parent().show()}else{return $(this).parent().hide()}})}));checkContainer=$("<div>").addClass("pvtCheckContainer").appendTo(valueList);ref2=keys.sort(naturalSort);for(o=0,len3=ref2.length;o<len3;o++){k=ref2[o];v=axisValues[c][k];filterItem=$("<label>");filterItemExcluded=opts.exclusions[c]?indexOf.call(opts.exclusions[c],k)>=0:false;hasExcludedItem||(hasExcludedItem=filterItemExcluded);$("<input type='checkbox' class='pvtFilter'>").attr("checked",!filterItemExcluded).data("filter",[c,k]).appendTo(filterItem);filterItem.append($("<span>").text(k+" ("+v+")"));checkContainer.append($("<p>").append(filterItem))}}updateFilter=function(){var unselectedCount;unselectedCount=$(valueList).find("[type='checkbox']").length-$(valueList).find("[type='checkbox']:checked").length;if(unselectedCount>0){attrElem.addClass("pvtFilteredAttribute")}else{attrElem.removeClass("pvtFilteredAttribute")}if(keys.length>opts.menuLimit){return valueList.toggle()}else{return valueList.toggle(0,refresh)}};$("<p>").appendTo(valueList).append($("<button>").text("OK").bind("click",updateFilter));showFilterList=function(e){valueList.toggle();$(".pvtSearch").val("");return $("label").show()};triangleLink=$("<span class='pvtTriangle'>").html(" &#x25BE;").bind("click",showFilterList);attrElem=$("<li class='axis_"+i+" pvtColLI'>").append($("<span class='pvtAttr'>").text(c).data("attrName",c).append(triangleLink));if(hasExcludedItem){attrElem.addClass("pvtFilteredAttribute")}colList.append(attrElem);valueListCtr=$("<div class='pvtFilterBoxCtr'>").append(valueList);attrElem.append(valueListCtr);return attrElem.bind("dblclick",showFilterList)};for(i in shownAttributes){c=shownAttributes[i];fn(c)}tr1=$("<tr>").appendTo(uiTable);aggregator=$("<select class='pvtAggregator'>").bind("change",function(){return refresh()});ref2=opts.aggregators;for(x in ref2){if(!hasProp.call(ref2,x))continue;aggregator.append($("<option>").val(x).html(x))}$("<td class='pvtVals'>").appendTo(tr1).append(aggregator).append($("<br>"));$("<td class='pvtAxisContainer pvtHorizList pvtCols'>").appendTo(tr1);tr2=$("<tr>").appendTo(uiTable);tr2.append($("<td valign='top' class='pvtAxisContainer pvtRows'>"));pivotTable=$("<td valign='top' class='pvtRendererArea'>").appendTo(tr2);if(opts.unusedAttrsVertical===true||unusedAttrsVerticalAutoOverride){uiTable.find("tr:nth-child(1)").prepend(rendererControl);uiTable.find("tr:nth-child(2)").prepend(colList)}else{uiTable.prepend($("<tr>").append(rendererControl).append(colList))}this.html(uiTable);ref3=opts.cols;for(o=0,len3=ref3.length;o<len3;o++){x=ref3[o];this.find(".pvtCols").append(this.find(".axis_"+shownAttributes.indexOf(x)))}ref4=opts.rows;for(q=0,len4=ref4.length;q<len4;q++){x=ref4[q];this.find(".pvtRows").append(this.find(".axis_"+shownAttributes.indexOf(x)))}if(opts.aggregatorName!=null){this.find(".pvtAggregator").val(opts.aggregatorName)}if(opts.rendererName!=null){this.find(".pvtRenderer").val(opts.rendererName)}initialRender=true;refreshDelayed=function(_this){return function(){var attr,exclusions,len5,natSort,newDropdown,numInputsToProcess,pivotUIOptions,pvtVals,ref5,ref6,s,subopts,t,unusedAttrsContainer,vals;subopts={derivedAttributes:opts.derivedAttributes,localeStrings:opts.localeStrings,rendererOptions:opts.rendererOptions,cols:[],rows:[]};numInputsToProcess=(ref5=opts.aggregators[aggregator.val()]([])().numInputs)!=null?ref5:0;vals=[];_this.find(".pvtRows li span.pvtAttr").each(function(){return subopts.rows.push($(this).data("attrName"))});_this.find(".pvtCols li span.pvtAttr").each(function(){return subopts.cols.push($(this).data("attrName"))});_this.find(".pvtVals select.pvtAttrDropdown").each(function(){if(numInputsToProcess===0){return $(this).remove()}else{numInputsToProcess--;if($(this).val()!==""){return vals.push($(this).val())}}});if(numInputsToProcess!==0){pvtVals=_this.find(".pvtVals");for(x=s=0,ref6=numInputsToProcess;0<=ref6?s<ref6:s>ref6;x=0<=ref6?++s:--s){newDropdown=$("<select class='pvtAttrDropdown'>").append($("<option>")).bind("change",function(){return refresh()});for(t=0,len5=shownAttributes.length;t<len5;t++){attr=shownAttributes[t];newDropdown.append($("<option>").val(attr).text(attr))}pvtVals.append(newDropdown)}}if(initialRender){vals=opts.vals;i=0;_this.find(".pvtVals select.pvtAttrDropdown").each(function(){$(this).val(vals[i]);return i++});initialRender=false}subopts.aggregatorName=aggregator.val();subopts.vals=vals;subopts.aggregator=opts.aggregators[aggregator.val()](vals);subopts.renderer=opts.renderers[renderer.val()];exclusions={};_this.find("input.pvtFilter").not(":checked").each(function(){var filter;filter=$(this).data("filter");if(exclusions[filter[0]]!=null){return exclusions[filter[0]].push(filter[1])}else{return exclusions[filter[0]]=[filter[1]]}});subopts.filter=function(record){var excludedItems,ref7;if(!opts.filter(record)){return false}for(k in exclusions){excludedItems=exclusions[k];if(ref7=""+record[k],indexOf.call(excludedItems,ref7)>=0){return false}}return true};pivotTable.pivot(input,subopts);pivotUIOptions=$.extend(opts,{cols:subopts.cols,rows:subopts.rows,vals:vals,exclusions:exclusions,aggregatorName:aggregator.val(),rendererName:renderer.val()});_this.data("pivotUIOptions",pivotUIOptions);if(opts.autoSortUnusedAttrs){natSort=$.pivotUtilities.naturalSort;unusedAttrsContainer=_this.find("td.pvtUnused.pvtAxisContainer");$(unusedAttrsContainer).children("li").sort(function(a,b){return natSort($(a).text(),$(b).text())}).appendTo(unusedAttrsContainer)}pivotTable.css("opacity",1);if(opts.onRefresh!=null){return opts.onRefresh(pivotUIOptions)}}}(this);refresh=function(_this){return function(){pivotTable.css("opacity",.5);return setTimeout(refreshDelayed,10)}}(this);refresh();this.find(".pvtAxisContainer").sortable({update:function(e,ui){if(ui.sender==null){return refresh()}},connectWith:this.find(".pvtAxisContainer"),items:"li",placeholder:"pvtPlaceholder"})}catch(_error){e=_error;if(typeof console!=="undefined"&&console!==null){console.error(e.stack)}this.html(opts.localeStrings.uiRenderError)}return this};$.fn.heatmap=function(scope){var colorGen,heatmapper,i,j,l,n,numCols,numRows,ref,ref1;if(scope==null){scope="heatmap"}numRows=this.data("numrows");numCols=this.data("numcols");colorGen=function(color,min,max){var hexGen;hexGen=function(){switch(color){case"red":return function(hex){return"ff"+hex+hex};case"green":return function(hex){return hex+"ff"+hex};case"blue":return function(hex){return""+hex+hex+"ff"}}}();return function(x){var hex,intensity;intensity=255-Math.round(255*(x-min)/(max-min));hex=intensity.toString(16).split(".")[0];if(hex.length===1){hex=0+hex}return hexGen(hex)}};heatmapper=function(_this){return function(scope,color){var colorFor,forEachCell,values;forEachCell=function(f){return _this.find(scope).each(function(){var x;x=$(this).data("value");if(x!=null&&isFinite(x)){return f(x,$(this))}})};values=[];forEachCell(function(x){return values.push(x)});colorFor=colorGen(color,Math.min.apply(Math,values),Math.max.apply(Math,values));return forEachCell(function(x,elem){return elem.css("background-color","#"+colorFor(x))})}}(this);switch(scope){case"heatmap":heatmapper(".pvtVal","red");break;case"rowheatmap":for(i=l=0,ref=numRows;0<=ref?l<ref:l>ref;i=0<=ref?++l:--l){heatmapper(".pvtVal.row"+i,"red")}break;case"colheatmap":for(j=n=0,ref1=numCols;0<=ref1?n<ref1:n>ref1;j=0<=ref1?++n:--n){heatmapper(".pvtVal.col"+j,"red")}}heatmapper(".pvtTotal.rowTotal","red");heatmapper(".pvtTotal.colTotal","red");return this};return $.fn.barchart=function(){var barcharter,i,l,numCols,numRows,ref;numRows=this.data("numrows");numCols=this.data("numcols");barcharter=function(_this){return function(scope){var forEachCell,max,scaler,values;forEachCell=function(f){return _this.find(scope).each(function(){var x;x=$(this).data("value");if(x!=null&&isFinite(x)){return f(x,$(this))}})};values=[];forEachCell(function(x){return values.push(x)});max=Math.max.apply(Math,values);scaler=function(x){return 100*x/(1.4*max)};return forEachCell(function(x,elem){var text,wrapper;text=elem.text();wrapper=$("<div>").css({position:"relative",height:"55px"});wrapper.append($("<div>").css({position:"absolute",bottom:0,left:0,right:0,height:scaler(x)+"%","background-color":"gray"}));wrapper.append($("<div>").text(text).css({position:"relative","padding-left":"5px","padding-right":"5px"}));return elem.css({padding:0,"padding-top":"5px","text-align":"center"}).html(wrapper)})}}(this);for(i=l=0,ref=numRows;0<=ref?l<ref:l>ref;i=0<=ref?++l:--l){barcharter(".pvtVal.row"+i)}barcharter(".pvtTotal.colTotal");return this}})}).call(this);
@libreliodev
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment