seitime-frappe/js/widgets/report_builder/calculator.js
2011-06-08 14:24:18 +05:30

69 lines
2 KiB
JavaScript

// Calculator
// ----------
_r.calc_dialog = null;
_r.show_calc = function(tab, colnames, coltypes, add_idx) {
if(!add_idx) add_idx = 0;
if(!tab || !tab.rows.length) { msgprint("No Data"); return; }
if(!_r.calc_dialog) {
var d = new Dialog(400,400,"Calculator")
d.make_body([
['Select','Column']
,['Data','Sum']
,['Data','Average']
,['Data','Min']
,['Data','Max']
])
d.widgets['Sum'].readonly = 'readonly';
d.widgets['Average'].readonly = 'readonly';
d.widgets['Min'].readonly = 'readonly';
d.widgets['Max'].readonly = 'readonly';
d.widgets['Column'].onchange = function() {
d.set_calc();
}
d.set_calc = function() {
// get the current column of the data table
var cn = sel_val(this.widgets['Column']);
var cidx = 0; var sum=0; var avg=0; var minv = null; var maxv = null;
for(var i=0;i<this.colnames.length;i++) {if(this.colnames[i]==cn){ cidx=i+add_idx; break; } }
for(var i=0; i<this.datatab.rows.length; i++) {
var c = this.datatab.rows[i].cells[cidx];
var v = c.div ? flt(c.div.innerHTML) : flt(c.innerHTML);
sum += v;
if(minv == null) minv = v;
if(maxv == null) maxv = v;
if(v > maxv)maxv = v;
if(v < minv)minv = v;
}
d.widgets['Sum'].value = fmt_money(sum);
d.widgets['Average'].value = fmt_money(sum / this.datatab.rows.length);
d.widgets['Min'].value = fmt_money(minv);
d.widgets['Max'].value = fmt_money(maxv);
_r.calc_dialog = d;
}
d.onshow = function() {
// set columns
var cl = [];
for(var i in _r.calc_dialog.colnames) {
if(in_list(['Currency','Int','Float'],_r.calc_dialog.coltypes[i]))
cl.push(_r.calc_dialog.colnames[i]);
}
if(!cl.length) {
this.hide();
alert("No Numeric Column");
return;
}
var s = this.widgets['Column'];
empty_select(s);
add_sel_options(s, cl);
if(s.inp)s.inp.value = cl[0];
else s.value = cl[0];
this.set_calc();
}
_r.calc_dialog = d;
}
_r.calc_dialog.datatab = tab;
_r.calc_dialog.colnames = colnames;
_r.calc_dialog.coltypes = coltypes;
_r.calc_dialog.show();
}