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

416 lines
12 KiB
JavaScript

_p.show_dialog = function() {
if(!_p.dialog) {
_p.make_dialog();
}
_p.dialog.show();
}
_p.make_dialog = function() {
var d = new Dialog(360, 140, "Print Formats");
d.make_body(
[['HTML','Select']
,['Check','No Letterhead','Will ignore letterhead if it can be set. May not work for all formats']
,['HTML', 'Buttons']
]);
d.widgets['No Letterhead'].checked = 1;
// prints
$btn(d.widgets.Buttons, 'Print',
function() { _p.build(sel_val(cur_frm.print_sel), _p.go, d.widgets['No Letterhead'].checked); },
{cssFloat:'right', marginBottom:'16px', marginLeft:'7px'}, 'green');
// preview
$btn(d.widgets.Buttons, 'Preview',
function() { _p.build(sel_val(cur_frm.print_sel), _p.preview, d.widgets['No Letterhead'].checked); },
{cssFloat:'right', marginBottom:'16px'}, '');
_p.dialog = d;
d.onshow = function() {
var c = d.widgets['Select'];
if(c.cur_sel && c.cur_sel.parentNode == c)
c.removeChild(c.cur_sel);
c.appendChild(cur_frm.print_sel);
c.cur_sel = cur_frm.print_sel;
}
}
_p.field_tab = function(layout_cell) {
var t = $a(layout_cell, 'table', '', {width:'100%'});
var r = t.insertRow(0); this.r = r;
r.insertCell(0); r.insertCell(1);
r.cells[0].className='datalabelcell';
r.cells[1].className='datainputcell';
return r
}
// standard layout
// ==========================================================================
_p.print_std_add_table = function(t, layout, pf_list, dt, no_letterhead) {
if(t.appendChild) {
// one table only
layout.cur_cell.appendChild(t);
} else {
// multiple tables
for(var ti=0;ti<t.length-1;ti++) {
// add to current page
layout.cur_cell.appendChild(t[ti]);
layout.close_borders();
pf_list[pf_list.length] = '<div style="page-break-after: always;" class="page_break"></div>';
// new page
layout = _p.add_layout(dt, no_letterhead);
pf_list[pf_list.length]=layout;
layout.addrow();
layout.addcell();
var div = $a(layout.cur_cell, 'div');
div.innerHTML = 'Continued from previous page...';
div.style.padding = '4px';
}
// last table
layout.cur_cell.appendChild(t[t.length-1]);
}
return layout;
}
// --------------------------------------------------------------------
_p.print_std_add_field = function(dt, dn, f, layout) {
var v = _f.get_value(dt,dn,f.fieldname);
if(f.fieldtype!="Button") {
if(!v && !in_list(['Float','Int','Currency'], f.fieldtype)) {
// no value and non-numberic - do nothing
} else {
r = _p.field_tab(layout.cur_cell)
// label
r.cells[0].innerHTML=f.label?f.label:f.fieldname;
$s(r.cells[1], v, f.fieldtype);
// left align currency in normal display
if(f.fieldtype=='Currency')
$y(r.cells[1],{textAlign: 'left'});
}
}
}
_p.get_letter_head = function() {
// add letter head
var cp = locals['Control Panel']['Control Panel'];
if(cur_frm.doc.letter_head)
var lh= cstr(_p.letter_heads[cur_frm.doc.letter_head]);
else if(cp.letter_head)
var lh= cp.letter_head;
else
var lh= '';
return lh;
}
// --------------------------------------------------------------------
_p.add_layout = function(dt, no_letterhead) {
var l = new Layout();
l.addrow();
if(locals['DocType'][dt].print_outline=='Yes') l.with_border = 1;
return l;
}
// --------------------------------------------------------------------
_p.print_std = function(no_letterhead) {
var dn = cur_frm.docname;
var dt = cur_frm.doctype;
var pf_list = [];
var layout = _p.add_layout(dt, no_letterhead);
pf_list[pf_list.length]=layout;
// heading
var h1 = $a(layout.cur_row.header, 'h1', '', {fontSize:'22px', marginBottom:'8px'});
h1.innerHTML = cur_frm.pformat[dn] ? cur_frm.pformat[dn] : get_doctype_label(dt);
var h2 = $a(layout.cur_row.header, 'div', '', {fontSize:'16px', color:'#888', marginBottom:'8px', paddingBottom:'8px', borderBottom:(layout.with_border ? '0px' : '1px solid #000' )});
h2.innerHTML = dn;
var fl = getchildren('DocField', dt, 'fields', 'DocType');
if(fl[0]&&fl[0].fieldtype!="Section Break") {
layout.addrow(); // default section break
if(fl[0].fieldtype!="Column Break") // without column too
layout.addcell();
}
// build each field
for(var i=0;i<fl.length;i++) {
var fn = fl[i].fieldname?fl[i].fieldname:fl[i].label;
if(fn)
var f = get_field(dt, fn, dn);
else
var f = fl[i];
if(!f.print_hide){
// if there is a custom method to generate the HTML then use it
if(cur_frm.pformat[f.fieldname]) {
var tmp = $a(layout.cur_cell, 'div');
tmp.innerHTML = cur_frm.pformat[f.fieldname](locals[dt][dn]);
} else {
// do the normal thing
switch(f.fieldtype){
case 'Section Break':
layout.addrow();
// if no column break after this field then add a column
if(fl[i+1]&&(fl[i+1].fieldtype!='Column Break')) {
layout.addcell(); }
// add label ---- no labels for section breaks!
//if(f.label) layout.cur_row.header.innerHTML = '<div class="sectionHeading">'+f.label+'</div>';
break;
case 'Column Break':
layout.addcell(f.width, f.label);
//if(f.label) layout.cur_cell.header.innerHTML = '<div class="columnHeading">'+f.label+'</div>';
break;
case 'Table':
var t = print_table(dt, dn,f.fieldname,f.options,null,null,null,null);
layout = _p.print_std_add_table(t, layout, pf_list, dt, no_letterhead);
break;
case 'HTML':
var tmp = $a(layout.cur_cell, 'div');
tmp.innerHTML = f.options;
break;
case 'Code':
var tmp = $a(layout.cur_cell, 'div');
var v= _f.get_value(dt,dn,f.fieldname);
tmp.innerHTML = '<div>'+ f.label + ': </div>' + '<pre style="font-family: Courier, Fixed;">'+(v?v:'')+'</pre>';
break;
case 'Text Editor':
var tmp = $a(layout.cur_cell, 'div');
var v= _f.get_value(dt,dn,f.fieldname);
tmp.innerHTML = v?v:'';
break;
default:
// add cell data
_p.print_std_add_field(dt, dn, f, layout);
}
}
}
}
layout.close_borders();
// build html for each page
var html = '';
for(var i=0;i<pf_list.length;i++) {
if(pf_list[i].wrapper) {
html += pf_list[i].wrapper.innerHTML;
} else if(pf_list[i].innerHTML) {
html += pf_list[i].innerHTML;
} else {
html += pf_list[i];
}
}
pf_list = []; // cleanup
return html;
}
_p.print_style = ".datalabelcell {padding: 2px 0px; width: 38%;vertical-align:top; }"
+".datainputcell { padding: 2px 0px; width: 62%; text-align:left; }"
+".sectionHeading { font-size: 16px; font-weight: bold; margin: 8px 0px }"
+".columnHeading { font-size: 14px; font-weight: bold; margin: 8px 0px; }"
_p.formats = {}
_p.build = function(fmtname, onload, no_letterhead, only_body) {
if(!cur_frm) { alert('No Document Selected'); return; }
var doc = locals[cur_frm.doctype][cur_frm.docname];
if(fmtname=='Standard') {
onload(_p.render(_p.print_std(no_letterhead), _p.print_style, doc, doc.name, no_letterhead, only_body));
} else {
if(!_p.formats[fmtname]) // not loaded, get data
$c('webnotes.widgets.form.get_print_format', {'name':fmtname },
function(r,rt) {
_p.formats[fmtname] = r.message;
onload(_p.render(_p.formats[fmtname], '', doc, doc.name, no_letterhead, only_body));
}
);
else // loaded
onload(_p.render(_p.formats[fmtname], '', doc, doc.name, no_letterhead, only_body));
}
}
_p.render = function(body, style, doc, title, no_letterhead, only_body) {
var block = document.createElement('div');
var tmp_html = '';
if(doc && cint(doc.docstatus)==0 && cur_frm.perm[0][SUBMIT]) {
var tmp_html = '<div style="text-align: center; padding: 8px; background-color: #CCC; "><div style="font-size: 20px; font-weight: bold; ">DRAFT</div>This box will go away after the document is submitted.</div>';
}
if(doc && doc.__archived) {
var tmp_html = '<div style="text-align: center; padding: 8px; background-color: #CCC; "><div style="font-size: 20px; font-weight: bold; ">ARCHIVED</div>You must restore this document to make it editable.</div>';
}
style = (only_body ? '' : _p.def_print_style_body) + _p.def_print_style_other + style;
block.innerHTML = body;
// run embedded javascript
var jslist = block.getElementsByTagName('script');
while(jslist.length>0) {
for(var i=0; i<jslist.length; i++) {
var code = jslist[i].innerHTML;
var p = jslist[i].parentNode;
var sp = $a(p, 'span');
p.replaceChild(sp, jslist[i]);
var h = eval(code); if(!h)h='';
sp.innerHTML = h;
}
jslist = block.getElementsByTagName('script');
}
// show letterhead?
if(only_body)
show_lh = false;
else {
if(!no_letterhead) show_lh = true;
else show_lh = false;
}
// add letter head
if(show_lh) {
block.innerHTML = '<div>' + _p.get_letter_head() + '</div>' + block.innerHTML;
}
if(only_body) {
return tmp_html + block.innerHTML.replace(/<td/g, '\n<td').replace(/<div/g, '\n<div');
} else {
// print block
return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n'
+ '<html><head>'
+ '<title>'+title+'</title>'
+ '<style>'+style+'</style>'
+ '</head><body>'
+ tmp_html
+ block.innerHTML.replace(/<td/g, '\n<td')
+ '</body></html>';
}
}
print_table = function(dt, dn, fieldname, tabletype, cols, head_labels, widths, condition, cssClass) {
var fl = fields_list[tabletype];
var ds = getchildren(tabletype, dn, fieldname, dt);
var tl = [];
var cell_style = {border:'1px solid #000', padding:'2px', verticalAlign:'top'};
var head_cell_style = {border:'1px solid #000', padding:'2px', verticalAlign:'top', backgroundColor:'#ddd'};
var make_table = function(fl) {
var w = document.createElement('div');
var t = $a(w, 'table', '', {width:'100%', borderCollapse:'collapse', marginBottom:'10px'});
t.wrapper = w;
// head row
t.insertRow(0);
var c_start = 0;
if(fl[0]=='SR') {
var cell = t.rows[0].insertCell(0)
cell.innerHTML = head_labels?head_labels[0]:'<b>Sr</b>';
$y(cell, {width:'30px'});
$y(cell, head_cell_style)
c_start = 1;
}
for(var c=c_start;c<fl.length;c++) {
var cell = t.rows[0].insertCell(c);
$y(cell, head_cell_style)
if(head_labels)
cell.innerHTML = head_labels[c];
else
cell.innerHTML = fl[c].label;
if(fl[c].width)
$y(cell, {width:fl[c].width});
if(widths)
$y(cell, {width: widths[c]});
if(fl[c].fieldtype=='Currency')
$y(cell,{textAlign: 'right'});
cell.style.fontWeight = 'bold';
}
return t;
}
// no headings if not entries
if(!ds.length) return document.createElement('div');
// make column list
var newfl = [];
if(cols&&cols.length) { // custom
if(cols[0]=='SR')newfl[0]='SR';
for(var i=0;i<cols.length;i++) {
for(var j=0;j<fl.length;j++) {
if(fl[j].fieldname==cols[i]) {
newfl[newfl.length] = fl[j];
break;
}
}
}
} else { // remove hidden cols
newfl = ['SR']
for(var j=0;j<fl.length;j++) {
if(!fl[j].print_hide) {
newfl[newfl.length] = fl[j];
}
}
}
fl = newfl;
var t = make_table(fl);
tl.push(t.wrapper);
// setup for auto "Sr No" -> SR
var c_start = 0;
if(fl[0]=='SR') { c_start = 1; }
// data
var sr = 0;
for(var r=0;r<ds.length;r++) {
if((!condition)||(condition(ds[r]))) {
// check for page break
if(ds[r].page_break) { var t = make_table(fl); tl.push(t.wrapper); }
var rowidx = t.rows.length;
sr++
var row = t.insertRow(rowidx);
if(c_start) {
var cell = row.insertCell(0);
cell.innerHTML = sr;
$y(cell, cell_style);
}
// add values
for(var c=c_start;c<fl.length;c++) {
var cell = row.insertCell(c);
$y(cell, cell_style);
$s(cell, ds[r][fl[c].fieldname], fl[c].fieldtype);
if(fl[c].fieldtype=='Currency')
cell.style.textAlign = 'right';
}
}
}
if(tl.length>1) return tl; // multiple tables with page breakes
else return tl[0];
}