Merge branch 'latest' of github.com:webnotes/wnframework into latest

This commit is contained in:
Rushabh Mehta 2012-01-30 08:11:05 +01:00
commit 066c8bd0e4
36 changed files with 362 additions and 426 deletions

View file

@ -11,8 +11,6 @@ body {
color: #000;
}
input, select, button { font-size: 12px; font-family: Arial, Helvetica, Sans; }
h1, h2, h3, h4, h5 {
font-family: Tahoma, Sans;
font-weight: normal;
@ -28,15 +26,27 @@ pre { margin: 0px; padding: 0px; }
button { margin: 2px; margin-left: 0px; }
label {
padding-top: 15px;
color: #404040;
}
select, input, textarea {
border: 1px solid #AAA;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
font-size: 13px
padding: 2px;
font-size: 13px;
padding: 4px;
color: #222;
}
textarea { font-family: arial, helvetica, sans serif; height: 120px; width: 90%; overflow-x: auto; font-size: 12px; }
textarea {
font-family: inherit;
height: 120px;
width: 90%;
font-size: 12px;
white-space: normal;
}
table { padding: 0px; border-collapse: 'collapse'}
@ -59,6 +69,7 @@ div#body_div {
position: relative;
display: none;
margin-top: 56px;
padding-right: 7px;
}
div.no_script {

View file

@ -196,4 +196,5 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
-moz-opacity: 0.4;
opacity: 0.4;
cursor: pointer;
font-weight: bold;
}

View file

@ -15,8 +15,6 @@ body {
color: #000;
}
input, select, button { font-size: 12px; font-family: Arial, Helvetica, Sans; }
h1, h2, h3, h4, h5 {
font-family: Tahoma, Sans;
font-weight: normal;
@ -32,15 +30,27 @@ pre { margin: 0px; padding: 0px; }
button { margin: 2px; margin-left: 0px; }
label {
padding-top: 15px;
color: #404040;
}
select, input, textarea {
border: 1px solid #AAA;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
font-size: 13px
padding: 2px;
font-size: 13px;
padding: 4px;
color: #222;
}
textarea { font-family: arial, helvetica, sans serif; height: 120px; width: 90%; overflow-x: auto; font-size: 12px; }
textarea {
font-family: inherit;
height: 120px;
width: 90%;
font-size: 12px;
white-space: normal;
}
table { padding: 0px; border-collapse: 'collapse'}
@ -63,6 +73,7 @@ div#body_div {
position: relative;
display: none;
margin-top: 56px;
padding-right: 7px;
}
div.no_script {
@ -430,10 +441,9 @@ div.time_field select{
.datainputcell { padding: 2px 0px; }
.field_description {
.field_description, .help {
margin: 3px 0px 11px 0px;
color: #888;
font-size: 12px;
font-style: italic;
}
@ -1182,11 +1192,12 @@ div.dialog_body {
}
div.dialog_back {
position: absolute;
position: fixed;
display: none;
top: 0px;
left: 0px;
width: 100%;
bottom: 0px;
right: 0px;
background-color: #EEE;
opacity: 0.6;
z-index: 50;
@ -1824,4 +1835,5 @@ button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
-moz-opacity: 0.4;
opacity: 0.4;
cursor: pointer;
font-weight: bold;
}

View file

@ -31,11 +31,12 @@ div.dialog_body {
}
div.dialog_back {
position: absolute;
position: fixed;
display: none;
top: 0px;
left: 0px;
width: 100%;
bottom: 0px;
right: 0px;
background-color: #EEE;
opacity: 0.6;
z-index: 50;

View file

@ -142,10 +142,9 @@ div.time_field select{
.datainputcell { padding: 2px 0px; }
.field_description {
.field_description, .help {
margin: 3px 0px 11px 0px;
color: #888;
font-size: 12px;
font-style: italic;
}

View file

@ -176,8 +176,8 @@ _f.Frm.prototype.runscript=function(scriptname,callingfield,onrefresh){var me=th
onrefresh(r,rtxt);me.refresh_fields();me.refresh_dependency();if(callingfield)callingfield.input.done_working();});}}
_f.Frm.prototype.runclientscript=function(caller,cdt,cdn){var _dt=this.parent_doctype?this.parent_doctype:this.doctype;var _dn=this.parent_docname?this.parent_docname:this.docname;var doc=get_local(_dt,_dn);if(!cdt)cdt=this.doctype;if(!cdn)cdn=this.docname;var ret=null;try{if(this.cscript[caller])
ret=this.cscript[caller](doc,cdt,cdn);if(this.cscript['custom_'+caller])
ret+=this.cscript['custom_'+caller](doc,cdt,cdn);}catch(e){submit_error(e);}
if(caller&&caller.toLowerCase()=='setup'){var doctype=get_local('DocType',this.doctype);var cs=doctype.__js||(doctype.client_script_core+doctype.client_script);if(cs){try{var tmp=eval(cs);}catch(e){submit_error(e);}}
ret+=this.cscript['custom_'+caller](doc,cdt,cdn);}catch(e){console.log(e);}
if(caller&&caller.toLowerCase()=='setup'){var doctype=get_local('DocType',this.doctype);var cs=doctype.__js||(doctype.client_script_core+doctype.client_script);if(cs){try{var tmp=eval(cs);}catch(e){console.log(e);}}
if(doctype.__css)set_style(doctype.__css)
if(doctype.client_string){this.cstring={};var elist=doctype.client_string.split('---');for(var i=1;i<elist.length;i=i+2){this.cstring[strip(elist[i])]=elist[i+1];}}}
return ret;}
@ -261,7 +261,7 @@ if(this.df['default'].toLowerCase()=='no add rows'){this.grid.can_add_rows=false
if(this.old_status!=st){if(st=='Write'){this.grid.show();}else if(st=='Read'){this.grid.show();}else{this.grid.hide();}
this.old_status=st;}
this.grid.refresh();}
_f.TableField.prototype.set=function(v){};_f.TableField.prototype.set_input=function(v){};_f.CodeField=function(){};_f.CodeField.prototype=new Field();_f.CodeField.prototype.make_input=function(){var me=this;this.label_span.innerHTML=this.df.label;this.input=$a(this.input_area,'textarea','code_text',{fontSize:'12px'});this.myid=wn.dom.set_unique_id(this.input);this.input.setAttribute('wrap','off');this.input.set_input=function(v){if(me.editor){me.editor.setContent(v);}else{me.input.value=v;me.input.innerHTML=v;}}
_f.TableField.prototype.set=function(v){};_f.TableField.prototype.set_input=function(v){};_f.CodeField=function(){};_f.CodeField.prototype=new Field();_f.CodeField.prototype.make_input=function(){var me=this;this.label_span.innerHTML=this.df.label;this.input=$a(this.input_area,'textarea','code_text',{fontSize:'12px'});this.myid=wn.dom.set_unique_id(this.input);this.input.set_input=function(v){if(me.editor){me.editor.setContent(v);}else{me.input.value=v;me.input.innerHTML=v;}}
this.input.onchange=function(){if(me.editor){}else{me.set(me.input.value);}
me.run_trigger();}
this.get_value=function(){if(me.editor){return me.editor.getContent();}else{return this.input.value;}}
@ -570,4 +570,4 @@ this.refresh();},refresh:function(){var me=this;$c('webnotes.widgets.form.assign
for(var i=0;i<d.length;i++){$(this.body).append(repl('<div>%(owner)s \
<a class="close" href="#" data-owner="%(owner)s">&#215</a></div>',d[i]))}
$(this.body).find('a.close').click(function(){$c('webnotes.widgets.form.assign_to.remove',{doctype:me.doctype,name:me.name,assign_to:$(this).attr('data-owner')},function(r,rt){me.render(r.message);});return false;});},add:function(){var me=this;if(!me.dialog){me.dialog=new wn.widgets.Dialog({title:'Add to To Do',width:350,fields:[{fieldtype:'Link',fieldname:'assign_to',options:'Profile',label:'Assign To',description:'Add to To Do List of',reqd:true},{fieldtype:'Data',fieldname:'description',label:'Comment','default':'Assigned by '+user},{fieldtype:'Date',fieldname:'date',label:'Complete By'},{fieldtype:'Select',fieldname:'priority',label:'Priority',options:'Low\nMedium\nHigh','default':'Medium'},{fieldtype:'Button',label:'Add',fieldname:'add_btn'}]});me.dialog.fields_dict.add_btn.input.onclick=function(){var assign_to=me.dialog.fields_dict.assign_to.get_value();if(assign_to){$c('webnotes.widgets.form.assign_to.add',{doctype:me.doctype,name:me.name,assign_to:assign_to,description:me.dialog.fields_dict.description.get_value(),priority:me.dialog.fields_dict.priority.get_value(),date:me.dialog.fields_dict.date.get_value()},function(r,rt){me.render(r.message);});}}}
me.dialog.clear();me.dialog.show();}});
me.dialog.clear();me.dialog.show();}});

