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

154 lines
4.3 KiB
JavaScript

_p.PrintQuery = function() {
this.args = {};
}
_p.PrintQuery.prototype.show_dialog = function(args) {
this.args = args;
var me = this;
if(!this.dialog) {
var d = new Dialog(400, 300, "Print");
d.make_body([
['Data', 'Max rows', 'Blank to print all rows'],
['Data', 'Rows per page'],
['Button', 'Go'],
]);
d.widgets['Go'].onclick = function() {
d.hide();
me.render(cint(d.widgets['Max rows'].value), cint(d.widgets['Rows per page'].value))
}
d.onshow = function() {
this.widgets['Rows per page'].value = '35';
this.widgets['Max rows'].value = '500';
}
this.dialog = d;
}
this.dialog.show();
}
_p.PrintQuery.prototype.render = function(max_rows, page_len) {
//q, title, colnames, colwidths, coltypes, has_index, check_limit, is_simple
var me = this;
var args = me.args;
// limit for max rows
if(cint(max_rows)!=0) args.query += ' LIMIT 0,' + cint(max_rows);
if(!args.query) return;
var callback = function(r,rt) {
if(!r.values) { return; }
if(!page_len) page_len = r.values.length;
// add serial num column
if(r.colnames && r.colnames.length)
args.colnames = args.has_index ? add_lists(['Sr'],r.colnames) : r.colnames;
if(r.colwidths && r.colwidths.length)
args.colwidths = args.has_index ? add_lists(['25px'],r.colwidths) : r.colwidths;
if(r.coltypes)
args.coltypes = args.has_index ? add_lists(['Data'],r.coltypes) : r.coltypes;
if(args.coltypes) {
for(var i in args.coltypes)
if(args.coltypes[i]=='Link') args.coltypes[i]='Data';
}
// fix widths to %
if(args.colwidths) {
var tw = 0;
for(var i=0; i<args.colwidths.length; i++) tw+=cint(args.colwidths[i] ? args.colwidths[i]: 100);
for(var i=0; i<args.colwidths.length; i++) args.colwidths[i]= cint(cint(args.colwidths[i] ? args.colwidths[i] : 100) / tw * 100) + '%';
}
var has_heading = args.colnames ? 1 : 0;
if(!args.has_headings) has_heading = 0;
var tl = []
for(var st=0; st< r.values.length; st = st + page_len) {
tl.push(me.build_table(r, st, page_len, has_heading, args.rb))
}
var html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'
+ '<html><head>'
+'<title>'+args.title+'</title>'
+'<style>'+_p.def_print_style_body + _p.def_print_style_other+'</style>'
+'</head><body>'
+ (r.header_html ? r.header_html : '')
+ tl.join('\n<div style="page-break-after: always;"></div>\n')
+ (r.footer_html ? r.footer_html : '')
+'</body></html>';
_p.preview(html);
}
var out_args = copy_dict(args);
if(args.is_simple) {
out_args.simple_query = args.query;
delete out_args.query;
}
// add filter values
if(args.filter_values)
out_args.filter_values = args.filter_values;
$c('webnotes.widgets.query_builder.runquery', out_args, callback);
}
_p.PrintQuery.prototype.build_table = function(r, start, page_len, has_heading, rb) {
// print a table
var div = document.createElement('div');
if(!r.page_template) {
var head = $a(div,'div',null,{fontSize:'20px', fontWeight:'bold', margin:'16px 0px', borderBottom: '1px solid #CCC', paddingBottom:'8px'});
head.innerHTML = args.title;
}
var m = start + page_len;
if(m>r.values.length) m = r.values.length
var t = make_table(div, m + has_heading - start, r.values[0].length + args.has_index, '100%', null);
t.className = 'simpletable';
if(args.colwidths)
$y(t,{tableLayout:'fixed'});
if(has_heading) {
for(var i=0; i < args.colnames.length; i++) {
$td(t,0,i).innerHTML = args.colnames[i].bold();
if(args.colwidths && args.colwidths[i]) {
$w($td(t,0,i),args.colwidths[i]);
}
}
}
for(var ri=start; ri<m; ri++) {
// Sr No
if(args.has_index)
$td(t,ri+has_heading-start,0).innerHTML=ri+1;
for(var ci=0; ci<r.values[0].length; ci++) {
if(ri-start==0 && args.colwidths && args.colwidths[i]){
$w($td(t,0,i), args.colwidths[i]); // colwidths for all
}
var c = $td(t,ri+has_heading-start,ci + args.has_index)
c.div = $a(c, 'div','', {whiteSpace:'normal'});
$s(
c.div,
r.values[ri][ci],
args.coltypes ? args.coltypes[ci + args.has_index] : null
);
}
}
// user style
if(r.style) {
for(var i=0;i<r.style.length;i++) {
$yt(t,r.style[i][0],r.style[i][1],r.style[i][2]);
}
}
if(rb && rb.aftertableprint) {
rb.aftertableprint(t);
}
if(r.page_template) return repl(r.page_template, {table:div.innerHTML});
else return div.innerHTML;
}