Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

566 rader
14 KiB

  1. /// Data Table
  2. _r.scroll_head = function(ele) {
  3. var h = ele.childNodes[0];
  4. h.style.top = cint(ele.scrollTop) + 'px';
  5. }
  6. _r.DataTable = function(html_fieldname, dt, repname, hide_toolbar) {
  7. var me = this;
  8. if(html_fieldname.substr) {
  9. var html_field = cur_frm.fields_dict[html_fieldname];
  10. // override onrefresh
  11. html_field.onrefresh = function() {
  12. if(me.docname != cur_frm.docname) {
  13. me.clear_all();
  14. me.docname = cur_frm.docname;
  15. }
  16. }
  17. var parent = html_field.wrapper;
  18. datatables[html_fieldname] = this;
  19. } else {
  20. var parent = html_fieldname;
  21. }
  22. this.start_rec = 1;
  23. this.page_len = 50;
  24. this.repname = repname;
  25. this.dt = dt;
  26. this.no_limit = false;
  27. this.query = '';
  28. this.has_index = 1;
  29. this.has_headings = 1; //this.sort_options = {};
  30. this.disabled_options = {};
  31. this.levels = [];
  32. // make ui
  33. // new link
  34. if(this.dt) {
  35. var tw = $a(parent, 'div');
  36. var t = $a(tw, 'div', 'link_type');
  37. t.style.cssFloat = 'right';
  38. $h(tw, '14px');
  39. t.style.margin = '2px 0px';
  40. t.style.fontSize = '11px';
  41. t.onclick = function() { new_doc(me.dt); }
  42. t.innerHTML = 'New '+ this.dt;
  43. }
  44. // toolbar
  45. if(!hide_toolbar) this.make_toolbar(parent);
  46. this.wrapper = $a(parent, 'div', 'report_tab');
  47. $h(this.wrapper, cint(screen.height * 0.35) + 'px');
  48. this.wrapper.onscroll = function() {_r.scroll_head(this); }
  49. this.hwrapper = $a(this.wrapper, 'div', 'report_head_wrapper');
  50. this.twrapper = $a(this.wrapper, 'div', 'report_tab_wrapper');
  51. this.no_data_tag = $a(this.wrapper, 'div', 'report_no_data');
  52. this.no_data_tag.innerHTML = 'No Records Found';
  53. this.fetching_tag = $a(this.wrapper, 'div', '', {height:'100%', background:'url("images/ui/square_loading.gif") center no-repeat', display:'none'});
  54. }
  55. _r.DataTable.prototype.add_icon = function(parent, imgsrc) {
  56. var i = $a(parent, 'img');
  57. i.style.padding = '2px';
  58. i.style.cursor = 'pointer';
  59. i.setAttribute('src', 'images/icons/'+imgsrc+'.gif');
  60. return i;
  61. }
  62. _r.DataTable.prototype.set_no_limit = function(v) {
  63. if(v) {
  64. this.no_limit = 1;
  65. $dh(this.page_len_sel.wrapper);
  66. } else {
  67. this.no_limit = 0;
  68. $ds(this.page_len_sel.wrapper);
  69. }
  70. }
  71. _r.DataTable.prototype.make_toolbar = function(parent) {
  72. var me = this;
  73. // headbar
  74. this.hbar = $a(parent, 'div', '', {margin:'8px 0px 16px 0px'});
  75. var ht = make_table(this.hbar,1,3,'100%',['40%','40%','20%'],{verticalAlign:'middle'});
  76. var div = $a($td(ht,0,0), 'div');
  77. var make_btn = function(label,icon,onclick,bold) {
  78. var btn = $btn(div,label,onclick);
  79. if(bold)$y(btn,{fontWeight: 'bold'});
  80. }
  81. // refresh btn
  82. make_btn('Refresh','ui-icon-refresh',function() { me.start_rec = 1; me.run();},1);
  83. // export
  84. make_btn('Export','ui-icon-circle-arrow-e',function() {me.do_export();});
  85. // print
  86. make_btn('Print','ui-icon-print',function() {me.do_print();});
  87. // print
  88. make_btn('Calc','ui-icon-calculator',function() {me.do_calc();});
  89. // sort select
  90. var t = make_table($td(ht,0,1),1,6,null,[null,null,null,'20px',null,null],{verticalAlign:'middle'});
  91. $td(t,0,0).innerHTML = 'Sort By:'; $y($td(t,0,1),{textAlign:'right',paddingRight:'4px'});
  92. this.sort_sel = $a($td(t,0,2), 'select','',{width:'100px'});
  93. this.sort_sel.onchange = function() {
  94. me.start_rec = 1;
  95. me.run();
  96. }
  97. // sort order
  98. this.sort_icon = this.add_icon($td(t,0,3), 'arrow_down');
  99. this.sort_order = 'DESC';
  100. this.sort_icon.onclick = function() {
  101. if(me.sort_order=='ASC') me.set_desc();
  102. else me.set_asc();
  103. me.start_rec = 1;
  104. me.run();
  105. }
  106. // page len
  107. $td(t,0,4).innerHTML = 'Per Page:'; $y($td(t,0,4),{textAlign:'right',paddingRight:'4px'});
  108. var s = new SelectWidget($td(t,0,5), ['50','100','500','1000'], '70px');
  109. s.inp.value = '50';
  110. s.inp.onchange = function() {
  111. me.page_len = flt(this.value);
  112. }
  113. this.page_len_sel = s;
  114. var c1 = $td(ht,0,2);
  115. c1.style.textAlign = 'right';
  116. // first page
  117. var ic = this.add_icon(c1, 'resultset_first');
  118. ic.onclick = function() {
  119. me.start_rec = 1;
  120. me.run();
  121. }
  122. // prev page
  123. var ic = this.add_icon(c1, 'resultset_previous');
  124. ic.onclick = function() {
  125. if(me.start_rec - me.page_len <= 0)return;
  126. me.start_rec = me.start_rec - me.page_len;
  127. me.run();
  128. }
  129. // next page
  130. this.has_next = false;
  131. var ic = this.add_icon(c1, 'resultset_next');
  132. ic.onclick = function() {
  133. if(!me.has_next)return;
  134. me.start_rec = me.start_rec + me.page_len;
  135. me.run();
  136. }
  137. }
  138. _r.DataTable.prototype.set_desc = function() {
  139. this.sort_icon.src = 'images/icons/arrow_down.gif'; this.sort_order='DESC';
  140. }
  141. _r.DataTable.prototype.set_asc = function(icon) {
  142. this.sort_icon.src = 'images/icons/arrow_up.gif'; this.sort_order='ASC';
  143. }
  144. ////
  145. _r.DataTable.prototype.set_sort_option_disabled = function(label, disabled) {
  146. // has bugs due to sequencing
  147. // may not set during load
  148. var s = this.sort_sel;
  149. if(disabled) {
  150. // remove this option
  151. for(var i=0; i<s.options.length; i++) {
  152. if(s.options[i] && s.options[i].text==label) {
  153. this.disabled_options[label] = s.options[i];
  154. s.remove(i);
  155. }
  156. }
  157. } else {
  158. // get it back
  159. if(this.disabled_options[label]) {
  160. try {
  161. s.add(this.disabled_options[label], s.options[s.options.length-1]);
  162. } catch(e) {
  163. try {
  164. s.add(this.disabled_options[label], s.options.length-1);
  165. } catch (e) { }
  166. }
  167. this.disabled_options[label] = null;
  168. }
  169. }
  170. }
  171. _r.DataTable.prototype.add_sort_option = function(label, val) {
  172. var s = this.sort_sel;
  173. s.options[s.options.length] =
  174. new Option(label, val, false, s.options.length==0?true:false);
  175. }
  176. _r.DataTable.prototype.update_query = function(no_limit) {
  177. // add sorting
  178. if((_r.rb_con.cur_rb && _r.rb_con.cur_rb.get_query) || (this.search_criteria && this.search_criteria.custom_query)) {
  179. // no sorting if custom_query or get_query
  180. } else {
  181. if(!sel_val(this.sort_sel)) {
  182. this.sort_sel.selectedIndex = 0; // select the first value (IE)
  183. }
  184. this.query += NEWLINE
  185. + ' ORDER BY ' + sel_val(this.sort_sel)
  186. + ' ' + this.sort_order;
  187. }
  188. if(no_limit || this.no_limit) {
  189. if(this.show_query) alert(this.query);
  190. return;
  191. }
  192. // add paging
  193. this.query += ' LIMIT ' + (this.start_rec-1) + ',' + this.page_len;
  194. if(this.show_query)
  195. alert(this.query);
  196. }
  197. _r.DataTable.prototype._get_query = function(no_limit) {
  198. $dh(this.no_data_tag);
  199. this.show_query = 0;
  200. if(this.make_query)
  201. this.make_query();
  202. this.update_query(no_limit);
  203. }
  204. _r.DataTable.prototype.run = function() {
  205. if(this.validate && !this.validate())
  206. return;
  207. if(_r.rb_con.cur_rb) {
  208. if(_r.rb_con.cur_rb.large_report == 1) {
  209. msgprint("This is a very large report and cannot be shown in the browser as it is likely to make your browser very slow.<br><br>Please click on 'Export' to open in a spreadsheet");
  210. return;
  211. }
  212. _r.rb_con.cur_rb.mytabs.items['Result'].expand();
  213. }
  214. var me = this;
  215. this._get_query();
  216. // preset data
  217. if(this.set_data) {
  218. this.show_result(this.set_data);
  219. this.set_data = null;
  220. return;
  221. }
  222. $ds(this.fetching_tag);
  223. if(isFF)this.clear_all();
  224. var args = {
  225. 'query':me.query,
  226. 'report_name': '_r.DataTable',
  227. 'show_deleted':1,
  228. 'sc_id':me.search_criteria ? me.search_criteria.name : '',
  229. 'filter_values':me.filter_vals ? docstring(me.filter_vals) : '',
  230. 'roles':'["'+user_roles.join('","')+'"]'
  231. }
  232. if(this.is_simple) args.is_simple = 1;
  233. page_body.set_status('Running Query...');
  234. $c('webnotes.widgets.query_builder.runquery', args, function(r,rt) {
  235. $dh(me.fetching_tag);
  236. page_body.set_status('Done');
  237. me.show_result(r,rt);
  238. });
  239. }
  240. _r.DataTable.prototype.clear_all = function() {
  241. // clear old
  242. if(this.htab && this.htab.parentNode) {
  243. this.htab.parentNode.removeChild(this.htab); delete this.htab; }
  244. if(this.tab && this.tab.parentNode) {
  245. this.tab.parentNode.removeChild(this.tab); delete this.tab; }
  246. $dh(this.no_data_tag);
  247. }
  248. _r.DataTable.prototype.has_data = function() {
  249. if(this.htab && this.htab.rows.length)return 1;
  250. else return 0;
  251. }
  252. _r.DataTable.prototype.show_result = function(r, rt) {
  253. // clear old
  254. var me = this;
  255. this.clear_all();
  256. this.rset = eval(r.values);
  257. if(this.rset && this.rset.length) {
  258. // add
  259. if(this.has_headings) {
  260. this.htab = $a(this.hwrapper, 'table');
  261. $y(this.twrapper,{top:'25px',borderTop:'0px'});
  262. }
  263. this.tab = $a(this.twrapper, 'table');
  264. this.colwidths = eval(r.colwidths);
  265. this.coltypes = eval(r.coltypes);
  266. this.coloptions = eval(r.coloptions);
  267. this.colnames = eval(r.colnames);
  268. $y(this.tab,{tableLayout:'fixed'});
  269. if(this.beforetableprint)this.beforetableprint(this);
  270. // heading
  271. if(this.has_headings) this.make_head_tab(this.colnames);
  272. // data
  273. var start = this.start_rec;
  274. // show max 1000
  275. var rset_len = this.rset.length;
  276. if(rset_len > 1000) {
  277. msgprint("Showing only 1000 records out of " + rset_len + ". Use 'Export' to see all records");
  278. rset_len = 1000;
  279. }
  280. for(var vi=0; vi<rset_len; vi++) {
  281. var row = this.tab.insertRow(vi);
  282. // for script
  283. if(this.has_index) {
  284. var c0 = row.insertCell(0);
  285. $w(c0, '30px');
  286. $a(c0, 'div', '', {width:'23px'}).innerHTML = start;
  287. }
  288. // cells
  289. start++;
  290. for(var ci=0;ci < this.rset[vi].length;ci++) {
  291. this.make_data_cell(vi, ci, this.rset[vi][ci]);
  292. }
  293. if(this.afterrowprint) {
  294. row.data_cells = {}; row.data = {};
  295. for(var ci=0;ci< this.colnames.length;ci++) {
  296. row.data[this.colnames[ci]] = this.rset[vi][ci];
  297. row.data_cells[this.colnames[ci]] = row.cells[ci+1];
  298. }f
  299. this.afterrowprint(row);
  300. }
  301. }
  302. // has next page?
  303. if(this.rset.length && this.rset.length>=this.page_len)this.has_next = true;
  304. // style
  305. if(r.style) {
  306. for(var i=0;i<r.style.length;i++) {
  307. $yt(this.tab,r.style[i][0],r.style[i][1],r.style[i][2]);
  308. }
  309. }
  310. // after table print
  311. if(this.aftertableprint) this.aftertableprint(this.tab);
  312. } else {
  313. $ds(this.no_data_tag);
  314. }
  315. }
  316. _r.DataTable.prototype.get_col_width = function(i) {
  317. if(this.colwidths
  318. && this.colwidths.length
  319. && this.colwidths[i])
  320. return cint(this.colwidths[i]) +'px';
  321. else return '100px';
  322. }
  323. _r.DataTable.prototype.make_head_tab = function(colnames) {
  324. var r0 = this.htab.insertRow(0);
  325. if(this.has_index) {
  326. var c0 = r0.insertCell(0);
  327. c0.className = 'report_head_cell';
  328. $w(c0, '30px');
  329. $a(c0, 'div').innerHTML = 'Sr';
  330. this.total_width = 30;
  331. }
  332. for(var i=0;i<colnames.length;i++) {
  333. var w = this.get_col_width(i);
  334. this.total_width+=cint(w);
  335. var c = r0.insertCell(r0.cells.length);
  336. c.className = 'report_head_cell';
  337. if(w)$w(c, w);
  338. $a(c,'div').innerHTML = colnames[i];
  339. c.val = colnames[i];
  340. }
  341. $w(this.htab, this.total_width + 'px');
  342. $w(this.tab, this.total_width + 'px');
  343. }
  344. _r.DataTable.prototype.make_data_cell = function(ri, ci, val) {
  345. var row = this.tab.rows[ri];
  346. var c = row.insertCell(row.cells.length);
  347. // row style:
  348. if(row.style.color)
  349. c.style.color = row.style.color;
  350. if(row.style.backgroundColor)
  351. c.style.backgroundColor = row.style.backgroundColor;
  352. if(row.style.fontWeight)
  353. c.style.fontWeight = row.style.fontWeight;
  354. if(row.style.fontSize)
  355. c.style.fontSize = row.style.fontSize;
  356. var w = this.get_col_width(ci);
  357. if(w)$w(c, w);
  358. c.val = val;
  359. var me = this;
  360. c.div = $a(c, 'div', '', {width:(cint(w)-7)+'px'});
  361. $s(c.div, val, this.coltypes[ci], this.coloptions[ci])
  362. }
  363. _r.DataTable.prototype.do_print = function() {
  364. this._get_query(true);
  365. args = {
  366. query : this.query,
  367. title : this.rep_name?this.rep_name:this.dt,
  368. colnames : null,
  369. colwidhts : null,
  370. coltypes : null,
  371. has_index : this.has_index,
  372. has_headings: this.has_headings,
  373. check_limit : 1,
  374. is_simple : (this.is_simple ? 'Yes' : ''),
  375. sc_id : (this.search_criteria ? this.search_criteria.name : ''),
  376. filter_values : docstring(this.filter_vals),
  377. finder: this.finder ? this.finder : null
  378. };
  379. new_widget('_p.PrintQuery', function(w) {
  380. // global
  381. if(!_p.print_query)
  382. _p.print_query = w;
  383. _p.print_query.show_dialog(args);
  384. }, 1);
  385. }
  386. _r.DataTable.prototype.do_export = function() {
  387. this._get_query(true);
  388. var me = this;
  389. export_query(this.query, function(q) {
  390. export_csv(q, (me.rep_name?me.rep_name:me.dt), (me.search_criteria?me.search_criteria.name:''), me.is_simple, docstring(me.filter_vals));
  391. });
  392. }
  393. // Calculator
  394. // ----------
  395. _r.DataTable.prototype.do_calc = function() {
  396. _r.show_calc(this.tab, this.colnames, this.coltypes, 1);
  397. }
  398. _r.DataTable.prototype.get_col_data = function(colname) {
  399. var ci = 0;
  400. if(!this.htab) return [];
  401. for(var i=1;i<this.htab.rows[0].cells.length;i++) {
  402. var hc = this.htab.rows[0].cells[i];
  403. if(hc.val == colname) {
  404. ci = i;
  405. break;
  406. }
  407. }
  408. var ret = [];
  409. for(var ri=0;ri<this.tab.rows.length;ri++) {
  410. ret[ret.length] = this.tab.rows[ri].cells[ci].val;
  411. }
  412. return ret;
  413. }
  414. _r.DataTable.prototype.get_html = function() {
  415. var w = document.createElement('div');
  416. w = $a(w, 'div');
  417. w.style.marginTop = '16px';
  418. var tab = $a(w, 'table');
  419. var add_head_style = function(c, w) {
  420. c.style.fontWeight = 'bold';
  421. c.style.border = '1px solid #000';
  422. c.style.padding = '2px';
  423. if(w)$w(c, w);
  424. return c;
  425. }
  426. var add_cell_style = function(c) {
  427. c.style.padding = '2px';
  428. c.style.border = '1px solid #000';
  429. return c;
  430. }
  431. tab.style.borderCollapse = 'collapse';
  432. var hr = tab.insertRow(0);
  433. var c0 = add_head_style(hr.insertCell(0), '30px');
  434. c0.innerHTML = 'Sr';
  435. // heading
  436. for(var i=1;i<this.htab.rows[0].cells.length;i++) {
  437. var hc = this.htab.rows[0].cells[i];
  438. var c = add_head_style(hr.insertCell(i), hc.style.width);
  439. c.innerHTML = hc.innerHTML;
  440. }
  441. // data
  442. for(var ri=0;ri<this.tab.rows.length;ri++) {
  443. var row = this.tab.rows[ri];
  444. var dt_row = tab.insertRow(tab.rows.length);
  445. for(var ci=0;ci<row.cells.length;ci++) {
  446. var c = add_cell_style(dt_row.insertCell(ci));
  447. c.innerHTML = row.cells[ci].innerHTML;
  448. }
  449. }
  450. return w.innerHTML;
  451. }