pivottable
Version:
Javascript Pivot Table (aka Pivot Grid, Pivot Chart, Cross-Tab) implementation with drag'n'drop
3 lines (2 loc) • 15.3 kB
JavaScript
(function(){var t,e;t=[["name","gender","colour","birthday","trials","successes"],["Nick","male","blue","1982-11-07",103,12],["Jane","female","red","1982-11-08",95,25],["John","male","blue","1982-12-08",112,30],["Carol","female","yellow","1983-12-08",102,14]],e=[{name:"Nick",colour:"red",age:34},{name:"Jane",gender:"female"},{name:"John",gender:"male",age:12},{name:"Jim",gender:null,age:12}],describe("$.pivotUI()",function(){return describe("with no rows/cols, default count aggregator, default TableRenderer",function(){var e;return e=null,beforeEach(function(r){return e=$("<div>").pivotUI(t,{onRefresh:r})}),it("has all the basic UI elements",function(t){return expect(e.find("td.pvtAxisContainer").length).toBe(3),expect(e.find("td.pvtRendererArea").length).toBe(1),expect(e.find("td.pvtVals").length).toBe(1),expect(e.find("select.pvtRenderer").length).toBe(1),expect(e.find("select.pvtAggregator").length).toBe(1),expect(e.find("span.pvtAttr").length).toBe(6),t()}),it("reflects its inputs",function(t){return expect(e.find("td.pvtUnused span.pvtAttr").length).toBe(6),expect(e.find("select.pvtRenderer").val()).toBe("Table"),expect(e.find("select.pvtAggregator").val()).toBe("Count"),t()}),it("renders a table",function(t){return expect(e.find("table.pvtTable").length).toBe(1),t()}),describe("its renderer output",function(){return it("has the correct type and number of cells",function(t){return expect(e.find("th.pvtTotalLabel").length).toBe(1),expect(e.find("td.pvtGrandTotal").length).toBe(1),t()}),it("has the correct textual representation",function(t){return expect(e.find("table.pvtTable").text()).toBe(["Totals","4"].join("")),t()}),it("has a correct grand total with data value",function(t){return expect(e.find("td.pvtGrandTotal").text()).toBe("4"),expect(e.find("td.pvtGrandTotal").data("value")).toBe(4),t()})})}),describe("with rows/cols, sum-over-sum aggregator, Heatmap renderer",function(){var e;return e=null,beforeEach(function(r){return e=$("<div>").pivotUI(t,{rows:["gender"],cols:["colour"],aggregatorName:"Sum over Sum",vals:["successes","trials"],rendererName:"Heatmap",onRefresh:r})}),it("has all the basic UI elements",function(t){return expect(e.find("td.pvtAxisContainer").length).toBe(3),expect(e.find("td.pvtRendererArea").length).toBe(1),expect(e.find("td.pvtVals").length).toBe(1),expect(e.find("select.pvtRenderer").length).toBe(1),expect(e.find("select.pvtAggregator").length).toBe(1),expect(e.find("span.pvtAttr").length).toBe(6),t()}),it("reflects its inputs",function(t){return expect(e.find("td.pvtUnused span.pvtAttr").length).toBe(4),expect(e.find("td.pvtRows span.pvtAttr").length).toBe(1),expect(e.find("td.pvtCols span.pvtAttr").length).toBe(1),expect(e.find("select.pvtRenderer").val()).toBe("Heatmap"),expect(e.find("select.pvtAggregator").val()).toBe("Sum over Sum"),t()}),it("renders a table",function(t){return expect(e.find("table.pvtTable").length).toBe(1),t()}),describe("its renderer output",function(){return it("has the correct type and number of cells",function(t){return expect(e.find("th.pvtAxisLabel").length).toBe(2),expect(e.find("th.pvtRowLabel").length).toBe(2),expect(e.find("th.pvtColLabel").length).toBe(3),expect(e.find("th.pvtTotalLabel").length).toBe(2),expect(e.find("td.pvtVal").length).toBe(6),expect(e.find("td.pvtTotal").length).toBe(5),expect(e.find("td.pvtGrandTotal").length).toBe(1),t()}),it("has the correct textual representation",function(t){return expect(e.find("table.pvtTable").text()).toBe(["colour","blue","red","yellow","Totals","gender","female","0.26","0.14","0.20","male","0.20","0.20","Totals","0.20","0.26","0.14","0.20"].join("")),t()}),it("has a correct spot-checked cell with data value",function(t){return expect(e.find("td.col0.row1").text()).toBe("0.20"),expect(e.find("td.col0.row1").data("value")).toBe(42/215),t()})})}),describe("with ragged input",function(){var t;return t=$("<div>").pivotUI(e,{rows:["gender"],cols:["age"]}),it("renders a table with the correct textual representation",function(){return expect(t.find("table.pvtTable").text()).toBe(["age","12","34","null","Totals","gender","female","1","1","male","1","1","null","1","1","2","Totals","2","1","1","4"].join(""))})})}),describe("$.pivot()",function(){return describe("with no rows/cols, default count aggregator, default TableRenderer",function(){var e;return e=$("<div>").pivot(t),it("renders a table",function(){return expect(e.find("table.pvtTable").length).toBe(1)}),describe("its renderer output",function(){return it("has the correct textual representation",function(){return expect(e.find("table.pvtTable").text()).toBe(["Totals","4"].join(""))}),it("has a correct grand total with data value",function(){return expect(e.find("td.pvtGrandTotal").text()).toBe("4"),expect(e.find("td.pvtGrandTotal").data("value")).toBe(4)})})}),describe("with rows/cols, sum aggregator, derivedAttributes, filter and sorters",function(){var e,r,n,a,o;return n=$.pivotUtilities,a=n.sortAs,r=n.derivers,e=n.aggregators,o=$("<div>").pivot(t,{rows:["gender"],cols:["birthyear"],aggregator:e.Sum(["trialbins"]),filter:function(t){return"Nick"!==t.name},derivedAttributes:{birthyear:r.dateFormat("birthday","%y"),trialbins:r.bin("trials",10)},sorters:function(t){if("gender"===t)return a(["male","female"])}}),it("renders a table with the correct textual representation",function(){return expect(o.find("table.pvtTable").text()).toBe(["birthyear","1982","1983","Totals","gender","male","110.00","110.00","female","90.00","100.00","190.00","Totals","200.00","100.00","300.00"].join(""))})}),describe("with rows/cols, fraction-of aggregator",function(){var e,r;return e=$.pivotUtilities.aggregators,r=$("<div>").pivot(t,{rows:["gender"],aggregator:e["Sum as Fraction of Total"](["trials"])}),it("renders a table with the correct textual representation",function(){return expect(r.find("table.pvtTable").text()).toBe(["gender","Totals","female","47.8%","male","52.2%","Totals","100.0%"].join(""))})}),describe("with rows/cols, custom aggregator, custom renderer with options",function(){var e,r,n;return e=null,r=null,n=$("<div>").pivot(t,{rows:["name","colour"],cols:["trials","successes"],aggregator:function(){return{count2x:0,push:function(){return this.count2x+=2},value:function(){return this.count2x},format:function(t){return"formatted "+t}}},renderer:function(t,n){return e=t,r=n,$("<div>").addClass(n.greeting).text("world")},rendererOptions:{greeting:"hithere"}}),it("renders the custom renderer as per options",function(){return expect(n.find("div.hithere").length).toBe(1)}),describe("its received PivotData object",function(){return it("has a correct grand total value and format for custom aggregator",function(){var t,r;return t=e.getAggregator([],[]),r=t.value(),expect(r).toBe(8),expect(t.format(r)).toBe("formatted 8")})})}),describe("with ragged input",function(){var t;return t=$("<div>").pivot(e,{rows:["gender"],cols:["age"]}),it("renders a table with the correct textual representation",function(){return expect(t.find("table.pvtTable").text()).toBe(["age","12","34","null","Totals","gender","female","1","1","male","1","1","null","1","1","2","Totals","2","1","1","4"].join(""))})})}),describe("$.pivotUtilities",function(){return describe(".PivotData()",function(){var e;return e={aggregator:$.pivotUtilities.aggregators["Sum over Sum"](["a","b"])},describe("with no options",function(){var t,e;return t=[["a","b"],[1,2],[3,4]],e=new $.pivotUtilities.PivotData(t),it("has the correct grand total value",function(){return expect(e.getAggregator([],[]).value()).toBe(2)})}),describe("with array-of-array input",function(){var t,r;return t=[["a","b"],[1,2],[3,4]],r=new $.pivotUtilities.PivotData(t,e),it("has the correct grand total value",function(){return expect(r.getAggregator([],[]).value()).toBe(4/6)})}),describe("with array-of-object input",function(){var t,r;return t=[{a:1,b:2},{a:3,b:4}],r=new $.pivotUtilities.PivotData(t,e),it("has the correct grand total value",function(){return expect(r.getAggregator([],[]).value()).toBe(4/6)})}),describe("with ragged array-of-object input",function(){var t,r;return r=[{a:1},{b:4},{a:3,b:2}],t=new $.pivotUtilities.PivotData(r,e),it("has the correct grand total value",function(){return expect(t.getAggregator([],[]).value()).toBe(4/6)})}),describe("with function input",function(){var t,r;return t=function(t){return t({a:1,b:2}),t({a:3,b:4})},r=new $.pivotUtilities.PivotData(t,e),it("has the correct grand total value",function(){return expect(r.getAggregator([],[]).value()).toBe(4/6)})}),describe("with jQuery table element input",function(){var t,r;return r=$("<table>\n <thead>\n <tr> <th>a</th><th>b</th> </tr>\n </thead>\n <tbody>\n <tr> <td>1</td> <td>2</td> </tr>\n <tr> <td>3</td> <td>4</td> </tr>\n </tbody>\n</table>"),t=new $.pivotUtilities.PivotData(r,e),it("has the correct grand total value",function(){return expect(t.getAggregator([],[]).value()).toBe(4/6)})}),describe("with rows/cols",function(){var e;return e=new $.pivotUtilities.PivotData(t,{rows:["name","colour"],cols:["trials","successes"]}),it("has correctly-ordered row keys",function(){return expect(e.getRowKeys()).toEqual([["Carol","yellow"],["Jane","red"],["John","blue"],["Nick","blue"]])}),it("has correctly-ordered col keys",function(){return expect(e.getColKeys()).toEqual([[95,25],[102,14],[103,12],[112,30]])}),it("can be iterated over",function(){var t,r,n,a,o,i,c,u,s,l;for(i=0,c=0,s=e.getRowKeys(),r=0,a=s.length;r<a;r++)for(u=s[r],l=e.getColKeys(),n=0,o=l.length;n<o;n++)t=l[n],null!=e.getAggregator(u,t).value()?i++:c++;return expect(i).toBe(4),expect(c).toBe(12)}),it("returns matching records",function(){var t;return t=[],e.forEachMatchingRecord({gender:"male"},function(e){return t.push(e.name)}),expect(t).toEqual(["Nick","John"])}),it("has a correct spot-checked aggregator",function(){var t,r;return t=e.getAggregator(["Carol","yellow"],[102,14]),r=t.value(),expect(r).toBe(1),expect(t.format(r)).toBe("1")}),it("has a correct grand total aggregator",function(){var t,r;return t=e.getAggregator([],[]),r=t.value(),expect(r).toBe(4),expect(t.format(r)).toBe("4")})})}),describe(".aggregatorTemplates",function(){var e,r;return e=function(e){var r;return r=new $.pivotUtilities.PivotData(t,{aggregator:e}),r.getAggregator([],[]).value()},r=$.pivotUtilities.aggregatorTemplates,describe(".count",function(){return it("works",function(){return expect(e(r.count()())).toBe(4)})}),describe(".countUnique",function(){return it("works",function(){return expect(e(r.countUnique()(["gender"]))).toBe(2)})}),describe(".listUnique",function(){return it("works",function(){return expect(e(r.listUnique()(["gender"]))).toBe("male,female")})}),describe(".average",function(){return it("works",function(){return expect(e(r.average()(["trials"]))).toBe(103)})}),describe(".sum",function(){return it("works",function(){return expect(e(r.sum()(["trials"]))).toBe(412)})}),describe(".min",function(){return it("works",function(){return expect(e(r.min()(["trials"]))).toBe(95)})}),describe(".max",function(){return it("works",function(){return expect(e(r.max()(["trials"]))).toBe(112)})}),describe(".first",function(){return it("works",function(){return expect(e(r.first()(["name"]))).toBe("Carol")})}),describe(".last",function(){return it("works",function(){return expect(e(r.last()(["name"]))).toBe("Nick")})}),describe(".average",function(){return it("works",function(){return expect(e(r.average()(["trials"]))).toBe(103)})}),describe(".median",function(){return it("works",function(){return expect(e(r.median()(["trials"]))).toBe(102.5)})}),describe(".quantile",function(){return it("works",function(){return expect(e(r.quantile(0)(["trials"]))).toBe(95),expect(e(r.quantile(.1)(["trials"]))).toBe(98.5),expect(e(r.quantile(.25)(["trials"]))).toBe(98.5),expect(e(r.quantile(1/3)(["trials"]))).toBe(102),expect(e(r.quantile(1)(["trials"]))).toBe(112)})}),describe(".var",function(){return it("works",function(){return expect(e(r["var"]()(["trials"]))).toBe(48.666666666666686)})}),describe(".stdev",function(){return it("works",function(){return expect(e(r.stdev()(["trials"]))).toBe(6.976149845485451)})}),describe(".sumOverSum",function(){return it("works",function(){return expect(e(r.sumOverSum()(["successes","trials"]))).toBe(81/412)})})}),describe(".naturalSort()",function(){var t,e;return t=$.pivotUtilities.naturalSort,e=[null,NaN,-Infinity,"-Infinity",-3,"-3",-2,"-2",-1,"-1",0,"2e-1",1,"01","1",2,"002","002e0","02","2","2e-0",3,10,"10","11","12","1e2","112",Infinity,"Infinity","1a","2a","12a","20a","A","A","NaN","a","a","a01","a012","a02","a1","a2","a12","a12","a21","a21","b","c","d","null"],it("sorts naturally (null, NaN, numbers & numbery strings, Alphanum for text strings)",function(){return expect(e.slice().sort(t)).toEqual(e)})}),describe(".sortAs()",function(){var t;return t=$.pivotUtilities.sortAs,it("sorts with unknown values sorted at the end",function(){return expect([5,2,3,4,1].sort(t([4,3,2]))).toEqual([4,3,2,1,5])}),it("sorts lowercase after uppercase",function(){return expect(["Ab","aA","aa","ab"].sort(t(["Ab","Aa"]))).toEqual(["Ab","ab","aa","aA"])})}),describe(".numberFormat()",function(){var t;return t=$.pivotUtilities.numberFormat,it("formats numbers",function(){var e;return e=t(),expect(e(1234567.89123456)).toEqual("1,234,567.89")}),it("formats booleans",function(){var e;return e=t(),expect(e(!0)).toEqual("1.00")}),it("formats numbers in strings",function(){var e;return e=t(),expect(e("1234567.89123456")).toEqual("1,234,567.89")}),it("doesn't formats strings",function(){var e;return e=t(),expect(e("hi there")).toEqual("")}),it("doesn't formats objects",function(){var e;return e=t(),expect(e({a:1})).toEqual("")}),it("formats percentages",function(){var e;return e=t({scaler:100,suffix:"%"}),expect(e(.12345)).toEqual("12.35%")}),it("adds separators",function(){var e;return e=t({thousandsSep:"a",decimalSep:"b"}),expect(e(1234567.89123456)).toEqual("1a234a567b89")}),it("adds prefixes and suffixes",function(){var e;return e=t({prefix:"a",suffix:"b"}),expect(e(1234567.89123456)).toEqual("a1,234,567.89b")}),it("scales and rounds",function(){var e;return e=t({digitsAfterDecimal:3,scaler:1e3}),expect(e(1234567.89123456)).toEqual("1,234,567,891.235")})}),describe(".derivers",function(){return describe(".dateFormat()",function(){var t;return t=$.pivotUtilities.derivers.dateFormat("x","abc % %% %%% %a %y %m %n %d %w %x %H %M %S",!0),it("formats date objects",function(){return expect(t({x:new Date("2015-01-02T23:43:11Z")})).toBe("abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11")}),it("formats input parsed by Date.parse()",function(){return expect(t({x:"2015-01-02T23:43:11Z"})).toBe("abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11"),expect(t({x:"bla"})).toBe("")})}),describe(".bin()",function(){var t;return t=$.pivotUtilities.derivers.bin("x",10),it("bins numbers",function(){return expect(t({x:11})).toBe(10),expect(t({x:9})).toBe(0),expect(t({x:111})).toBe(110)}),it("bins booleans",function(){return expect(t({x:!0})).toBe(0)}),it("bins negative numbers",function(){return expect(t({x:-12})).toBe(-10)}),it("doesn't bin strings",function(){return expect(t({x:"a"})).toBeNaN()}),it("doesn't bin objects",function(){return expect(t({x:{a:1}})).toBeNaN()})})})})}).call(this);
//# sourceMappingURL=pivot_spec.min.js.map