|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561 |
- /// Data Table
-
-
- _r.scroll_head = function(ele) {
- var h = ele.childNodes[0];
- h.style.top = cint(ele.scrollTop) + 'px';
- }
-
- _r.DataTable = function(html_fieldname, dt, repname, hide_toolbar) {
-
-
- var me = this;
- if(html_fieldname.substr) {
- var html_field = cur_frm.fields_dict[html_fieldname];
-
- // override onrefresh
- html_field.onrefresh = function() {
- if(me.docname != cur_frm.docname) {
- me.clear_all();
- me.docname = cur_frm.docname;
- }
- }
-
- var parent = html_field.wrapper;
- datatables[html_fieldname] = this;
- } else {
- var parent = html_fieldname;
- }
-
- this.start_rec = 1;
- this.page_len = 50;
- this.repname = repname;
- this.dt = dt;
- this.no_limit = false;
- this.query = '';
- this.has_index = 1;
- this.has_headings = 1; //this.sort_options = {};
- this.disabled_options = {};
-
- this.levels = [];
-
- // make ui
-
- // new link
- if(this.dt) {
- var tw = $a(parent, 'div');
- var t = $a(tw, 'div', 'link_type');
- t.style.cssFloat = 'right';
- $h(tw, '14px');
- t.style.margin = '2px 0px';
- t.style.fontSize = '11px';
- t.onclick = function() { new_doc(me.dt); }
- t.innerHTML = 'New '+ this.dt;
- }
-
- // toolbar
- if(!hide_toolbar) this.make_toolbar(parent);
-
- this.wrapper = $a(parent, 'div', 'report_tab');
- $h(this.wrapper, cint(screen.height * 0.35) + 'px');
-
- this.wrapper.onscroll = function() {_r.scroll_head(this); }
-
- this.hwrapper = $a(this.wrapper, 'div', 'report_head_wrapper');
- this.twrapper = $a(this.wrapper, 'div', 'report_tab_wrapper');
-
- this.no_data_tag = $a(this.wrapper, 'div', 'report_no_data');
- this.no_data_tag.innerHTML = 'No Records Found';
-
- this.fetching_tag = $a(this.wrapper, 'div', '', {height:'100%', background:'url("lib/images/ui/square_loading.gif") center no-repeat', display:'none'});
- }
-
- _r.DataTable.prototype.add_icon = function(parent, imgsrc) {
- var i = $a(parent, 'img');
- i.style.padding = '2px';
- i.style.cursor = 'pointer';
- i.setAttribute('src', 'lib/images/icons/'+imgsrc+'.gif');
- return i;
- }
-
- _r.DataTable.prototype.set_no_limit = function(v) {
- if(v) {
- this.no_limit = 1;
- $dh(this.page_len_sel.wrapper);
- } else {
- this.no_limit = 0;
- $ds(this.page_len_sel.wrapper);
- }
- }
-
- _r.DataTable.prototype.make_toolbar = function(parent) {
- var me = this;
-
- // headbar
- this.hbar = $a(parent, 'div', '', {margin:'8px 0px 16px 0px'});
-
- var ht = make_table(this.hbar,1,3,'100%',['40%','40%','20%'],{verticalAlign:'middle'});
- var div = $a($td(ht,0,0), 'div');
-
- var make_btn = function(label,icon,onclick,bold) {
- var btn = $btn(div,label,onclick);
- if(bold)$y(btn,{fontWeight: 'bold'});
- }
-
-
- // refresh btn
- make_btn('Refresh','ui-icon-refresh',function() { me.start_rec = 1; me.run();},1);
-
- // export
- make_btn('Export','ui-icon-circle-arrow-e',function() {me.do_export();});
-
- // print
- make_btn('Print','ui-icon-print',function() {me.do_print();});
-
- // print
- make_btn('Calc','ui-icon-calculator',function() {me.do_calc();});
-
- // sort select
- var t = make_table($td(ht,0,1),1,6,null,[null,null,null,'20px',null,null],{verticalAlign:'middle'});
-
- $td(t,0,0).innerHTML = 'Sort By:'; $y($td(t,0,1),{textAlign:'right',paddingRight:'4px'});
-
- this.sort_sel = $a($td(t,0,2), 'select','',{width:'100px'});
-
- this.sort_sel.onchange = function() {
- me.start_rec = 1;
- me.run();
- }
-
- // sort order
- this.sort_icon = this.add_icon($td(t,0,3), 'arrow_down');
- this.sort_order = 'DESC';
-
- this.sort_icon.onclick = function() {
- if(me.sort_order=='ASC') me.set_desc();
- else me.set_asc();
-
- me.start_rec = 1;
- me.run();
- }
-
- // page len
-
- $td(t,0,4).innerHTML = 'Per Page:'; $y($td(t,0,4),{textAlign:'right',paddingRight:'4px'});
- var s = new SelectWidget($td(t,0,5), ['50','100','500','1000'], '70px');
- s.inp.value = '50';
-
- s.inp.onchange = function() {
- me.page_len = flt(this.value);
- }
- this.page_len_sel = s;
-
- var c1 = $td(ht,0,2);
- c1.style.textAlign = 'right';
-
- // first page
- var ic = this.add_icon(c1, 'resultset_first');
- ic.onclick = function() {
- me.start_rec = 1;
- me.run();
- }
-
- // prev page
- var ic = this.add_icon(c1, 'resultset_previous');
- ic.onclick = function() {
- if(me.start_rec - me.page_len <= 0)return;
- me.start_rec = me.start_rec - me.page_len;
- me.run();
- }
-
- // next page
- this.has_next = false;
- var ic = this.add_icon(c1, 'resultset_next');
- ic.onclick = function() {
- if(!me.has_next)return;
- me.start_rec = me.start_rec + me.page_len;
- me.run();
- }
-
- }
-
- _r.DataTable.prototype.set_desc = function() {
- this.sort_icon.src = 'lib/images/icons/arrow_down.gif'; this.sort_order='DESC';
- }
- _r.DataTable.prototype.set_asc = function(icon) {
- this.sort_icon.src = 'lib/images/icons/arrow_up.gif'; this.sort_order='ASC';
- }
-
- ////
-
- _r.DataTable.prototype.set_sort_option_disabled = function(label, disabled) {
- // has bugs due to sequencing
- // may not set during load
-
- var s = this.sort_sel;
- if(disabled) {
- // remove this option
- for(var i=0; i<s.options.length; i++) {
- if(s.options[i] && s.options[i].text==label) {
- this.disabled_options[label] = s.options[i];
- s.remove(i);
- }
- }
- } else {
- // get it back
- if(this.disabled_options[label]) {
- try {
- s.add(this.disabled_options[label], s.options[s.options.length-1]);
- } catch(e) {
- try {
- s.add(this.disabled_options[label], s.options.length-1);
- } catch (e) { }
- }
- this.disabled_options[label] = null;
- }
- }
-
-
- }
-
- _r.DataTable.prototype.add_sort_option = function(label, val) {
- var s = this.sort_sel;
- s.options[s.options.length] =
- new Option(label, val, false, s.options.length==0?true:false);
- }
-
-
- _r.DataTable.prototype.update_query = function(no_limit) {
-
- // add sorting
- if((_r.rb_con.cur_rb && _r.rb_con.cur_rb.get_query) || (this.search_criteria && this.search_criteria.custom_query)) {
- // no sorting if custom_query or get_query
- } else {
- if(!sel_val(this.sort_sel)) {
- this.sort_sel.selectedIndex = 0; // select the first value (IE)
- }
- this.query += NEWLINE
- + ' ORDER BY ' + sel_val(this.sort_sel)
- + ' ' + this.sort_order;
- }
-
- if(no_limit || this.no_limit) {
- if(this.show_query) alert(this.query);
- return;
- }
-
- // add paging
- this.query += ' LIMIT ' + (this.start_rec-1) + ',' + this.page_len;
- if(this.show_query)
- alert(this.query);
-
- }
-
- _r.DataTable.prototype._get_query = function(no_limit) {
- $dh(this.no_data_tag);
- this.show_query = 0;
- if(this.make_query)
- this.make_query();
- this.update_query(no_limit);
- }
-
- _r.DataTable.prototype.run = function() {
- if(this.validate && !this.validate())
- return;
-
- if(_r.rb_con.cur_rb) {
- if(_r.rb_con.cur_rb.large_report == 1) {
- 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");
- return;
- }
- _r.rb_con.cur_rb.mytabs.items['Result'].expand();
- }
-
- var me = this;
- this._get_query();
-
- // preset data
- if(this.set_data) {
- this.show_result(this.set_data);
- this.set_data = null;
- return;
- }
-
- $ds(this.fetching_tag);
- if(isFF)this.clear_all();
-
- var args = {
- 'query':me.query,
- 'report_name': '_r.DataTable',
- 'show_deleted':1,
- 'sc_id':me.search_criteria ? me.search_criteria.name : '',
- 'filter_values':me.filter_vals ? docstring(me.filter_vals) : '',
- 'roles':'["'+user_roles.join('","')+'"]'
- }
-
- if(this.is_simple) args.is_simple = 1;
-
- page_body.set_status('Running Query...');
- $c('webnotes.widgets.query_builder.runquery', args, function(r,rt) {
- $dh(me.fetching_tag);
- page_body.set_status('Done');
- me.show_result(r,rt);
- });
-
- }
-
- _r.DataTable.prototype.clear_all = function() {
- // clear old
- if(this.htab && this.htab.parentNode) {
- this.htab.parentNode.removeChild(this.htab); delete this.htab; }
- if(this.tab && this.tab.parentNode) {
- this.tab.parentNode.removeChild(this.tab); delete this.tab; }
- $dh(this.no_data_tag);
-
- }
-
- _r.DataTable.prototype.has_data = function() {
- if(this.htab && this.htab.rows.length)return 1;
- else return 0;
- }
-
- _r.DataTable.prototype.show_result = function(r, rt) {
- // clear old
- var me = this;
- this.clear_all();
-
- this.rset = eval(r.values);
-
- if(this.rset && this.rset.length) {
-
- // add
- if(this.has_headings) {
- this.htab = $a(this.hwrapper, 'table');
- $y(this.twrapper,{top:'25px',borderTop:'0px'});
- }
- this.tab = $a(this.twrapper, 'table');
-
- this.colwidths = eval(r.colwidths);
- this.coltypes = eval(r.coltypes);
- this.coloptions = eval(r.coloptions);
- this.colnames = eval(r.colnames);
-
- $y(this.tab,{tableLayout:'fixed'});
-
- if(this.beforetableprint)this.beforetableprint(this);
-
- // heading
- if(this.has_headings) this.make_head_tab(this.colnames);
-
- // data
- var start = this.start_rec;
-
- // show max 1000
- var rset_len = this.rset.length;
- if(rset_len > 1000) {
- msgprint("Showing only 1000 records out of " + rset_len + ". Use 'Export' to see all records");
- rset_len = 1000;
- }
-
- for(var vi=0; vi<rset_len; vi++) {
- var row = this.tab.insertRow(vi);
- // for script
-
- if(this.has_index) {
- var c0 = row.insertCell(0);
- $w(c0, '30px');
- $a(c0, 'div', '', {width:'23px'}).innerHTML = start;
- }
-
- // cells
- start++;
- for(var ci=0;ci < this.rset[vi].length;ci++) {
- this.make_data_cell(vi, ci, this.rset[vi][ci]);
- }
-
- if(this.afterrowprint) {
- row.data_cells = {}; row.data = {};
- for(var ci=0;ci< this.colnames.length;ci++) {
- row.data[this.colnames[ci]] = this.rset[vi][ci];
- row.data_cells[this.colnames[ci]] = row.cells[ci+1];
- }f
- this.afterrowprint(row);
- }
-
- }
-
- // has next page?
- if(this.rset.length && this.rset.length>=this.page_len)this.has_next = true;
-
- // style
- if(r.style) {
- for(var i=0;i<r.style.length;i++) {
- $yt(this.tab,r.style[i][0],r.style[i][1],r.style[i][2]);
- }
- }
-
- // after table print
- if(this.aftertableprint) this.aftertableprint(this.tab);
-
-
- } else {
- $ds(this.no_data_tag);
- }
- }
-
- _r.DataTable.prototype.get_col_width = function(i) {
- if(this.colwidths
- && this.colwidths.length
- && this.colwidths[i])
- return cint(this.colwidths[i]) +'px';
- else return '100px';
- }
-
- _r.DataTable.prototype.make_head_tab = function(colnames) {
- var r0 = this.htab.insertRow(0);
- if(this.has_index) {
- var c0 = r0.insertCell(0);
- c0.className = 'report_head_cell';
- $w(c0, '30px');
- $a(c0, 'div').innerHTML = 'Sr';
- this.total_width = 30;
- }
-
- for(var i=0;i<colnames.length;i++) {
- var w = this.get_col_width(i);
- this.total_width+=cint(w);
-
- var c = r0.insertCell(r0.cells.length);
- c.className = 'report_head_cell';
- if(w)$w(c, w);
- $a(c,'div').innerHTML = colnames[i];
- c.val = colnames[i];
- }
- $w(this.htab, this.total_width + 'px');
- $w(this.tab, this.total_width + 'px');
- }
-
- _r.DataTable.prototype.make_data_cell = function(ri, ci, val) {
- var row = this.tab.rows[ri];
- var c = row.insertCell(row.cells.length);
-
- // row style:
- if(row.style.color)
- c.style.color = row.style.color;
- if(row.style.backgroundColor)
- c.style.backgroundColor = row.style.backgroundColor;
- if(row.style.fontWeight)
- c.style.fontWeight = row.style.fontWeight;
- if(row.style.fontSize)
- c.style.fontSize = row.style.fontSize;
-
- var w = this.get_col_width(ci);
- if(w)$w(c, w);
- c.val = val;
-
- var me = this;
-
- c.div = $a(c, 'div', '', {width:(cint(w)-7)+'px'});
- $s(c.div, val, this.coltypes[ci], this.coloptions[ci])
- }
-
- _r.DataTable.prototype.do_print = function() {
- this._get_query(true);
-
- args = {
- query : this.query,
- title : this.rep_name?this.rep_name:this.dt,
- colnames : null,
- colwidhts : null,
- coltypes : null,
- has_index : this.has_index,
- has_headings: this.has_headings,
- check_limit : 1,
- is_simple : (this.is_simple ? 'Yes' : ''),
- sc_id : (this.search_criteria ? this.search_criteria.name : ''),
- filter_values : docstring(this.filter_vals),
- finder: this.finder ? this.finder : null
- };
-
- wn.require('lib/js/legacy/widgets/print_query.js');
- _p.print_query = new _p.PrintQuery();
- _p.print_query.show_dialog(args);
- }
-
- _r.DataTable.prototype.do_export = function() {
- this._get_query(true);
-
- var me = this;
- export_query(this.query, function(q) {
- 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));
- });
- }
-
- // Calculator
- // ----------
- _r.DataTable.prototype.do_calc = function() {
- _r.show_calc(this.tab, this.colnames, this.coltypes, 1);
- }
-
- _r.DataTable.prototype.get_col_data = function(colname) {
- var ci = 0;
- if(!this.htab) return [];
- for(var i=1;i<this.htab.rows[0].cells.length;i++) {
- var hc = this.htab.rows[0].cells[i];
- if(hc.val == colname) {
- ci = i;
- break;
- }
- }
-
- var ret = [];
- for(var ri=0;ri<this.tab.rows.length;ri++) {
- ret[ret.length] = this.tab.rows[ri].cells[ci].val;
- }
- return ret;
- }
-
- _r.DataTable.prototype.get_html = function() {
- var w = document.createElement('div');
- w = $a(w, 'div');
- w.style.marginTop = '16px';
- var tab = $a(w, 'table');
-
- var add_head_style = function(c, w) {
- c.style.fontWeight = 'bold';
- c.style.border = '1px solid #000';
- c.style.padding = '2px';
- if(w)$w(c, w);
- return c;
- }
-
- var add_cell_style = function(c) {
- c.style.padding = '2px';
- c.style.border = '1px solid #000';
- return c;
- }
-
- tab.style.borderCollapse = 'collapse';
- var hr = tab.insertRow(0);
- var c0 = add_head_style(hr.insertCell(0), '30px');
- c0.innerHTML = 'Sr';
-
- // heading
- for(var i=1;i<this.htab.rows[0].cells.length;i++) {
- var hc = this.htab.rows[0].cells[i];
- var c = add_head_style(hr.insertCell(i), hc.style.width);
- c.innerHTML = hc.innerHTML;
- }
-
- // data
- for(var ri=0;ri<this.tab.rows.length;ri++) {
- var row = this.tab.rows[ri];
- var dt_row = tab.insertRow(tab.rows.length);
- for(var ci=0;ci<row.cells.length;ci++) {
- var c = add_cell_style(dt_row.insertCell(ci));
- c.innerHTML = row.cells[ci].innerHTML;
- }
- }
- return w.innerHTML;
- }
-
|