@@ -12,13 +12,6 @@ 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 | |||
*/ | |||
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 | |||
*/ | |||
@@ -30,7 +23,7 @@ localStorage.setItem('_version_number',window._version_number);}}} | |||
*/ | |||
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);} | |||
return src.split('.').slice(-1)[0];},load:function(src){var t=src;$.ajax({url:t,data:{q:Math.floor(Math.random()*1000)},dataType:'text',success:function(txt){wn.assets.add(src,txt);},async: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)}}} | |||
/* | |||
@@ -50,8 +43,7 @@ else | |||
c.className=className;} | |||
if(cs)wn.dom.css(c,cs);if(innerHTML)c.innerHTML=innerHTML;if(onclick)c.onclick=onclick;return c;} | |||
wn.dom.css=function(ele,s){if(ele&&s){for(var i in s)ele.style[i]=s[i];};return ele;} | |||
wn.dom.hide=function(ele){ele.style.display='none';} | |||
wn.dom.show=function(ele,value){if(!value)value='block';ele.style.display=value;} | |||
wn.get_cookie=function(c){var t=""+document.cookie;var ind=t.indexOf(c);if(ind==-1||c=="")return"";var ind1=t.indexOf(';',ind);if(ind1==-1)ind1=t.length;return unescape(t.substring(ind+c.length+1,ind1));} | |||
/* | |||
* lib/js/wn/page.js | |||
*/ | |||
@@ -96,6 +88,18 @@ text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function | |||
('0000'+a.charCodeAt(0).toString(16)).slice(-4);});} | |||
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/wn/request.js | |||
*/ | |||
wn.provide('wn.request');wn.request.url='index.cgi';wn.request.prepare=function(opts){if(opts.btn)$(opts.btn).set_working();if(opts.show_spinner)set_loading();if(opts.freeze)freeze();if(!opts.args.cmd){console.log(opts) | |||
throw"Incomplete Request";}} | |||
wn.request.cleanup=function(opts,r){if(opts.btn)$(opts.btn).done_working();if(opts.show_spinner)hide_loading();if(opts.freeze)unfreeze();if(wn.boot.sid&&wn.get_cookie('sid')!=wn.boot.sid){msgprint('Session expired');setTimeout('redirect_to_login()',3000);return;} | |||
if(r.server_messages)msgprint(r.server_messages) | |||
if(r.exc){errprint(r.exc);console.log(r.exc);};if(r.docs)LocalDB.sync(r.docs);} | |||
wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});msgprint('Unable to complete request: '+textStatus) | |||
if(opts.error)opts.error(xhr)}})} | |||
wn.call=function(opts){var args=opts.args||{};if(opts.module&&opts.page){args.cmd=module+'.page.'+page+'.'+page+'.'+method}else if(opts.method){args.cmd=opts.method;} | |||
wn.request.call({args:args,success:opts.callback,error:opts.error,btn:opts.btn,freeze:opts.freeze,show_spinner:!opts.no_spinner});} | |||
/* | |||
* lib/js/core.js | |||
*/ | |||
@@ -3,13 +3,9 @@ | |||
// dialog container | |||
var popup_cont; | |||
var session = {}; | |||
var start_sid = null; | |||
if(!wn) var wn = {}; | |||
function startup() { | |||
// save the sid (so that we know if it changes mid-session) | |||
start_sid = get_cookie('sid'); | |||
function startup() { | |||
popup_cont = $a(document.getElementsByTagName('body')[0], 'div'); | |||
// Globals | |||
@@ -272,12 +272,9 @@ function $i(id) { | |||
if(id && id.appendChild)return id; // already an element | |||
return document.getElementById(id); | |||
} | |||
function $t(parent, txt) { if(parent.substr)parent = $i(parent); return parent.appendChild(document.createTextNode(txt)); } | |||
function $w(e,w) { if(e && e.style && w)e.style.width = w; } | |||
function $h(e,h) { if(e && e.style && h)e.style.height = h; } | |||
function $bg(e,w) { if(e && e.style && w)e.style.backgroundColor = w; } | |||
function $fg(e,w) { if(e && e.style && w)e.style.color = w; } | |||
function $op(e,w) { if(e && e.style && w) { set_opacity(e,w); } } | |||
function $y(ele, s) { | |||
if(ele && s) { | |||
@@ -415,16 +412,6 @@ function get_scroll_top() { | |||
return st; | |||
} | |||
function get_cookie(c) { | |||
var t=""+document.cookie; | |||
var ind=t.indexOf(c); | |||
if (ind==-1 || c=="") return ""; | |||
var ind1=t.indexOf(';',ind); | |||
if (ind1==-1) ind1=t.length; | |||
return unescape(t.substring(ind+c.length+1,ind1)); | |||
} | |||
// URL utilities | |||
wn.urllib = { | |||
@@ -474,55 +461,4 @@ wn.urllib = { | |||
} | |||
get_url_arg = wn.urllib.get_arg; | |||
get_url_dict = wn.urllib.get_dict; | |||
// set user image | |||
var user_img = {} | |||
var user_img_queue = {}; | |||
var user_img_loading = []; | |||
set_user_img = function(img, username, get_latest, img_id) { | |||
function set_it(i) { | |||
if(user_img[username]=='no_img_m') | |||
i.src = 'lib/images/ui/no_img_m.gif'; | |||
else if(user_img[username]=='no_img_f') | |||
i.src = 'lib/images/ui/no_img_f.gif'; // no image | |||
else { | |||
ac_id = wn.control_panel.account_id; | |||
i.src = repl('cgi-bin/getfile.cgi?ac=%(ac)s&name=%(fn)s', {fn:user_img[username], ac:ac_id}); | |||
} | |||
} | |||
// given | |||
if(img_id) { | |||
user_img[username] = img_id; | |||
set_it(img); | |||
return; | |||
} | |||
// from dict or load | |||
if(user_img[username] && !get_latest) { | |||
set_it(img); | |||
} else{ | |||
// queue multiple request while loading | |||
if(in_list(user_img_loading,username)) { | |||
if(!user_img_queue[username]) | |||
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); | |||
} | |||
} | |||
get_url_dict = wn.urllib.get_dict; |
@@ -20,146 +20,50 @@ | |||
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
// | |||
// My HTTP Request | |||
var outUrl = "index.cgi"; | |||
var NULL_CHAR = '^\5*'; | |||
// check response of HTTP request, only if ready | |||
function checkResponse(r, on_timeout, no_spinner, freeze_msg) { | |||
try { | |||
if (r.readyState==4 && r.status==200) return true; else return false; | |||
} catch(e) { | |||
// $i("icon_loading").style.visibility = "hidden"; WAINING MESSAGE | |||
msgprint("error:Request timed out, try again"); | |||
if(on_timeout) | |||
on_timeout(); | |||
hide_loading(); | |||
if(freeze_msg) | |||
unfreeze(); | |||
return false; | |||
} | |||
} | |||
var pending_req = 0; | |||
// new XMLHttpRequest object | |||
function newHttpReq() { | |||
if (!$.browser.msie) | |||
var r=new XMLHttpRequest(); | |||
else if (window.ActiveXObject) | |||
var r=new ActiveXObject("Microsoft.XMLHTTP"); | |||
return r; | |||
} | |||
// call execute serverside request | |||
function $c(command, args, fn, on_timeout, no_spinner, freeze_msg, btn) { | |||
var req=newHttpReq(); | |||
ret_fn=function() { | |||
if (checkResponse(req, on_timeout, no_spinner, freeze_msg)) { | |||
if(btn)$(btn).done_working(); | |||
if(!no_spinner) | |||
hide_loading(); // Loaded | |||
var rtxt = req.responseText; | |||
try { | |||
var r = JSON.parse(rtxt); | |||
} catch(e) { | |||
msgprint('Handler Exception:' + rtxt); | |||
return; | |||
} | |||
// unfreeze | |||
if(freeze_msg)unfreeze(); | |||
if(!validate_session(r,rtxt)) return; | |||
if(r.exc) { | |||
errprint(r.exc); | |||
console.log(r.exc); | |||
}; | |||
if(r.server_messages) { msgprint(r.server_messages);}; | |||
if(r.docs) { LocalDB.sync(r.docs); } | |||
saveAllowed = true; | |||
if(fn)fn(r, rtxt); | |||
} | |||
} | |||
if(btn) $(btn).set_working(); | |||
req.onreadystatechange=ret_fn; | |||
req.open("POST",outUrl,true); | |||
req.setRequestHeader("ENCTYPE", "multipart/form-data"); | |||
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); | |||
args['cmd']=command; | |||
req.send(makeArgString(args)); | |||
if(!no_spinner)set_loading(); // Loading | |||
if(freeze_msg)freeze(freeze_msg,1); | |||
} | |||
function validate_session(r,rt) { | |||
// check for midway change in session | |||
if(r.message=='Logged In') { | |||
start_sid = get_cookie('sid'); | |||
return true; | |||
} | |||
if(start_sid && start_sid != get_cookie('sid') && user && user!='Guest') { | |||
page_body.set_session_changed(); | |||
return; | |||
} | |||
// check for expired session | |||
if(r.exc && r.session_status=='Session Expired') { | |||
resume_session(); | |||
return; | |||
} | |||
// check for logged out sesion | |||
if(r.exc && r.session_status=='Logged Out') { | |||
msgprint('You have been logged out'); | |||
setTimeout('redirect_to_login()', 3000); | |||
return; | |||
} | |||
if(r.exc && r.exc_type && r.exc_type=='PermissionError') { | |||
loadpage('_home'); | |||
} | |||
return true; | |||
function $c(command, args, callback, error, no_spinner, freeze_msg, btn) { | |||
wn.request.call({ | |||
args: $.extend(args, {cmd: command}), | |||
success: callback, | |||
error: error, | |||
btn: btn, | |||
freeze: freeze_msg, | |||
show_spinner: !no_spinner | |||
}) | |||
} | |||
// For calling an object | |||
function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg, btn) { | |||
var args = { 'method':method, 'arg': (typeof arg=='string' ? arg : JSON.stringify(arg)) } | |||
if(typeof doclist=='string') args.doctype = doclist; | |||
else args.docs = compress_doclist(doclist) | |||
// single | |||
$c('runserverobj',args, call_back, null, no_spinner, freeze_msg, btn); | |||
function $c_obj(doclist, method, arg, callback, no_spinner, freeze_msg, btn) { | |||
if(typeof arg=='string') arg = JSON.stringify(arg); | |||
wn.request.call({ | |||
args: { | |||
cmd:'runserverobj', | |||
arg: arg, | |||
method: method | |||
}, | |||
success: callback, | |||
btn: btn, | |||
freeze: freeze_msg, | |||
show_spinner: !no_spinner | |||
}); | |||
} | |||
// For call a page metho | |||
function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg, btn) { | |||
if(arg && !arg.substr) arg = JSON.stringify(arg); | |||
$c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg}, | |||
call_back, null, no_spinner, freeze_msg, btn); | |||
} | |||
// generic server call (call page, object) | |||
wn.call = function(args) { | |||
if(!args.args) args.args = {}; | |||
if(args.module && args.page) { | |||
$c_page(args.module, args.page, args.method, args.args, args.callback, | |||
args.no_spinner, false, args.btn); | |||
} else if(args.docs) { | |||
$c_obj(args.doc, args.method, args.args, args.callback, args.no_spinner, | |||
false, args.btn); | |||
} else { | |||
$c(args.method, args.args, args.callback, false, args.no_spinner, false, args.btn); | |||
} | |||
function $c_page(module, page, method, arg, callback, no_spinner, freeze_msg, btn) { | |||
if(typeof arg=='string') arg = JSON.stringify(arg); | |||
wn.request.call({ | |||
args: { | |||
cmd: module+'.page.'+page+'.'+page+'.'+method, | |||
arg: arg, | |||
method: method | |||
}, | |||
success: callback, | |||
error: error, | |||
btn: btn, | |||
freeze: freeze_msg, | |||
show_spinner: !no_spinner | |||
}); | |||
} | |||
// For calling an for output as csv | |||
function $c_obj_csv(doclist, method, arg) { | |||
// single | |||
@@ -179,30 +83,6 @@ function $c_obj_csv(doclist, method, arg) { | |||
open_url_post(outUrl, args); | |||
} | |||
function my_eval(co) { | |||
var w = window; | |||
// Evaluate script | |||
if (!w.execScript) { | |||
if (/Gecko/.test(navigator.userAgent)) { | |||
eval(co, w); // Firefox 3.0 | |||
} else { | |||
eval.call(w, co); | |||
} | |||
} else { | |||
w.execScript(co); // IE | |||
} | |||
} | |||
function makeArgString(dict) { | |||
var varList = []; | |||
for(key in dict){ | |||
varList[varList.length] = key + '=' + encodeURIComponent(dict[key]); | |||
} | |||
return varList.join('&'); | |||
} | |||
// call a url as POST | |||
function open_url_post(URL, PARAMS, new_window) { | |||
var temp=document.createElement("form"); | |||
@@ -1,48 +0,0 @@ | |||
// Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) | |||
// | |||
// MIT License (MIT) | |||
// | |||
// Permission is hereby granted, free of charge, to any person obtaining a | |||
// copy of this software and associated documentation files (the "Software"), | |||
// to deal in the Software without restriction, including without limitation | |||
// the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
// and/or sell copies of the Software, and to permit persons to whom the | |||
// Software is furnished to do so, subject to the following conditions: | |||
// | |||
// The above copyright notice and this permission notice shall be included in | |||
// all copies or substantial portions of the Software. | |||
// | |||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | |||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | |||
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | |||
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
// | |||
var fcount = 0; | |||
var frozen = 0; | |||
var dialog_message; | |||
var dialog_back; | |||
function freeze(msg, do_freeze) { | |||
// blur | |||
if(!dialog_back) { | |||
dialog_back = $a($i('body_div'), 'div', 'dialog_back'); | |||
$(dialog_back).css('opacity', 0.6); | |||
} | |||
$ds(dialog_back); | |||
fcount++; | |||
frozen = 1; | |||
} | |||
function unfreeze() { | |||
if(dialog_message) | |||
$dh(dialog_message); | |||
if(!fcount)return; // anything open? | |||
fcount--; | |||
if(!fcount) { | |||
$dh(dialog_back); | |||
frozen = 0; | |||
} | |||
} |
@@ -20,6 +20,10 @@ | |||
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
// | |||
var pending_req = 0; | |||
var fcount = 0; | |||
var dialog_back; | |||
function set_loading() { | |||
pending_req++; | |||
$('#spinner').css('visibility', 'visible'); | |||
@@ -32,4 +36,21 @@ function hide_loading() { | |||
$('body').css('cursor', 'default'); | |||
$('#spinner').css('visibility', 'hidden'); | |||
} | |||
} | |||
function freeze() { | |||
// blur | |||
if(!dialog_back) { | |||
dialog_back = $a($i('body_div'), 'div', 'dialog_back'); | |||
$(dialog_back).css('opacity', 0.6); | |||
} | |||
$ds(dialog_back); | |||
fcount++; | |||
} | |||
function unfreeze() { | |||
if(!fcount)return; // anything open? | |||
fcount--; | |||
if(!fcount) { | |||
$dh(dialog_back); | |||
} | |||
} |
@@ -75,7 +75,7 @@ Dialog.prototype.make_row = function(d) { | |||
var c1 = $td(t,0,0); | |||
var c2 = $td(t,0,1); | |||
if(d[0]!='Check' && d[0]!='Button') | |||
$t(c1, d[1]); | |||
$(c1).text(d[1]); | |||
} | |||
if(d[0]=='HTML') { | |||
@@ -176,7 +176,7 @@ CommentItem = function(cell, ri, ci, d, comment) { | |||
// Set picture | |||
// ----------- | |||
CommentItem.prototype.set_picture = function(d, ri){ | |||
set_user_img(this.img, user) | |||
this.user.src = wn.user_info(d[ri][2]).image; | |||
this.cmt_by.innerHTML = d[ri][7] ? d[ri][7] : d[ri][2]; | |||
} | |||
@@ -63,7 +63,7 @@ TabbedPage.prototype.add_tab = function(n, onshow, no_body, with_heading) { | |||
tab.set_selected = function() { | |||
if(me.cur_tab) me.cur_tab.collapse(); | |||
this.className = 'box_tab_selected'; | |||
$op(this, 100); | |||
$(this).css('opacity', 1); | |||
me.cur_tab = this; | |||
} | |||
tab.expand = function(arg) { | |||
@@ -225,7 +225,11 @@ SingleTag.prototype.make_body = function(parent) { | |||
if(this.onclick) $y(this.body, {cursor:'pointer'}); | |||
// hover | |||
$(this.body).hover(function() { $op(this,60); } ,function() { $op(this,100); }); | |||
$(this.body).hover(function() { | |||
$(this).css('opacity', 0.6); | |||
} ,function() { | |||
$(this).css('opacity', 1); | |||
}); | |||
// label | |||
this.make_label(); | |||
@@ -22,7 +22,6 @@ | |||
// library to mange assets (js, css, models, html) etc in the app. | |||
// will try and get from localStorge if latest are available | |||
// or will load them via xmlhttp | |||
// depends on wn.versions to manage versioning | |||
wn.assets = { | |||
@@ -57,16 +56,23 @@ wn.assets = { | |||
}, | |||
// load an asset via | |||
// xmlhttp | |||
load: function(src) { | |||
// this is virtual page load, only get the the source | |||
// *without* the template | |||
var t = src; | |||
wn.xmlhttp.get(t, function(txt) { | |||
// add it to localstorage | |||
wn.assets.add(src, txt); | |||
}, 'q=' + Math.floor(Math.random()*1000) , false) | |||
$.ajax({ | |||
url: t, | |||
data: { | |||
q: Math.floor(Math.random()*1000) | |||
}, | |||
dataType: 'text', | |||
success: function(txt) { | |||
// add it to localstorage | |||
wn.assets.add(src, txt); | |||
}, | |||
async: false | |||
}) | |||
}, | |||
// pass on to the handler to set | |||
@@ -61,11 +61,11 @@ wn.dom.css= function(ele, s) { | |||
return ele; | |||
} | |||
wn.dom.hide = function(ele) { | |||
ele.style.display = 'none'; | |||
} | |||
wn.dom.show = function(ele, value) { | |||
if(!value) value = 'block'; | |||
ele.style.display = value; | |||
wn.get_cookie = function(c) { | |||
var t=""+document.cookie; | |||
var ind=t.indexOf(c); | |||
if (ind==-1 || c=="") return ""; | |||
var ind1=t.indexOf(';',ind); | |||
if (ind1==-1) ind1=t.length; | |||
return unescape(t.substring(ind+c.length+1,ind1)); | |||
} |
@@ -0,0 +1,111 @@ | |||
// Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) | |||
// | |||
// MIT License (MIT) | |||
// | |||
// Permission is hereby granted, free of charge, to any person obtaining a | |||
// copy of this software and associated documentation files (the "Software"), | |||
// to deal in the Software without restriction, including without limitation | |||
// the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
// and/or sell copies of the Software, and to permit persons to whom the | |||
// Software is furnished to do so, subject to the following conditions: | |||
// | |||
// The above copyright notice and this permission notice shall be included in | |||
// all copies or substantial portions of the Software. | |||
// | |||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | |||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | |||
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | |||
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
// | |||
// My HTTP Request | |||
wn.provide('wn.request'); | |||
wn.request.url = 'index.cgi'; | |||
// call execute serverside request | |||
wn.request.prepare = function(opts) { | |||
// btn indicator | |||
if(opts.btn) $(opts.btn).set_working(); | |||
// navbar indicator | |||
if(opts.show_spinner) set_loading(); | |||
// freeze page | |||
if(opts.freeze) freeze(); | |||
// no cmd? | |||
if(!opts.args.cmd) { | |||
console.log(opts) | |||
throw "Incomplete Request"; | |||
} | |||
} | |||
wn.request.cleanup = function(opts, r) { | |||
// stop button indicator | |||
if(opts.btn) $(opts.btn).done_working(); | |||
// hide button indicator | |||
if(opts.show_spinner) hide_loading(); | |||
// un-freeze page | |||
if(opts.freeze) unfreeze(); | |||
// session expired? | |||
if(wn.boot.sid && wn.get_cookie('sid') != wn.boot.sid) { | |||
msgprint('Session expired'); | |||
setTimeout('redirect_to_login()', 3000); | |||
return; | |||
} | |||
// show messages | |||
if(r.server_messages) msgprint(r.server_messages) | |||
// show errors | |||
if(r.exc) { errprint(r.exc); console.log(r.exc); }; | |||
// sync docs | |||
if(r.docs) LocalDB.sync(r.docs); | |||
} | |||
wn.request.call = function(opts) { | |||
wn.request.prepare(opts); | |||
$.ajax({ | |||
url: opts.url || wn.request.url, | |||
data: opts.args, | |||
type: opts.type || 'POST', | |||
dataType: opts.dataType || 'json', | |||
success: function(r, xhr) { | |||
wn.request.cleanup(opts, r); | |||
opts.success(r, xhr.responseText); | |||
}, | |||
error: function(xhr, textStatus) { | |||
wn.request.cleanup(opts, {}); | |||
msgprint('Unable to complete request: ' + textStatus) | |||
if(opts.error)opts.error(xhr) | |||
} | |||
}) | |||
} | |||
// generic server call (call page, object) | |||
wn.call = function(opts) { | |||
var args = opts.args || {}; | |||
// cmd | |||
if(opts.module && opts.page) { | |||
args.cmd = module+'.page.'+page+'.'+page+'.'+method | |||
} else if(opts.method) { | |||
args.cmd = opts.method; | |||
} | |||
wn.request.call({ | |||
args: args, | |||
success: opts.callback, | |||
error: opts.error, | |||
btn: opts.btn, | |||
freeze: opts.freeze, | |||
show_spinner: !opts.no_spinner | |||
}); | |||
} |
@@ -56,7 +56,7 @@ wn.ui.Button = function(args) { | |||
if(me.btn.args.is_ajax) { | |||
$(me.btn).css('margin-right', '0px'); | |||
} | |||
wn.dom.show(me.loading_img, 'inline'); | |||
$(me.loading_img).css('display','inline'); | |||
}, | |||
done_working: function() { | |||
@@ -64,7 +64,7 @@ wn.ui.Button = function(args) { | |||
if(me.btn.args.is_ajax) { | |||
$(me.btn).css('margin-right', '24px'); | |||
} | |||
wn.dom.hide(me.loading_img); | |||
$(me.loading_img).toggle(false); | |||
} | |||
}); | |||
this.make(); | |||
@@ -1,66 +0,0 @@ | |||
// Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) | |||
// | |||
// MIT License (MIT) | |||
// | |||
// Permission is hereby granted, free of charge, to any person obtaining a | |||
// copy of this software and associated documentation files (the "Software"), | |||
// to deal in the Software without restriction, including without limitation | |||
// the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
// and/or sell copies of the Software, and to permit persons to whom the | |||
// Software is furnished to do so, subject to the following conditions: | |||
// | |||
// The above copyright notice and this permission notice shall be included in | |||
// all copies or substantial portions of the Software. | |||
// | |||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, | |||
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A | |||
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |||
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |||
// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | |||
// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
// | |||
wn.xmlhttp = { | |||
request: function() { | |||
if ( window.XMLHttpRequest ) // Gecko | |||
return new XMLHttpRequest() ; | |||
else if ( window.ActiveXObject ) // IE | |||
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) { | |||
// async by default | |||
if(async === null) async=true; | |||
var req = wn.xmlhttp.request(); | |||
// for async type | |||
req.onreadystatechange = function() { | |||
if (req.readyState==4) { | |||
wn.xmlhttp.complete(req, callback, url) | |||
} | |||
} | |||
// separator can be & or ? | |||
// based on if there are already arguments | |||
var sep = ((args && args.indexOf('?'))==-1) ? '?' : '&'; | |||
// add arguments to url | |||
var u = args ? (url + sep + args) : url; | |||
// call the server | |||
req.open('GET', u, async); | |||
req.send(null); | |||
// for sync | |||
if(!async) { | |||
wn.xmlhttp.complete(req, callback, url) | |||
} | |||
} | |||
} |
@@ -62,11 +62,6 @@ class HTTPRequest: | |||
webnotes.msgprint(webnotes.conn.get_global("__session_status_message")) | |||
raise webnotes.SessionStopped('Session Stopped') | |||
# write out cookies if sid is supplied (this is a pre-logged in redirect) | |||
if webnotes.form_dict.get('sid'): | |||
webnotes.cookie_manager.set_cookies() | |||
# run login triggers | |||
if webnotes.form_dict.get('cmd')=='login': | |||
webnotes.login_manager.run_trigger('on_login_post_session') | |||
@@ -74,6 +69,9 @@ class HTTPRequest: | |||
# load profile | |||
self.setup_profile() | |||
# write out cookies | |||
webnotes.cookie_manager.set_cookies() | |||
webnotes.conn.commit() | |||
# end transaction | |||
# ----------------------------- | |||
@@ -305,7 +303,6 @@ class CookieManager: | |||
# sid expires in 3 days | |||
import datetime | |||
expires = datetime.datetime.now() + datetime.timedelta(days=3) | |||
webnotes.cookies['sid']['expires'] = expires.strftime('%a, %d %b %Y %H:%M:%S') | |||
# Set Remember Me | |||
@@ -345,36 +342,19 @@ class Session: | |||
r = webnotes.conn.sql("""select user, sessiondata, status from | |||
tabSessions where sid='%s'""" % self.sid) | |||
if not r: | |||
# return guest record if present | |||
self.sid = 'Guest' | |||
r = webnotes.conn.sql("""select user, sessiondata, status from | |||
tabSessions where sid='%s'""" % self.sid) | |||
return r | |||
return r and r[0] or None | |||
def load(self): | |||
"""non-login request: load a session""" | |||
import webnotes | |||
r = self.get_session_record() | |||
if r: | |||
r=r[0] | |||
# ExipredSession | |||
if r[2]=='Expired' and (webnotes.form_dict.get('cmd')!='resume_session'): | |||
if r[0]=='Guest' or (not webnotes.form_dict.get('cmd')) or webnotes.form_dict.get('cmd')=='logout': | |||
self.start_as_guest() | |||
else: | |||
webnotes.response['session_status'] = 'Session Expired' | |||
raise Exception, 'Session Expired' | |||
elif r[2]=='Logged Out': | |||
self.start_as_guest() | |||
# allow refresh or logout | |||
if webnotes.form_dict.get('cmd') and webnotes.form_dict.get('cmd')!='logout': | |||
webnotes.response['session_status'] = 'Logged Out' | |||
raise Exception, 'Logged Out' | |||
else: | |||
self.data = {'data': (r[1] and eval(r[1]) or {}), | |||
self.data = {'data': (r[1] and eval(r[1]) or {}), | |||
'user':r[0], 'sid': self.sid} | |||
else: | |||
self.start_as_guest() | |||
@@ -384,9 +364,8 @@ class Session: | |||
webnotes.login_manager.login_as_guest() | |||
self.start() | |||
# start a session | |||
# --------------- | |||
def start(self): | |||
"""start a new session""" | |||
import os | |||
import webnotes | |||
import webnotes.utils | |||
@@ -417,33 +396,13 @@ class Session: | |||
raise e | |||
# update profile | |||
webnotes.conn.sql("UPDATE tabProfile SET last_login = '%s', last_ip = '%s' where name='%s'" % (webnotes.utils.now(), webnotes.remote_ip, self.data['user'])) | |||
webnotes.conn.sql("""UPDATE tabProfile SET last_login = '%s', last_ip = '%s' | |||
where name='%s'""" % (webnotes.utils.now(), webnotes.remote_ip, self.data['user'])) | |||
# set cookies to write | |||
webnotes.session = self.data | |||
webnotes.cookie_manager.set_cookies() | |||
# resume session | |||
# -------------- | |||
def resume(self): | |||
pwd = webnotes.form_dict.get('pwd') | |||
webnotes.login_manager.authenticate(self.data['user'], pwd) | |||
webnotes.conn.sql("update tabSessions set status='Active' where sid=%s", self.data['sid']) | |||
return 'Logged In' | |||
# update session | |||
# -------------- | |||
def update(self): | |||
# update session | |||
if webnotes.session['user'] != 'Guest': | |||
webnotes.conn.sql("""update tabSessions set sessiondata=%s, user=%s, lastupdate=NOW() | |||
where sid=%s""" , (str(self.data['data']), self.data['user'], self.data['sid'])) | |||
self.check_expired() | |||
# check expired | |||
# ------------- | |||
def check_expired(self): | |||
"""expire non-guest sessions""" | |||
exp_sec = webnotes.conn.get_value('Control Panel', None, 'session_expiry') or '6:00:00' | |||
@@ -460,8 +419,6 @@ class Session: | |||
webnotes.conn.sql("""delete from tabSessions where TIMEDIFF(NOW(), lastupdate) | |||
> '72:00:00' and sid!='Guest'""") | |||
# Get IP Info from ipinfodb.com | |||
# ----------------------------- | |||
def get_ipinfo(self): | |||
import os | |||
@@ -473,7 +430,9 @@ class Session: | |||
gi = pygeoip.GeoIP('data/GeoIP.dat') | |||
self.data['data']['ipinfo'] = {'countryName': gi.country_name_by_addr(os.environ.get('REMOTE_ADDR'))} | |||
# ----------------------------- | |||
def insert_session_record(self): | |||
webnotes.conn.sql("insert into tabSessions (sessiondata, user, lastupdate, sid, status) values (%s , %s, NOW(), %s, 'Active')", (str(self.data['data']), self.data['user'], self.data['sid'])) | |||
webnotes.conn.sql("""insert into tabSessions | |||
(sessiondata, user, lastupdate, sid, status) | |||
values (%s , %s, NOW(), %s, 'Active')""", | |||
(str(self.data['data']), self.data['user'], self.data['sid'])) | |||
@@ -52,6 +52,7 @@ def get_bootinfo(): | |||
import webnotes.widgets.menus | |||
bootinfo['dt_labels'] = get_dt_labels() | |||
bootinfo['user_info'] = get_fullnames() | |||
bootinfo['sid'] = webnotes.session['sid']; | |||
# home page | |||
get_home_page(bootinfo, doclist) | |||