View file

@ -220,47 +220,51 @@ wn.datetime.time_to_hhmm = function(hh,mm,am) {
return hh + ':' + mm;
}
// when
/*
* JavaScript Pretty Date
* Copyright (c) 2011 John Resig (ejohn.org)
* Licensed under the MIT and GPL licenses.
*/
wn.datetime.comment_when = function(dt, only_days) {
if(only_days) {
var cdate = dateutil.str_to_obj(dt.split(' ')[0]);
var diff = (new Date() - cdate) / 1000;
if(diff < 604800) {
var t = Math.floor(diff/86400);
if(t==0) return "Today";
if(t==1) return "Yesterday";
return t + " days ago"
} else {
return cdate.getDate() + " " + month_list[cdate.getMonth()] + " " + cdate.getFullYear();
}
} else {
var cdate = dateutil.str_to_obj(dt);
var diff = (new Date() - cdate) / 1000;
if(diff < 60) {
return "Few moments ago"
} else if(diff < 3600) {
var t = Math.floor(diff/60);
return t + " minute" + (t==1?"":"s") + " ago"
} else if(diff < 86400) {
var t = Math.floor(diff/3600);
return t + " hour" + (t==1?"":"s") + " ago"
} else if(diff < 604800) {
var t = Math.floor(diff/86400);
return t + " day" + (t==1?"":"s") + " ago"
} else {
return cdate.getDate() + " " + month_list[cdate.getMonth()] + " " + cdate.getFullYear();
}
}
// Takes an ISO time and returns a string representing how
// long ago the date represents.
function prettyDate(time){
if(!time) return ''
var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")),
diff = (((new Date()).getTime() - date.getTime()) / 1000),
day_diff = Math.floor(diff / 86400);
if ( isNaN(day_diff) || day_diff < 0 )
return '';
return day_diff == 0 && (
diff < 60 && "just now" ||
diff < 120 && "1 minute ago" ||
diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
diff < 7200 && "1 hour ago" ||
diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
day_diff == 1 && "Yesterday" ||
day_diff < 7 && day_diff + " days ago" ||
day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" ||
day_diff < 365 && Math.ceil( day_diff / 30) + " months ago" ||
"more than " + Math.floor( day_diff / 365 ) + " year(s) ago";
}
// If jQuery is included in the page, adds a jQuery plugin to handle it as well
if ( typeof jQuery != "undefined" )
jQuery.fn.prettyDate = function(){
return this.each(function(){
var date = prettyDate(this.title);
if ( date )
jQuery(this).text( date );
});
};
var comment_when = prettyDate;
// globals (deprecate)
var date = dateutil = wn.datetime;
var get_today = wn.datetime.get_today
var comment_when = wn.datetime.comment_when;
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;

View file

@ -106,20 +106,26 @@ $item_selected = function(ele) {
}
$item_pressed = function(ele) {
$bg(ele,'#F90'); $fg(ele,'#FFF');
}
$item_set_working = function(ele) {
if(ele.loading_img) {
$di(ele.loading_img)
} else {
ele.disabled = 1;
ele.loading_img = $a(ele.parentNode,'img','',{marginLeft:'4px',marginBottom:'-2px',display:'inline'});
ele.loading_img.src = 'lib/images/ui/button-load.gif';
};
(function($) {
$.fn.set_working = function() {
var ele = this.get(0);
if(ele.loading_img) {
$di(ele.loading_img)
} else {
ele.disabled = 1;
ele.loading_img = $a(ele.parentNode,'img','',
{marginLeft:'4px',marginBottom:'-2px',display:'inline'});
ele.loading_img.src = 'lib/images/ui/button-load.gif';
}
}
}
$item_done_working = function(ele) {
ele.disabled = 0;
if(ele.loading_img) { $dh(ele.loading_img) };
}
$.fn.done_working = function() {
var ele = this.get(0);
ele.disabled = 0;
if(ele.loading_img) { $dh(ele.loading_img) };
}
})(jQuery);
// set out of 100
function set_opacity(ele, ieop) {

View file

@ -33,11 +33,13 @@ function newHttpReq() {
}
// call execute serverside request
function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) {
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(!no_spinner)hide_loading(); // Loaded
if(btn)$(btn).done_working();
if(!no_spinner)
hide_loading(); // Loaded
var rtxt = req.responseText;
@ -61,6 +63,7 @@ function $c(command, args, fn, on_timeout, no_spinner, freeze_msg) {
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");
@ -103,22 +106,37 @@ function validate_session(r,rt) {
}
// For calling an object
function $c_obj(doclist, method, arg, call_back, no_spinner, freeze_msg) {
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);
$c('runserverobj',args, call_back, null, no_spinner, freeze_msg, btn);
}
// For call a page metho
function $c_page(module, page, method, arg, call_back, no_spinner, freeze_msg) {
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);
$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.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, args.no_spinner, false, args.btn);
}
}
// For calling an for output as csv
function $c_obj_csv(doclist, method, arg) {
// single
@ -138,12 +156,6 @@ function $c_obj_csv(doclist, method, arg) {
open_url_post(outUrl, args);
}
// For loading a matplotlib Plot
function $c_graph(img, control_dt, method, arg) {
img.src = outUrl + '?' + makeArgString({cmd:'get_graph', dt:control_dt, method:method, arg:arg});
}
function my_eval(co) {
var w = window;
@ -159,93 +171,6 @@ function my_eval(co) {
}
}
// For loading javascript file on demand using AJAX
function $c_js(fn, callback) {
var req=newHttpReq();
ret_fn=function() {
if (checkResponse(req, function() { }, 1, null)) {
if(req.responseText.substr(0,9)=='Not Found') {
alert(req.responseText);
return;
}
hide_loading();
my_eval(req.responseText);
callback();
}
}
req.onreadystatechange=ret_fn;
req.open("POST",'cgi-bin/getjsfile.cgi',true);
req.setRequestHeader("ENCTYPE", "multipart/form-data");
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
req.send(makeArgString({filename:fn}));
set_loading();
}
var load_queue = {};
var currently_loading = {};
var widgets = {};
var single_widgets = {};
// load a widget on demand
// --------------------------------------------------------------
function new_widget(widget, callback, single_type) {
var namespace = '';
var widget_name = widget;
if(widget.search(/\./) != -1) {
namespace = widget.split('.')[0];
widget_name = widget.split('.')[1];
}
var widget_loaded = function() {
currently_loading[widget] = 0;
for(var i in load_queue[widget]) {
// callback
load_queue[widget][i](create_widget());
}
// clear the queue
load_queue[widget] = [];
}
var create_widget = function() {
if(single_type && single_widgets[widget_name])
return null;
if(namespace)
var w = new window[namespace][widget_name]();
else
var w = new window[widget_name]();
// add to singles
if(single_type)
single_widgets[widget_name] = w;
return w;
}
if(namespace ? window[namespace][widget_name] : window[widget_name]) {
// loaded?
callback(create_widget());
} else {
// loading in process
if(!load_queue[widget]) load_queue[widget] = [];
load_queue[widget].push(callback);
// load only if not currently loading
if(!currently_loading[widget]) {
$c_js(widget_files[widget], widget_loaded);
}
// flag it as loading
currently_loading[widget] = 1;
}
}
function makeArgString(dict) {
var varList = [];
@ -273,100 +198,4 @@ function open_url_post(URL, PARAMS, new_window) {
document.body.appendChild(temp);
temp.submit();
return temp;
}
// Resume sessions
var resume_dialog = null;
function resume_session() {
if(!resume_dialog) {
var d = new Dialog(400,200,'Session Expired');
d.make_body([
['Password','password','Re-enter your password to resume the session'], ['Button','Go']]);
// check password
d.widgets['Go'].onclick = function() {
resume_dialog.widgets['Go'].set_working();
var callback = function(r, rt) {
resume_dialog.widgets['Go'].done_working();
if(r.message == 'Logged In') {
// okay
resume_dialog.allow_close=1;
resume_dialog.hide();
setTimeout('resume_dialog.allow_close=0',100);
} else {
// wrong password
msgprint('Wrong Password, try again');
resume_dialog.wrong_count++;
if(resume_dialog.wrong_count > 2) logout();
}
}
$c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback)
}
d.onhide = function() {
if(!resume_dialog.allow_close) logout();
}
resume_dialog = d;
}
resume_dialog.wrong_count = 0;
resume_dialog.show();
}
/**
* require is used for on demand loading of JavaScript
*
* require r1 // 2008.02.05 // jQuery 1.2.2
*
* // basic usage (just like .accordion)
* $.require("comp1.js");
*
* @param jsFiles string array or string holding the js file names to load
* @param params object holding parameter like browserType, callback, cache
* @return The jQuery object
* @author Manish Shanker
*/
(function($){
$.require = function(jsFiles, params) {
var params = params || {};
var bType = params.browserType===false?false:true;
if (!bType){
return $;
}
var cBack = params.callBack || function(){};
var eCache = params.cache===false?false:true;
if (!$.require.loadedLib) $.require.loadedLib = {};
if ( !$.scriptPath ) {
var path = $('script').attr('src');
$.scriptPath = path.replace(/\w+\.js$/, '');
}
if (typeof jsFiles === "string") {
jsFiles = new Array(jsFiles);
}
for (var n=0; n< jsFiles.length; n++) {
if (!$.require.loadedLib[jsFiles[n]]) {
$.ajax({
type: "GET",
url: $.scriptPath + jsFiles[n],
success: cBack,
dataType: "script",
cache: eCache,
async: false
});
$.require.loadedLib[jsFiles[n]] = true;
}
}
//console.dir($.require.loadedLib);
return $;
};
})(jQuery);
}

