Statistician.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. MWF.xApplication.query = MWF.xApplication.query || {};
  2. MWF.xApplication.query.Query = MWF.xApplication.query.Query || {};
  3. MWF.require("MWF.widget.Common", null, false);
  4. MWF.require("MWF.xScript.Macro", null, false);
  5. MWF.xDesktop.requireApp("query.Query", "lp.zh-cn", null, false);
  6. MWF.xApplication.query.Query.Statistician = MWF.QStatistician = new Class({
  7. Implements: [Options, Events],
  8. Extends: MWF.widget.Common,
  9. options: {
  10. "style": "default",
  11. "resizeNode": true
  12. },
  13. initialize: function(app, container, json, options){
  14. this.setOptions(options);
  15. this.path = "/x_component_query_Query/$Statistician/";
  16. this.cssPath = "/x_component_query_Query/$Statistician/"+this.options.style+"/css.wcss";
  17. this._loadCss();
  18. this.lp = MWF.xApplication.query.Query.LP;
  19. this.app = app;
  20. this.container = $(container);
  21. this.json = json;
  22. this.statJson = null;
  23. this.gridJson = null;
  24. this.load();
  25. },
  26. load: function(){
  27. this.loadLayout();
  28. this.loadStatData();
  29. },
  30. loadLayout: function(){
  31. this.node = new Element("div", {"styles": this.css.node}).inject(this.container);
  32. //if (this.json.isChart) this.chartAreaNode = new Element("div", {"styles": this.css.statChartAreaNode}).inject(this.node);
  33. //if (this.json.isTable) this.tableAreaNode = new Element("div", {"styles": this.css.statTableAreaNode}).inject(this.node);
  34. },
  35. createLoadding: function(){
  36. this.node.empty();
  37. this.loadingAreaNode = new Element("div", {"styles": this.css.viewLoadingAreaNode}).inject(this.node);
  38. new Element("div", {"styles": {"height": "5px"}}).inject(this.loadingAreaNode);
  39. var loadingNode = new Element("div", {"styles": this.css.viewLoadingNode}).inject(this.loadingAreaNode);
  40. new Element("div", {"styles": this.css.viewLoadingIconNode}).inject(loadingNode);
  41. var loadingTextNode = new Element("div", {"styles": this.css.viewLoadingTextNode}).inject(loadingNode);
  42. loadingTextNode.set("text", "loading...");
  43. },
  44. loadStatData: function(node){
  45. this.createLoadding();
  46. MWF.Actions.get("x_query_assemble_surface").loadStat(this.json.statName, this.json.application, null, function(json){
  47. if (this.loadingAreaNode){
  48. this.loadingAreaNode.destroy();
  49. this.loadingAreaNode = null;
  50. }
  51. if (json.data.calculate.isGroup){
  52. this.stat = new MWF.xApplication.query.Query.Statistician.GroupStat(this, json.data);
  53. }else{
  54. this.stat = new MWF.xApplication.query.Query.Statistician.Stat(this, json.data);
  55. }
  56. this.fireEvent("loaded");
  57. }.bind(this));
  58. }
  59. });
  60. MWF.xApplication.query.Query.Statistician.Stat = new Class({
  61. initialize: function(statistician, data){
  62. //this.explorer = explorer;
  63. this.statistician = statistician;
  64. this.json = this.statistician.json;
  65. this.data = data;
  66. this.css = this.statistician.css;
  67. this.lp = this.statistician.lp;
  68. this.node = this.statistician.node;
  69. this.load();
  70. },
  71. load: function(){
  72. if (this.json.isChart) this.chartAreaNode = new Element("div", {"styles": this.css.statChartAreaNode}).inject(this.node);
  73. if (this.json.isTable) this.tableAreaNode = new Element("div", {"styles": this.css.statTableAreaNode}).inject(this.node);
  74. this.loadData();
  75. if (this.json.isTable) this.createTable();
  76. if (this.json.isChart) this.createChart();
  77. },
  78. loadData: function(){
  79. var entries = {};
  80. this.data.selectList.each(function(entry){entries[entry.column] = entry;}.bind(this));
  81. },
  82. createChart: function(){
  83. this.chartNode = new Element("div", {"styles": this.css.statChartNode}).inject(this.chartAreaNode);
  84. this.loadChart();
  85. if (this.statistician.app){
  86. this.resizeChartFun = this.resizeChart.bind(this);
  87. this.statistician.app.addEvent("resizeCompleted", this.resizeChartFun);
  88. this.statistician.app.addEvent("postMaxSize", this.resizeChartFun);
  89. this.statistician.app.addEvent("postRestoreSize", this.resizeChartFun);
  90. }
  91. },
  92. resizeChart: function(){
  93. if (this.bar) this.bar.destroy();
  94. this.bar = null;
  95. if (this.chartNode) this.chartNode.empty();
  96. this.loadChart();
  97. },
  98. loadChart: function(){
  99. MWF.require("MWF.widget.chart.Bar", function(){
  100. this.bar = new MWF.widget.chart.Bar(this.chartNode, this.data.calculateGrid, "displayName", {"delay": 0, "style": "monthly"});
  101. this.bar.addBar("value");
  102. //bar.addBar("value");
  103. this.bar.addEvents({
  104. "mouseover": function(rects, texts, d, i){
  105. texts.filter(function(data, idx){return (idx==i);}).attr("display", "block");
  106. var rect = rects.filter(function(data, idx){return (idx==i);});
  107. var color = rect.attr("fill");
  108. rect.node().store("color", color);
  109. rect.attr("fill", "brown");
  110. }.bind(this),
  111. "mouseout": function(rects, texts, d, i){
  112. texts.filter(function(data, idx){return (idx==i);}).attr("display", "none");
  113. var rect = rects.filter(function(data, idx){return (idx==i);});
  114. var color = rect.node().retrieve("color");
  115. rect.attr("fill", color);
  116. }.bind(this)
  117. });
  118. this.bar.load();
  119. }.bind(this));
  120. },
  121. createTable: function(){
  122. this.createTableHead();
  123. this.createTableData();
  124. },
  125. createTableHead: function(){
  126. this.table = new Element("table", {
  127. "styles": this.css.statTableNode,
  128. "width": "100%",
  129. "border": "0",
  130. "cellPadding": "0",
  131. "cellSpacing": "0"
  132. }).inject(this.node);
  133. this.headTr = new Element("tr").inject(this.table);
  134. this.data.calculate.calculateList.each(function(title){
  135. var th = new Element("th", {
  136. "styles": this.css.statHeadTh,
  137. "text": title.displayName
  138. }).inject(this.headTr);
  139. }.bind(this));
  140. },
  141. createTableData: function(){
  142. if (this.data.calculateGrid.length){
  143. var tr = new Element("tr").inject(this.table);
  144. this.data.calculateGrid.each(function(d){
  145. var td = new Element("td", {"styles": this.css.statContentTdNode}).inject(tr);
  146. td.set("text", d.value);
  147. }.bind(this));
  148. }
  149. },
  150. destroy: function(){
  151. if (this.bar) this.bar.destroy();
  152. if (this.statistician.app){
  153. if (this.resizeChartFun){
  154. this.resizeChartFun.app.removeEvent("resizeCompleted", this.resizeChartFun);
  155. this.resizeChartFun.app.removeEvent("postMaxSize", this.resizeChartFun);
  156. this.resizeChartFun.app.removeEvent("postRestoreSize", this.resizeChartFun);
  157. }
  158. }
  159. MWF.release(this);
  160. }
  161. });
  162. MWF.xApplication.query.Query.Statistician.GroupStat = new Class({
  163. Extends: MWF.xApplication.query.Query.Statistician.Stat,
  164. loadData: function(){
  165. var entries = {};
  166. var groupColumn = null;
  167. this.data.selectList.each(function(entry){
  168. entries[entry.column] = entry;
  169. if (entry.column === this.data.group.column){
  170. groupColumn = entry;
  171. }
  172. }.bind(this));
  173. this.data.calculateGrid.each(function(dd){
  174. if (groupColumn){
  175. dd.group = (groupColumn.code) ? MWF.Macro.exec(groupColumn.code, {"value": dd.group, "data": this.data}) : dd.group;
  176. }
  177. dd.list.each(function(c){
  178. c.value = (entries[c.column].code) ? MWF.Macro.exec(entries[c.column].code, {"value": c.value, "data": this.data}) : c.value
  179. }.bind(this));
  180. }.bind(this));
  181. },
  182. createChart: function(){
  183. if (this.json.isLegend) this.chartFlagNode = new Element("div", {"styles": this.css.statChartFlagAreaNode}).inject(this.chartAreaNode);
  184. this.chartNode = new Element("div", {"styles": this.css.statChartNode}).inject(this.chartAreaNode);
  185. this.loadChart();
  186. if (this.statistician.app){
  187. this.resizeChartFun = this.resizeChart.bind(this);
  188. this.statistician.app.addEvent("resizeCompleted", this.resizeChartFun);
  189. this.statistician.app.addEvent("postMaxSize", this.resizeChartFun);
  190. this.statistician.app.addEvent("postRestoreSize", this.resizeChartFun);
  191. }
  192. },
  193. resizeChart: function(){
  194. if (this.bar) this.bar.destroy();
  195. this.bar = null;
  196. if (this.json.isLegend) this.chartFlagNode.empty();
  197. this.chartNode.empty();
  198. this.loadChart();
  199. },
  200. loadChart: function(){
  201. if (!this.selectedData) this.selectedData = this.data.calculateGrid;
  202. if (!this.selectedData.length) this.selectedData = this.data.calculateGrid;
  203. MWF.require("MWF.widget.chart.Bar", function(){
  204. this.flag = [];
  205. this.bar = new MWF.widget.chart.Bar(this.chartNode, this.selectedData, "group", {"delay": 0, "style": "monthly"});
  206. if (this.selectedData.length){
  207. this.selectedData[0].list.each(function(d, i){
  208. this.flag.push({"name":d.displayName, "color": this.bar.colors[i]});
  209. this.bar.addBar(function(v){return v.list[i].value});
  210. }.bind(this));
  211. }
  212. this.bar.addEvents({
  213. "mouseover": function(rects, texts, d, i){
  214. texts.filter(function(data, idx){return (idx==i);}).attr("display", "block");
  215. var rect = rects.filter(function(data, idx){return (idx==i);});
  216. var color = rect.attr("fill");
  217. rect.node().store("color", color);
  218. rect.attr("fill", "brown");
  219. }.bind(this),
  220. "mouseout": function(rects, texts, d, i){
  221. texts.filter(function(data, idx){return (idx==i);}).attr("display", "none");
  222. var rect = rects.filter(function(data, idx){return (idx==i);});
  223. var color = rect.node().retrieve("color");
  224. rect.attr("fill", color);
  225. }.bind(this)
  226. });
  227. this.bar.load();
  228. if (this.json.isLegend) this.loadFlags();
  229. }.bind(this));
  230. },
  231. loadFlags: function(){
  232. this.flag.each(function(f, i){
  233. this.loadFlag(f, i);
  234. }.bind(this));
  235. },
  236. loadFlag: function(f, i){
  237. var flagNode = new Element("div", {"styles": this.css.ststChartFlagNode}).inject(this.chartFlagNode);
  238. var flagColorNode = new Element("div", {"styles": this.css.ststChartFlagColorNode}).inject(flagNode);
  239. flagColorNode.setStyle("background-color", f.color);
  240. var flagNameNode = new Element("div", {"styles": this.css.ststChartFlagNameNode}).inject(flagNode);
  241. flagNameNode.set("text", f.name);
  242. flagNameNode.set("title", f.name);
  243. flagNode.store("idx", i);
  244. flagNode.store("barColor", f.color);
  245. var _self = this;
  246. flagNode.addEvents({
  247. "mouseover": function(){
  248. this.getFirst().setStyles(_self.css.ststChartFlagColorNode_over);
  249. var idx = this.retrieve("idx");
  250. _self.highlightBar(idx);
  251. },
  252. "mouseout": function(){
  253. this.getFirst().setStyles(_self.css.ststChartFlagColorNode);
  254. var idx = this.retrieve("idx");
  255. var barColor = this.retrieve("barColor");
  256. _self.unHighlightBar(idx, barColor);
  257. }
  258. });
  259. },
  260. createDefs: function(node, data){
  261. var svgNode = node.append(data.tag);
  262. Object.each(data.attrs, function(v,k){svgNode.attr(k,v);});
  263. if (data.subs) {
  264. data.subs.each(function(v){
  265. this.createDefs(svgNode, v);
  266. }.bind(this));
  267. }
  268. },
  269. createHighlightDefs: function(id){
  270. //this.defssvg = this.bar.createDefs;
  271. var node = this.bar.svg.append("defs");
  272. var data = this.bar.css["rect_over_defs"];
  273. this.createDefs(node, data);
  274. node.select(function(){ return this.getFirst(); }).attr("id", id);
  275. node.attr("id", "defs_"+id);
  276. },
  277. unHighlightBar: function(i, barColor){
  278. var id = "rect_over_defs"+i;
  279. var def = d3.select("#defs_"+id);
  280. def.remove();
  281. var rects = this.bar.rectCluster[i];
  282. rects.attr(this.bar.css["rect_over_defs"].urlAttr, null);
  283. var texts = this.bar.textCluster[i];
  284. texts.attr("display", "none");
  285. texts.attr("font-weight", "normal");
  286. },
  287. highlightBar: function(i){
  288. this.bar.rectCluster[i].remove();
  289. var rects = this.recreateBars(i);
  290. var id = "rect_over_defs"+i;
  291. this.createHighlightDefs(id);
  292. rects.attr(this.bar.css["rect_over_defs"].urlAttr, "url(#"+id+")");
  293. var texts = this.bar.textCluster[i];
  294. texts.attr("display", "block");
  295. texts.attr("font-weight", "bold");
  296. },
  297. recreateBars: function(i){
  298. var data = this.data.calculateGrid.map(function(d, idx) {
  299. return {"name": d["group"], "data": d.list[i].value};
  300. }.bind(this));
  301. this.bar.rectClass = Math.round(Math.random()*100);
  302. var barWidth = this.bar.xScale.bandwidth()/this.bar.barsData.length;
  303. var rects = this.bar.group.selectAll(".MWFBar_"+this.bar.rectClass+"_"+i)
  304. .data(data)
  305. .enter().append("rect")
  306. .attr("class", ".MWFBar_"+this.bar.rectClass+"_"+i)
  307. .attr("x", function(d) { return this.xScale(d.name)+(i*barWidth); }.bind(this.bar))
  308. .attr("width", barWidth)
  309. .attr("height", function(d) { return this.size.y - this.yScale(d.data); }.bind(this.bar))
  310. .attr("y", function(d) { return this.yScale(d.data); }.bind(this.bar))
  311. .attr("fill", this.bar.colors[i]);
  312. this.bar.rectCluster[i] = rects;
  313. this.bar.setEvents();
  314. return rects;
  315. },
  316. createTableHead: function(){
  317. this.selectedCols = [];
  318. this.selectedRows = [];
  319. this.table = new Element("table", {
  320. "styles": this.css.statTableNode,
  321. "width": "100%",
  322. "border": "0",
  323. "cellPadding": "0",
  324. "cellSpacing": "0"
  325. }).inject(this.node);
  326. _self = this;
  327. this.headTr = this.table.insertRow();
  328. this.selectAllTd = this.headTr.insertCell().setStyles(this.css.statAllSelectTd).set("title", this.lp.selecteAll);
  329. this.selectAllTd.addEvent("click", function(){
  330. _self.selectAll(this);
  331. });
  332. this.selectEntryTd = this.headTr.insertCell().setStyles(this.css.statAllColSelectTd).set("title", this.lp.selecteAllCol);
  333. this.selectEntryTd.addEvent("click", function(){
  334. _self.selectAllCol(this);
  335. });
  336. this.data.calculate.calculateList.each(function(title){
  337. selectTd = this.headTr.insertCell().setStyles(this.css.statColSelectTd);
  338. selectTd.addEvent("click", function(){
  339. _self.selectCol(this);
  340. });
  341. }.bind(this));
  342. this.titleTr = this.table.insertRow();
  343. this.selectGroupTd = this.titleTr.insertCell().setStyles(this.css.statAllRowSelectTd).set("title", this.lp.selecteAllRow);
  344. this.categoryTitleTd = new Element("th", {
  345. "styles": this.css.statHeadTh,
  346. "text": this.data.calculate.title || this.lp.category
  347. }).inject(this.titleTr);
  348. this.categoryTitleTd.setStyle("width", "160px");
  349. this.data.calculate.calculateList.each(function(title){
  350. var th = new Element("th", {
  351. "styles": this.css.statHeadTh,
  352. "text": title.displayName
  353. }).inject(this.titleTr);
  354. }.bind(this));
  355. },
  356. createTableData: function(){
  357. if (this.data.calculateGrid.length){
  358. var _self = this;
  359. var groupColumn = null;
  360. for (var c = 0; c<this.data.selectList.length; c++){
  361. if (this.data.selectList[c].column === this.data.group.column){
  362. groupColumn = this.data.selectList[c];
  363. break;
  364. }
  365. }
  366. this.data.calculateGrid.each(function(d){
  367. var tr = this.table.insertRow();
  368. var selectTd = tr.insertCell().setStyles(this.css.statRowSelectTd);
  369. selectTd.addEvent("click", function(){
  370. _self.selectRow(this);
  371. });
  372. var text = d.group;
  373. if (groupColumn){
  374. text = (groupColumn.code) ? MWF.Macro.exec(groupColumn.code, {"value": d.group, "data": this.data}) : d.group;
  375. }
  376. var categoryTh = new Element("th", {"styles": this.css.statHeadTh, "text": text}).inject(tr);
  377. d.list.each(function(l){
  378. var td = new Element("td", {"styles": this.css.statContentTdNode}).inject(tr);
  379. td.set("text", l.value);
  380. this.setDragEvent(td);
  381. }.bind(this));
  382. }.bind(this));
  383. }
  384. },
  385. setDragEvent: function(td){
  386. new Drag(td, {
  387. "onStart": function(dragged, e){
  388. this.cellDragStart(dragged, e);
  389. }.bind(this),
  390. "onDrag": function(dragged, e){
  391. this.cellDrag(dragged, e);
  392. }.bind(this),
  393. "onComplete": function(dragged, e){
  394. this.completeDrag(dragged, e);
  395. }.bind(this)
  396. });
  397. var _self = this;
  398. td.addEvent("click", function(){
  399. var cellIndex = td.cellIndex-2;
  400. var rowIndex = td.getParent("tr").rowIndex-2;
  401. if (_self.checkIsSelected(cellIndex, rowIndex)){
  402. }else{
  403. debugger;
  404. if (_self.selectedCols.length || _self.selectedRows.length){
  405. _self.selectAll();
  406. }
  407. }
  408. });
  409. },
  410. cellDragStart: function(td, e){
  411. //if (_self.selectedCols.length || _self.selectedRows.length){
  412. // _self.selectAll();
  413. //}
  414. var p = td.getPosition();
  415. var size = td.getSize();
  416. td.store("start", {"x": p.x, "y": p.y});
  417. td.store("start2", {"x": p.x+size.x, "y": p.y+size.y});
  418. },
  419. getSelectedCells: function(td, start, e){
  420. var ox = e.page.x-start.x;
  421. var oy = e.page.y-start.y;
  422. var tdSize = td.getSize();
  423. var cols = (ox/tdSize.x).toInt();
  424. var rows = (oy/tdSize.y).toInt();
  425. return {"cols": cols, "rows": rows};
  426. },
  427. cellDrag: function(td, e){
  428. this.selectedRows = [];
  429. this.selectedCols = [];
  430. this.selectedData = [];
  431. var start = td.retrieve("start");
  432. var start2 = td.retrieve("start2");
  433. var c1 = this.getSelectedCells(td, start, e);
  434. var c2 = this.getSelectedCells(td, start2, e);
  435. var cols = (Math.abs(c1.cols)>Math.abs(c2.cols)) ? c1.cols : c2.cols;
  436. var rows = (Math.abs(c1.rows)>Math.abs(c2.rows)) ? c1.rows : c2.rows;
  437. var cellIndex = td.cellIndex-2;
  438. var rowIndex = td.getParent("tr").rowIndex-2;
  439. if (!cellIndex || cellIndex<0) cellIndex = 0;
  440. if (!rowIndex || rowIndex<0) rowIndex = 0;
  441. var toCellIndex = cellIndex+cols;
  442. var toRowIndex = rowIndex+rows;
  443. if (toRowIndex>rowIndex){
  444. for (var i=rowIndex; i<=toRowIndex; i++) this.selectedRows.push(i);
  445. }else{
  446. for (var i=toRowIndex; i<=rowIndex; i++) this.selectedRows.push(i);
  447. }
  448. if (toCellIndex>cellIndex){
  449. for (var i=cellIndex; i<=toCellIndex; i++) this.selectedCols.push(i);
  450. }else{
  451. for (var i=toCellIndex; i<=cellIndex; i++) this.selectedCols.push(i);
  452. }
  453. this.checkSelectedCells();
  454. },
  455. completeDrag: function(td, e){
  456. var trs = this.table.getElements("tr");
  457. var tds = trs[0].getElements("td");
  458. this.selectedCols.each(function(i){
  459. tds[i+2].setStyles(this.css.statTableSelectedTd);
  460. }.bind(this));
  461. this.selectedRows.each(function(i){
  462. trs[i+2].getElement("td").setStyles(this.css.statTableSelectedTd);
  463. }.bind(this));
  464. this.reloadChart();
  465. },
  466. selectCol: function(td){
  467. var i = td.cellIndex;
  468. var dataIndex = i-2;
  469. if (this.selectedCols.indexOf(dataIndex)!=-1){
  470. td.setStyles(this.css.statTableSelectTd);
  471. this.selectedCols.erase(dataIndex);
  472. }else{
  473. td.setStyles(this.css.statTableSelectedTd);
  474. this.selectedCols.push(dataIndex);
  475. }
  476. this.checkSelectedCells();
  477. this.reloadChart();
  478. },
  479. selectRow: function(td){
  480. var tr = td.getParent("tr");
  481. var i = tr.rowIndex;
  482. var dataIndex = i-2;
  483. if (this.selectedRows.indexOf(dataIndex)!=-1){
  484. td.setStyles(this.css.statTableSelectTd);
  485. this.selectedRows.erase(dataIndex);
  486. }else{
  487. td.setStyles(this.css.statTableSelectedTd);
  488. this.selectedRows.push(dataIndex);
  489. }
  490. this.checkSelectedCells();
  491. this.reloadChart();
  492. },
  493. selectAllCol: function(){
  494. if (this.selectedCols.length){
  495. this.selectedCols = [];
  496. var trs = this.table.getElements("tr");
  497. var tds = trs[0].getElements("td");
  498. for (var i=2; i<tds.length; i++){
  499. tds[i].setStyles(this.css.statTableSelectTd);
  500. }
  501. //for (var n=2; n<trs.length; n++){
  502. // trs[n].getElement("td").setStyles(this.css.statTableSelectTd);
  503. //}
  504. }else{
  505. var seltrs = this.table.getElements("tr");
  506. var seltds = seltrs[0].getElements("td");
  507. for (var n=2; n<seltds.length; n++){
  508. this.selectedCols.push(n-2);
  509. seltds[n].setStyles(this.css.statTableSelectedTd);
  510. }
  511. }
  512. this.checkSelectedCells();
  513. this.reloadChart();
  514. },
  515. selectAll: function(){
  516. if (this.selectedRows.length || this.selectedCols.length){
  517. this.selectedRows = [];
  518. this.selectedCols = [];
  519. var trs = this.table.getElements("tr");
  520. var tds = trs[0].getElements("td");
  521. for (var i=2; i<tds.length; i++){
  522. tds[i].setStyles(this.css.statTableSelectTd);
  523. }
  524. for (var n=2; n<trs.length; n++){
  525. trs[n].getElement("td").setStyles(this.css.statTableSelectTd);
  526. }
  527. }else{
  528. var seltrs = this.table.getElements("tr");
  529. var seltds = seltrs[0].getElements("td");
  530. for (var seli=2; seli<seltds.length; seli++){
  531. this.selectedCols.push(seli-2);
  532. seltds[seli].setStyles(this.css.statTableSelectedTd);
  533. }
  534. for (var seln=2; seln<seltrs.length; seln++){
  535. this.selectedRows.push(seln-2);
  536. seltrs[seln].getElement("td").setStyles(this.css.statTableSelectedTd);
  537. }
  538. }
  539. this.checkSelectedCells();
  540. this.reloadChart();
  541. },
  542. checkIsSelected: function(ci, ri){
  543. if (!this.selectedCols.length && !this.selectedRows.length) return false;
  544. var colSelect = (!this.selectedCols.length) || this.selectedCols.indexOf(ci)!=-1;
  545. var rowSelect = (!this.selectedRows.length) || this.selectedRows.indexOf(ri)!=-1;
  546. return (colSelect && rowSelect);
  547. },
  548. checkSelectedCells: function(){
  549. this.selectedData = [];
  550. var rows = this.table.getElements("tr");
  551. for (var rowIdx = 2; rowIdx<rows.length; rowIdx++){
  552. var o = {
  553. "group": this.data.calculateGrid[rowIdx-2].group,
  554. "list": []
  555. };
  556. var cols = rows[rowIdx].getElements("td");
  557. for (var colIdx = 1; colIdx<cols.length; colIdx++){
  558. if (this.checkIsSelected(colIdx-1, rowIdx-2)){
  559. cols[colIdx].setStyles(this.css.statContentTdNode_selected);
  560. o.list.push({
  561. "column": this.data.calculateGrid[rowIdx-2].list[colIdx-1].column,
  562. "displayName": this.data.calculateGrid[rowIdx-2].list[colIdx-1].displayName,
  563. "value": this.data.calculateGrid[rowIdx-2].list[colIdx-1].value
  564. });
  565. }else{
  566. cols[colIdx].setStyles(this.css.statContentTdNode);
  567. }
  568. }
  569. if (o.list.length) this.selectedData.push(o);
  570. }
  571. },
  572. reloadChart: function(){
  573. if (this.json.isChart){
  574. if (this.bar) this.bar.destroy();
  575. this.bar = null;
  576. this.chartFlagNode.empty();
  577. this.chartNode.empty();
  578. this.loadChart();
  579. }
  580. }
  581. });