From e57267f79a077dc440e5a07d130bc7cc4e2cc1bc Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Wed, 11 Jul 2012 13:18:58 +0530 Subject: [PATCH 1/7] added patch for account and cleanups to breadcrumbs and msgprint --- erpnext/accounts/doctype/account/account.js | 52 ++++++++++-------- .../doctype/cost_center/cost_center.js | 22 +++++--- .../doctype/cost_center/cost_center.py | 48 +++++------------ .../accounts/doctype/gl_control/gl_control.py | 1 + .../page/accounts_browser/accounts_browser.js | 5 +- .../july_2012/default_freeze_account.py | 3 ++ erpnext/patches/patch_list.py | 5 ++ erpnext/setup/doctype/company/company.py | 1 + erpnext/stock/doctype/item/item.txt | 17 ++---- erpnext/stock/doctype/warehouse/warehouse.js | 4 ++ erpnext/stock/doctype/warehouse/warehouse.txt | 48 ++++++----------- public/css/all-app.css | 10 ++++ public/css/all-web.css | 10 ++++ public/js/all-app.js | 54 +++++++++---------- public/js/all-web.js | 32 +++++------ 15 files changed, 159 insertions(+), 153 deletions(-) create mode 100644 erpnext/patches/july_2012/default_freeze_account.py diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js index 79c15bf1ae..18b58948bc 100644 --- a/erpnext/accounts/doctype/account/account.js +++ b/erpnext/accounts/doctype/account/account.js @@ -20,33 +20,39 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) { } +cur_frm.cscript.set_breadcrumbs = function(barea) { + cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname); + cur_frm.frm_head.appframe.add_breadcrumb(' in \ + Chart of Accounts'); + cur_frm.frm_head.appframe.add_breadcrumb(' in Accounts'); +} + // Refresh // ----------------------------------------- cur_frm.cscript.refresh = function(doc, cdt, cdn) { - // read-only for root accounts - root_acc = ['Application of Funds (Assets)','Expenses','Income','Source of Funds (Liabilities)']; - if(inList(root_acc, doc.account_name)) - cur_frm.perm = [[1,0,0], [1,0,0]]; - // hide fields if group cur_frm.toggle_fields(['account_type', 'master_type', 'master_name', 'freeze_account', - 'credit_days', 'credit_limit'], doc.group_or_ledger=='Ledger') + 'credit_days', 'credit_limit', 'tax_rate'], doc.group_or_ledger=='Ledger') - // credit days and type if customer or supplier - cur_frm.toggle_fields(['credit_days', 'credit_limit'], - in_list(['Customer', 'Supplier'], doc.master_type)) + cur_frm.toggle_fields('account_name', doc.__islocal) - // hide tax_rate - cur_frm.cscript.account_type(doc, cdt, cdn); + // read-only for root accounts + root_acc = ['Application of Funds (Assets)','Expenses','Income','Source of Funds (Liabilities)']; + if(in_list(root_acc, doc.account_name)) { + cur_frm.perm = [[1,0,0], [1,0,0]]; + cur_frm.set_intro("This is a root account and cannot be edited."); + } else { + // credit days and type if customer or supplier + cur_frm.set_intro(null); + cur_frm.toggle_fields(['credit_days', 'credit_limit'], + in_list(['Customer', 'Supplier'], doc.master_type)) - // show / hide convert buttons - cur_frm.cscript.hide_unhide_group_ledger(doc); - - // back to chart of accounts - cur_frm.add_custom_button('Back To Chart of Accounts', function() { - wn.set_route('Accounts Browser', 'Account'); - }, 'icon-arrow-left') - + // hide tax_rate + cur_frm.cscript.account_type(doc, cdt, cdn); + + // show / hide convert buttons + cur_frm.cscript.hide_unhide_group_ledger(doc); + } } // Fetch parent details @@ -57,8 +63,12 @@ cur_frm.add_fetch('parent_account', 'is_pl_account', 'is_pl_account'); // Hide tax rate based on account type // ----------------------------------------- cur_frm.cscript.account_type = function(doc, cdt, cdn) { - cur_frm.toggle_fields(['tax_rate'], doc.account_type == 'Tax') - cur_frm.toggle_fields(['master_type', 'master_name'], cstr(doc.account_type)=='') + if(doc.group_or_ledger=='Ledger') { + cur_frm.toggle_fields(['tax_rate'], + doc.account_type == 'Tax'); + cur_frm.toggle_fields(['master_type', 'master_name'], + cstr(doc.account_type)==''); + } } // Hide/unhide group or ledger diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js index f721e42f2d..9b6670454c 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.js +++ b/erpnext/accounts/doctype/cost_center/cost_center.js @@ -26,17 +26,25 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) { } +cur_frm.cscript.set_breadcrumbs = function(barea) { + cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname); + cur_frm.frm_head.appframe.add_breadcrumb(' in \ + Chart of Cost Centers'); + cur_frm.frm_head.appframe.add_breadcrumb(' in Accounts'); +} + cur_frm.cscript.refresh = function(doc, cdt, cdn) { - cur_frm.cscript.hide_unhide_group_ledger(doc); - cur_frm.add_custom_button('Back To Chart of Cost Centers', function() { - wn.set_route('Accounts Browser', 'Cost Center'); - }, 'icon-arrow-left') + cur_frm.toggle_fields('cost_center_name', doc.__islocal) var intro_txt = ''; if(!doc.__islocal && doc.group_or_ledger=='Group') { intro_txt += '