View file

@ -7,15 +7,6 @@ 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 submit_error(e) {
if(isIE) {
var t = 'Explorer: ' + e + '\n' + e.description;
} else {
var t = 'Mozilla: ' + e.toString() + '\n' + e.message + '\nLine Number:' + e.lineNumber;// + '\nStack:' + e.stack;
}
errprint(e + '\nLine Number:' + e.lineNumber + '\nStack:' + e.stack);
}
function setup_err_console() {
err_console = new Dialog(640, 480, 'Error Console')
err_console.make_body([

View file

@ -9,9 +9,7 @@ function freeze(msg, do_freeze) {
dialog_back = $a($i('body_div'), 'div', 'dialog_back');
if(isIE) dialog_back.style['filter'] = 'alpha(opacity=60)';
}
$ds(dialog_back);
$y(dialog_back, {height: $(document).height() + 'px'});
fcount++;
frozen = 1;

View file

@ -144,7 +144,7 @@ function historyChange(newLocation) {
if(t[0]=='Form') {
_history_current = newLocation;
if(docname.substr(0, 3)=='New') {
if(docname.substr(0, 3)=='New' && !(locals[t[1]] && locals[t[1]][docname])) {
newdoc(t[1]);
} else {
loaddoc(t[1], docname);

View file

@ -212,7 +212,7 @@ function loadpage(page_name, call_back, no_history) {
try {
if(pscript['refresh_'+page_name]) pscript['refresh_'+page_name](); // onload
} catch(e) {
submit_error(e);
console.log(e);
}
}

View file

@ -9,12 +9,14 @@ function Page(page_name, content) {
this.onshow = function() {
// default set_title
set_title(me.doc.page_title ? me.doc.page_title : me.name);
set_title(me.doc.title ? me.doc.title : me.name);
// onshow
try {
if(pscript['onshow_'+me.name]) pscript['onshow_'+me.name](); // onload
} catch(e) { submit_error(e); }
if(pscript['onshow_'+me.name]) pscript['onshow_'+me.name](me.wrapper); // onload
} catch(e) {
console.log(e);
}
// clear cur_frm
cur_frm = null;
@ -42,12 +44,14 @@ function render_page(page_name, menuitem) {
}
var pdoc = locals['Page'][page_name];
// style
if(pdoc.style) set_style(pdoc.style)
// stylesheet
if(pdoc.stylesheet) { set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet); stylesheets.push(pdoc.stylesheet); }
if(pdoc.stylesheet) {
set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet);
stylesheets.push(pdoc.stylesheet);
}
// create page
var p = new Page(page_name, pdoc._Page__content?pdoc._Page__content:pdoc.content);
@ -64,10 +68,12 @@ function render_page(page_name, menuitem) {
// run onload
try {
if(pscript['onload_'+page_name]) pscript['onload_'+page_name](); // onload
} catch(e) { submit_error(e); }
if(pscript['onload_'+page_name])
pscript['onload_'+page_name](page_body.pages[page_name]); // onload
} catch(e) {
console.log(e);
}
//setTimeout('page_body.pages[cur_page].set_page_height()', 100);
return p;
}

View file

@ -853,7 +853,6 @@ TextField.prototype.make_input = function() {
return; // do nothing, text dialog will take over
this.input = $a(this.input_area, 'textarea');
this.input.wrap = 'off';
if(this.df.fieldtype=='Small Text')
this.input.style.height = "80px";
this.input.set_input = function(v) {

View file

@ -979,7 +979,7 @@ _f.Frm.prototype.runclientscript = function(caller, cdt, cdn) {
if(this.cscript['custom_'+caller])
ret += this.cscript['custom_'+caller](doc, cdt, cdn);
} catch(e) {
submit_error(e);
console.log(e);
}
if(caller && caller.toLowerCase()=='setup') {
@ -992,7 +992,7 @@ _f.Frm.prototype.runclientscript = function(caller, cdt, cdn) {
try {
var tmp = eval(cs);
} catch(e) {
submit_error(e);
console.log(e);
}
}

View file

@ -335,7 +335,6 @@ _f.CodeField.prototype.make_input = function() {
this.input = $a(this.input_area, 'textarea','code_text',{fontSize:'12px'});
this.myid = wn.dom.set_unique_id(this.input);
this.input.setAttribute('wrap', 'off');
this.input.set_input = function(v) {
if(me.editor) {
me.editor.setContent(v);

View file

@ -2,6 +2,19 @@
// uses FieldGroup for rendering filters
// removed rarely used functionality
//
// opts:
// parent
// query or get_query
// query_max
// no_result_message ("No result")
// page_length (20)
// filters ([{docfield}, ..])
// hide_refresh (False)
// new_doctype
// [function] render_row(parent, data)
// [function] onrun
// no_loading (no ajax indicator)
wn.widgets.Listing = function(opts) {
this.opts = opts;
@ -63,7 +76,7 @@ wn.widgets.Listing = function(opts) {
// make more button
// that shows more results when they are displayed
this.make_more_button = function() {
this.more_btn = $btn(this.more_button_area, 'Show more results...',
this.more_btn = $btn(this.more_button_area, 'More...',
function() {
me.more_btn.set_working();
me.run(function() {
@ -137,14 +150,13 @@ wn.widgets.Listing = function(opts) {
this.start = 0;
// load query
this.query = this.opts.get_query();
this.query = this.opts.get_query ? this.opts.get_query() : this.opts.query;
this.add_limits();
args={ query_max: this.query_max ? this.query_max : '' }
args={ query_max: this.query_max || this.opts.query_max || '' }
args.simple_query = this.query;
if(this.opts.as_dict) args.as_dict = 1;
if(this.opts.formatted) args.formatted = 1;
args.as_dict = 1;
// show loading
if(this.loading_img) $di(this.loading_img);
@ -152,6 +164,8 @@ wn.widgets.Listing = function(opts) {
function(r, rt) { me.make_results(r, rt) }, null, this.opts.no_loading);
}
this.refresh = this.run;
this.add_limits = function() {
this.query += ' LIMIT ' + this.start + ',' + (this.page_length+1);
}

View file

@ -117,9 +117,13 @@ if(t.length!=2){show_alert('[set_time] Incorect time format');return;}
if(cint(t[0])==0)var ret=['12',t[1],'AM'];else if(cint(t[0])<12)var ret=[cint(t[0])+'',t[1],'AM'];else if(cint(t[0])==12)var ret=['12',t[1],'PM'];else var ret=[(cint(t[0])-12)+'',t[1],'PM'];return ret;}
wn.datetime.time_to_hhmm=function(hh,mm,am){if(am=='AM'&&hh=='12'){hh='00';}else if(am=='PM'&&hh!='12'){hh=cint(hh)+12;}
return hh+':'+mm;}
wn.datetime.comment_when=function(dt,only_days){if(only_days){var cdate=dateutil.str_to_obj(dt.split(' ')[0]);var diff=(new Date()-cdate)/1000;if(diff<604800){var t=Math.floor(diff/86400);if(t==0)return"Today";if(t==1)return"Yesterday";return t+" days ago"}else{return cdate.getDate()+" "+month_list[cdate.getMonth()]+" "+cdate.getFullYear();}}else{var cdate=dateutil.str_to_obj(dt);var diff=(new Date()-cdate)/1000;if(diff<60){return"Few moments ago"}else if(diff<3600){var t=Math.floor(diff/60);return t+" minute"+(t==1?"":"s")+" ago"}else if(diff<86400){var t=Math.floor(diff/3600);return t+" hour"+(t==1?"":"s")+" ago"}else if(diff<604800){var t=Math.floor(diff/86400);return t+" day"+(t==1?"":"s")+" ago"}else{return cdate.getDate()+" "+month_list[cdate.getMonth()]+" "+cdate.getFullYear();}}}
var date=dateutil=wn.datetime;var get_today=wn.datetime.get_today
var comment_when=wn.datetime.comment_when;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;
function prettyDate(time){if(!time)return''
var date=new Date((time||"").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/,"")),diff=(((new Date()).getTime()-date.getTime())/1000),day_diff=Math.floor(diff/86400);if(isNaN(day_diff)||day_diff<0)
return'';return day_diff==0&&(diff<60&&"just now"||diff<120&&"1 minute ago"||diff<3600&&Math.floor(diff/60)+" minutes ago"||diff<7200&&"1 hour ago"||diff<86400&&Math.floor(diff/3600)+" hours ago")||day_diff==1&&"Yesterday"||day_diff<7&&day_diff+" days ago"||day_diff<31&&Math.ceil(day_diff/7)+" weeks ago"||day_diff<365&&Math.ceil(day_diff/30)+" months ago"||"more than "+Math.floor(day_diff/365)+" year(s) ago";}
if(typeof jQuery!="undefined")
jQuery.fn.prettyDate=function(){return this.each(function(){var date=prettyDate(this.title);if(date)
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
*/
@ -137,10 +141,8 @@ function addEvent(ev,fn){if(isIE){document.attachEvent('on'+ev,function(){fn(win
$item_normal=function(ele){$y(ele,{padding:'6px 8px',cursor:'pointer',marginRight:'8px',whiteSpace:'nowrap',overflow:'hidden',borderBottom:'1px solid #DDD'});$bg(ele,'#FFF');$fg(ele,'#000');}
$item_active=function(ele){$bg(ele,'#FE8');$fg(ele,'#000');}
$item_selected=function(ele){$bg(ele,'#777');$fg(ele,'#FFF');}
$item_pressed=function(ele){$bg(ele,'#F90');$fg(ele,'#FFF');}
$item_set_working=function(ele){if(ele.loading_img){$di(ele.loading_img)}else{ele.disabled=1;ele.loading_img=$a(ele.parentNode,'img','',{marginLeft:'4px',marginBottom:'-2px',display:'inline'});ele.loading_img.src='lib/images/ui/button-load.gif';}}
$item_done_working=function(ele){ele.disabled=0;if(ele.loading_img){$dh(ele.loading_img)};}
function set_opacity(ele,ieop){var op=ieop/100;if(ele.filters){try{ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity=ieop;}catch(e){ele.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';}}else{ele.style.opacity=op;}}
$item_pressed=function(ele){$bg(ele,'#F90');$fg(ele,'#FFF');};(function($){$.fn.set_working=function(){var ele=this.get(0);if(ele.loading_img){$di(ele.loading_img)}else{ele.disabled=1;ele.loading_img=$a(ele.parentNode,'img','',{marginLeft:'4px',marginBottom:'-2px',display:'inline'});ele.loading_img.src='lib/images/ui/button-load.gif';}}
$.fn.done_working=function(){var ele=this.get(0);ele.disabled=0;if(ele.loading_img){$dh(ele.loading_img)};}})(jQuery);function set_opacity(ele,ieop){var op=ieop/100;if(ele.filters){try{ele.filters.item("DXImageTransform.Microsoft.Alpha").opacity=ieop;}catch(e){ele.style.filter='progid:DXImageTransform.Microsoft.Alpha(opacity='+ieop+')';}}else{ele.style.opacity=op;}}
function set_gradient(ele,from,to){var no_gradient=0;if(isIE)no_gradient=1;if(isFF&&ffversion<3.6)no_gradient=1;if(no_gradient){var rgb_from=get_rgb(from.substr(1));var rgb_to=get_rgb(to.substr(1));$y(ele,{backgroundColor:'#'
+d2h(rgb_to[0]+(rgb_from[0]-rgb_to[0])/2)
+d2h(rgb_to[1]+(rgb_from[1]-rgb_to[1])/2)
@ -242,54 +244,32 @@ unfreeze();return false;}}
var pending_req=0;function newHttpReq(){if(!isIE)
var r=new XMLHttpRequest();else if(window.ActiveXObject)
var r=new ActiveXObject("Microsoft.XMLHTTP");return r;}
function $c(command,args,fn,on_timeout,no_spinner,freeze_msg){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,on_timeout,no_spinner,freeze_msg)){if(!no_spinner)hide_loading();var rtxt=req.responseText;try{var r=JSON.parse(rtxt);}catch(e){alert('Handler Exception:'+rtxt);return;}
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();var rtxt=req.responseText;try{var r=JSON.parse(rtxt);}catch(e){alert('Handler Exception:'+rtxt);return;}
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);}}
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();if(freeze_msg)freeze(freeze_msg,1);}
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();if(freeze_msg)freeze(freeze_msg,1);}
function validate_session(r,rt){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;}
if(r.exc&&r.session_status=='Session Expired'){resume_session();return;}
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_obj(doclist,method,arg,call_back,no_spinner,freeze_msg){var args={'method':method,'arg':(typeof arg=='string'?arg:JSON.stringify(arg))}
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)
$c('runserverobj',args,call_back,null,no_spinner,freeze_msg);}
function $c_page(module,page,method,arg,call_back,no_spinner,freeze_msg){if(arg&&!arg.substr)arg=JSON.stringify(arg);$c(module+'.page.'+page+'.'+page+'.'+method,{'arg':arg},call_back,null,no_spinner,freeze_msg);}
$c('runserverobj',args,call_back,null,no_spinner,freeze_msg,btn);}
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);}
wn.call=function(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,args.no_spinner,false,args.btn);}}
function $c_obj_csv(doclist,method,arg){var args={}
args.cmd='runserverobj';args.as_csv=1;args.method=method;args.arg=arg;if(doclist.substr)
args.doctype=doclist;else
args.docs=compress_doclist(doclist);open_url_post(outUrl,args);}
function $c_graph(img,control_dt,method,arg){img.src=outUrl+'?'+makeArgString({cmd:'get_graph',dt:control_dt,method:method,arg:arg});}
function my_eval(co){var w=window;if(!w.execScript){if(/Gecko/.test(navigator.userAgent)){eval(co,w);}else{eval.call(w,co);}}else{w.execScript(co);}}
function $c_js(fn,callback){var req=newHttpReq();ret_fn=function(){if(checkResponse(req,function(){},1,null)){if(req.responseText.substr(0,9)=='Not Found'){alert(req.responseText);return;}
hide_loading();my_eval(req.responseText);callback();}}
req.onreadystatechange=ret_fn;req.open("POST",'cgi-bin/getjsfile.cgi',true);req.setRequestHeader("ENCTYPE","multipart/form-data");req.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");req.send(makeArgString({filename:fn}));set_loading();}
var load_queue={};var currently_loading={};var widgets={};var single_widgets={};function new_widget(widget,callback,single_type){var namespace='';var widget_name=widget;if(widget.search(/\./)!=-1){namespace=widget.split('.')[0];widget_name=widget.split('.')[1];}
var widget_loaded=function(){currently_loading[widget]=0;for(var i in load_queue[widget]){load_queue[widget][i](create_widget());}
load_queue[widget]=[];}
var create_widget=function(){if(single_type&&single_widgets[widget_name])
return null;if(namespace)
var w=new window[namespace][widget_name]();else
var w=new window[widget_name]();if(single_type)
single_widgets[widget_name]=w;return w;}
if(namespace?window[namespace][widget_name]:window[widget_name]){callback(create_widget());}else{if(!load_queue[widget])load_queue[widget]=[];load_queue[widget].push(callback);if(!currently_loading[widget]){$c_js(widget_files[widget],widget_loaded);}
currently_loading[widget]=1;}}
function makeArgString(dict){var varList=[];for(key in dict){varList[varList.length]=key+'='+encodeURIComponent(dict[key]);}
return varList.join('&');}
function open_url_post(URL,PARAMS,new_window){var temp=document.createElement("form");temp.action=URL;temp.method="POST";temp.style.display="none";if(new_window){temp.target='_blank';}
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;}
var resume_dialog=null;function resume_session(){if(!resume_dialog){var d=new Dialog(400,200,'Session Expired');d.make_body([['Password','password','Re-enter your password to resume the session'],['Button','Go']]);d.widgets['Go'].onclick=function(){resume_dialog.widgets['Go'].set_working();var callback=function(r,rt){resume_dialog.widgets['Go'].done_working();if(r.message=='Logged In'){resume_dialog.allow_close=1;resume_dialog.hide();setTimeout('resume_dialog.allow_close=0',100);}else{msgprint('Wrong Password, try again');resume_dialog.wrong_count++;if(resume_dialog.wrong_count>2)logout();}}
$c('resume_session',{pwd:resume_dialog.widgets['password'].value},callback)}
d.onhide=function(){if(!resume_dialog.allow_close)logout();}
resume_dialog=d;}
resume_dialog.wrong_count=0;resume_dialog.show();}
(function($){$.require=function(jsFiles,params){var params=params||{};var bType=params.browserType===false?false:true;if(!bType){return $;}
var cBack=params.callBack||function(){};var eCache=params.cache===false?false:true;if(!$.require.loadedLib)$.require.loadedLib={};if(!$.scriptPath){var path=$('script').attr('src');$.scriptPath=path.replace(/\w+\.js$/,'');}
if(typeof jsFiles==="string"){jsFiles=new Array(jsFiles);}
for(var n=0;n<jsFiles.length;n++){if(!$.require.loadedLib[jsFiles[n]]){$.ajax({type:"GET",url:$.scriptPath+jsFiles[n],success:cBack,dataType:"script",cache:eCache,async:false});$.require.loadedLib[jsFiles[n]]=true;}}
return $;};})(jQuery);
/*
* lib/js/legacy/utils/msgprint.js
*/
@ -492,7 +472,7 @@ this.make_filters=function(){if(this.opts.filters){$ds(this.filters_area);this.f
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();}
this.loading_img=$a(this.toolbar_area,'img','lib/images/ui/button-load.gif',{display:'none',marginLeft:'3px',marginBottom:'-2px'});}
if(this.opts.new_doctype){this.new_btn=$btn(this.toolbar_area,'New '+get_doctype_label(this.opts.new_doctype),function(){newdoc(me.opts.new_doctype,me.opts.new_doc_onload,me.opts.new_doc_indialog,me.opts.new_doc_onsave);},{marginLeft:'7px'});}}
this.make_more_button=function(){this.more_btn=$btn(this.more_button_area,'Show more results...',function(){me.more_btn.set_working();me.run(function(){me.more_btn.done_working();},1);},{fontSize:'14px'},0,1);$y(this.more_btn.loading_img,{marginBottom:'0px'});}
this.make_more_button=function(){this.more_btn=$btn(this.more_button_area,'More...',function(){me.more_btn.set_working();me.run(function(){me.more_btn.done_working();},1);},{fontSize:'14px'},0,1);$y(this.more_btn.loading_img,{marginBottom:'0px'});}
this.clear=function(){this.results_area.innerHTML='';this.table=null;$ds(this.results_area);$dh(this.no_results_area);}
this.make_results=function(r,rt){if(this.start==0)this.clear();$dh(this.more_button_area);if(this.loading_img)$dh(this.loading_img)
if(r.values&&r.values.length){this.values=r.values;var m=Math.min(r.values.length,this.page_length);for(var i=0;i<m;i++){var row=this.add_row();this.opts.render_row(row,r.values[i],this,i);}
@ -501,9 +481,9 @@ if(this.onrun)this.onrun();if(this.opts.onrun)this.opts.onrun();}
this.add_row=function(){return $a(this.results_area,'div','',(opts.cell_style?opts.cell_style:{padding:'3px'}));}
this.run=function(callback,append){if(callback)
this.onrun=callback;if(!append)
this.start=0;this.query=this.opts.get_query();this.add_limits();args={query_max:this.query_max?this.query_max:''}
args.simple_query=this.query;if(this.opts.as_dict)args.as_dict=1;if(this.opts.formatted)args.formatted=1;if(this.loading_img)$di(this.loading_img);$c('webnotes.widgets.query_builder.runquery',args,function(r,rt){me.make_results(r,rt)},null,this.opts.no_loading);}
this.add_limits=function(){this.query+=' LIMIT '+this.start+','+(this.page_length+1);}
this.start=0;this.query=this.opts.get_query?this.opts.get_query():this.opts.query;this.add_limits();args={query_max:this.query_max||this.opts.query_max||''}
args.simple_query=this.query;args.as_dict=1;if(this.loading_img)$di(this.loading_img);$c('webnotes.widgets.query_builder.runquery',args,function(r,rt){me.make_results(r,rt)},null,this.opts.no_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/tree.js
@ -704,7 +684,7 @@ function historyChange(newLocation){var t=nav_obj.get_page(newLocation)
for(var i=0;i<t.length;i++)
t[i]=decodeURIComponent(t[i]);if(nav_obj.ol.length){var c=nav_obj.ol[nav_obj.ol.length-1];if(t.length==2){if(c[0]==t[0]&&c[1]==t[1])return;}else{if(c[0]==t[0]&&c[1]==t[1]&&c[2]==t[2])return;}}
if(t[2])
var docname=history_get_name(t);if(t[0]=='Form'){_history_current=newLocation;if(docname.substr(0,3)=='New'){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);});
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
*/
@ -750,7 +730,7 @@ function hide_loading(){pending_req--;if(!pending_req){$('body').css('cursor','d
*/
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);$y(dialog_back,{height:$(document).height()+'px'});fcount++;frozen=1;}
$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;}}
/*
@ -758,8 +738,6 @@ $dh(dialog_message);if(!fcount)return;fcount--;if(!fcount){$dh(dialog_back);froz
*/
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 submit_error(e){if(isIE){var t='Explorer: '+e+'\n'+e.description;}else{var t='Mozilla: '+e.toString()+'\n'+e.message+'\nLine Number:'+e.lineNumber;}
errprint(e+'\nLine Number:'+e.lineNumber+'\nStack:'+e.stack);}
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]')
var call_back=function(r,rt){err_console.hide();msgprint("Error Report Sent")}
@ -799,7 +777,7 @@ var newdoc=new_doc;var pscript={};var cur_page;function loadpage(page_name,call_
page_name=home_page;var fn=function(r,rt){page_body.set_status('Done');if(page_body.pages[page_name]){var p=page_body.pages[page_name]
page_body.change_to(page_name);}else{var p=render_page(page_name);if(!p)return;}
cur_page=page_name;if(call_back)call_back();scroll(0,0);pscript.update_page_history(page_name,no_history)
try{if(pscript['refresh_'+page_name])pscript['refresh_'+page_name]();}catch(e){submit_error(e);}}
try{if(pscript['refresh_'+page_name])pscript['refresh_'+page_name]();}catch(e){console.log(e);}}
if(get_local('Page',page_name)||page_body.pages[page_name])
fn();else{args=get_url_dict();args.name=page_name;$c('webnotes.widgets.page.getpage',args,fn);}}
pscript.update_page_history=function(page_name,no_history){var arg=null;var t=null;if(window.location.hash){var t=nav_obj.get_page(window.location.hash)}else if(get_url_arg('page')){var t=nav_obj.get_page(get_url_arg('page'))}
@ -821,7 +799,7 @@ function upload_callback(id,fid){uploaders[id].callback(fid);}
* lib/js/legacy/webpage/page.js
*/
var pages=[];var stylesheets=[];function Page(page_name,content){var me=this;this.name=page_name;this.onshow=function(){set_title(me.doc.page_title?me.doc.page_title:me.name);try{if(pscript['onshow_'+me.name])pscript['onshow_'+me.name]();}catch(e){submit_error(e);}
var pages=[];var stylesheets=[];function Page(page_name,content){var me=this;this.name=page_name;this.onshow=function(){set_title(me.doc.title?me.doc.title:me.name);try{if(pscript['onshow_'+me.name])pscript['onshow_'+me.name](me.wrapper);}catch(e){console.log(e);}
cur_frm=null;}
this.wrapper=page_body.add_page(page_name,this.onshow);this.cont=this.wrapper
if(content)
@ -831,7 +809,8 @@ function render_page(page_name,menuitem){if(!page_name)return;if((!locals['Page'
var pdoc=locals['Page'][page_name];if(pdoc.style)set_style(pdoc.style)
if(pdoc.stylesheet){set_style(locals.Stylesheet[pdoc.stylesheet].stylesheet);stylesheets.push(pdoc.stylesheet);}
var p=new Page(page_name,pdoc._Page__content?pdoc._Page__content:pdoc.content);var script=pdoc.__script?pdoc.__script:pdoc.script;p.doc=pdoc;if(script){eval(script);}
page_body.change_to(page_name);try{if(pscript['onload_'+page_name])pscript['onload_'+page_name]();}catch(e){submit_error(e);}
page_body.change_to(page_name);try{if(pscript['onload_'+page_name])
pscript['onload_'+page_name](page_body.pages[page_name]);}catch(e){console.log(e);}
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);}

39
js/lib/prettydate.js Normal file
View file

@ -0,0 +1,39 @@
/*
* JavaScript Pretty Date
* Copyright (c) 2011 John Resig (ejohn.org)
* Licensed under the MIT and GPL licenses.
*/
// Takes an ISO time and returns a string representing how
// long ago the date represents.
function prettyDate(time){
if(!time) return ''
var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ").replace(/\.[0-9]*/, "")),
diff = (((new Date()).getTime() - date.getTime()) / 1000),
day_diff = Math.floor(diff / 86400);
if ( isNaN(day_diff) || day_diff < 0 )
return '';
return day_diff == 0 && (
diff < 60 && "just now" ||
diff < 120 && "1 minute ago" ||
diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
diff < 7200 && "1 hour ago" ||
diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
day_diff == 1 && "Yesterday" ||
day_diff < 7 && day_diff + " days ago" ||
day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago" ||
day_diff < 365 && Math.ceil( day_diff / 30) + " months ago" ||
"more than " + Math.floor( day_diff / 365 ) + " year(s) ago";
}
// If jQuery is included in the page, adds a jQuery plugin to handle it as well
if ( typeof jQuery != "undefined" )
jQuery.fn.prettyDate = function(){
return this.each(function(){
var date = prettyDate(this.title);
if ( date )
jQuery(this).text( date );
});
};

View file

@ -63,7 +63,7 @@
*/
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.hide();me.opts.execute($(this).val());});},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++)
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

View file

@ -37,9 +37,14 @@ wn.ui.toolbar.SelectorDialog = Class.extend({
// on change
$(this.dialog.fields_dict.doctype.input).change(function() {
me.dialog.hide();
me.opts.execute($(this).val());
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();

View file

@ -38,10 +38,17 @@ class DocType:
'default',
'name'
]
self.set_true_doctype()
def set_true_doctype(self):
"""
Sets a value of self.true_doctype as the actual doctype and not its label
"""
if self.doc.doc_type:
from webnotes.utils import get_label_doctype
self.true_doctype = get_label_doctype(self.doc.doc_type)
else: self.true_doctype = None
def get(self):
@ -51,6 +58,7 @@ class DocType:
self.clear()
if self.doc.doc_type:
if not self.true_doctype: self.set_true_doctype()
from webnotes.model.doc import addchild
for d in self.get_ref_doclist():
@ -133,16 +141,6 @@ class DocType:
self.set_properties(diff_list)
#webnotes.msgprint('End of Post')
#webnotes.msgprint('this doc')
#webnotes.msgprint([[d.name, d.idx, 'label' in d.fields and d.label or None] for d in this_doclist])
#webnotes.msgprint('ref doc')
#webnotes.msgprint([[d.name, d.idx, 'label' in d.fields and d.label or None] for d in ref_doclist])
#webnotes.msgprint('def doc')
#webnotes.msgprint([[d.name, d.idx, 'label' in d.fields and d.label or None] for d in dt_doclist])
#webnotes.msgprint([[d.fields['property'], d.fields['value'], d.fields['doc_name'], d.fields['select_item'], 'delete' in d.fields and d.fields['delete'] or None] for d in diff_list])
def diff(self, new_dl, ref_dl, dt_dl):
"""

View file

@ -28,13 +28,13 @@ class DocType():
other_list = webnotes.conn.sql("""select name from `tabFile Data`
where name like '%s-%%.%s' order by name desc""" % (parts[0], '.'.join(parts[1:])))
if other_list:
last_name = other_list[0][0]
from webnotes.utils import cint
new_id = str(cint(last_name.split('.')[0].split('-')[-1]) + 1)
else:
new_id = '1'
if other_list:
last_name = other_list[0][0]
from webnotes.utils import cint
new_id = str(cint(last_name.split('.')[0].split('-')[-1]) + 1)
else:
new_id = '1'
# new name
self.doc.file_name = parts[0] + '-' + new_id + '.' + '.'.join(parts[1:])

View file

@ -62,7 +62,7 @@ class DocType:
"""
from webnotes import defs
from webnotes.utils.transfer import in_transfer
if not in_transfer and getattr(defs,'developer_mode', 0):
if not in_transfer and getattr(defs,'developer_mode', 0) and self.doc.standard=='Yes':
from webnotes.modules.export_module import export_to_files
from webnotes.modules import get_module_path, scrub
import os

View file

@ -5,14 +5,14 @@
{
'creation': '2009-05-12 11:19:11',
'docstatus': 0,
'modified': '2012-01-24 16:05:50',
'modified': '2012-01-27 13:26:59',
'modified_by': 'Administrator',
'owner': 'Administrator'
},
# These values are common for all DocType
{
'_last_update': '1323345145',
'_last_update': '1327650972',
'allow_copy': 0,
'allow_email': 0,
'allow_print': 0,
@ -30,7 +30,7 @@
'section_style': 'Tabbed',
'server_code_error': ' ',
'show_in_menu': 0,
'version': 9
'version': 11
},
# These values are common for all DocField
@ -90,6 +90,20 @@
'reqd': 1
},
# DocField
{
'doctype': 'DocField',
'fieldname': 'title',
'fieldtype': 'Data',
'label': 'Title'
},
# DocField
{
'doctype': 'DocField',
'fieldtype': 'Column Break'
},
# DocField
{
'doctype': 'DocField',
@ -118,10 +132,7 @@
# DocField
{
'doctype': 'DocField',
'fieldtype': 'HTML',
'label': 'Help HTML',
'oldfieldtype': 'HTML',
'options': '<div class="help-box">To add images, use <b>$image(<i>filename</i>)</b><br>Where file name is the ID or Name of the File record</div>'
'fieldtype': 'Section Break'
},
# DocField
@ -157,5 +168,27 @@
'options': 'Page Role',
'reqd': 0,
'search_index': 0
},
# DocField
{
'doctype': 'DocField',
'fieldtype': 'Section Break'
},
# DocField
{
'doctype': 'DocField',
'fieldname': 'script',
'fieldtype': 'Code',
'label': 'Script (JS)'
},
# DocField
{
'doctype': 'DocField',
'fieldname': 'style',
'fieldtype': 'Code',
'label': 'Style (CSS)'
}
]

View file

@ -65,7 +65,7 @@ class HTTPRequest:
if webnotes.session['data'].get('profile'):
webnotes.user.load_from_session(webnotes.session['data']['profile'])
else:
webnotes.user.load_profile()
webnotes.user.load_profile()
# set database login
# ------------------
@ -318,7 +318,8 @@ class Session:
r=None
try:
r = webnotes.conn.sql("select user, sessiondata, status from tabSessions where sid='%s'" % self.sid)
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()
@ -344,7 +345,8 @@ class Session:
webnotes.response['session_status'] = 'Logged Out'
raise Exception, 'Logged Out'
else:
self.data = {'data':eval(r[1]), 'user':r[0], 'sid': self.sid}
self.data = {'data': (r[1] and eval(r[1]) or {}),
'user':r[0], 'sid': self.sid}
else:
webnotes.login_manager.login_as_guest()
self.start()

View file

@ -27,7 +27,7 @@ def get_bootinfo():
import webnotes.widgets.menus
bootinfo['start_items'] = webnotes.widgets.menus.get_menu_items()
bootinfo['dt_labels'] = get_dt_labels()
# home page
get_home_page(bootinfo, doclist)
@ -62,15 +62,9 @@ def get_home_page(bootinfo, doclist):
doclist += webnotes.widgets.page.get(home_page)
bootinfo['home_page'] = home_page or ''
def get_dt_labels():
import webnotes
d = {}
try:
res = webnotes.conn.sql("select name, dt_label from `tabDocType Label`")
except:
return {}
for r in res:
d[r[0]] = r[1]
return d
res = webnotes.conn.sql("select name, dt_label from `tabDocType Label`")
return dict(res)

View file

@ -64,7 +64,8 @@ class Database:
Connect to a database
"""
self._conn = MySQLdb.connect(user=self.user, host=self.host, passwd=self.password)
self._conn.set_character_set('utf8')
self._conn.converter[246]=float
self._conn.set_character_set('utf8')
self._cursor = self._conn.cursor()
def use(self, db_name):
@ -119,7 +120,7 @@ class Database:
"""
* Execute a `query`, with given `values`
* returns as a dictionary if as_dict = 1
* returns as a list of lists (with cleaned up dates and decimals) if as_list = 1
* returns as a list of lists (with cleaned up dates) if as_list = 1
"""
# in transaction validations
self.check_transaction_status(query)
@ -168,8 +169,6 @@ class Database:
# ======================================================================================
def convert_to_simple_type(self, v, formatted=0):
try: import decimal # for decimal Python 2.5 onwards
except: pass
import datetime
from webnotes.utils import formatdate, fmt_money
@ -193,12 +192,6 @@ class Database:
# long
elif type(v)==long:
v=int(v)
# decimal
try:
if type(v)==decimal.Decimal:
v=float(v)
except: pass
# convert to strings... (if formatted)
if formatted:
@ -309,7 +302,7 @@ class Database:
defkey=%s and parent = "Control Panel" """, key):
# update
self.sql("""update `tabDefaultValue` set defvalue="%s"
self.sql("""update `tabDefaultValue` set defvalue=%s
where parent = "Control Panel" and defkey=%s""", (val, key))
else:
from webnotes.model.doc import Document

View file

@ -94,7 +94,9 @@ class DatabaseInstance:
def create_doctypecache(self):
self.conn.sql("DROP TABLE IF EXISTS `__DocTypeCache`")
self.conn.sql("create table `__DocTypeCache` (name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)")
self.conn.sql("""
create table `__SessionCache` (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)
""")

View file

@ -42,7 +42,12 @@ class Installer:
import webnotes
self.dbman.drop_table('__DocTypeCache')
webnotes.conn.sql("create table `__DocTypeCache` (name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)")
webnotes.conn.sql("""create table `__DocTypeCache`
(name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)""")
self.dbman.drop_table('__SessionCache')
webnotes.conn.sq.("""create table `__SessionCache`
(user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)""")
# set the basic passwords
webnotes.conn.begin()

View file

@ -82,6 +82,9 @@ class Document:
if (doctype and name):
self._loadfromdb(doctype, name)
else:
if not fielddata:
self.fields['__islocal'] = 1
def __nonzero__(self):
return True
@ -115,6 +118,8 @@ class Document:
# ---------------------------------------------------------------------------
def _load_values(self, data, description):
if '__islocal' in self.fields:
del self.fields['__islocal']
for i in range(len(description)):
v = data[i]
self.fields[description[i][0]] = webnotes.conn.convert_to_simple_type(v)
@ -244,7 +249,7 @@ class Document:
# Insert
# ---------------------------------------------------------------------------
def _makenew(self, autoname, istable, case='', make_autoname=1):
def insert(self, autoname, istable, case='', make_autoname=1):
# set name
if make_autoname:
self._set_name(autoname, istable)
@ -371,9 +376,14 @@ class Document:
res = webnotes.model.meta.get_dt_values(self.doctype, 'autoname, issingle, istable, name_case', as_dict=1)
res = res and res[0] or {}
# add missing parentinfo (if reqd)
if self.parent and not (self.parenttype and self.parentfield):
self.update_parentinfo()
# if required, make new
if new or (not new and self.fields.get('__islocal')) and (not res.get('issingle')):
r = self._makenew(res.get('autoname'), res.get('istable'), res.get('name_case'), make_autoname)
r = self.insert(res.get('autoname'), res.get('istable'), res.get('name_case'), \
make_autoname)
if r:
return r
@ -381,6 +391,24 @@ class Document:
self._update_values(res.get('issingle'), check_links and self.make_link_list() or {}, ignore_fields)
self._clear_temp_fields()
def update_parentinfo(self):
"""update parent type and parent field, if not explicitly specified"""
tmp = webnotes.conn.sql("""select parent, fieldname from tabDocField
where fieldtype='Table' and options=%s""", self.doctype)
if len(tmp)==0:
raise Exception, 'Incomplete parent info in child table (%s, %s)' \
% (self.doctype, self.fields.get('name', '[new]'))
elif len(tmp)>1:
raise Exception, 'Ambiguous parent info (%s, %s)' \
% (self.doctype, self.fields.get('name', '[new]'))
else:
self.parenttype = tmp[0][0]
self.parentfield = tmp[0][1]
# check permissions
# ---------------------------------------------------------------------------

View file

@ -15,7 +15,7 @@ class Profile:
self.can_get_report = []
def _load_roles(self):
res = webnotes.conn.sql('select role from tabUserRole where parent = "%s"' % self.name)
res = webnotes.conn.sql('select role from tabUserRole where parent = %s', self.name)
self.roles = []
for t in res:
if t[0]: self.roles.append(t[0])
@ -32,7 +32,7 @@ class Profile:
"""
if self.roles:
return self.roles
return self._load_roles()
def get_allow_list(self, key):

View file

@ -13,17 +13,16 @@ def clear():
def clear_cache(user=''):
"""clear cache"""
try:
if user:
webnotes.conn.sql("delete from __SessionCache where user=%s", user)
else:
webnotes.conn.sql("delete from __SessionCache")
except Exception, e:
if e.args[0]==1146:
make_cache_table()
else:
raise e
if user:
webnotes.conn.sql("delete from __SessionCache where user=%s", user)
webnotes.conn.sql("update tabSessions set sessiondata=NULL where user=%s", user)
else:
webnotes.conn.sql("delete from __SessionCache")
webnotes.conn.sql("update tabSessions set sessiondata=NULL")
if webnotes.session:
webnotes.session['data'] = {}
def get():
"""get session boot info"""
import webnotes.defs
@ -70,8 +69,3 @@ def add_to_cache(sd, country):
# make new
webnotes.conn.sql("insert into `__SessionCache` (user, country, cache) VALUES (%s, %s, %s)", (webnotes.session['user'], country, str(sd)))
def make_cache_table():
webnotes.conn.commit()
webnotes.conn.sql("create table `__SessionCache` (user VARCHAR(120), country VARCHAR(120), cache LONGTEXT)")
webnotes.conn.begin()

View file

@ -327,9 +327,6 @@ def parse_val(v):
"""
import datetime
try: import decimal # for decimal Python 2.5 (?)
except: pass
if type(v)==datetime.date:
v = str(v)
elif type(v)==datetime.timedelta:
@ -338,10 +335,6 @@ def parse_val(v):
v = str(v)
elif type(v)==long: v=int(v)
try:
if type(v)==decimal.Decimal: v=float(v)
except: pass
return v
# ==============================================================================

View file

@ -26,7 +26,8 @@ def get_master_fields(dt):
webnotes.session['data']['auto_masters'] = {}
if webnotes.session['data']['auto_masters'].get(dt, None)==None:
fl = webnotes.conn.sql("select fieldname from tabDocField where fieldtype='Data' and options='Suggest' and parent=%s", dt)
fl = webnotes.conn.sql("select fieldname from tabDocField where fieldtype='Data' \
and options='Suggest' and parent=%s", dt)
webnotes.session['data']['auto_masters'][dt] = fl
return webnotes.session['data']['auto_masters'][dt]