cleaned up handlerpy, build and made ajax crawler friendly

This commit is contained in:
Rushabh Mehta 2012-02-01 14:45:59 +05:30
parent 9ba0bff606
commit 5d2c362963
23 changed files with 526 additions and 690 deletions

15
conf/index.html Normal file
View file

@ -0,0 +1,15 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<head>
<meta charset="utf-8">
<title>ERPNext</title>
{{ ajax_meta_tag }}
<meta name="author" content="">
<script type="text/javascript">
{{ bootinfo }};
{{ corejs }}
</script>
</head>
<body>
{{ body_html }}
</body>

View file

@ -1,8 +1,7 @@
/*
* lib/css/legacy/body.css
*/
html {
* lib/css/legacy/body.css
*/html {
margin: 0px;
padding: 0px;
}
@ -179,9 +178,8 @@ div.std-footer-item {
}
/*
* lib/css/legacy/menus.css
*/
* lib/css/legacy/menus.css
*/
/******** Menus - menu.js ************/
ul.menu_toolbar {
@ -233,9 +231,8 @@ div.dd_item {
}
div.dd_item_mo { background-color: #FE8; }
/*
* lib/css/legacy/messages.css
*/
* lib/css/legacy/messages.css
*/
/* FLOATING MESSAGE */
.btn-img { cursor: pointer; }
@ -284,9 +281,8 @@ div.notice {
font-size: 14px;
}
/*
* lib/css/legacy/forms.css
*/
/* FORMS */
* lib/css/legacy/forms.css
*//* FORMS */
div.frm_print_wrapper {
@ -508,9 +504,8 @@ div.sidebar-comment-info {
color: #777;
}
/*
* lib/css/legacy/grid.css
*/
* lib/css/legacy/grid.css
*/
/* Grid */
@ -633,9 +628,8 @@ div.sidebar-comment-info {
.gridDivSelected option { border: 0px; }
/*
* lib/css/legacy/listing.css
*/
/* listing 2.0 */
* lib/css/legacy/listing.css
*//* listing 2.0 */
div.listing-more {
margin: 7px 0px 17px 0px;
@ -693,9 +687,8 @@ div.srs_filter_area td {
/*
* lib/css/legacy/report.css
*/
* lib/css/legacy/report.css
*/
/* Reports */
div.report_grid_area {
@ -876,9 +869,8 @@ table.builder_tab td {
padding: 2px;
}
/*
* lib/css/legacy/calendar.css
*/
/**** CALENDAR ****/
* lib/css/legacy/calendar.css
*//**** CALENDAR ****/
.caldiv {
position:absolute;
@ -1051,9 +1043,8 @@ div.cal_event_hover {
}
/*
* lib/css/legacy/autosuggest.css
*/
/*
* lib/css/legacy/autosuggest.css
*//*
================================================
autosuggest, inquisitor style
================================================
@ -1146,9 +1137,8 @@ div.autosuggest ul em
}
/*
* lib/css/legacy/dialog.css
*/
/***** Dialogs *******/
* lib/css/legacy/dialog.css
*//***** Dialogs *******/
div.dialog_wrapper {
position: absolute;
@ -1227,9 +1217,8 @@ div.dialog_row table td textarea {
}
/*
* lib/css/legacy/wntoolbar.css
*/
* lib/css/legacy/wntoolbar.css
*/
/* Recent */
div.status_flag {
@ -1256,9 +1245,8 @@ div.status_flag {
.sprite-search { background-position: 0 -330px; }
.sprite-tools { background-position: 0 -396px; }
/*
* lib/css/legacy/tabs.css
*/
* lib/css/legacy/tabs.css
*/
/******* TABS ********/
div.box_label_wrapper {
@ -1318,9 +1306,8 @@ ul.box_tabs li.box_tab_selected a {
}
/*
* lib/css/legacy/bw-icons.css
*/
* lib/css/legacy/bw-icons.css
*/
/** general icons **/
.wn-icon { background: url('lib/images/icons/icons.png'); width: 16px; height: 16px; cursor: pointer; }
@ -1572,9 +1559,8 @@ ul.box_tabs li.box_tab_selected a {
/*
* lib/css/legacy/sidebar.css
*/
div.psidebar-wrapper {
* lib/css/legacy/sidebar.css
*/div.psidebar-wrapper {
margin: 0px 8px;
}
@ -1624,9 +1610,8 @@ div.follower-list {
font-size: 11px;
}
/*
* lib/css/legacy/bootstrap-buttons.css
*/
.btn.danger,
* lib/css/legacy/bootstrap-buttons.css
*/.btn.danger,
.alert-message.danger,
.btn.danger:hover,
.alert-message.danger:hover,

54
js/core.min.js vendored
View file

@ -1,53 +1,46 @@
/*
* lib/js/wn/class.js
*/
* lib/js/wn/class.js
*/
(function(){var initializing=false,fnTest=/xyz/.test(function(){xyz;})?/\b_super\b/:/.*/;this.Class=function(){};Class.extend=function(prop){var _super=this.prototype;initializing=true;var prototype=new this();initializing=false;for(var name in prop){prototype[name]=typeof prop[name]=="function"&&typeof _super[name]=="function"&&fnTest.test(prop[name])?(function(name,fn){return function(){var tmp=this._super;this._super=_super[name];var ret=fn.apply(this,arguments);this._super=tmp;return ret;};})(name,prop[name]):prop[name];}
function Class(){if(!initializing&&this.init)
this.init.apply(this,arguments);}
Class.prototype=prototype;Class.prototype.constructor=Class;Class.extend=arguments.callee;return Class;};})();
/*
* lib/js/wn/provide.js
*/
wn={}
* lib/js/wn/provide.js
*/
if(!window.wn)wn={}
wn.provide=function(namespace){var nsl=namespace.split('.');var l=nsl.length;var parent=window;for(var i=0;i<l;i++){var n=nsl[i];if(!parent[n]){parent[n]={}}
parent=parent[n];}}
wn.provide('wn.settings');wn.provide('wn.ui');
/*
* lib/js/wn/xmlhttp.js
*/
* lib/js/wn/xmlhttp.js
*/
wn.xmlhttp={request:function(){if(window.XMLHttpRequest)
return new XMLHttpRequest();else if(window.ActiveXObject)
return new ActiveXObject("MsXml2.XmlHttp");},complete:function(req,callback,url){if(req.status==200||req.status==304){callback(req.responseText);}else{alert(url+' request error: '+req.statusText+' ('+req.status+')');}},get:function(url,callback,args,async){if(async===null)async=true;var req=wn.xmlhttp.request();req.onreadystatechange=function(){if(req.readyState==4){wn.xmlhttp.complete(req,callback,url)}}
var sep=((args&&args.indexOf('?'))==-1)?'?':'&';var u=args?(url+sep+args):url;req.open('GET',u,async);req.send(null);if(!async){wn.xmlhttp.complete(req,callback,url)}}}
/*
* lib/js/wn/versions.js
*/
wn.versions={check:function(){if(localStorage){if(window._version_number==-1||parseInt(localStorage._version_number)!=parseInt(window._version_number)){localStorage.clear();}
* lib/js/wn/versions.js
*/
wn.versions={check:function(){if(localStorage){if(window._version_number==-1||parseInt(localStorage._version_number)!=parseInt(window._version_number)){localStorage.clear();console.log("Cache cleared - version: "+_version_number)}
localStorage.setItem('_version_number',window._version_number);}}}
/*
* lib/js/wn/assets.js
*/
* lib/js/wn/assets.js
*/
wn.assets={executed_:{},exists:function(src){if('localStorage'in window&&localStorage.getItem(src))
return true},add:function(src,txt){if('localStorage'in window){localStorage.setItem(src,txt);}},get:function(src){return localStorage.getItem(src);},extn:function(src){if(src.indexOf('?')!=-1){src=src.split('?').slice(-1)[0];}
return src.split('.').slice(-1)[0];},load:function(src){var t=src;wn.xmlhttp.get(t,function(txt){wn.assets.add(src,txt);},'q='+Math.floor(Math.random()*1000),false)},execute:function(src){if(!wn.assets.exists(src)){wn.assets.load(src);}
var type=wn.assets.extn(src);if(wn.assets.handler[type]){wn.assets.handler[type](wn.assets.get(src),src);wn.assets.executed_[src]=1;}},handler:{js:function(txt,src){wn.dom.eval(txt);},css:function(txt,src){var se=document.createElement('style');se.type="text/css";if(se.styleSheet){se.styleSheet.cssText=txt;}else{se.appendChild(document.createTextNode(txt));}
document.getElementsByTagName('head')[0].appendChild(se);},cgi:function(txt,src){wn.dom.eval(txt)}}}
/*
* lib/js/wn/require.js
*/
* lib/js/wn/require.js
*/
wn.require=function(items){if(typeof items==="string"){items=[items];}
var l=items.length;for(var i=0;i<l;i++){var src=items[i];if(!(src in wn.assets.executed_)){wn.assets.execute(src);}}}
/*
* lib/js/wn/dom.js
*/
* lib/js/wn/dom.js
*/
wn.provide('wn.dom');wn.dom.by_id=function(id){return document.getElementById(id);}
wn.dom.eval=function(txt){var el=document.createElement('script');el.appendChild(document.createTextNode(txt));document.getElementsByTagName('head')[0].appendChild(el);}
wn.dom.add=function(parent,newtag,className,cs,innerHTML,onclick){if(parent&&parent.substr)parent=wn.dom.by_id(parent);var c=document.createElement(newtag);if(parent)
@ -60,17 +53,15 @@ wn.dom.css=function(ele,s){if(ele&&s){for(var i in s)ele.style[i]=s[i];};return
wn.dom.hide=function(ele){ele.style.display='none';}
wn.dom.show=function(ele,value){if(!value)value='block';ele.style.display=value;}
/*
* lib/js/wn/page.js
*/
* lib/js/wn/page.js
*/
wn.page={set:function(src){var new_selection=$('.inner div.content[_src="'+src+'"]');if(!new_selection.length){wn.assets.execute(src);new_selection=$('.inner div.content[_src="'+src+'"]');}
$('.inner .current_page').removeClass('current_page');new_selection.addClass('current_page');var title=$('nav ul li a[href*="'+src+'"]').attr('title')||'No Title'
state=window.location.hash;if(state!=src){window.location.hash=state;}
else{document.title=title;}}}
/*
* lib/js/lib/json2.js
*/
* lib/js/lib/json2.js
*/
var JSON;if(!JSON){JSON={};}
(function(){"use strict";function f(n){return n<10?'0'+n:n;}
if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+
@ -97,7 +88,6 @@ text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function
if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}
throw new SyntaxError('JSON.parse');};}}());
/*
* lib/js/core.js
*/
* lib/js/core.js
*/
wn.versions.check();wn.require("lib/js/lib/jquery.min.js");wn.require("lib/js/lib/history/history.min.js");$(document).bind('ready',function(){var base=window.location.href.split('#')[0];$.each($('a[softlink!="false"]'),function(i,v){if(v.href.substr(0,base.length)==base){var path=(v.href.substr(base.length));if(path.substr(0,1)!='#'){v.href=base+'#'+path;}}});if(!wn.settings.no_history&&window.location.hash){wn.page.set(window.location.hash.substr(1));}});

View file

@ -97,12 +97,13 @@ function startup() {
}
page_body.ready();
}
if(_startup_data && keys(_startup_data).length && _startup_data.docs) {
LocalDB.sync(_startup_data.docs);
callback(_startup_data, '');
// for debug
if(_startup_data.server_messages) msgprint(_startup_data.server_messages);
if(wn.boot) {
LocalDB.sync(wn.boot.docs);
callback(wn.boot, '');
if(wn.boot.error_messages)
console.log(wn.boot.error_messages)
if(wn.boot.server_messages)
msgprint(wn.boot.server_messages);
} else {
if($i('startup_div'))
$c('startup',{},callback,null,1);

View file

@ -1,8 +1,7 @@
/*
* lib/js/legacy/widgets/form/form_container.js
*/
* lib/js/legacy/widgets/form/form_container.js
*/
_f.FrmContainer=function(){this.wrapper=page_body.add_page("Forms",function(){},function(){});this.last_displayed=null;$dh(this.wrapper);this.body=$a(this.wrapper,'div','frm_container');_f.frm_dialog=new _f.FrmDialog();}
_f.frm_dialog=null;_f.calling_doc_stack=[];_f.temp_access={};_f.FrmDialog=function(){var me=this;this.last_displayed=null;var d=new Dialog(640,null,'Edit Row');this.body=$a(d.body,'div','dialog_frm');$y(d.body,{backgroundColor:'#EEE'});d.done_btn_area=$a(d.body,'div','',{margin:'8px'});me.on_complete=function(){if(me.table_form){me.dialog.hide();}else{var callback=function(r){var dn=cur_frm.docname;if(!r.exc){me.dialog.hide();}
if(me.on_save_callback)
@ -24,9 +23,8 @@ var f=new _f.Frm(doctype,parent);f.in_dialog=in_dialog;if(onload)onload(r,rt);}
var is_new=0;if(opt_name&&locals[doctype]&&locals[doctype][opt_name]&&locals[doctype][opt_name].__islocal){is_new=1;}
if(opt_name&&!is_new){var args={'name':opt_name,'doctype':doctype,'getdoctype':1,'user':user};if(get_url_arg('akey'))args['akey']=get_url_arg('akey');if(from_archive)args['from_archive']=1;$c('webnotes.widgets.form.load.getdoc',args,callback);}else{$c('webnotes.widgets.form.load.getdoctype',args={'doctype':doctype},callback);}}
/*
* lib/js/legacy/widgets/form/form_header.js
*/
* lib/js/legacy/widgets/form/form_header.js
*/
_f.FrmHeader=function(parent,frm){var me=this;this.wrapper=$a(parent,'div');if(frm.meta.in_dialog)$y(this.wrapper,{marginLeft:'8px',marginRight:'8px'});this.page_head=new PageHeader(this.wrapper);this.dt_area=$a(this.page_head.main_head,'h1','',{marginRight:'8px',display:'inline'})
var div=$a(null,'div','',{marginBottom:'4px'});this.page_head.lhs.insertBefore(div,this.page_head.sub_head);this.dn_area=$a(div,'span','',{fontSize:'14px',fontWeight:'normal',marginRight:'8px'})
this.status_area=$a(div,'span','',{marginRight:'8px',marginBottom:'2px',cursor:'pointer',textShadow:'none'})
@ -57,9 +55,8 @@ _f.FrmHeader.prototype.set_save_submit_color=function(doc){var save_btn=this.pag
_f.FrmHeader.prototype.refresh_labels=function(f){var ph=this.page_head;var me=this;this.dt_area.innerHTML=get_doctype_label(f.doctype);this.dn_area.innerHTML='';if(!f.meta.issingle)
this.dn_area.innerHTML=f.docname;var doc=locals[f.doctype][f.docname];var sl=this.get_status_tags(doc,f);this.set_save_submit_color(doc);var t=this.status_area;t.innerHTML='';t.appendChild(sl[0]);if(sl[1])t.appendChild(sl[1]);this.timestamp_area.innerHTML=me.get_timestamp(doc);}
/*
* lib/js/legacy/widgets/form/form.js
*/
* lib/js/legacy/widgets/form/form.js
*/
wn.provide('_f');_f.edit_record=function(dt,dn){d=_f.frm_dialog;var show_dialog=function(){var f=frms[dt];if(f.meta.istable){f.parent_doctype=cur_frm.doctype;f.parent_docname=cur_frm.docname;}
d.cur_frm=f;d.dn=dn;d.table_form=f.meta.istable;f.refresh(dn);}
if(!frms[dt]){_f.add_frm(dt,show_dialog,null);}else{show_dialog();}}
@ -209,9 +206,8 @@ if(frm&&frm==cur_frm){frm.set_heading();}}}
_f.Frm.prototype.show_comments=function(){if(!cur_frm.comments){cur_frm.comments=new Dialog(540,400,'Comments');cur_frm.comments.comment_body=$a(cur_frm.comments.body,'div','dialog_frm');$y(cur_frm.comments.body,{backgroundColor:'#EEE'});cur_frm.comments.list=new CommentList(cur_frm.comments.comment_body);}
cur_frm.comments.list.dt=cur_frm.doctype;cur_frm.comments.list.dn=cur_frm.docname;cur_frm.comments.show();cur_frm.comments.list.run();}
/*
* lib/js/legacy/widgets/form/form_fields.js
*/
* lib/js/legacy/widgets/form/form_fields.js
*/
_f.ColumnBreak=function(){this.set_input=function(){};}
_f.ColumnBreak.prototype.make_body=function(){if((!this.perm[this.df.permlevel])||(!this.perm[this.df.permlevel][READ])||this.df.hidden){return;}
this.cell=this.frm.layout.addcell(this.df.width);$y(this.cell.wrapper,{padding:'8px'});_f.cur_col_break_width=this.df.width;var fn=this.df.fieldname?this.df.fieldname:this.df.label;if(this.df&&this.df.label){this.label=$a(this.cell.wrapper,'h3','','',this.df.label);}}
@ -269,9 +265,8 @@ _f.CodeField.prototype.init_editor=function(){var me=this;this.editor=tinymce.ge
_f.CodeField.prototype.set_disp=function(val){$y(this.disp_area,{width:'90%'})
if(this.df.fieldtype=='Text Editor'){this.disp_area.innerHTML=val;}else{this.disp_area.innerHTML='<textarea class="code_text" readonly=1>'+val+'</textarea>';}}
/*
* lib/js/legacy/widgets/form/grid.js
*/
* lib/js/legacy/widgets/form/grid.js
*/
_f.cur_grid_cell=null;_f.Grid=function(parent){}
_f.Grid.prototype.init=function(parent,row_height){this.col_idx_by_name={}
this.alt_row_bg='#F2F2FF';this.row_height=row_height;if(!row_height)this.row_height='26px';this.make_ui(parent);this.insert_column('','','Int','Sr','50px','',[1,0,0]);if(this.oninit)this.oninit();keypress_observers.push(this);var me=this;$(cur_frm.wrapper).bind('render_complete',function(){me.set_ht();});}
@ -328,9 +323,8 @@ _f.Grid.prototype.set_ht=function(){var max_ht=cint(0.37*screen.width);var ht=$(
ht=100;if(ht>max_ht)ht=max_ht;ht+=4;$y(this.wrapper,{height:ht+'px'});}
_f.Grid.prototype.refresh_row=function(ridx,docname){var row=this.tab.rows[ridx];row.docname=docname;row.is_newrow=false;for(var cidx=0;cidx<row.cells.length;cidx++){this.set_cell_value(row.cells[cidx]);}}
/*
* lib/js/legacy/widgets/form/form_grid.js
*/
* lib/js/legacy/widgets/form/form_grid.js
*/
_f.FormGrid=function(field){this.field=field;this.doctype=field.df.options;if(!this.doctype){show_alert('No Options for table '+field.df.label);}
this.col_break_width=cint(this.field.col_break_width);if(!this.col_break_width)this.col_break_width=100;$y(field.parent,{marginTop:'8px'});this.init(field.parent,field.df.width);this.setup();}
_f.FormGrid.prototype=new _f.Grid();_f.FormGrid.prototype.setup=function(){this.make_columns();}
@ -366,9 +360,8 @@ len=len-1;if(r.rowIndex<(len-1))
var swap_row=this.tab.rows[r.rowIndex+1];}
if(swap_row){var cidx=_f.cur_grid_cell.cellIndex;this.cell_deselect();var aidx=locals[this.doctype][r.docname].idx;locals[this.doctype][r.docname].idx=locals[this.doctype][swap_row.docname].idx;locals[this.doctype][swap_row.docname].idx=aidx;var adocname=swap_row.docname;this.refresh_row(swap_row.rowIndex,r.docname);this.refresh_row(r.rowIndex,adocname);this.cell_select(this.tab.rows[swap_row.rowIndex].cells[cidx]);this.set_unsaved();}}
/*
* lib/js/legacy/widgets/form/print_format.js
*/
* lib/js/legacy/widgets/form/print_format.js
*/
$.extend(_p,{show_dialog:function(){if(!_p.dialog){_p.make_dialog();}
_p.dialog.show();},make_dialog:function(){var d=new Dialog(360,140,'Print Formats',[['HTML','Select'],['Check','No Letterhead'],['HTML','Buttons']]);$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');$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'},'');d.onshow=function(){var c=_p.dialog.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;}
@ -450,9 +443,8 @@ for(var c=me.flist.indexOf('SR')+1;c<me.flist.length;c++){var cell=row.insertCel
$s(cell,data[r][me.flist[c].fieldname],me.flist[c].fieldtype);if(in_list(['Currency','Float'],me.flist[c].fieldtype)){cell.style.textAlign='right';}}}}}});if(!this.data.length){return document.createElement('div');}
this.prepare_col_heads(this.flist);var table=me.make_print_table(this.flist);this.table_list=[table.wrapper];this.populate_table(table,this.data);return(me.table_list.length>1)?me.table_list:me.table_list[0];}
/*
* lib/js/legacy/widgets/form/email.js
*/
* lib/js/legacy/widgets/form/email.js
*/
_e.email_as_field='email_id';_e.email_as_dt='Contact';_e.email_as_in='email_id,contact_name';sendmail=function(emailto,emailfrom,cc,subject,message,fmt,with_attachments){var fn=function(html){$c('webnotes.utils.email_lib.send_form',{'sendto':emailto,'sendfrom':emailfrom?emailfrom:'','cc':cc?cc:'','subject':subject,'message':replace_newlines(message),'body':html,'full_domain':wn.urllib.get_base_url(),'with_attachments':with_attachments?1:0,'dt':cur_frm.doctype,'dn':cur_frm.docname},function(r,rtxt){});}
_p.build(fmt,fn);}
_e.make=function(){var d=new Dialog(440,440,"Send Email");var email_go=function(){var emailfrom=d.widgets['From'].value;var emailto=d.widgets['To'].value;if(!emailfrom)
@ -469,9 +461,8 @@ as.createList(as.aSug);}
$c('webnotes.utils.email_lib.get_contact_list',{'select':_e.email_as_field,'from':_e.email_as_dt,'where':_e.email_as_in,'txt':(last_txt?strip(last_txt):'%')},call_back);return;}
var sel;_e.dialog=d;}
/*
* lib/js/legacy/widgets/form/clientscriptAPI.js
*/
* lib/js/legacy/widgets/form/clientscriptAPI.js
*/
$c_get_values=function(args,doc,dt,dn,user_callback){var call_back=function(r,rt){if(!r.message)return;if(user_callback)user_callback(r.message);var fl=args.fields.split(',');for(var i in fl){locals[dt][dn][fl[i]]=r.message[fl[i]];if(args.table_field)
refresh_field(fl[i],dn,args.table_field);else
refresh_field(fl[i]);}}
@ -495,9 +486,8 @@ unhide_field=function(n){function _hide_field(n,hidden){var df=get_field(cur_frm
if(cur_frm){if(n.substr)_hide_field(n,0);else{for(var i in n)_hide_field(n[i],0)}}}
get_field_obj=function(fn){return cur_frm.fields_dict[fn];}
/*
* lib/js/legacy/widgets/form/form_comments.js
*/
* lib/js/legacy/widgets/form/form_comments.js
*/
wn.widgets.form.comments={n_comments:{},comment_list:{},sync:function(dt,dn,r){var f=wn.widgets.form.comments;f.n_comments[dn]=r.n_comments;f.comment_list[dn]=r.comment_list;},add:function(input,dt,dn,callback){$c('webnotes.widgets.form.comments.add_comment',wn.widgets.form.comments.get_args(input,dt,dn),function(r,rt){wn.widgets.form.comments.update_comment_list(input,dt,dn);input.value='';callback(input,dt,dn);});},remove:function(dt,dn,comment_id,callback){$c('webnotes.widgets.form.comments.remove_comment',{id:comment_id,dt:dt,dn:dn},callback);},get_args:function(input,dt,dn){return{comment:input.value,comment_by:user,comment_by_fullname:user_fullname,comment_doctype:dt,comment_docname:dn}},update_comment_list:function(input,dt,dn){var f=wn.widgets.form.comments;f.n_comments[dn]=cint(f.n_comments[dn])+1;f.comment_list[dn]=add_lists([f.get_args(input,dt,dn)],f.comment_list[dn]);}}
CommentList=function(parent,dt,dn){this.wrapper=$a(parent,'div','',{margin:'16px'});this.input_area=$a(this.wrapper,'div','',{margin:'2px'});this.lst_area=$a(this.wrapper,'div','',{margin:'2px'});this.make_input();this.make_lst();this.dt;this.dn;}
CommentList.prototype.run=function(){this.lst.run();}
@ -516,16 +506,14 @@ else{time=hr+':'+min+' AM'}}
this.cmt_dtl.innerHTML='On '+d[ri][10].substring(0,3)+' '+d[ri][9]+', '+d[ri][11]+' at '+time;this.cmt.innerHTML=replace_newlines(d[ri][1]);}
CommentItem.prototype.cmt_delete=function(cell,ri,ci,d){var me=this;if(d[ri][2]==user||d[ri][3]==user){del=$a(cell,'div','wn-icon ic-trash',{cursor:'pointer'});del.cmt_id=d[ri][0];del.onclick=function(){wn.widgets.form.comments.remove(cur_frm.doctype,cur_frm.docname,this.cmt_id,function(){me.comment.lst.run();})}}}
/*
* lib/js/legacy/wn/widgets/form/sidebar.js
*/
* lib/js/legacy/wn/widgets/form/sidebar.js
*/
wn.widgets.form.sidebar={Sidebar:function(form){var me=this;this.form=form;this.opts={sections:[{title:'Actions',items:[{type:'link',label:'New',icon:'ic-doc_new',display:function(){return in_list(profile.can_create,form.doctype)},onclick:function(){new_doc(me.form.doctype)}},{type:'link',label:'Refresh',icon:'ic-playback_reload',onclick:function(){me.form.reload_doc()}},{type:'link',label:'Print',display:function(){return!(me.form.doc.__islocal||me.form.meta.allow_print);},icon:'ic-print',onclick:function(){me.form.print_doc()}},{type:'link',label:'Email',display:function(){return!(me.form.doc.__islocal||me.form.meta.allow_email);},icon:'ic-mail',onclick:function(){me.form.email_doc()}},{type:'link',label:'Copy',display:function(){return in_list(profile.can_create,me.form.doctype)&&!me.form.meta.allow_copy},icon:'ic-clipboard_copy',onclick:function(){me.form.copy_doc()}},{type:'link',label:'Delete',display:function(){return me.form.meta.allow_trash&&cint(me.form.doc.docstatus)!=2&&(!me.form.doc.__islocal)&&me.form.perm[0][CANCEL]},icon:'ic-trash',onclick:function(){me.form.savetrash()}}]},{title:'Assign To',render:function(wrapper){me.form.assign_to=new wn.widgets.form.sidebar.AssignTo(wrapper,me,me.form.doctype,me.form.docname);},display:function(){if(!me.form.doc.__local)return true;else return false;}},{title:'Attachments',render:function(wrapper){me.form.attachments=new wn.widgets.form.sidebar.Attachments(wrapper,me,me.form.doctype,me.form.docname);},display:function(){return me.form.meta.allow_attach}},{title:'Comments',render:function(wrapper){new wn.widgets.form.sidebar.Comments(wrapper,me,me.form.doctype,me.form.docname);},display:function(){return!me.form.doc.__islocal}},{title:'Tags',render:function(wrapper){me.form.taglist=new TagList(wrapper,me.form.doc._user_tags?me.form.doc._user_tags.split(','):[],me.form.doctype,me.form.docname,0,function(){});},display:function(){return!me.form.doc.__islocal}}]}
this.refresh=function(){var parent=this.form.page_layout.sidebar_area;if(!this.sidebar){$y(parent,{paddingTop:'37px'})
this.sidebar=new wn.widgets.PageSidebar(parent,this.opts);}else{this.sidebar.refresh();}}}}
/*
* lib/js/legacy/wn/widgets/form/comments.js
*/
* lib/js/legacy/wn/widgets/form/comments.js
*/
wn.widgets.form.sidebar.Comments=function(parent,sidebar,doctype,docname){var me=this;this.sidebar=sidebar;this.doctype=doctype;this.docname=docname;this.refresh=function(){$c('webnotes.widgets.form.comments.get_comments',{dt:me.doctype,dn:me.docname,limit:5},function(r,rt){wn.widgets.form.comments.sync(me.doctype,me.docname,r);me.make_body();});}
this.make_body=function(){if(this.wrapper)this.wrapper.innerHTML='';else this.wrapper=$a(parent,'div','sidebar-comment-wrapper');this.input=$a_input(this.wrapper,'text');this.btn=$btn(this.wrapper,'Post',function(){me.add_comment()},{marginLeft:'8px'});this.render_comments()}
this.render_comments=function(){var f=wn.widgets.form.comments;var cl=f.comment_list[me.docname]
@ -535,9 +523,8 @@ this.render_one_comment=function(det){$a(this.wrapper,'div','social sidebar-comm
this.add_comment=function(){if(!this.input.value)return;this.btn.set_working();wn.widgets.form.comments.add(this.input,me.doctype,me.docname,function(){me.btn.done_working();me.make_body();});}
this.refresh();}
/*
* lib/js/legacy/wn/widgets/form/attachments.js
*/
* lib/js/legacy/wn/widgets/form/attachments.js
*/
wn.widgets.form.sidebar.Attachments=function(parent,sidebar,doctype,docname){var me=this;this.frm=sidebar.form;this.make=function(){if(this.wrapper)this.wrapper.innerHTML='';else this.wrapper=$a(parent,'div','sidebar-comment-wrapper');this.attach_wrapper=$a(this.wrapper,'div');if(this.frm.doc.__islocal){this.attach_wrapper.innerHTML='Attachments can be uploaded after saving'
return;}
var n=this.frm.doc.file_list?this.frm.doc.file_list.split('\n').length:0;if(n<this.frm.meta.max_attachments||!this.frm.meta.max_attachments){this.btn=$btn($a(this.wrapper,'div','sidebar-comment-message'),'Add',function(){me.add_attachment()});}
@ -561,9 +548,8 @@ doc.file_list=fl.join('\n');}
else
doc.file_list=filename+','+fileid;doc.modified=new_timestamp;var frm=frms[doctype];frm.attachments.dialog.hide();msgprint('File Uploaded Sucessfully.');frm.refresh();}
/*
* lib/js/legacy/wn/widgets/form/assign_to.js
*/
* lib/js/legacy/wn/widgets/form/assign_to.js
*/
wn.widgets.form.sidebar.AssignTo=Class.extend({init:function(parent,sidebar,doctype,docname){var me=this;this.doctype=doctype;this.name=docname;this.wrapper=$a(parent,'div','sidebar-comment-wrapper');this.body=$a(this.wrapper,'div');this.add_btn=$btn($a(this.wrapper,'div','sidebar-comment-message'),'Assign',function(){me.add();})
this.refresh();},refresh:function(){var me=this;$c('webnotes.widgets.form.assign_to.get',{doctype:me.doctype,name:me.name},function(r,rt){me.render(r.message)})},render:function(d){var me=this;$(this.body).empty();if(this.dialog){this.dialog.hide();}
for(var i=0;i<d.length;i++){$(this.body).append(repl('<div>%(owner)s \

View file

@ -1,8 +1,7 @@
/*
* lib/js/legacy/widgets/report_builder/report_builder.js
*/
* lib/js/legacy/widgets/report_builder/report_builder.js
*/
_r.ReportContainer=function(){if(user=='Guest'){msgprint("Not Allowed");return;}
wn.require('lib/js/legacy/widgets/form/fields.js');this.wrapper=page_body.add_page("Report Builder",function(){});this.wrapper.className='layout_wrapper';var head_div=$a(this.wrapper,'div');this.rb_area=$a(this.wrapper,'div');$dh(this.wrapper);var me=this;this.rb_dict={};this.page_head=new PageHeader(head_div);$y(this.page_head.wrapper,{marginBottom:'0px'});var run_fn=function(){if(me.cur_rb){me.cur_rb.dt.start_rec=1;me.cur_rb.dt.run();}}
var runbtn=this.page_head.add_button('Run',run_fn,1,'ui-icon-circle-triangle-e',1);if(has_common(['Administrator','System Manager'],user_roles)){var savebtn=this.page_head.add_button('Save',function(){if(me.cur_rb)me.cur_rb.save_criteria();},0,'ui-icon-disk');var fn=function(){if(me.cur_rb){if(!me.cur_rb.current_loaded){msgprint("error:You must save the report before you can set Advanced features");return;}
@ -149,9 +148,8 @@ this.all_fields[i].selected=1;}}
_r.ReportColumnPicker.prototype.add_field=function(f){if(!f.label)return;var by_default=(f.in_filter)?1:0;this.all_fields.push({selected:by_default,df:f,sel_idx:(by_default?this.sel_idx:0),selected_by_default:by_default});this.sel_idx+=by_default;}
_r.ReportColumnPicker.prototype.set=function(dt,label,selected){for(var i=0;i<this.all_fields.length;i++){if(this.all_fields[i].df.parent==dt&&this.all_fields[i].df.label==label){this.all_fields[i].selected=selected;this.all_fields[i].sel_idx=this.sel_idx;this.sel_idx+=cint(selected);this.refresh();return;}}}
/*
* lib/js/legacy/widgets/report_builder/datatable.js
*/
* lib/js/legacy/widgets/report_builder/datatable.js
*/
_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];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;}
@ -222,9 +220,8 @@ tab.style.borderCollapse='collapse';var hr=tab.insertRow(0);var c0=add_head_styl
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;}
/*
* lib/js/legacy/widgets/report_builder/calculator.js
*/
* lib/js/legacy/widgets/report_builder/calculator.js
*/
_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']])

View file

@ -1,15 +1,13 @@
/*
* lib/js/legacy/globals.js
*/
* lib/js/legacy/globals.js
*/
wn.provide('wn.widgets.form');wn.provide('wn.widgets.report');wn.provide('wn.utils');wn.provide('wn.model');wn.provide('wn.profile');wn.provide('wn.session');wn.provide('_f');wn.provide('_p');wn.provide('_r');wn.provide('_c');wn.provide('_e');wn.provide('_startup_data')
wn.settings.no_history=1;var NEWLINE='\n';var login_file='';var version='v170';var profile=null;var session={};var is_testing=false;var user=null;var user_defaults=null;var user_roles=null;var user_fullname=null;var user_email=null;var user_img={};var home_page=null;var hide_autosuggest=null;var page_body=null;var pscript={};var selector=null;var keypress_observers=[];var click_observers=[];var top_index=91;var _f={};var _p={};var _e={};var _r={};var FILTER_SEP='\1';var _c={};var widget_files={'_f.FrmContainer':'form.compressed.js','_c.CalendarPopup':'widgets/form/date_picker.js','_r.ReportContainer':'report.compressed.js','_p.PrintQuery':'widgets/print_query.js','Calendar':'widgets/calendar.js','Recommendation':'widgets/recommend.js','RatingWidget':'widgets/rating.js'}
var frms={};var cur_frm=null;var pscript={};var validated=true;var validation_message='';var tinymce_loaded=null;var cur_autosug=null;
/*
* lib/js/legacy/utils/datatype.js
*/
* lib/js/legacy/utils/datatype.js
*/
var startup_list=[];wn.utils.full_name=function(fn,ln){return fn+(ln?' ':'')+(ln?ln:'')}
function fmt_money(v){if(v==null||v=='')return'0.00';v=(v+'').replace(/,/g,'');v=parseFloat(v);if(isNaN(v)){return'';}else{var cp=wn.control_panel;var val=2;if(cp.currency_format=='Millions')val=3;v=v.toFixed(2);var delimiter=",";amount=v+'';var a=amount.split('.',2)
var d=a[1];var i=parseInt(a[0]);if(isNaN(i)){return'';}
@ -73,18 +71,16 @@ if(remainder){if(remainder>=100)comma=','
else comma=''
return bestguess+comma+' '+in_words(remainder);}else{return bestguess;}}
/*
* lib/js/legacy/utils/browser_detect.js
*/
* lib/js/legacy/utils/browser_detect.js
*/
var appVer=navigator.appVersion.toLowerCase();var is_minor=parseFloat(appVer);var is_major=parseInt(is_minor);var iePos=appVer.indexOf('msie');if(iePos!=-1){is_minor=parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)))
is_major=parseInt(is_minor);}
var isIE=(iePos!=-1);var isIE6=(isIE&&is_major<=6);var isIE7=(isIE&&is_major>=7);if(/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){var isFF=1;var ffversion=new Number(RegExp.$1)
if(ffversion>=3)var isFF3=1;else if(ffversion>=2)var isFF2=1;else if(ffversion>=1)var isFF1=1;}
var isSafari=navigator.userAgent.indexOf('Safari')!=-1?1:0;var isChrome=navigator.userAgent.indexOf('Chrome')!=-1?1:0;
/*
* lib/js/legacy/utils/datetime.js
*/
* lib/js/legacy/utils/datetime.js
*/
function same_day(d1,d2){if(d1.getFullYear()==d2.getFullYear()&&d1.getMonth()==d2.getMonth()&&d1.getDate()==d2.getDate())return true;else return false;}
var month_list=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];var month_last={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
var month_list_full=['January','February','March','April','May','June','July','August','September','October','November','December'];var week_list=['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];var week_list_full=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];function int_to_str(i,len){i=''+i;if(i.length<len)for(c=0;c<(len-i.length);c++)i='0'+i;return i}
@ -125,9 +121,8 @@ jQuery.fn.prettyDate=function(){return this.each(function(){var date=prettyDate(
jQuery(this).text(date);});};var comment_when=prettyDate;var date=dateutil=wn.datetime;var get_today=wn.datetime.get_today
var time_to_ampm=wn.datetime.time_to_ampm;var time_to_hhmm=wn.datetime.time_to_hhmm;var only_date=wn.datetime.only_date;
/*
* lib/js/legacy/utils/dom.js
*/
* lib/js/legacy/utils/dom.js
*/
wn.dom.set_unique_id=function(ele){var id='unique-'+wn.dom.id_count;ele.setAttribute('id',id);wn.dom.id_count++;return id;}
wn.tinymce={add_simple:function(ele,height){if(ele.myid){tinyMCE.execCommand('mceAddControl',true,ele.myid);return;}
ele.myid=wn.dom.set_unique_id(ele);$(ele).tinymce({script_url:'lib/js/legacy/tiny_mce_33/tiny_mce.js',height:height?height:'200px',theme:"advanced",theme_advanced_buttons1:"bold,italic,underline,separator,strikethrough,justifyleft,justifycenter,justifyright,justifyfull,bullist,numlist,outdent,indent,link,unlink,forecolor,backcolor,code,",theme_advanced_buttons2:"",theme_advanced_buttons3:"",theme_advanced_toolbar_location:"top",theme_advanced_toolbar_align:"left",theme_advanced_path:false,theme_advanced_resizing:false});},remove:function(ele){tinyMCE.execCommand('mceRemoveControl',true,ele.myid);},get_value:function(ele){return tinymce.get(ele.myid).getContent();}}
@ -235,9 +230,8 @@ user_img_queue[username]=[];user_img_queue[username].push(img);return;}
$c('webnotes.profile.get_user_img',{username:username},function(r,rt){delete user_img_loading[user_img_loading.indexOf(username)];user_img[username]=r.message;if(user_img_queue[username]){var q=user_img_queue[username];for(var i in q){set_it(q[i]);}}
set_it(img);},null,1);user_img_loading.push(username);}}
/*
* lib/js/legacy/utils/handler.js
*/
* lib/js/legacy/utils/handler.js
*/
var outUrl="index.cgi";var NULL_CHAR='^\5*';function checkResponse(r,on_timeout,no_spinner,freeze_msg){try{if(r.readyState==4&&r.status==200)return true;else return false;}catch(e){msgprint("error:Request timed out, try again");if(on_timeout)
on_timeout();hide_loading();if(freeze_msg)
unfreeze();return false;}}
@ -271,9 +265,8 @@ function open_url_post(URL,PARAMS,new_window){var temp=document.createElement("f
for(var x in PARAMS){var opt=document.createElement("textarea");opt.name=x;opt.value=PARAMS[x];temp.appendChild(opt);}
document.body.appendChild(temp);temp.submit();return temp;}
/*
* lib/js/legacy/utils/msgprint.js
*/
* lib/js/legacy/utils/msgprint.js
*/
var msg_dialog;function msgprint(msg,issmall,callback){if(!msg)return;if(typeof(msg)!='string')
msg=JSON.stringify(msg);if(issmall){show_alert(msg);return;}
if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8));return;}
@ -287,9 +280,8 @@ msg_dialog.custom_onhide=callback;}
var growl_area;function show_alert(txt){if(!growl_area){growl_area=$a(popup_cont,'div','',{position:'fixed',bottom:'8px',right:'8px',width:'320px',zIndex:10});}
var wrapper=$a(growl_area,'div','',{position:'relative'});var body=$a(wrapper,'div','notice');var c=$a(body,'div','wn-icon ic-round_delete',{cssFloat:'right'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);$(wrapper).hide().fadeIn(1000);}
/*
* lib/js/legacy/utils/shortcut.js
*/
* lib/js/legacy/utils/shortcut.js
*/
(function(jQuery){jQuery.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",191:"/",224:"meta"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":": ","'":"\"",",":"<",".":">","/":"?","\\":"|"}};function keyHandler(handleObj){if(typeof handleObj.data!=="string"){return;}
var origHandler=handleObj.handler,keys=handleObj.data.toLowerCase().split(" ");handleObj.handler=function(event){if(this!==event.target&&(/textarea|select/i.test(event.target.nodeName)||event.target.type==="text")){return;}
var special=event.type!=="keypress"&&jQuery.hotkeys.specialKeys[event.which],character=String.fromCharCode(event.which).toLowerCase(),key,modif="",possible={};if(event.altKey&&special!=="alt"){modif+="alt+";}
@ -300,9 +292,8 @@ if(special){possible[modif+special]=true;}else{possible[modif+character]=true;po
for(var i=0,l=keys.length;i<l;i++){if(possible[keys[i]]){return origHandler.apply(this,arguments);}}};}
jQuery.each(["keydown","keyup","keypress"],function(){jQuery.event.special[this]={add:keyHandler};});})(jQuery);
/*
* lib/js/legacy/utils/printElement.js
*/
;(function(window,undefined){var document=window["document"];var $=window["jQuery"];$.fn["printElement"]=function(options){var mainOptions=$.extend({},$.fn["printElement"]["defaults"],options);if(mainOptions["printMode"]=='iframe'){if($.browser.opera||(/chrome/.test(navigator.userAgent.toLowerCase())))
* lib/js/legacy/utils/printElement.js
*/;(function(window,undefined){var document=window["document"];var $=window["jQuery"];$.fn["printElement"]=function(options){var mainOptions=$.extend({},$.fn["printElement"]["defaults"],options);if(mainOptions["printMode"]=='iframe'){if($.browser.opera||(/chrome/.test(navigator.userAgent.toLowerCase())))
mainOptions["printMode"]='popup';}
$("[id^='printElement_']").remove();return this.each(function(){var opts=$.meta?$.extend({},mainOptions,$(this).data()):mainOptions;_printElement($(this),opts);});};$.fn["printElement"]["defaults"]={"printMode":'iframe',"pageTitle":'',"overrideElementCSS":null,"printBodyOptions":{"styleToAdd":'padding:10px;margin:10px;',"classNameToAdd":''},"leaveOpen":false,"iframeElementOptions":{"styleToAdd":'border:none;position:absolute;width:0px;height:0px;bottom:0px;left:0px;',"classNameToAdd":''}};$.fn["printElement"]["cssElement"]={"href":'',"media":''};function _printElement(element,opts){var html=_getMarkup(element,opts);var popupOrIframe=null;var documentToWriteTo=null;if(opts["printMode"].toLowerCase()=='popup'){popupOrIframe=window.open('about:blank','printElementWindow','width=650,height=440,scrollbars=yes');documentToWriteTo=popupOrIframe.document;}
else{var printElementID="printElement_"+(Math.round(Math.random()*99999)).toString();var iframe=document.createElement('IFRAME');$(iframe).attr({style:opts["iframeElementOptions"]["styleToAdd"],id:printElementID,className:opts["iframeElementOptions"]["classNameToAdd"],frameBorder:0,scrolling:'no',src:'about:blank'});document.body.appendChild(iframe);documentToWriteTo=(iframe.contentWindow||iframe.contentDocument);if(documentToWriteTo.document)
@ -318,9 +309,8 @@ html.push('<link type="text/css" rel="stylesheet" href="'+current["href"]+'" med
else{$("link",document).filter(function(){return $(this).attr("rel").toLowerCase()=="stylesheet";}).each(function(){html.push('<link type="text/css" rel="stylesheet" href="'+$(this).attr("href")+'" media="'+$(this).attr('media')+'" >');});}
html.push('<base href="'+_getBaseHref()+'" />');html.push('</head><body style="'+opts["printBodyOptions"]["styleToAdd"]+'" class="'+opts["printBodyOptions"]["classNameToAdd"]+'">');html.push('<div class="'+$element.attr('class')+'">'+elementHtml+'</div>');html.push('<script type="text/javascript">function printPage(){focus();print();'+((!$.browser.opera&&!opts["leaveOpen"]&&opts["printMode"].toLowerCase()=='popup')?'close();':'')+'}</script>');html.push('</body></html>');return html.join('');};})(window);
/*
* lib/js/wn/ui/dialog.js
*/
* lib/js/wn/ui/dialog.js
*/
wn.widgets.FieldGroup=function(){this.first_button=false;this.make_fields=function(body,fl){wn.require('lib/js/legacy/widgets/form/fields.js');$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];var div=$a(body,'div','',{margin:'6px 0px'})
f=make_field(df,null,div,null);f.not_in_form=1;this.fields_dict[df.fieldname]=f
f.refresh();if(df.fieldtype=='Button'&&!this.first_button){$(f.input).addClass('primary');this.first_button=true;}}}
@ -347,9 +337,8 @@ if(opts)this.make();}
wn.widgets.Dialog.prototype=new wn.widgets.FieldGroup();keypress_observers.push(new function(){this.notify_keypress=function(e,kc){if(cur_dialog&&kc==27&&!cur_dialog.no_cancel_flag)
cur_dialog.hide();}});
/*
* lib/js/legacy/widgets/dialog.js
*/
* lib/js/legacy/widgets/dialog.js
*/
var cur_dialog;var top_index=91;function Dialog(w,h,title,content){wn.require('lib/js/legacy/widgets/form/fields.js');this.make({width:w,title:title});if(content)this.make_body(content);this.onshow='';this.oncancel='';this.no_cancel_flag=0;this.display=false;this.first_button=false;}
Dialog.prototype=new wn.widgets.Dialog()
Dialog.prototype.make_body=function(content){this.rows={};this.widgets={};for(var i in content)this.make_row(content[i]);}
@ -369,9 +358,8 @@ else if(d[0]=='Button'){c2.style.height='32px';var b=$btn(c2,d[1],function(btn){
if(d[2]){b._onclick=d[2];}
this.widgets[d[1]]=b;}}
/*
* lib/js/legacy/widgets/listing.js
*/
* lib/js/legacy/widgets/listing.js
*/
list_opts={cell_style:{padding:'3px 2px'},alt_cell_style:{},head_style:{height:'20px',overflow:'hidden',verticalAlign:'middle',fontWeight:'bold',padding:'1px',fontSize:'13px'},head_main_style:{padding:'0px'},hide_export:1,hide_print:1,hide_refresh:0,hide_rec_label:0,show_calc:1,show_empty_tab:0,no_border:1,append_records:1,table_width:null};function Listing(head_text,no_index,no_loading){wn.require('lib/js/legacy/widgets/form/fields.js');this.start=0;this.page_len=20;this.filters_per_line=7;this.cell_idx=0;this.head_text=head_text?head_text:'Result';this.keyword='records';this.no_index=no_index;this.underline=1;this.no_rec_message='No Result';this.show_cell=null;this.show_result=null;this.colnames=null;this.colwidths=null;this.coltypes=null;this.coloptions=null;this.filters={};this.sort_list={};this.sort_order_dict={};this.sort_heads={};this.is_std_query=false;this.server_call=null;this.no_loading=no_loading;this.opts=copy_dict(list_opts);}
Listing.prototype.make=function(parent){var me=this;this.wrapper=parent;this.filter_wrapper=$a(parent,'div','srs_filter_wrapper');this.filter_area=$a(this.filter_wrapper,'div','srs_filter_area');$dh(this.filter_wrapper);this.btn_area=$a(parent,'div','',{margin:'8px 0px'});this.body_area=$a(parent,'div','srs_body_area');if(!this.opts.hide_rec_label)
this.rec_label=$a(this.body_area,'div','',{margin:'4px 0px',color:'#888'});this.results=$a($a(this.body_area,'div','srs_results_area'),'div');this.fetching_area=$a(this.body_area,'div','',{height:'120px',background:'url("lib/images/ui/square_loading.gif") center no-repeat',display:'none'});this.show_no_records=$a(this.body_area,'div','',{margin:'200px 0px',textAlign:'center',fontSize:'14px',color:'#888',display:'none'});this.show_no_records.innerHTML='No Result';if(this.opts.show_empty_tab)
@ -464,9 +452,8 @@ $di(this.more_btn);}}
Listing.prototype.make_headings=function(t,nr,nc){for(var ci=0;ci<nc;ci++){var tmp=make_table($td(t,0,ci),1,2,'100%',['','0px'],this.opts.head_style);$y(tmp,{tableLayout:'fixed',borderCollapse:'collapse'});$y($td(t,0,ci),this.opts.head_main_style);$td(t,0,ci).sort_cell=$td(tmp,0,1);$td(t,0,ci).label_cell=$td(tmp,0,0);$td(tmp,0,1).style.padding='0px';$td(tmp,0,0).innerHTML=this.colnames[ci]?this.colnames[ci]:'&nbsp;';if(this.sort_list[ci])this.set_sort($td(t,0,ci),ci,this.sort_list[ci]);var div=$a($td(t,0,ci),'div');$td(t,0,ci).style.borderBottom='1px solid #CCC';if(this.coltypes&&this.coltypes[ci]&&in_list(['Currency','Float','Int'],this.coltypes[ci]))$y($td(t,0,ci).label_cell,{textAlign:'right'})}}
Listing.prototype.std_cell=function(cell,ri,ci,d){var has_headrow=this.colnames?1:0;cell.div=$a(cell,'div');$s(cell.div,d[ri][ci],this.coltypes?this.coltypes[ci+(this.no_index?0:1)]:null,this.coloptions?this.coloptions[ci+(this.no_index?0:1)]:null);}
/*
* lib/js/wn/ui/listing.js
*/
* lib/js/wn/ui/listing.js
*/
wn.widgets.Listing=function(opts){this.opts=opts;this.page_length=20;this.btns={};this.start=0;var me=this;this.make=function(opts){this.wrapper=$a(this.opts.parent,'div');this.filters_area=$a(this.wrapper,'div','listing-filters');this.toolbar_area=$a(this.wrapper,'div','listing-toolbar');this.results_area=$a(this.wrapper,'div','listing-results');this.more_button_area=$a(this.wrapper,'div','listing-more');this.no_results_area=$a(this.wrapper,'div','help_box',{display:'none'},(this.opts.no_result_message?this.opts.no_result_message:'No results'));if(opts)this.opts=opts;this.page_length=this.opts.page_length?this.opts.page_length:this.page_length;this.make_toolbar();this.make_filters();this.make_more_button();}
this.make_filters=function(){if(this.opts.filters){$ds(this.filters_area);this.filters=new wn.widgets.FieldGroup(this.filters_area,this.opts.fields);}}
this.make_toolbar=function(){if(!this.opts.hide_refresh){this.ref_img=$a(this.toolbar_area,'span','link_type',{color:'#888'},'[refresh]');this.ref_img.onclick=function(){me.run();}
@ -486,9 +473,8 @@ args.simple_query=this.query;args.as_dict=1;if(this.loading_img)$di(this.loading
this.refresh=this.run;this.add_limits=function(){this.query+=' LIMIT '+this.start+','+(this.page_length+1);}
if(opts)this.make();}
/*
* lib/js/legacy/widgets/layout.js
*/
* lib/js/legacy/widgets/layout.js
*/
function Layout(parent,width){if(parent&&parent.substr){parent=$i(parent);}
this.wrapper=$a(parent,'div','',{display:'none'});if(width){this.width=this.wrapper.style.width;}
this.myrows=[];}
@ -513,9 +499,8 @@ $y(row.cells[i],{width:cint(w/cells_with_no_width)+'%'})}}
LayoutCell.prototype.show=function(){$ds(this.wrapper);}
LayoutCell.prototype.hide=function(){$dh(this.wrapper);}
/*
* lib/js/legacy/widgets/tabbedpage.js
*/
* lib/js/legacy/widgets/tabbedpage.js
*/
function TabbedPage(parent,only_labels){this.tabs={};this.items=this.tabs
this.cur_tab=null;this.label_wrapper=$a(parent,'div','box_label_wrapper',{marginTop:'16px'});this.label_body=$a(this.label_wrapper,'div','box_label_body');this.label_area=$a(this.label_body,'ul','box_tabs');if(!only_labels)this.body_area=$a(parent,'div','',{backgroundColor:'#FFF'});else this.body_area=null;this.add_item=function(label,onclick,no_body,with_heading){this.add_tab(label,onclick,no_body,with_heading);return this.items[label];}}
TabbedPage.prototype.add_tab=function(n,onshow,no_body,with_heading){var tab=$a(this.label_area,'li');tab.label=$a(tab,'a');tab.label.innerHTML=n;if(this.body_area&&!no_body){tab.tab_body=$a(this.body_area,'div');$dh(tab.tab_body);tab.body=tab.tab_body;}else{tab.tab_body=null;}
@ -544,9 +529,8 @@ this.collapse=function(){if(me.wrapper)$dh(me.wrapper);$item_normal(me.ldiv);}
this.hide=function(){me.collapse();$dh(me.ldiv);}
this.show=function(){$ds(me.ldiv);}}
/*
* lib/js/legacy/webpage/page_header.js
*/
* lib/js/legacy/webpage/page_header.js
*/
var def_ph_style={wrapper:{marginBottom:'16px',backgroundColor:'#EEE'},main_heading:{},sub_heading:{marginBottom:'8px',color:'#555',display:'none'},separator:{borderTop:'3px solid #444'},toolbar_area:{padding:'3px 0px',display:'none',borderBottom:'1px solid #AAA'}}
function PageHeader(parent,main_text,sub_text){this.wrapper=$a(parent,'div','page_header');this.t1=make_table($a(this.wrapper,'div','',def_ph_style.wrapper.backgroundColor),1,2,'100%',[null,'100px'],{padding:'2px'});$y(this.t1,{borderCollapse:'collapse'})
this.lhs=$td(this.t1,0,0);this.main_head=$a(this.lhs,'h1','',def_ph_style.main_heading);this.sub_head=$a(this.lhs,'h4','',def_ph_style.sub_heading);this.separator=$a(this.wrapper,'div','',def_ph_style.separator);this.toolbar_area=$a(this.wrapper,'div','',def_ph_style.toolbar_area);this.padding_area=$a(this.wrapper,'div','',{padding:'3px'});$y($td(this.t1,0,1),{textAlign:'right',padding:'3px'});this.close_btn=$a($td(this.t1,0,1),'span','close',{},'&#215;');this.close_btn.onclick=function(){nav_obj.show_last_open();};if(main_text)this.main_head.innerHTML=main_text;if(sub_text)this.sub_head.innerHTML=sub_text;this.buttons={};this.buttons2={};}
@ -554,16 +538,14 @@ PageHeader.prototype.add_button=function(label,fn,bold,icon,green){var tb=this.t
PageHeader.prototype.clear_toolbar=function(){this.toolbar_area.innerHTML='';this.buttons={};}
PageHeader.prototype.make_buttonset=function(){$(this.toolbar_area).buttonset();}
/*
* lib/js/legacy/widgets/select.js
*/
* lib/js/legacy/widgets/select.js
*/
function SelectWidget(parent,options,width,editable,bg_color){var me=this;this.inp=$a(parent,'select');if(options)add_sel_options(this.inp,options);if(width)$y(this.inp,{width:width});this.set_width=function(w){$y(this.inp,{width:w})};this.set_options=function(o){add_sel_options(this.inp,o);}
this.inp.onchange=function(){if(me.onchange)me.onchange(this);}
return;}
/*
* lib/js/legacy/widgets/tags.js
*/
* lib/js/legacy/widgets/tags.js
*/
_tags={dialog:null,color_map:{},all_tags:[],colors:{'Default':'#add8e6'}}
TagList=function(parent,start_list,dt,dn,static,onclick){this.start_list=start_list?start_list:[];this.tag_list=[];this.dt=dt;this.onclick=onclick;this.dn=dn;this.static;this.parent=parent;this.make_body();}
TagList.prototype.make=function(parent){for(var i=0;i<this.start_list.length;i++){if(this.start_list[i])
@ -611,9 +593,8 @@ this.render=function(refresh){$c('webnotes.widgets.tags.get_top_tags',{doctype:d
this.render();}
wn.widgets.TagCloud.Tag=function(args,count_cell,det){$(count_cell).css('text-align','right').html(det[1]+' x');args.static=1;this.tag=new SingleTag(args)}
/*
* lib/js/legacy/widgets/export_query.js
*/
* lib/js/legacy/widgets/export_query.js
*/
var export_dialog;function export_query(query,callback){if(!export_dialog){var d=new Dialog(400,300,"Export...");d.make_body([['Data','Max rows','Blank to export all rows'],['Button','Go'],]);d.widgets['Go'].onclick=function(){export_dialog.hide();n=export_dialog.widgets['Max rows'].value;if(cint(n))
export_dialog.query+=' LIMIT 0,'+cint(n);callback(export_dialog.query);}
d.onshow=function(){this.widgets['Max rows'].value='500';}
@ -625,9 +606,8 @@ args.simple_query=q;else
args.query=q;args.sc_id=sc_id?sc_id:'';args.filter_values=filter_values?filter_values:'';if(colnames)
args.colnames=colnames.join(',');args.report_name=report_name?report_name:'';open_url_post(outUrl,args);}
/*
* lib/js/legacy/webpage/history.js
*/
* lib/js/legacy/webpage/history.js
*/
var nav_obj={}
nav_obj.observers=[];nav_obj.add_observer=function(o){nav_obj.observers.push(o);}
nav_obj.ol=[];nav_obj.open_notify=function(t,dt,dn,no_history){if(nav_obj.ol.length){var tmp=nav_obj.ol[nav_obj.ol.length-1];if(tmp&&tmp[0]==t&&tmp[1]==dt&&tmp[2]==dn)return;}
@ -652,9 +632,8 @@ t[i]=decodeURIComponent(t[i]);if(nav_obj.ol.length){var c=nav_obj.ol[nav_obj.ol.
if(t[2])
var docname=history_get_name(t);if(t[0]=='Form'){_history_current=newLocation;if(docname.substr(0,3)=='New'&&!(locals[t[1]]&&locals[t[1]][docname])){newdoc(t[1]);}else{loaddoc(t[1],docname);}}else if(t[0]=='Report'){_history_current=newLocation;loadreport(t[1],docname);}else if(t[0]=='Page'){_history_current=newLocation;loadpage(t[1]);}else if(t[0]=='Application'){_history_current=newLocation;loadapp(t[1]);}else if(t[0]=='DocBrowser'||t[0]=='List'){_history_current=newLocation;loaddocbrowser(t[1]);}};$(window).bind('hashchange',function(){historyChange(location.hash);});
/*
* lib/js/legacy/webpage/search.js
*/
* lib/js/legacy/webpage/search.js
*/
search_fields={};function setlinkvalue(name){selector.input.set_input(name);selector.hide();}
function makeselector(){var d=new Dialog(540,440,'Search');d.make_body([['Data','Beginning With','Tip: You can use wildcard "%"'],['Select','Search By'],['Button','Search'],['HTML','Help'],['HTML','Result']]);var inp=d.widgets['Beginning With'];var field_sel=d.widgets['Search By'];var btn=d.widgets['Search'];d.sel_type='';d.values_len=0;d.set=function(input,type,label){d.sel_type=type;d.input=input;if(d.style!='Link'){d.rows['Result'].innerHTML='';d.values_len=0;}
d.style='Link';d.set_query_description()
@ -686,23 +665,20 @@ var cl=[]
for(var j=1;j<r.values[i].length;j++)cl.push(r.values[i][j]);var c=$a(div,'div','comment',{marginTop:'2px'});c.innerHTML=cl.join(', ');}}
selector=d;}
/*
* lib/js/legacy/webpage/spinner.js
*/
* lib/js/legacy/webpage/spinner.js
*/
function set_loading(){pending_req++;$('#spinner').css('visibility','visible');$('body').css('cursor','progress');}
function hide_loading(){pending_req--;if(!pending_req){$('body').css('cursor','default');$('#spinner').css('visibility','hidden');}}
/*
* lib/js/legacy/webpage/freeze_page.js
*/
* lib/js/legacy/webpage/freeze_page.js
*/
var fcount=0;var frozen=0;var dialog_message;var dialog_back;function freeze(msg,do_freeze){if(!dialog_back){dialog_back=$a($i('body_div'),'div','dialog_back');if(isIE)dialog_back.style['filter']='alpha(opacity=60)';}
$ds(dialog_back);fcount++;frozen=1;}
function unfreeze(){if(dialog_message)
$dh(dialog_message);if(!fcount)return;fcount--;if(!fcount){$dh(dialog_back);frozen=0;}}
/*
* lib/js/legacy/webpage/error_console.js
*/
* lib/js/legacy/webpage/error_console.js
*/
var err_console;var err_list=[];function errprint(t){err_list[err_list.length]=('<pre style="font-family: Courier, Fixed; font-size: 11px; border-bottom: 1px solid #AAA; overflow: auto; width: 90%;">'+t+'</pre>');}
function setup_err_console(){err_console=new Dialog(640,480,'Error Console')
err_console.make_body([['HTML','Error List'],['Button','Clear'],['HTML','Error Report']]);var span=$a(err_console.widgets['Error Report'],'span','link_type');span.innerHTML='Send Error Report';span.onclick=function(){msg=prompt('How / where did you get the error [optional]')
@ -713,9 +689,8 @@ err_console.onshow=function(){err_console.rows['Error List'].innerHTML='<div sty
+err_list.join('<div style="height: 10px; margin-bottom: 10px; border-bottom: 1px solid #AAA"></div>')+'</div>';}}
startup_list.push(setup_err_console);
/*
* lib/js/legacy/webpage/loaders.js
*/
* lib/js/legacy/webpage/loaders.js
*/
function loadreport(dt,rep_name,onload,menuitem,reset_report){wn.require('lib/js/legacy/report.compressed.js');dt=get_label_doctype(dt);var show_report_builder=function(){if(!_r.rb_con){_r.rb_con=new _r.ReportContainer();}
_r.rb_con.set_dt(dt,function(rb){if(rep_name){var t=rb.current_loaded;rb.load_criteria(rep_name);if(onload)
onload(rb);if((rb.dt)&&(!rb.dt.has_data()||rb.current_loaded!=t))
@ -753,18 +728,16 @@ script.onreadystatechange=function(){if(this.readyState=='complete'||this.readyS
var doc_browser_page;function loaddocbrowser(dt,label,fields){wn.require('lib/js/legacy/widgets/form/fields.js');wn.require('lib/js/legacy/webpage/docbrowser.js');dt=get_label_doctype(dt);if(!doc_browser_page)
doc_browser_page=new ItemBrowserPage();doc_browser_page.show(dt,label,fields);nav_obj.open_notify('List',dt,'');}
/*
* lib/js/legacy/webpage/uploader.js
*/
* lib/js/legacy/webpage/uploader.js
*/
var uploaders={};var upload_frame_count=0;Uploader=function(parent,args,callback){var id='frame'+upload_frame_count;upload_frame_count++;this.callback=callback;var div=$a(parent,'div');div.innerHTML='<iframe id="'+id+'" name="'+id+'" src="blank.html" \
style="width:0px; height:0px; border:0px"></iframe>';var div=$a(parent,'div');div.innerHTML='<form method="POST" enctype="multipart/form-data" action="'+outUrl+'" target="'+id+'"></form>';var ul_form=div.childNodes[0];var f_list=[];var inp_fdata=$a_input($a(ul_form,'span'),'file',{name:'filedata'},{marginLeft:'7px'});if(!('cmd'in args)){var inp=$a_input($a(ul_form,'span'),'hidden',{name:'cmd'});inp.value='uploadfile';}
var inp=$a_input($a(ul_form,'span'),'hidden',{name:'uploader_id'});inp.value=id;var inp=$a_input($a(ul_form,'span'),'submit',null,{marginLeft:'7px'});inp.value='Upload';$y(inp,{width:'80px'});for(var key in args){var inp=$a_input($a(ul_form,'span'),'hidden',{name:key});inp.value=args[key];}
uploaders[id]=this;}
function upload_callback(id,fid){uploaders[id].callback(fid);}
/*
* lib/js/legacy/webpage/page.js
*/
* lib/js/legacy/webpage/page.js
*/
var pages=[];var stylesheets=[];function Page(page_name,content){var me=this;this.name=page_name;this.trigger=function(event){try{if(pscript[event+'_'+this.name])
pscript[event+'_'+this.name](this.wrapper);}catch(e){console.log(e);}}
this.onshow=function(){set_title(me.doc.title?me.doc.title:me.name);if(!me.onload_complete){me.trigger('onload');me.onload_complete=true;}
@ -781,15 +754,13 @@ page_body.change_to(page_name);return p;}
function refresh_page(page_name){var fn=function(r,rt){render_page(page_name)}
$c('webnotes.widgets.page.getpage',{'name':page_name,stylesheets:JSON.stringify(stylesheets)},fn);}
/*
* lib/js/legacy/wn/page_layout.js
*/
* lib/js/legacy/wn/page_layout.js
*/
wn.PageLayout=function(args){$.extend(this,args)
this.wrapper=$a(this.parent,'div');this.wtab=make_table(this.wrapper,1,2,'100%',[this.main_width,this.sidebar_width]);this.main=$a($td(this.wtab,0,0),'div','layout_wrapper');this.sidebar_area=$a($td(this.wtab,0,1),'div');this.head=$a(this.main,'div');this.toolbar_area=$a(this.main,'div');this.body=$a(this.main,'div');this.footer=$a(this.main,'div');if(this.heading){this.page_head=new PageHeader(this.head,this.heading);}}
/*
* lib/js/legacy/wn/widgets/page_sidebar.js
*/
* lib/js/legacy/wn/widgets/page_sidebar.js
*/
wn.widgets.PageSidebar=function(parent,opts){this.opts=opts
this.sections={}
this.wrapper=$a(parent,'div','psidebar-wrapper')
@ -814,17 +785,15 @@ this.ln=$a(this.wrapper,'span','link_type psidebar-section-link',opts.style,opts
wn.widgets.PageSidebarButton=function(section,opts,wrapper){this.wrapper=wrapper;this.section=section;this.opts=opts;var me=this;this.btn=$btn(this.wrapper,opts.label,opts.onclick,opts.style,opts.color);}
wn.widgets.PageSidebarHTML=function(section,opts,wrapper){wrapper.innerHTML=opts.content}
/*
* lib/js/legacy/wn/widgets/footer.js
*/
* lib/js/legacy/wn/widgets/footer.js
*/
wn.widgets.Footer=function(args){$.extend(this,args);this.make=function(){this.wrapper=$a(this.parent,'div','std-footer');this.table=make_table(this.wrapper,1,this.columns,[],{width:100/this.columns+'%'});this.render_items();}
this.render_items=function(){for(var i=0;i<this.items.length;i++){var item=this.items[i];var div=$a($td(this.table,0,item.column),'div','std-footer-item');div.label=$a($a(div,'div'),'span','link_type','',item.label);div.label.onclick=item.onclick;if(item.description){div.description=$a(div,'div','field_description','',item.description);}}}
if(this.items)
this.make();}
/*
* lib/js/legacy/model/local_data.js
*/
* lib/js/legacy/model/local_data.js
*/
var locals={'DocType':{}};var fields={};var fields_list={};var LocalDB={};var READ=0;var WRITE=1;var CREATE=2;var SUBMIT=3;var CANCEL=4;var AMEND=5;LocalDB.getchildren=function(child_dt,parent,parentfield,parenttype){var l=[];for(var key in locals[child_dt]){var d=locals[child_dt][key];if((d.parent==parent)&&(d.parentfield==parentfield)){if(parenttype){if(d.parenttype==parenttype)l.push(d);}else{l.push(d);}}}
l.sort(function(a,b){return(cint(a.idx)-cint(b.idx))});return l;}
LocalDB.add=function(dt,dn){if(!locals[dt])locals[dt]={};if(locals[dt][dn])delete locals[dt][dn];locals[dt][dn]={'name':dn,'doctype':dt,'docstatus':0};return locals[dt][dn];}
@ -888,9 +857,8 @@ else
return label}
var getchildren=LocalDB.getchildren;var get_field=Meta.get_field;var createLocal=LocalDB.create;
/*
* lib/js/legacy/model/doclist.js
*/
* lib/js/legacy/model/doclist.js
*/
function compress_doclist(list){var kl={};var vl=[];var flx={};for(var i=0;i<list.length;i++){var o=list[i];var fl=[];if(!kl[o.doctype]){var tfl=['doctype','name','docstatus','owner','parent','parentfield','parenttype','idx','creation','modified','modified_by','__islocal','__deleted','__newname','__modified','_user_tags'];var fl=['doctype','name','docstatus','owner','parent','parentfield','parenttype','idx','creation','modified','modified_by','__islocal','__deleted','__newname','__modified','_user_tags'];for(key in fields[o.doctype]){if(!in_list(fl,key)&&!in_list(no_value_fields,fields[o.doctype][key].fieldtype)&&!fields[o.doctype][key].no_column){fl[fl.length]=key;tfl[tfl.length]=key}}
flx[o.doctype]=fl;kl[o.doctype]=tfl}
var nl=[];var fl=flx[o.doctype];for(var j=0;j<fl.length;j++){var v=o[fl[j]];nl.push(v);}
@ -912,9 +880,8 @@ if(all_clear)all_clear=false;}}
if(errfld.length)msgprint('<b>Mandatory fields required in '+
(doc.parenttype?(fields[doc.parenttype][doc.parentfield].label+' (Table)'):get_doctype_label(doc.doctype))+':</b>\n'+errfld.join('\n'));return all_clear;}
/*
* lib/js/legacy/webpage/body.js
*/
* lib/js/legacy/webpage/body.js
*/
function Body(){this.left_sidebar=null;this.right_sidebar=null;this.status_area=null;var me=this;page_body=this;this.no_of_columns=function(){var n=2;if(cint(me&&me.cp&&me.cp.right_sidebar_width))
n=n+1;return n;}
this.ready=function(){$dh('startup_div');$ds('body_div');}
@ -939,9 +906,8 @@ this.status_area.innerHTML=txt;}
this.set_session_changed=function(){if(this.session_message_set)return;var div=$a($i('body_div').parentNode,'div','',{textAlign:'center',fontSize:'14px',margin:'150px auto'});$dh('body_div');div.innerHTML='This session has been changed. Please <span class="link_type" onclick="window.location.reload()">refresh</span> to continue';this.session_message_set=1;}
this.setup();}
/*
* lib/js/legacy/app.js
*/
* lib/js/legacy/app.js
*/
var popup_cont;var session={};var start_sid=null;if(!wn)var wn={};function startup(){start_sid=get_cookie('sid');popup_cont=$a(document.getElementsByTagName('body')[0],'div');var setup_globals=function(r){wn.boot=r;profile=r.profile;user=r.profile.name;user_fullname=profile.first_name+(r.profile.last_name?(' '+r.profile.last_name):'');user_defaults=profile.defaults;user_roles=profile.roles;user_email=profile.email;profile.start_items=r.start_items;home_page=r.home_page;_p.letter_heads=r.letter_heads;sys_defaults=r.sysdefaults;session.rt=profile.can_read;if(r.ipinfo)session.ipinfo=r.ipinfo;session.dt_labels=r.dt_labels;session.rev_dt_labels={}
_tags.color_map=r.tag_color_map;if(r.dt_labels){for(key in r.dt_labels)session.rev_dt_labels[r.dt_labels[key]]=key;}
wn.control_panel=r.control_panel;}
@ -953,7 +919,10 @@ var callback=function(r,rt){if(r.exc)console.log(r.exc);setup_globals(r);setup_h
if(get_url_arg('embed')){newdoc(get_url_arg('embed'));return;}
var t=to_open();if(t){historyChange(t);}else if(home_page){loadpage(home_page);}
page_body.ready();}
if(_startup_data&&keys(_startup_data).length&&_startup_data.docs){LocalDB.sync(_startup_data.docs);callback(_startup_data,'');if(_startup_data.server_messages)msgprint(_startup_data.server_messages);}else{if($i('startup_div'))
if(wn.boot){LocalDB.sync(wn.boot.docs);callback(wn.boot,'');if(wn.boot.error_messages)
console.log(wn.boot.error_messages)
if(wn.boot.server_messages)
msgprint(wn.boot.server_messages);}else{if($i('startup_div'))
$c('startup',{},callback,null,1);}}
function to_open(){if(get_url_arg('page'))
return get_url_arg('page');var h=location.hash;if(h){return h.substr(1);}}

View file

@ -1,5 +1,5 @@
// provide a namespace
wn = {}
if(!window.wn)wn = {}
wn.provide = function(namespace) {
var nsl = namespace.split('.');
var l = nsl.length;

View file

@ -1,8 +1,7 @@
/*
* lib/js/bootstrap/bootstrap-dropdown.js
*/
/* ============================================================
* lib/js/bootstrap/bootstrap-dropdown.js
*//* ============================================================
* bootstrap-dropdown.js v1.4.0
* http://twitter.github.com/bootstrap/javascript.html#dropdown
* ============================================================
@ -59,31 +58,26 @@
}( window.jQuery || window.ender );
/*
* lib/js/wn/ui/toolbar/selector_dialog.js
*/
* lib/js/wn/ui/toolbar/selector_dialog.js
*/
wn.ui.toolbar.SelectorDialog=Class.extend({init:function(opts){this.opts=opts;try{this.make_dialog();}catch(e){console.log(e);}
this.bind_events();},make_dialog:function(){this.dialog=new wn.widgets.Dialog({title:this.opts.title,width:300,fields:[{fieldtype:'Select',fieldname:'doctype',options:'Select...',label:'Select Type'},{fieldtype:'Button',label:'Go',fieldname:'go'}]});},bind_events:function(){var me=this;$(this.dialog.fields_dict.go.input).click(function(){me.dialog.hide();me.opts.execute(me.dialog.fields_dict.doctype.get_value());});$(this.dialog.fields_dict.doctype.input).change(function(){me.dialog.fields_dict.go.input.click();}).keypress(function(ev){if(ev.which==13){me.dialog.fields_dict.go.input.click();}});},show:function(){this.dialog.show();this.dialog.fields_dict.doctype.input.focus();return false;},set_values:function(lst){for(var i=0;i<lst.length;i++)
lst[i]=get_doctype_label(lst[i]);var sel=this.dialog.fields_dict.doctype.input;$(sel).empty();add_sel_options(sel,lst.sort());}})
/*
* lib/js/wn/ui/toolbar/new.js
*/
* lib/js/wn/ui/toolbar/new.js
*/
wn.ui.toolbar.NewDialog=wn.ui.toolbar.SelectorDialog.extend({init:function(){this._super({title:"New Record",execute:function(val){new_doc(val);},});this.set_values(profile.can_create.join(',').split(','));}});wn.ui.toolbar.new_dialog=new wn.ui.toolbar.NewDialog();
/*
* lib/js/wn/ui/toolbar/search.js
*/
* lib/js/wn/ui/toolbar/search.js
*/
wn.ui.toolbar.Search=wn.ui.toolbar.SelectorDialog.extend({init:function(){this._super({title:"Search",execute:function(val){selector.set_search(val);selector.show();},});this.set_values(profile.can_read.join(',').split(','));makeselector();}});wn.ui.toolbar.search=new wn.ui.toolbar.Search();
/*
* lib/js/wn/ui/toolbar/report.js
*/
* lib/js/wn/ui/toolbar/report.js
*/
wn.ui.toolbar.Report=wn.ui.toolbar.SelectorDialog.extend({init:function(){this._super({title:"Start Report For",execute:function(val){loadreport(val,null,null,null,1);},});this.set_values(profile.can_get_report.join(',').split(','));}});wn.ui.toolbar.report=new wn.ui.toolbar.Report();
/*
* lib/js/wn/ui/toolbar/recent.js
*/
* lib/js/wn/ui/toolbar/recent.js
*/
wn.ui.toolbar.RecentDocs=Class.extend({init:function(){$('.topbar .nav:first').append('<li class="dropdown">\
<a class="dropdown-toggle" href="#" onclick="return false;">Recent</a>\
<ul class="dropdown-menu" id="toolbar-recent"></ul>\
@ -95,9 +89,8 @@ catch(e){return;}
var m=rlist.length;if(m>15)m=15;for(var i=0;i<m;i++){var rd=rlist[i]
if(rd[1]){var dt=rd[0];var dn=rd[1];this.add(dt,dn,0);}}}});
/*
* lib/js/wn/ui/toolbar/toolbar.js
*/
* lib/js/wn/ui/toolbar/toolbar.js
*/
wn.require('lib/css/bootstrap/bootstrap-topbar.css');wn.ui.toolbar.Toolbar=Class.extend({init:function(){this.make();this.make_home();this.make_new();this.make_search();this.make_report();wn.ui.toolbar.recent=new wn.ui.toolbar.RecentDocs();if(in_list(user_roles,'Administrator'))
this.make_options();this.make_tools();this.make_logout();$('.topbar').dropdown();$(document).trigger('toolbar_setup');},make:function(){$('header').append('<div class="topbar">\
<div class="topbar-inner">\

View file

@ -7,6 +7,8 @@ wn.versions = {
if(window._version_number==-1 || parseInt(localStorage._version_number)
!= parseInt(window._version_number)) {
localStorage.clear();
console.log("Cache cleared - version: " + _version_number
+ ' to ' + localStorage._version_number)
}
localStorage.setItem('_version_number', window._version_number);
}

View file

@ -34,7 +34,7 @@ class Bundle:
data = "\nwn.assets.handler.css('%s');\n" %\
data.replace("'", "\\'").replace('\n', '\\\n')
outtxt += ('\n/*\n*\t%s\n*/\n' % f)
outtxt += ('\n/*\n *\t%s\n */' % f)
# append
if suffix=='concat' or out_type != 'js':

View file

@ -1,80 +1,43 @@
verbose = False
import os
import os
class Project:
"""
Build a project
Make files::
index.html
assets/template.html
assets/js/core.min.js
assets/timestamps.json
"""
def __init__(self):
"""
load libraries
"""
from py.build.bundle import Bundle
self.bundle = Bundle()
def getversion(self):
"""get from version.num file and increment it"""
if os.path.exists('version.num'):
with open('version.num', 'r') as vfile:
self.version = int(vfile.read()) + 1
else:
self.version = 1
with open('version.num', 'w') as vfile:
vfile.write(str(self.version))
return self.version
def boot(self):
"""
returns bootstrap js
"""
import json
corejs = open('lib/js/core.min.js', 'r')
boot = ('window._version_number="%s";' % str(self.getversion())) + \
'\n' + corejs.read()
corejs.close()
return boot
def render_templates(self):
"""
Generate static files from templates
"""
# render templates
boot = self.boot()
for wt in os.walk('templates'):
for fname in wt[2]:
if fname.split('.')[-1]=='html' and not fname.startswith('template'):
fpath = os.path.relpath(os.path.join(wt[0], fname), 'templates')
with open(os.path.join(wt[0], fname), 'r') as tempfile:
temp = tempfile.read()
temp = temp % boot
with open(fpath, 'w') as outfile:
outfile.write(temp)
print "Rendered %s | %.2fkb" % (fpath, os.path.getsize(fpath) / 1024.0)
def build(self):
"""
build js files, index.html
"""
for wt in os.walk('lib'):
for fname in wt[2]:
if fname=='build.json':
self.bundle.make(os.path.join(wt[0], fname))
def build():
"""concat / minify js files"""
from py.build.bundle import Bundle
bundle = Bundle()
for wt in os.walk('lib'):
for fname in wt[2]:
if fname=='build.json':
bundle.make(os.path.join(wt[0], fname))
self.render_templates()
increment_version()
def get_version():
"""get from version.num file and increment it"""
if os.path.exists('version.num'):
with open('version.num', 'r') as vfile:
version = int(vfile.read()) + 1
else:
version = 1
return version
def increment_version():
"""incremenet version by 1"""
version = get_version()
with open('version.num', 'w') as vfile:
vfile.write(str(version))
return version
def get_corejs():
"""return corejs with version number"""
import json
corejs = open('lib/js/core.min.js', 'r')
boot = ('window._version_number="%s";' % str(get_version())) + \
'\n' + corejs.read()
corejs.close()
return boot

View file

@ -6,7 +6,7 @@ pscript['onload_Login Page'] = function(){
pscript.login_btn = $btn('login_btn', 'Login', pscript.doLogin);
$(pscript.login_btn).addClass('primary');
$('#login_wrapper').keyup(function(ev){
$('#password').keypress(function(ev){
if(ev.which==13 && $('#password').value)
pscript.doLogin();
})
@ -20,7 +20,7 @@ pscript['onshow_Login Page'] = function() {
pscript.onLoginReply = function(r, rtext) {
pscript.login_btn.done_working();
if(r.message=="Logged In"){
window.location.href='index.html' + (get_url_arg('page') ? ('?page='+get_url_arg('page')) : '');
window.location.href='index.cgi' + (get_url_arg('page') ? ('?page='+get_url_arg('page')) : '');
} else {
$i('login_message').innerHTML = '<span style="color: RED;">'+(r.message)+'</span>';
//if(r.exc)alert(r.exc);

View file

@ -1,18 +1,8 @@
#
# import modules path
#
import os, sys
"""
globals attached to webnotes module
+ some utility functions that should probably be moved
"""
try:
import webnotes.defs
m = getattr(webnotes.defs,'modules_path',None)
m and sys.path.append(m)
except Exception,e:
raise e
#
# map for identifying which field values come from files
#
code_fields_dict = {
'Page':[('script', 'js'), ('content', 'html'), ('style', 'css'), ('static_content', 'html'), ('server_code', 'py')],
'DocType':[('server_code_core', 'py'), ('client_script_core', 'js')],
@ -23,81 +13,43 @@ code_fields_dict = {
'Control Panel':[('startup_code', 'js'), ('startup_css', 'css')]
}
#
# globals
#
#: "v170"
version = 'v170'
form_dict = {}
auth_obj = None
#: The database connection :class:`webnotes.db.Database` setup by :mod:`auth`
conn = None
#: The cgi.FieldStorage() object (Dictionary representing the formdata from the URL)
form = None
session = None
"""
Global session dictionary.
* session['user'] - Current user
* session['data'] - Returns a dictionary of the session cache
"""
user = None
is_testing = None
""" Flag to identify if system is in :term:`Testing Mode` """
incoming_cookies = {}
add_cookies = {}
""" Dictionary of additional cookies appended by custom code """
add_cookies = {} # append these to outgoing request
cookies = {}
auto_masters = {}
tenant_id = None
response = {'message':'', 'exc':''}
debug_log = []
message_log = []
from webnotes.utils import cstr
#
# Custom Class (no traceback)
#
class ValidationError(Exception):
pass
#
# HTTP standard response
#
response = {'message':'', 'exc':''}
"""
The JSON response object. Default is::
{'message':'', 'exc':''}
"""
#
# the logs
#
debug_log = []
""" List of exceptions to be shown in the :term:`Error Console` """
message_log = []
""" List of messages to be shown to the user in a popup box at the end of the request """
def getTraceback():
import webnotes.utils
return webnotes.utils.getTraceback()
import utils
return utils.getTraceback()
def errprint(msg):
"""
Append to the :data:`debug log`
"""
from utils import cstr
debug_log.append(cstr(msg or ''))
def msgprint(msg, small=0, raise_exception=0, as_table=False):
"""
Append to the :data:`message_log`
"""
from utils import cstr
if as_table and type(msg) in (list, tuple):
msg = '<table border="1px" style="border-collapse: collapse" cellpadding="2px">' + ''.join(['<tr>'+''.join(['<td>%s</td>' % c for c in r])+'</tr>' for r in msg]) + '</table>'
@ -118,9 +70,7 @@ def get_index_path():
return os.sep.join(os.path.dirname(os.path.abspath(__file__)).split(os.sep)[:-2])
def get_files_path():
global conn
import defs, os
import defs
if not conn:
raise Exception, 'You must login first'
@ -143,7 +93,6 @@ def create_folder(path):
else:
raise e
def connect(db_name=None):
"""
Connect to this db (or db), if called from command prompt
@ -162,46 +111,16 @@ def connect(db_name=None):
global user
user = webnotes.profile.Profile('Administrator')
# Environment Variables
#-----------------------------------------------------------
def get_env_vars(env_var):
import os
return os.environ.get(env_var,'None')
remote_ip = get_env_vars('REMOTE_ADDR') #Required for login from python shell
# Logging
# -----------------------------------------------------------
logger = None
def setup_logging():
import logging
import logging.handlers
# Also please set umask for apache to 002.
global logger
try:
logger = logging.getLogger('WNLogger')
logger.setLevel(eval(defs.log_level))
log_handler = logging.handlers.RotatingFileHandler(defs.log_file_name, maxBytes = defs.log_file_size, backupCount = defs.log_file_backup_count)
formatter = logging.Formatter('%(name)s - %(asctime)s - %(levelname)s\n%(message)s\n-------------------')
log_handler.setFormatter(formatter)
logger.addHandler(log_handler)
except IOError,e:
if e.args == 13:
open(defs.log_file_name).close()
if getattr(defs, 'log_file_name', None):
setup_logging()
def get_db_password(db_name):
from webnotes import defs
import defs
if hasattr(defs, 'get_db_password'):
return defs.get_db_password(db_name)

View file

@ -39,7 +39,6 @@ class HTTPRequest:
# start session
webnotes.session_obj = Session()
webnotes.session = webnotes.session_obj.data
webnotes.tenant_id = webnotes.session.get('tenant_id', 0)
# write out cookies if sid is supplied (this is a pre-logged in redirect)
if webnotes.form_dict.get('sid'):
@ -316,15 +315,8 @@ class Session:
def load(self):
import webnotes
r=None
try:
r = webnotes.conn.sql("""select user, sessiondata, status from
tabSessions where sid='%s'""" % self.sid)
except Exception, e:
if e.args[0]==1054:
self.add_status_column()
else:
raise e
r = webnotes.conn.sql("""select user, sessiondata, status from
tabSessions where sid='%s'""" % self.sid)
if r:
r=r[0]
@ -419,13 +411,6 @@ class Session:
# clear out old sessions
webnotes.conn.sql("delete from tabSessions where TIMEDIFF(NOW(), lastupdate) > '72:00:00'")
# -----------------------------
def add_status_column(self):
webnotes.conn.commit()
webnotes.conn.sql("alter table tabSessions add column `status` varchar(20)")
webnotes.conn.begin()
# Get IP Info from ipinfodb.com
# -----------------------------
def get_ipinfo(self):

View file

@ -8,9 +8,8 @@ def get_bootinfo():
import webnotes
bootinfo = {}
doclist = []
webnotes.conn.begin()
webnotes.conn.begin()
# profile
get_profile(bootinfo)
@ -59,10 +58,10 @@ def get_home_page(bootinfo, doclist):
home_page = webnotes.user.get_home_page()
if home_page:
import webnotes.widgets.page
page_doclist = webnotes.widgets.page.get(home_page)
doclist += webnotes.widgets.page.get(home_page)
bootinfo['home_page'] = home_page or ''
bootinfo['home_page_html'] = page_doclist[0].content
def get_dt_labels():
import webnotes

View file

@ -39,13 +39,6 @@ def runserverobj(arg=None):
def logout():
webnotes.login_manager.logout()
# versions
# --------
def get_diff():
v = webnotes.form_dict.get('version_number')
from build.version import VersionControl
webnotes.response['message'] = VersionControl().repo.diff(v)
# DocType Mapper
# ------------------------------------------------------------------------------------
@ -166,27 +159,6 @@ def get_file():
webnotes.response['filecontent'] = res[1]
else:
webnotes.msgprint('[get_file] Unknown file name')
# Get Graph
# ------------------------------------------------------------------------------------
def get_graph():
form = webnotes.form
import StringIO
f = StringIO.StringIO()
# call the object
obj = server.get_obj(form_dict.get('dt'))
plt = server.run_server_obj(obj, form_dict.get('method'), form_dict.get('arg'))
plt.savefig(f)
# stream out
webnotes.response['type'] = 'download'
webnotes.response['filename'] = webnotes.user.get_random_password() + '.png'
webnotes.response['filecontent'] = f.getvalue()
# Reset Password
# ------------------------------------------------------------------------------------
def reset_password():
form_dict = webnotes.form_dict
@ -199,27 +171,59 @@ def reset_password():
else:
webnotes.msgprint("No such user (%s)", user)
# Resume session
# ------------------------------------------------------------------------------------
def resume_session():
webnotes.response['message'] = webnotes.session_obj.resume()
def handle():
"""handle request"""
cmd = webnotes.form_dict['cmd']
# -------------
# Create Backup
# -------------
if cmd!='login':
# login executed in webnotes.auth
try:
execute_cmd(cmd)
except webnotes.ValidationError:
webnotes.conn.rollback()
except:
webnotes.errprint(webnotes.utils.getTraceback())
webnotes.conn and webnotes.conn.rollback()
if webnotes.conn:
webnotes.conn.close()
print_response()
def backupdb(form_dict, session):
db_name = server.decrypt(form_dict.get('db_name'))
def execute_cmd(cmd):
"""execute a request as python module"""
validate_cmd(cmd)
method = get_method(cmd)
server.backup_db(db_name)
if not webnotes.conn.in_transaction:
webnotes.conn.begin()
webnotes.response['type'] = 'download'
webnotes.response['filename'] = db_name+'.tar.gz'
webnotes.response['filecontent'] = open('../backups/' + db_name+'.tar.gz','rb').read()
if 'arg' in webnotes.form_dict:
# direct method call
ret = method(webnotes.form_dict.get('arg'))
else:
ret = method()
# ---------------------------------------------------------------------
# returns with a message
if ret:
webnotes.response['message'] = ret
# update session
webnotes.session_obj.update()
if webnotes.conn.in_transaction:
webnotes.conn.commit()
def get_method(cmd):
"""get method object from cmd"""
if '.' in cmd:
module = __import__('.'.join(cmd.split('.')[:-1]), fromlist=[''])
method = getattr(module, cmd.split('.')[-1])
else:
method = globals()[cmd]
return method
def validate_cmd(cmd):
# check if there is no direct possibility of malicious script injection
if cmd.startswith('webnotes.model.code'):
@ -230,145 +234,27 @@ def validate_cmd(cmd):
if cmd.startswith('webnotes.conn'):
raise Exception, 'Cannot call database connection method directly from the handler'
# Execution Starts Here
# ---------------------------------------------------------------------
import webnotes.auth
import webnotes.db
# reset password
# ---------------------------------------------------------------------
if form_dict.has_key('cmd') and (form_dict.get('cmd')=='reset_password'):
webnotes.conn = webnotes.db.Database(use_default = 1)
sql = webnotes.conn.sql
sql("START TRANSACTION")
try:
reset_password()
sql("COMMIT")
except Exception, e:
webnotes.errprint(str(e))
sql("ROLLBACK")
# pre-login access - for registration etc.
# ---------------------------------------------------------------------
elif form_dict.has_key('cmd') and (form_dict.get('cmd')=='prelogin'):
webnotes.conn = webnotes.db.Database(use_default = 1)
sql = webnotes.conn.sql
webnotes.session = {'user':'Administrator'}
import webnotes.model.code
sql("START TRANSACTION")
try:
webnotes.response['message'] = webnotes.model.code.get_obj('Profile Control').prelogin(form_dict) or ''
sql("COMMIT")
except:
webnotes.errprint(webnotes.utils.getTraceback())
sql("ROLLBACK")
# main stuff
# ---------------------------------------------------------------------
else:
try:
webnotes.request = webnotes.auth.HTTPRequest()
if form_dict.get('cmd') != 'login' and webnotes.conn:
sql = webnotes.conn.sql
# NOTE:
# guest should only be allowed:
# getdoc (if Guest access)
# runserverobj (if Guest access)
def print_response():
import string
import os
if webnotes.response.get('type')=='csv':
print_csv()
elif webnotes.response.get('type')=='iframe':
print_iframe()
elif webnotes.response.get('type')=='download':
print_raw()
else:
print_json()
# get command cmd
cmd = form_dict.has_key('cmd') and form_dict.get('cmd') or ''
read_only = form_dict.has_key('_read_only') and form_dict.get('_read_only') or None
validate_cmd(cmd)
module = ''
if '.' in cmd:
module = '.'.join(cmd.split('.')[:-1])
cmd = cmd.split('.')[-1]
exec 'from %s import %s' % (module, cmd) in locals()
# execute
if locals().has_key(cmd):
if (not webnotes.conn.in_transaction) and (not read_only):
webnotes.conn.begin()
if webnotes.form_dict.get('arg'):
# direct method call
ret = locals()[cmd](webnotes.form_dict.get('arg'))
else:
ret = locals()[cmd]()
# returns with a message
if ret:
webnotes.response['message'] = ret
# update session
webnotes.session_obj.update()
if webnotes.conn.in_transaction:
webnotes.conn.commit()
else:
if cmd!='login':
webnotes.msgprint('No Method: %s' % cmd)
except webnotes.ValidationError:
webnotes.conn.rollback()
except:
webnotes.errprint(webnotes.utils.getTraceback())
webnotes.conn and webnotes.conn.rollback()
#### cleanup
#-----------
if webnotes.conn:
webnotes.conn.close()
#### go
import string
import os
acceptsGzip, out_buf, str_out = 0, None, None
try:
if string.find(os.environ["HTTP_ACCEPT_ENCODING"], "gzip") != -1:
acceptsGzip = 1 # problem in win ?
except:
pass
def compressBuf(buf):
import gzip, cStringIO
zbuf = cStringIO.StringIO()
zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 5)
zfile.write(buf)
zfile.close()
return zbuf.getvalue()
# CSV
# -------------------------------------------------------------------
if webnotes.response.get('type')=='csv':
def print_csv():
print "Content-Type: text/csv"
print "Content-Disposition: attachment; filename="+webnotes.response['doctype'].replace(' ', '_')+".csv"
print
print webnotes.response['result']
# IFRAME
# -------------------------------------------------------------------
elif webnotes.response.get('type')=='iframe':
def print_iframe():
print "Content-Type: text/html"
print
if webnotes.response.get('result'):
@ -376,69 +262,63 @@ elif webnotes.response.get('type')=='iframe':
if webnotes.debug_log:
print '''<script type='text/javascript'>alert("%s");</script>''' % ('-------'.join(webnotes.debug_log).replace('"', '').replace('\n',''))
# file
# -------------------------------------------------------------------
elif webnotes.response.get('type')=='download':
def print_raw():
import mimetypes
print "Content-Type: %s" % (mimetypes.guess_type(webnotes.response['filename'])[0] or 'application/unknown')
print "Content-Disposition: filename="+webnotes.response['filename'].replace(' ', '_')
print
print webnotes.response['filecontent']
# JSON
# -------------------------------------------------------------------
else:
if webnotes.debug_log:
save_log = 1
if webnotes.debug_log[0].startswith('[Validation Error]'):
save_log = 0
t = '\n----------------\n'.join(webnotes.debug_log)
if errdoctype:
t = t + '\nDocType: ' + errdoctype
if errdoc:
t = t + '\nName: ' + errdoc
if errmethod:
t = t + '\nMethod: ' + errmethod
webnotes.response['exc'] = '<pre>'+t.replace('\n','<br>')+'</pre>'
if save_log: # don't save validation errors
try: save_log(t, 'Server')
except: pass
if webnotes.message_log:
webnotes.response['server_messages'] = '\n----------------\n'.join(webnotes.message_log)
def print_json():
make_logs()
cleanup_docs()
# Convert to JSON
# ---------------
try:
import json
except: # python 2.4
import simplejson as json
import json
str_out = json.dumps(webnotes.response)
if acceptsGzip and 1 and len(str_out)>512:
if accept_gzip() and len(str_out)>512:
out_buf = compressBuf(str_out)
print "Content-Encoding: gzip"
print "Content-Length: %d" % (len(out_buf))
str_out = out_buf
print "Content-Type: text/html; charset: utf-8"
# if there ar additional cookies defined during the request, add them here
print_cookies()
# Headers end
print
print str_out
def accept_gzip():
"""return true if client accepts gzip"""
try:
if string.find(os.environ["HTTP_ACCEPT_ENCODING"], "gzip") != -1:
return True
except:
return False
def make_logs():
"""make strings for msgprint and errprint"""
if webnotes.debug_log:
t = '\n----------------\n'.join(webnotes.debug_log)
webnotes.response['exc'] = t
if webnotes.message_log:
t = '\n----------------\n'.join(webnotes.message_log)
webnotes.response['server_messages'] = t
def print_cookies():
"""if there ar additional cookies defined during the request, add them"""
if webnotes.cookies or webnotes.add_cookies:
for c in webnotes.add_cookies.keys():
webnotes.cookies[c] = webnotes.add_cookies[c]
print webnotes.cookies
print # Headers end
if out_buf:
sys.stdout.write(out_buf)
elif str_out:
print str_out
print webnotes.cookies
def compressBuf(buf):
import gzip, cStringIO
zbuf = cStringIO.StringIO()
zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 5)
zfile.write(buf)
zfile.close()
return zbuf.getvalue()

109
py/webnotes/index.py Normal file
View file

@ -0,0 +1,109 @@
"""
Generate index.cgi html
Loads index.html from the template with:
1. bootinfo
2. static html of home / if _escaped_fragment_ is given
3. top menus and bottom menus
"""
import webnotes
body_html = """
<header></header>
<div id="startup_div" style="padding: 8px;
font-size: 12px; font-family: Arial !important; line-height: 1.6em;">
Loading...
</div>
<!-- Main Starts -->
<div id="body_div">
</div>
<div class="no_script" style="display: none;">
%s
</div>
<footer></footer>
<script>wn.require('js/app.js');</script>
<div id="dialog_back"></div>
"""
def get():
"""get index html"""
import webnotes
from jinja2 import Template
with open('lib/conf/index.html', 'r') as f:
template = Template(f.read())
# google crawler
if '_escaped_fragment_' in webnotes.form:
page = webnotes.form_dict['_escaped_fragment_']
if not page:
page = webnotes.user.get_home_page()
return template.render(bootinfo = '', \
corejs = '', body_html=html_snapshot(page), ajax_meta_tag = '')
# home page
else:
import webnotes.session_cache
from build.project import get_corejs
import json
bootinfo = webnotes.session_cache.get()
# is this needed?
home_content = bootinfo['home_page_html']
del bootinfo['home_page_html']
bootinfo = """var wn = {}; wn.boot = %s;""" % json.dumps(bootinfo)
return template.render(bootinfo = bootinfo, \
corejs = get_corejs(), body_html=body_html % '', \
ajax_meta_tag = '<meta name="fragment" content="!">')
def html_snapshot(page):
"""get html snapshot for search bot"""
from webnotes.widgets.page import get_page_html
from webnotes.model.doc import Document
doc = Document('Top Bar Settings', 'Top Bar Settings')
doc.content = get_page_html(page)
doc.header_menu = doc.footer_menu = ''
doc.page_name = page
for m in webnotes.conn.sql("""select parentfield, label, std_page, custom_page
from `tabTop Bar Item` where parent='Top Bar Settings' order by idx""", as_dict=1):
if m['custom_page']:
m['std_page'] = m['custom_page']
if m['parentfield']=='top_bar_items':
doc.header_menu += '<li><a href="index.cgi#!%(std_page)s">%(label)s</a></li>' % m
else:
doc.footer_menu += '<li><a href="index.cgi#!%(std_page)s">%(label)s</a></li>' % m
return """
<header>
<h3>%(brand_html)s</h3>
<ul>
%(header_menu)s
</ul>
</header>
%(content)s
<footer>
<ul>
%(footer_menu)s
</ul>
<div>Address: %(address)s</div>
<div>&copy; %(copyright)s</div>
<div>Powered by <a href="https://erpnext.com">erpnext.com</a></div>
<div style="background-color: #ffc; padding: 7px">
This page is for search engines, for standard browsers click
<a href="index.cgi#!%(page_name)s">here</a>
</div>
</footer>
""" % doc.fields

View file

@ -49,11 +49,25 @@ class Installer:
webnotes.conn.sq.("""create table `__SessionCache`
(user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)""")
create_sessions_table()
# set the basic passwords
webnotes.conn.begin()
webnotes.conn.sql("update tabProfile set password = password('admin') where name='Administrator'")
webnotes.conn.commit()
def create_sessions_table(self):
self.dbman.drop_table('tabSessions')
webnotes.conn.sql("""CREATE TABLE `tabSessions` (
`user` varchar(40) DEFAULT NULL,
`sid` varchar(120) DEFAULT NULL,
`sessiondata` longtext,
`ipaddress` varchar(16) DEFAULT NULL,
`lastupdate` datetime DEFAULT NULL,
`status` varchar(20) DEFAULT NULL,
KEY `sid` (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8""")
def import_core_module(self):
"""
Imports the "Core" module from .txt file and creates

View file

@ -100,13 +100,14 @@ class Profile:
"""
Get the name of the user's home page from the `Control Panel`
"""
roles = self.get_roles()
hpl = webnotes.conn.sql("select role, home_page from `tabDefault Home Page` where parent='Control Panel' order by idx asc")
for h in hpl:
if h[0] in roles:
return h[1]
return webnotes.conn.get_value('Control Panel',None,'home_page') or 'Login Page'
hpl = webnotes.conn.sql("""select home_page from `tabDefault Home Page`
where parent='Control Panel'
and role in ('%s') order by idx asc limit 1""" % "', '".join(self.get_roles()))
if hpl:
return hpl[0][0]
else:
return webnotes.conn.get_value('Control Panel',None,'home_page') or 'Login Page'
def get_defaults(self):
"""

View file

@ -20,6 +20,8 @@ def clear_cache(user=''):
webnotes.conn.sql("delete from __SessionCache")
webnotes.conn.sql("update tabSessions set sessiondata=NULL")
# rebuild a cache for guest
if webnotes.session:
webnotes.session['data'] = {}

View file

@ -116,4 +116,30 @@ def getpage():
# send
webnotes.response['docs'] = doclist
def get_page_path(page_name, module):
import os
import webnotes.defs
from webnotes.modules import scrub
return os.path.join(webnotes.defs.modules_path, 'erpnext', scrub(module), \
'page', scrub(page_name), scrub(page_name) + '.html')
def get_page_html(page_name):
"""get html of page"""
p = webnotes.conn.sql("""select module, content from tabPage where name=%s""", \
page_name, as_dict=1)
if not p:
return ''
else:
import os
p=p[0]
path = get_page_path(page_name, p['module'])
if os.path.exists(path):
with open(path, 'r') as f:
return f.read()
else:
return p['content']

8
wnf.py
View file

@ -43,12 +43,12 @@ def run():
cmd = sys.argv[1]
if cmd=='build':
from build.project import Project
Project().build()
import build.project
build.project.build()
elif cmd=='clear':
from build.project import Project
Project().render_templates()
from build.project import increment_version
print "Version:" + str(increment_version())
# replace code
elif cmd=='replace':