Note: This is Cost Center is a Group, \ Accounting Entries are not allowed against groups.

'; } + + cur_frm.cscript.hide_unhide_group_ledger(doc); + + cur_frm.toggle_fields('sb1', doc.group_or_ledger=='Ledger') cur_frm.set_intro(intro_txt); } @@ -80,8 +88,7 @@ cur_frm.cscript.hide_unhide_group_ledger = function(doc) { cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) { $c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) { if(r.message == 1) { - refresh_field('group_or_ledger'); - cur_frm.cscript.hide_unhide_group_ledger(cur_frm.get_doc()); + cur_frm.refresh(); } }); } @@ -91,8 +98,7 @@ cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) { cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) { $c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) { if(r.message == 1) { - refresh_field('group_or_ledger'); - cur_frm.cscript.hide_unhide_group_ledger(cur_frm.get_doc()); + cur_frm.refresh(); } }); } diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py index 83ad9d23cd..99b4bac157 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.py +++ b/erpnext/accounts/doctype/cost_center/cost_center.py @@ -14,24 +14,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Please edit this list and import only required elements import webnotes - -from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add -from webnotes.model import db_exists -from webnotes.model.doc import Document, addchild, getchildren, make_autoname -from webnotes.model.doclist import getlist, copy_doclist -from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax -from webnotes import session, form, is_testing, msgprint, errprint - -set = webnotes.conn.set -sql = webnotes.conn.sql -get_value = webnotes.conn.get_value -in_transaction = webnotes.conn.in_transaction -convert_to_lists = webnotes.conn.convert_to_lists +from webnotes.model.doclist import getlist +from webnotes import msgprint -# ----------------------------------------------------------------------------------------- - class DocType: def __init__(self,d,dl): @@ -41,9 +27,9 @@ class DocType: def autoname(self): self.doc.name = self.doc.cost_center_name + ' - ' + self.doc.company_abbr - #------------------------------------------------------------------------- def get_abbr(self): - abbr = sql("select abbr from tabCompany where company_name='%s'"%(self.doc.company_name))[0][0] or '' + abbr = webnotes.conn.sql("select abbr from tabCompany where company_name=%s", + self.doc.company_name)[0][0] or '' ret = { 'company_abbr' : abbr } @@ -56,7 +42,6 @@ class DocType: if self.doc.cost_center_name != 'Root' and not self.doc.parent_cost_center: msgprint("Please enter parent cost center", raise_exception=1) - #------------------------------------------------------------------------- def convert_group_to_ledger(self): if self.check_if_child_exists(): msgprint("Cost Center: %s has existing child. You can not convert this cost center to ledger" % (self.doc.name), raise_exception=1) @@ -67,7 +52,6 @@ class DocType: self.doc.save() return 1 - #------------------------------------------------------------------------- def convert_ledger_to_group(self): if self.check_gle_exists(): msgprint("Cost Center with existing transaction can not be converted to group.", raise_exception=1) @@ -76,37 +60,36 @@ class DocType: self.doc.save() return 1 - #------------------------------------------------------------------------- def check_gle_exists(self): - return sql("select name from `tabGL Entry` where cost_center = %s and ifnull(is_cancelled, 'No') = 'No'", (self.doc.name)) + return webnotes.conn.sql("select name from `tabGL Entry` where cost_center = %s and \ + ifnull(is_cancelled, 'No') = 'No'", (self.doc.name)) - - #------------------------------------------------------------------------- def check_if_child_exists(self): - return sql("select name from `tabCost Center` where parent_cost_center = %s and docstatus != 2", self.doc.name) - + return webnotes.conn.sql("select name from `tabCost Center` where \ + parent_cost_center = %s and docstatus != 2", self.doc.name) def validate_budget_details(self): check_acc_list = [] for d in getlist(self.doclist, 'budget_details'): + if doc.group_or_ledger=="Group": + msgprint("Budget cannot be set for Group Cost Centers", raise_exception=1) + if [d.account, d.fiscal_year] in check_acc_list: - msgprint("Account " + cstr(d.account) + "has been entered more than once for fiscal year " + cstr(d.fiscal_year), raise_exception=1) + msgprint("Account " + d.account + "has been entered more than once for fiscal year " + d.fiscal_year, raise_exception=1) else: check_acc_list.append([d.account, d.fiscal_year]) - #------------------------------------------------------------------------- def validate(self): """ Cost Center name must be unique """ - if (self.doc.__islocal or not self.doc.name) and sql("select name from `tabCost Center` where cost_center_name = %s and company_name=%s", (self.doc.cost_center_name, self.doc.company_name)): + if (self.doc.__islocal or not self.doc.name) and webnotes.conn.sql("select name from `tabCost Center` where cost_center_name = %s and company_name=%s", (self.doc.cost_center_name, self.doc.company_name)): msgprint("Cost Center Name already exists, please rename", raise_exception=1) self.validate_mandatory() self.validate_budget_details() - #------------------------------------------------------------------------- def update_nsm_model(self): """ update Nested Set Model @@ -114,16 +97,13 @@ class DocType: import webnotes.utils.nestedset webnotes.utils.nestedset.update_nsm(self) - #------------------------------------------------------------------------- def on_update(self): self.update_nsm_model() - # On Trash - #------------------------------------------------------------------------- def on_trash(self): if self.check_if_child_exists(): msgprint("Child exists for this cost center. You can not trash this account.", raise_exception=1) # rebuild tree - set(self.doc,'old_parent', '') + webnotes.conn.set_value(self.doc,'old_parent', '') self.update_nsm_model() diff --git a/erpnext/accounts/doctype/gl_control/gl_control.py b/erpnext/accounts/doctype/gl_control/gl_control.py index bfeddb0c52..ef8960c35d 100644 --- a/erpnext/accounts/doctype/gl_control/gl_control.py +++ b/erpnext/accounts/doctype/gl_control/gl_control.py @@ -123,6 +123,7 @@ class DocType: ac.fields[d] = arg[d] ac.old_parent = '' ac_obj = get_obj(doc=ac) + ac_obj.doc.freeze_account='No' ac_obj.validate() ac_obj.doc.save(1) ac_obj.on_update() diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js index 734e4de18a..793ee595fb 100644 --- a/erpnext/accounts/page/accounts_browser/accounts_browser.js +++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js @@ -62,7 +62,10 @@ pscript['onload_Accounts Browser'] = function(wrapper){ pscript['onshow_Accounts Browser'] = function(wrapper){ // set route var ctype = wn.get_route()[1] || 'Account'; - wrapper.appframe.title('Chart of '+ctype+'s'); + + wrapper.appframe.clear_breadcrumbs(); + wrapper.appframe.add_breadcrumb('Chart of '+ctype+'s') + wrapper.appframe.add_breadcrumb(' in Accounts'); if(erpnext.account_chart && erpnext.account_chart.ctype != ctype) { wrapper.$company_select.change(); diff --git a/erpnext/patches/july_2012/default_freeze_account.py b/erpnext/patches/july_2012/default_freeze_account.py new file mode 100644 index 0000000000..f5b3cc6e8a --- /dev/null +++ b/erpnext/patches/july_2012/default_freeze_account.py @@ -0,0 +1,3 @@ +def execute(): + import webnotes + webnotes.conn.sql("""update tabAccount set freeze_account='No' where freeze_account is null""") diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py index ab95e9553d..6cd73cd71e 100644 --- a/erpnext/patches/patch_list.py +++ b/erpnext/patches/patch_list.py @@ -487,4 +487,9 @@ patch_list = [ 'patch_file': 'deprecate_import_data_control', 'description': "deprecate doctype - Import Data Control and page - Import Data" }, + { + 'patch_module': 'patches.july_2012', + 'patch_file': 'default_freeze_account', + 'description': "set default freeze_account as 'No' where NULL" + }, ] \ No newline at end of file diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 11ed655ce4..f5ca6ac1a5 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -166,6 +166,7 @@ class DocType: ac.fields[d] = (d == 'parent_account' and lst[self.fld_dict[d]]) and lst[self.fld_dict[d]] +' - '+ self.doc.abbr or lst[self.fld_dict[d]] ac.old_parent = '' ac_obj = get_obj(doc=ac) + ac_obj.doc.freeze_account='No' ac_obj.validate() ac_obj.doc.save(1) ac_obj.on_update() diff --git a/erpnext/stock/doctype/item/item.txt b/erpnext/stock/doctype/item/item.txt index 8a079b815d..b531e53265 100644 --- a/erpnext/stock/doctype/item/item.txt +++ b/erpnext/stock/doctype/item/item.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2012-04-30 18:33:53', + 'creation': '2012-07-03 13:30:46', 'docstatus': 0, - 'modified': '2012-06-07 16:16:24', + 'modified': '2012-07-11 09:57:40', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -196,7 +196,7 @@ # DocField { 'colour': u'White:FFF', - 'description': u'Classify your item in any one item group by clicking on the magnifying glass', + 'description': u'Manage Item Groups', 'doctype': u'DocField', 'fieldname': u'item_group', 'fieldtype': u'Link', @@ -209,17 +209,6 @@ 'reqd': 1 }, - # DocField - { - 'doctype': u'DocField', - 'fieldname': u'ighelp', - 'fieldtype': u'HTML', - 'label': u'IGHelp', - 'oldfieldtype': u'HTML', - 'options': u'To manage Item Groups, click here', - 'permlevel': 0 - }, - # DocField { 'doctype': u'DocField', diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js index b218063b4a..4ad95f494f 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.js +++ b/erpnext/stock/doctype/warehouse/warehouse.js @@ -14,6 +14,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +cur_frm.cscript.refresh = function(doc) { + cur_frm.toggle_fields('warehouse_name', doc.__islocal); +} + cur_frm.cscript.country = function(doc, cdt, cdn) { var mydoc=doc; $c('runserverobj', args={'method':'check_state', 'docs':compress_doclist(make_doclist(doc.doctype, doc.name))}, diff --git a/erpnext/stock/doctype/warehouse/warehouse.txt b/erpnext/stock/doctype/warehouse/warehouse.txt index 16bf59d9d5..844e3f326c 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.txt +++ b/erpnext/stock/doctype/warehouse/warehouse.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2012-05-15 12:15:13', + 'creation': '2012-07-03 13:30:45', 'docstatus': 0, - 'modified': '2012-05-21 18:02:46', + 'modified': '2012-07-11 10:18:07', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -17,6 +17,7 @@ 'autoname': u'field:warehouse_name', 'colour': u'White:FFF', 'default_print_format': u'Standard', + 'description': u'A logical Warehouse against which stock entries are made.\n\nThere are two main Warehouse Types that are significant in ERPNext.\n\n1. **Stores:** These are where your incoming **Items** are kept before they are consumed or sold. You can have as many \u201cStores\u201d type **Warehouses** as you wish. Stores type warehouses are significant because if you set an Item for automatic re-order, ERPNext will check its quantities in all \u201cStores\u201d type **Warehouses** when deciding whether to re-order or not.\n\n2. **Asset**: **Items** marked as type \u201cFixed Asset\u201d are maintained in Asset Type **Warehouses**. This helps you separate them for the **Items** that are consumed as a part of your regular operations or \u201cCost of Goods Sold\u201d.\n', 'doctype': 'DocType', 'document_type': u'Master', 'module': u'Stock', @@ -170,17 +171,6 @@ 'write': 1 }, - # DocField - { - 'doctype': u'DocField', - 'fieldname': u'trash_reason', - 'fieldtype': u'Small Text', - 'label': u'Trash Reason', - 'oldfieldname': u'trash_reason', - 'oldfieldtype': u'Small Text', - 'permlevel': 1 - }, - # DocField { 'doctype': u'DocField', @@ -220,7 +210,6 @@ # DocField { 'colour': u'White:FFF', - 'description': u'The valuation of items in this warehouse will be considered for the company that is specified', 'doctype': u'DocField', 'fieldname': u'company', 'fieldtype': u'Link', @@ -233,6 +222,17 @@ 'search_index': 1 }, + # DocField + { + 'colour': u'White:FFF', + 'description': u'For Reference Only.', + 'doctype': u'DocField', + 'fieldname': u'warehouse_contact_info', + 'fieldtype': u'Section Break', + 'label': u'Warehouse Contact Info', + 'permlevel': 0 + }, + # DocField { 'doctype': u'DocField', @@ -246,24 +246,6 @@ 'print_hide': 0 }, - # DocField - { - 'doctype': u'DocField', - 'fieldname': u'auto_indent_mail', - 'fieldtype': u'Select', - 'hidden': 1, - 'label': u'Send Reorder Alert Mail ', - 'no_copy': 1, - 'oldfieldname': u'auto_indent_mail', - 'oldfieldtype': u'Select', - 'options': u'No\nYes', - 'permlevel': 0, - 'print_hide': 1, - 'report_hide': 1, - 'reqd': 0, - 'trigger': u'Client' - }, - # DocField { 'doctype': u'DocField', @@ -357,6 +339,8 @@ # DocField { + 'colour': u'White:FFF', + 'description': u'For Admin use only. Please report errors to support@erpnext.com', 'doctype': u'DocField', 'fieldname': u'repost_stock', 'fieldtype': u'Section Break', diff --git a/public/css/all-app.css b/public/css/all-app.css index 6bd1d58037..5cfd39104d 100644 --- a/public/css/all-app.css +++ b/public/css/all-app.css @@ -2259,6 +2259,14 @@ div.std-footer-item { div.fetching { color: #888; text-align:right; } +.msgprint { + min-height: 60px; + max-height: 500px; + padding: 9px; + color: #333; + overflow: auto; +} + div.notice { postion: absolute; background-color: #000; @@ -3276,6 +3284,8 @@ div.appframe-toolbar { border-bottom: 1px solid #ccc; } + + /* * lib/css/ui/fonts.css */ diff --git a/public/css/all-web.css b/public/css/all-web.css index e1311c4baa..b32cff8403 100644 --- a/public/css/all-web.css +++ b/public/css/all-web.css @@ -2120,6 +2120,14 @@ div.std-footer-item { div.fetching { color: #888; text-align:right; } +.msgprint { + min-height: 60px; + max-height: 500px; + padding: 9px; + color: #333; + overflow: auto; +} + div.notice { postion: absolute; background-color: #000; @@ -2525,6 +2533,8 @@ div.appframe-toolbar { border-bottom: 1px solid #ccc; } + + /* * erpnext/startup/startup.css */ diff --git a/public/js/all-app.js b/public/js/all-app.js index d0e4771658..91da926f99 100644 --- a/public/js/all-app.js +++ b/public/js/all-app.js @@ -605,16 +605,12 @@ document.body.appendChild(temp);temp.submit();return temp;} /* * 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;} -if(!msg_dialog){msg_dialog=new Dialog(500,200,"Message");msg_dialog.make_body([['HTML','Msg']]) -msg_dialog.onhide=function(){msg_dialog.msg_area.innerHTML='';$dh(msg_dialog.msg_icon);if(msg_dialog.custom_onhide)msg_dialog.custom_onhide();} -$y(msg_dialog.rows['Msg'],{fontSize:'14px',lineHeight:'1.5em',padding:'16px'}) -var t=make_table(msg_dialog.rows['Msg'],1,2,'100%',['20px','250px'],{padding:'2px',verticalAlign:'Top'});msg_dialog.msg_area=$td(t,0,1);msg_dialog.msg_icon=$a($td(t,0,0),'img');} -if(!msg_dialog.display)msg_dialog.show();var has_msg=msg_dialog.msg_area.innerHTML?1:0;var m=$a(msg_dialog.msg_area,'div','');if(has_msg)$y(m,{marginTop:'4px'});$dh(msg_dialog.msg_icon);if(msg.substr(0,6).toLowerCase()=='error:'){msg_dialog.msg_icon.src='images/lib/icons/error.gif';$di(msg_dialog.msg_icon);msg=msg.substr(6);}else if(msg.substr(0,8).toLowerCase()=='message:'){msg_dialog.msg_icon.src='images/lib/icons/application.gif';$di(msg_dialog.msg_icon);msg=msg.substr(8);}else if(msg.substr(0,3).toLowerCase()=='ok:'){msg_dialog.msg_icon.src='images/lib/icons/accept.gif';$di(msg_dialog.msg_icon);msg=msg.substr(3);} -m.innerHTML=replace_newlines(msg);if(m.offsetHeight>200){$y(m,{height:'200px',width:'400px',overflow:'auto'})} -msg_dialog.custom_onhide=callback;} +var msg_dialog;function msgprint(msg,title){if(!msg)return;if(typeof(msg)!='string') +msg=JSON.stringify(msg);if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8));return;} +if(!msg_dialog){msg_dialog=new wn.ui.Dialog({title:"Message",onhide:function(){msg_dialog.msg_area.empty();}});msg_dialog.msg_area=$('
').appendTo(msg_dialog.body);} +if(msg.search(/
|

/)==-1) +msg=replace_newlines(msg);msg_dialog.set_title(title||'Message') +msg_dialog.msg_area.append(msg);msg_dialog.show();} var growl_area;function show_alert(txt,id){if(!growl_area){if(!$('#dialog-container').length){$('

').appendTo('body');} growl_area=$a($i('dialog-container'),'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,'i','icon-remove-sign',{cssFloat:'right',cursor:'pointer'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);if(id){$(t).attr('id',id);} @@ -854,10 +850,14 @@ wn.ui.AppFrame=Class.extend({init:function(parent,title){this.buttons={};this.$w \ ×\
').appendTo(this.$w);this.$w.find('.close').click(function(){window.history.back();}) -if(title)this.title(title);},title:function(txt){this.$titlebar.find('.appframe-title').html(txt);},add_button:function(label,click,icon){if(!this.$w.find('.appframe-toolbar').length) -this.$w.append('
');args={label:label,icon:''};if(icon){args.icon='';} +if(title)this.title(title);},title:function(txt){this.$titlebar.find('.appframe-title').html(txt);},make_toolbar:function(){if(!this.$w.find('.appframe-toolbar').length) +this.$w.append('
');},add_button:function(label,click,icon){this.make_toolbar();args={label:label,icon:''};if(icon){args.icon='';} this.buttons[label]=$(repl('',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('
\ + %(icon)s %(label)s',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.$w.find('.appframe-toolbar'));},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs) +this.$breadcrumbs=$('\ + ').appendTo(this.$titlebar);var crumb=$('').html(html);if(!this.$breadcrumbs.find('span').length){crumb.addClass('appframe-title');} +crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('
\
\
\
');}else{$(opts.parent).html('
\ @@ -881,8 +881,8 @@ return ret;} this.set_value=function(key,val){var f=this.fields_dict[key];if(f){f.set_input(val);f.refresh_mandatory();}} this.set_values=function(dict){for(var key in dict){if(this.fields_dict[key]){this.set_value(key,dict[key]);}}} this.clear=function(){for(key in this.fields_dict){var f=this.fields_dict[key];if(f){f.set_input(f.df['default']||'');}}}} -wn.widgets.Dialog=function(opts){this.opts=opts;this.display=false;this.make=function(opts){if(opts) -this.opts=opts;if(!this.opts.width)this.opts.width=480;if(!$('#dialog-container').length){$('
').appendTo('body');} +wn.widgets.Dialog=function(opts){this.display=false;this.make=function(opts){if(opts){this.opts=opts;$.extend(this,opts);} +if(!this.opts.width)this.opts.width=480;if(!$('#dialog-container').length){$('
').appendTo('body');} this.wrapper=$('
').appendTo('#dialog-container').get(0);if(this.opts.width) this.wrapper.style.width=this.opts.width+'px';this.make_head();this.body=$a(this.wrapper,'div','dialog_body');if(this.opts.fields) this.make_fields(this.body,this.opts.fields);} @@ -893,7 +893,7 @@ this.show=function(){if(this.display)return;this.set_postion() $ds(this.wrapper);freeze();this.display=true;cur_dialog=this;if(this.onshow)this.onshow();} this.hide=function(){if(this.onhide)this.onhide();unfreeze();$dh(this.wrapper);this.display=false;cur_dialog=null;} this.no_cancel=function(){this.appframe.$titlebar.find('.close').toggle(false);} -if(opts)this.make();} +if(opts)this.make(opts);} wn.widgets.Dialog.prototype=new wn.widgets.FieldGroup();wn.provide('wn.ui');wn.ui.Dialog=wn.widgets.Dialog $(document).bind('keydown',function(e){if(cur_dialog&&!cur_dialog.no_cancel_flag&&e.which==27){cur_dialog.hide();}}); /* @@ -966,7 +966,7 @@ wn.views.DocListView=wn.ui.Listing.extend({init:function(doctype){this.doctype=d
\
\
\ -
');this.appframe=new wn.ui.AppFrame(this.$page.find('.appframe-area'));wn.views.breadcrumbs($('').appendTo(this.appframe.$titlebar),locals.DocType[this.doctype].module,this.doctype);},setup:function(){var me=this;me.can_delete=wn.model.can_delete(me.doctype);me.meta=locals.DocType[me.doctype];me.$page.find('.wnlist-area').empty(),me.setup_docstatus_filter();me.setup_listview();me.init_list();me.init_stats();me.make_report_button();me.add_delete_option();},make_report_button:function(){var me=this;if(wn.boot.profile.can_get_report.indexOf(this.doctype)!=-1){this.appframe.add_button('Build Report',function(){wn.set_route('Report2',me.doctype);},'icon-th')}},setup_docstatus_filter:function(){var me=this;this.can_submit=$.map(locals.DocPerm,function(d){if(d.parent==me.meta.name&&d.submit)return 1 +
');this.appframe=new wn.ui.AppFrame(this.$page.find('.appframe-area'));wn.views.breadcrumbs(this.appframe,locals.DocType[this.doctype].module,this.doctype);},setup:function(){var me=this;me.can_delete=wn.model.can_delete(me.doctype);me.meta=locals.DocType[me.doctype];me.$page.find('.wnlist-area').empty(),me.setup_docstatus_filter();me.setup_listview();me.init_list();me.init_stats();me.make_report_button();me.add_delete_option();},make_report_button:function(){var me=this;if(wn.boot.profile.can_get_report.indexOf(this.doctype)!=-1){this.appframe.add_button('Build Report',function(){wn.set_route('Report2',me.doctype);},'icon-th')}},setup_docstatus_filter:function(){var me=this;this.can_submit=$.map(locals.DocPerm,function(d){if(d.parent==me.meta.name&&d.submit)return 1 else return null;}).length;if(this.can_submit){this.$page.find('.show-docstatus').removeClass('hide');this.$page.find('.show-docstatus input').click(function(){me.run();})}},setup_listview:function(){if(this.meta.__listjs){eval(this.meta.__listjs);this.listview=new wn.doclistviews[this.doctype](this);}else{this.listview=new wn.views.ListView(this);} this.listview.parent=this;this.wrapper=this.$page.find('.wnlist-area');this.page_length=20;this.allow_delete=true;},init_list:function(auto_run){var me=this;this.make({method:'webnotes.widgets.doclistview.get',get_args:this.get_args,parent:this.wrapper,start:0,page_length:this.page_length,show_filters:true,show_grid:true,new_doctype:this.doctype,allow_delete:this.allow_delete,no_result_message:this.make_no_result(),columns:this.listview.fields});$(this.wrapper).find('button[list_view_doc="'+me.doctype+'"]').click(function(){me.make_new_doc(me.doctype);});if((auto_run!==false)&&(auto_run!==0))this.run();},make_no_result:function(){var no_result_message=repl('
\

No %(doctype_label)s found

\ @@ -1460,8 +1460,8 @@ return false;} /* * lib/js/wn/views/breadcrumbs.js */ -wn.provide('wn.views');wn.views.breadcrumbs=function(parent,module,doctype,name){$(parent).empty();var $bspan=$(parent);if(name){$bspan.append(''+name+'');}else if(doctype){$bspan.append(''+doctype+' List ');}else if(module){$bspan.append(''+module+'');} -if(name&&doctype&&(!locals['DocType'][doctype].issingle)){$bspan.append(repl(' in %(doctype)s List',{doctype:doctype}))};if(doctype&&module&&wn.modules&&wn.modules[module]){$bspan.append(repl(' in %(module)s',{module:module,module_page:wn.modules[module]}))}} +wn.provide('wn.views');wn.views.breadcrumbs=function(appframe,module,doctype,name){appframe.clear_breadcrumbs();if(name){appframe.add_breadcrumb(name);}else if(doctype){appframe.add_breadcrumb(doctype+' List');}else if(module){appframe.add_breadcrumb(module);} +if(name&&doctype&&(!locals['DocType'][doctype].issingle)){appframe.add_breadcrumb(repl(' in %(doctype)s List',{doctype:doctype}))};if(doctype&&module&&wn.modules&&wn.modules[module]){appframe.add_breadcrumb(repl(' in %(module)s',{module:module,module_page:wn.modules[module]}))}} /* * lib/js/legacy/widgets/form/fields.js */ @@ -1694,8 +1694,8 @@ d.cur_frm=f;d.dn=dn;d.table_form=f.meta.istable;f.refresh(dn);$(f.page_layout.wr * lib/js/legacy/widgets/form/form_header.js */ _f.FrmHeader=Class.extend({init:function(parent,frm){this.appframe=new wn.ui.AppFrame(parent) -this.appframe.$titlebar.append('\ - ');this.$w=this.appframe.$w;},refresh:function(){wn.views.breadcrumbs($(this.$w.find('.breadcrumb-area')),cur_frm.meta.module,cur_frm.meta.name,cur_frm.docname);this.refresh_labels();this.refresh_toolbar();},refresh_labels:function(){var labinfo={0:['Saved','label-success'],1:['Submitted','label-info'],2:['Cancelled','label-important']}[cint(cur_frm.doc.docstatus)];if(labinfo[0]=='Saved'&&cur_frm.meta.is_submittable){labinfo[0]='Saved, to Submit';} +this.$w=this.appframe.$w;},refresh:function(){if(cur_frm.cscript.set_breadcrumbs){this.appframe.clear_breadcrumbs();cur_frm.cscript.set_breadcrumbs();}else{wn.views.breadcrumbs(this.appframe,cur_frm.meta.module,cur_frm.meta.name,cur_frm.docname);} +this.refresh_labels();this.refresh_toolbar();},refresh_labels:function(){var labinfo={0:['Saved','label-success'],1:['Submitted','label-info'],2:['Cancelled','label-important']}[cint(cur_frm.doc.docstatus)];if(labinfo[0]=='Saved'&&cur_frm.meta.is_submittable){labinfo[0]='Saved, to Submit';} if(cur_frm.doc.__unsaved||cur_frm.doc.__islocal){labinfo[0]='Not Saved';labinfo[1]='label-warning'} this.set_label(labinfo);if(cur_frm.doc.__unsaved&&cint(cur_frm.doc.docstatus)==1&&this.appframe.buttons['Update']){this.appframe.buttons['Update'].toggle(true);}},set_label:function(labinfo){this.$w.find('.label').remove();$(repl('\ %(lab_status)s',{lab_status:labinfo[0],lab_class:labinfo[1]})).insertBefore(this.$w.find('.breadcrumb-area'))},refresh_toolbar:function(){this.appframe.clear_buttons();var p=cur_frm.get_doc_perms();if(cur_frm.meta.read_only_onload&&!cur_frm.doc.__islocal){if(!cur_frm.editable) @@ -1706,7 +1706,8 @@ if(docstatus==0&&p[SUBMIT]&&(!cur_frm.doc.__islocal)) this.appframe.add_button('Submit',function(){cur_frm.savesubmit();},'icon-lock');if(docstatus==1&&p[SUBMIT]){this.appframe.add_button('Update',function(){cur_frm.saveupdate();},'');if(!cur_frm.doc.__unsaved)this.appframe.buttons['Update'].toggle(false);} if(docstatus==1&&p[CANCEL]) this.appframe.add_button('Cancel',function(){cur_frm.savecancel()},'icon-remove');if(docstatus==2&&p[AMEND]) -this.appframe.add_button('Amend',function(){cur_frm.amend_doc()},'icon-pencil');},show:function(){},hide:function(){},hide_close:function(){this.$w.find('.close').toggle(false);}}) +this.appframe.add_button('Amend',function(){cur_frm.amend_doc()},'icon-pencil');if(cur_frm.meta.description){this.appframe.add_help_button(wn.markdown('## '+cur_frm.doctype+'\n
\n' ++cur_frm.meta.description));}},show:function(){},hide:function(){},hide_close:function(){this.$w.find('.close').toggle(false);}}) /* * lib/js/legacy/widgets/form/form.js */ @@ -1744,7 +1745,7 @@ _f.Frm.prototype.setup_sidebar=function(){this.sidebar=new wn.widgets.form.sideb _f.Frm.prototype.setup_footer=function(){var me=this;var f=this.page_layout.footer;f.save_area=$a(this.page_layout.footer,'div','',{display:'none',marginTop:'11px'});f.help_area=$a(this.page_layout.footer,'div');var b=$btn(f.save_area,'Save',function(){cur_frm.save('Save');},{marginLeft:'0px'},'green');f.show_save=function(){$ds(me.page_layout.footer.save_area);} f.hide_save=function(){$dh(me.page_layout.footer.save_area);}} _f.Frm.prototype.set_intro=function(txt){if(!this.intro_area){this.intro_area=$('
').insertBefore(this.page_layout.body.firstChild);} -if(txt){this.intro_area.html(txt);}else{this.intro_area.remove();this.intro_area=null;}} +if(txt){if(txt.search(/

/)==-1)txt='

'+txt+'

';this.intro_area.html(txt);}else{this.intro_area.remove();this.intro_area=null;}} _f.Frm.prototype.setup_fields_std=function(){var fl=wn.meta.docfield_list[this.doctype];fl.sort(function(a,b){return a.idx-b.idx});if(fl[0]&&fl[0].fieldtype!="Section Break"||get_url_arg('embed')){this.layout.addrow();if(fl[0].fieldtype!="Column Break"){var c=this.layout.addcell();$y(c.wrapper,{padding:'8px'});}} var sec;for(var i=0;i