Merge branch 'latest' of github.com:webnotes/erpnext into latest
diff --git a/css/all-app.css b/css/all-app.css
index 7faff74..5ee09bf 100644
--- a/css/all-app.css
+++ b/css/all-app.css
@@ -2252,4 +2252,16 @@
.module-icons-selling{ background-position: 0 -528px; }
.module-icons-setup{ background-position: 0 -594px; }
.module-icons-stock{ background-position: 0 -660px; }
-.module-icons-support{ background-position: 0 -726px; }
\ No newline at end of file
+.module-icons-support{ background-position: 0 -726px; }
+
+.topbar-new-comments {
+ margin: -3px 0px;
+ padding: 2px;
+ font-size: 14px;
+ color: #fff;
+ background-color: #B00D07;
+ min-width: 20px;
+ text-align: center;
+ display: inline-block;
+ border-radius: 2px;
+}
diff --git a/css/all-web.css b/css/all-web.css
index 3350100..13ea802 100644
--- a/css/all-web.css
+++ b/css/all-web.css
@@ -1036,6 +1036,19 @@
.module-icons-setup{ background-position: 0 -594px; }
.module-icons-stock{ background-position: 0 -660px; }
.module-icons-support{ background-position: 0 -726px; }
+
+.topbar-new-comments {
+ margin: -3px 0px;
+ padding: 2px;
+ font-size: 14px;
+ color: #fff;
+ background-color: #B00D07;
+ min-width: 20px;
+ text-align: center;
+ display: inline-block;
+ border-radius: 2px;
+}
+
/*
* erpnext/website/css/website.css
*/#body_div {
diff --git a/erpnext/home/doctype/home_control/home_control.py b/erpnext/home/doctype/home_control/home_control.py
index 9d82153..1999345 100644
--- a/erpnext/home/doctype/home_control/home_control.py
+++ b/erpnext/home/doctype/home_control/home_control.py
@@ -197,10 +197,11 @@
return count
def get_todo_list(self):
- return sql("""select name, description, date,
+ res = sql("""select name, description, `date`,
priority, checked, reference_type, reference_name from `tabToDo Item`
where owner=%s order by field(priority,'High','Medium','Low') asc, date asc""", \
session['user'], as_dict=1)
+ return res
def add_todo_item(self,args):
args = json.loads(args)
@@ -213,11 +214,27 @@
d.owner = session['user']
d.save(not args.get('name') and 1 or 0)
+ if args.get('name') and d.checked:
+ self.notify_assignment(d)
+
return d.name
def remove_todo_item(self,nm):
+ d = Document('ToDo Item', nm or None)
+ if d and d.name:
+ self.notify_assignment(d)
sql("delete from `tabToDo Item` where name = %s",nm)
+ def notify_assignment(self, d):
+ doc_type = d.fields.get('reference_type')
+ doc_name = d.fields.get('reference_name')
+ assigned_by = d.fields.get('assigned_by')
+ if doc_type and doc_name and assigned_by:
+ from webnotes.widgets.form import assign_to
+ assign_to.notify_assignment(assigned_by, d.owner, doc_type, doc_name)
+
+
+
# -------------------------------------------------------------------------------------------------------
def dismiss_message(self, arg=''):
diff --git a/erpnext/home/page/event_updates/event_updates.js b/erpnext/home/page/event_updates/event_updates.js
index 4df78e3..15f84d9 100644
--- a/erpnext/home/page/event_updates/event_updates.js
+++ b/erpnext/home/page/event_updates/event_updates.js
@@ -95,6 +95,7 @@
if(online_users.length) {
var max = online_users.length; max = (max > 10 ? 10 : max)
+ me.wrapper.innerHTML = "";
for(var i=0; i<max; i++) {
new OneOnlineUser(me.wrapper, online_users[i]);
}
@@ -577,34 +578,13 @@
(strip(det.full_name) ? det.full_name : det.modified_by);
}
-HomeStatusBar = function() {
- var me = this;
- var parent = page_body.pages['Event Updates'];
- this.wrapper = $a($td(parent.main_tab, 0, 1), 'div', 'home-status', {}, 'Loading...');
- $br(this.wrapper, '3px');
-
- this.render = function(r) {
- this.wrapper.innerHTML = '';
- this.span = $a($a(this.wrapper, 'p'), 'span', 'link_type', {fontWeight:'bold'});
- this.span.onclick = function() { loadpage('My Company') }
-
- if(r.unread_messages) {
- this.span.innerHTML = '<span class="home-status-unread">' + r.unread_messages + '</span> unread';
- } else {
- this.span.innerHTML = 'Team / Messages';
- }
-
- }
-}
-
pscript.home_make_status = function() {
- var home_status_bar = new HomeStatusBar()
var wrapper = page_body.pages['Event Updates'];
// get values
$c_page('home', 'event_updates', 'get_status_details', user,
function(r,rt) {
- home_status_bar.render(r.message);
+ page_body.wntoolbar.set_new_comments(r.message.unread_messages);
// render online users
pscript.online_users_obj.render(r.message.online_users);
diff --git a/erpnext/home/page/event_updates/event_updates.py b/erpnext/home/page/event_updates/event_updates.py
index 6966b87..05f3d93 100644
--- a/erpnext/home/page/event_updates/event_updates.py
+++ b/erpnext/home/page/event_updates/event_updates.py
@@ -10,13 +10,16 @@
and t1.user not in ('Guest','Administrator')
and TIMESTAMPDIFF(HOUR,t1.lastupdate,NOW()) <= 1""", as_list=1) or []
+@webnotes.whitelist()
def get_unread_messages(arg=None):
"returns unread (docstatus-0 messages for a user)"
- return cint(webnotes.conn.sql("""SELECT COUNT(*) FROM `tabComment Widget Record`
- WHERE comment_doctype='My Company'
- AND comment_docname = %s
- AND ifnull(docstatus,0)=0
- """, webnotes.user.name)[0][0])
+ return webnotes.conn.sql("""\
+ SELECT name, comment
+ FROM `tabComment Widget Record`
+ WHERE comment_doctype='My Company'
+ AND comment_docname = %s
+ AND ifnull(docstatus,0)=0
+ """, webnotes.user.name, as_list=1)
@webnotes.whitelist()
def get_status_details(arg=None):
@@ -30,8 +33,6 @@
'user_count': len(online) or 0,
'unread_messages': get_unread_messages(),
'online_users': online or [],
- 'is_trial': webnotes.conn.get_global('is_trial'),
- 'days_to_expiry': (webnotes.conn.get_global('days_to_expiry') or '0'),
'setup_status': get_setup_status(),
'registration_complete': cint(get_defaults('registration_complete')) and 'Yes' or 'No',
'profile': webnotes.conn.sql("""\
diff --git a/erpnext/home/page/my_company/my_company.py b/erpnext/home/page/my_company/my_company.py
index a63e8d9..ead5333 100644
--- a/erpnext/home/page/my_company/my_company.py
+++ b/erpnext/home/page/my_company/my_company.py
@@ -119,7 +119,7 @@
d.comment = arg['comment']
d.save(1)
- if cint(arg['notify']):
+ if cint(arg.get('notify')):
fn = webnotes.conn.sql('select first_name, last_name from tabProfile where name=%s', webnotes.user.name)[0]
if fn[0] or f[1]:
fn = cstr(fn[0]) + (fn[0] and ' ' or '') + cstr(fn[1])
diff --git a/erpnext/patches/jan_mar_2012/apps/__init__.py b/erpnext/patches/jan_mar_2012/apps/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/apps/__init__.py
diff --git a/erpnext/patches/jan_mar_2012/apps/todo_item.py b/erpnext/patches/jan_mar_2012/apps/todo_item.py
new file mode 100644
index 0000000..f2239f5
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/apps/todo_item.py
@@ -0,0 +1,6 @@
+def execute():
+ """
+ * Reload ToDo Item
+ """
+ from webnotes.modules.module_manager import reload_doc
+ reload_doc('utilities', 'doctype', 'todo_item')
diff --git a/erpnext/patches/jan_mar_2012/website/all.py b/erpnext/patches/jan_mar_2012/website/all.py
index 2a55d72..c68e653 100644
--- a/erpnext/patches/jan_mar_2012/website/all.py
+++ b/erpnext/patches/jan_mar_2012/website/all.py
@@ -3,6 +3,9 @@
import patches.jan_mar_2012.website.website
import patches.jan_mar_2012.website.cleanups
import patches.jan_mar_2012.website.domain_list
+import patches.jan_mar_2012.website.file_data_rename
+import patches.jan_mar_2012.website.analytics
+
def execute():
patches.jan_mar_2012.website.login.execute()
@@ -11,3 +14,4 @@
patches.jan_mar_2012.website.cleanups.execute()
patches.jan_mar_2012.website.domain_list.execute()
patches.jan_mar_2012.website.file_data_rename.execute()
+ patches.jan_mar_2012.website.analytics.execute()
diff --git a/erpnext/startup/startup.css b/erpnext/startup/startup.css
index 6e368ac..0fee616 100644
--- a/erpnext/startup/startup.css
+++ b/erpnext/startup/startup.css
@@ -43,4 +43,16 @@
.module-icons-selling{ background-position: 0 -528px; }
.module-icons-setup{ background-position: 0 -594px; }
.module-icons-stock{ background-position: 0 -660px; }
-.module-icons-support{ background-position: 0 -726px; }
\ No newline at end of file
+.module-icons-support{ background-position: 0 -726px; }
+
+.topbar-new-comments {
+ margin: -3px 0px;
+ padding: 2px;
+ font-size: 14px;
+ color: #fff;
+ background-color: #B00D07;
+ min-width: 20px;
+ text-align: center;
+ display: inline-block;
+ border-radius: 2px;
+}
diff --git a/erpnext/startup/startup.js b/erpnext/startup/startup.js
index d40f233..c68650a 100644
--- a/erpnext/startup/startup.js
+++ b/erpnext/startup/startup.js
@@ -29,13 +29,16 @@
// setup toolbar
erpnext.toolbar.setup();
+
+ // set interval for updates
+ erpnext.startup.set_periodic_updates();
// border to the body
// ------------------
$('footer').html('<div class="erpnext-footer">\
Powered by <a href="https://erpnext.com">ERPNext</a></div>');
}
-
+
$('#startup_div').toggle(false);
}
@@ -77,6 +80,35 @@
if(callback) this.callback = function(){ callback(); }
}
+// ========== Update Messages ============
+var update_messages = function() {
+ // Updates Team Messages
+
+ if(inList(['Guest', 'Administrator'], user)) { return; }
+
+ $c_page('home', 'event_updates', 'get_unread_messages', null,
+ function(r,rt) {
+ if(!r.exc) {
+ // This function is defined in toolbar.js
+ page_body.wntoolbar.set_new_comments(r.message);
+ }
+ }
+ );
+}
+
+erpnext.startup.set_periodic_updates = function() {
+ // Set interval for periodic updates of team messages
+ wn.updates = {};
+
+ if(wn.updates.id) {
+ clearInterval(wn.updates.id);
+ }
+
+ wn.updates.id = setInterval(update_messages, 180000);
+}
+
+// =======================================
+
// start
$(document).bind('startup', function() {
erpnext.startup.start();
diff --git a/erpnext/startup/toolbar.js b/erpnext/startup/toolbar.js
index 49738ce..11499b8 100644
--- a/erpnext/startup/toolbar.js
+++ b/erpnext/startup/toolbar.js
@@ -3,7 +3,12 @@
erpnext.toolbar.setup = function() {
// profile
- $('#toolbar-user').append('<li><a href="#profile-settings">Profile Settings</a></li>')
+ $('#toolbar-user').append('<li><a href="#profile-settings">Profile Settings</a></li>');
+
+ $('#toolbar-user').append('<li><a href="#My Company">Team / Messages</a></li>');
+
+ $('.topbar .secondary-nav').prepend('\
+ <li><a href="#" id="toolbar-new-comments"></a></li>');
// help
$('.topbar .secondary-nav').append('<li class="dropdown">\
@@ -24,4 +29,25 @@
if(pscript.is_erpnext_saas && is_system_manager) {
$('#toolbar-user').append('<li><a href="#billing">Billing</a></li>')
}
-}
\ No newline at end of file
+
+ $.extend(page_body.wntoolbar, {
+ set_new_comments: function(new_comments) {
+ var topbar_nc = $('#toolbar-new-comments');
+ if(new_comments && new_comments.length>0) {
+ topbar_nc.html('<span class="topbar-new-comments">' + new_comments.length + '</span>');
+ topbar_nc.click(function() { loadpage('My Company'); });
+ $.each(new_comments, function(i, v) {
+ var msg = 'New Message: ' + (v[1].length<=100 ? v[1] : (v[1].substr(0, 100) + "..."));
+ var id = v[0].replace('/', '-');
+ if(!$('#' + id)[0]) { show_alert(msg, id); }
+ })
+ } else {
+ topbar_nc.html('');
+ topbar_nc.click(function() { return false; });
+ }
+ }
+ });
+
+ page_body.wntoolbar.set_new_comments();
+}
+
diff --git a/erpnext/utilities/doctype/todo_item/todo_item.txt b/erpnext/utilities/doctype/todo_item/todo_item.txt
index 28745ae..86f5d0d 100644
--- a/erpnext/utilities/doctype/todo_item/todo_item.txt
+++ b/erpnext/utilities/doctype/todo_item/todo_item.txt
@@ -3,140 +3,211 @@
# These values are common in all dictionaries
{
- 'creation': '2009-05-12 11:19:11',
+ 'creation': '2009-05-12 16:43:58',
'docstatus': 0,
- 'modified': '2010-09-20 14:06:57',
- 'modified_by': 'yogesh@webnotestech.com',
- 'owner': 'Administrator'
+ 'modified': '2012-02-17 15:48:54',
+ 'modified_by': u'Administrator',
+ 'owner': u'Administrator'
},
# These values are common for all DocType
{
- 'autoname': 'TDI.########',
- 'colour': 'White:FFF',
+ 'allow_attach': 0,
+ 'allow_copy': 0,
+ 'allow_email': 0,
+ 'allow_print': 0,
+ 'allow_rename': 0,
+ 'allow_trash': 0,
+ 'autoname': u'TDI.########',
+ 'colour': u'White:FFF',
'doctype': 'DocType',
+ 'hide_heading': 0,
+ 'hide_toolbar': 0,
'in_create': 1,
- 'module': 'Utilities',
+ 'in_dialog': 0,
+ 'is_transaction_doc': 0,
+ 'issingle': 0,
+ 'max_attachments': 0,
+ 'module': u'Utilities',
'name': '__common__',
'read_only': 1,
- 'section_style': 'Simple',
- 'server_code_error': ' ',
- 'show_in_menu': 0
+ 'read_only_onload': 0,
+ 'section_style': u'Simple',
+ 'server_code_error': u' ',
+ 'show_in_menu': 0,
+ 'use_template': 0,
+ 'version': 5
},
# These values are common for all DocField
{
- 'doctype': 'DocField',
+ 'doctype': u'DocField',
'name': '__common__',
- 'parent': 'ToDo Item',
- 'parentfield': 'fields',
- 'parenttype': 'DocType',
+ 'parent': u'ToDo Item',
+ 'parentfield': u'fields',
+ 'parenttype': u'DocType',
'permlevel': 0
},
# These values are common for all DocPerm
{
'create': 1,
- 'doctype': 'DocPerm',
- 'idx': 1,
+ 'doctype': u'DocPerm',
'name': '__common__',
- 'parent': 'ToDo Item',
- 'parentfield': 'permissions',
- 'parenttype': 'DocType',
+ 'parent': u'ToDo Item',
+ 'parentfield': u'permissions',
+ 'parenttype': u'DocType',
'permlevel': 0,
'read': 1,
- 'role': 'All'
+ 'role': u'All',
+ 'write': 1
},
# DocType, ToDo Item
{
'doctype': 'DocType',
- 'name': 'ToDo Item'
+ 'name': u'ToDo Item'
},
# DocPerm
{
- 'doctype': 'DocPerm'
+ 'doctype': u'DocPerm'
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'description',
- 'fieldtype': 'Text',
- 'idx': 1,
- 'label': 'Description',
- 'oldfieldname': 'description',
- 'oldfieldtype': 'Text',
- 'width': '300px'
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'description',
+ 'fieldtype': u'Text',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Description',
+ 'no_copy': 0,
+ 'oldfieldname': u'description',
+ 'oldfieldtype': u'Text',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0,
+ 'width': u'300px'
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'date',
- 'fieldtype': 'Date',
- 'idx': 2,
- 'label': 'Date',
- 'oldfieldname': 'date',
- 'oldfieldtype': 'Date',
- 'reqd': 1
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'date',
+ 'fieldtype': u'Date',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Date',
+ 'no_copy': 0,
+ 'oldfieldname': u'date',
+ 'oldfieldtype': u'Date',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'priority',
- 'fieldtype': 'Data',
- 'idx': 3,
- 'label': 'Priority',
- 'oldfieldname': 'priority',
- 'oldfieldtype': 'Data',
- 'reqd': 1
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'priority',
+ 'fieldtype': u'Data',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Priority',
+ 'no_copy': 0,
+ 'oldfieldname': u'priority',
+ 'oldfieldtype': u'Data',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'reference_type',
- 'fieldtype': 'Data',
- 'idx': 4,
- 'label': 'Reference Type',
- 'oldfieldname': 'reference_type',
- 'oldfieldtype': 'Data'
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'reference_type',
+ 'fieldtype': u'Data',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Reference Type',
+ 'no_copy': 0,
+ 'oldfieldname': u'reference_type',
+ 'oldfieldtype': u'Data',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'reference_name',
- 'fieldtype': 'Data',
- 'idx': 5,
- 'label': 'Reference Name',
- 'oldfieldname': 'reference_name',
- 'oldfieldtype': 'Data'
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'reference_name',
+ 'fieldtype': u'Data',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Reference Name',
+ 'no_copy': 0,
+ 'oldfieldname': u'reference_name',
+ 'oldfieldtype': u'Data',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'checked',
- 'fieldtype': 'Check',
- 'idx': 6,
- 'label': 'Checked',
- 'oldfieldname': 'checked',
- 'oldfieldtype': 'Check'
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'checked',
+ 'fieldtype': u'Check',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Checked',
+ 'no_copy': 0,
+ 'oldfieldname': u'checked',
+ 'oldfieldtype': u'Check',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0
},
# DocField
{
- 'doctype': 'DocField',
- 'fieldname': 'role',
- 'fieldtype': 'Link',
- 'idx': 7,
- 'label': 'Role',
- 'oldfieldname': 'role',
- 'oldfieldtype': 'Link',
- 'options': 'Role'
+ 'allow_on_submit': 0,
+ 'doctype': u'DocField',
+ 'fieldname': u'role',
+ 'fieldtype': u'Link',
+ 'hidden': 0,
+ 'in_filter': 0,
+ 'label': u'Role',
+ 'no_copy': 0,
+ 'oldfieldname': u'role',
+ 'oldfieldtype': u'Link',
+ 'options': u'Role',
+ 'print_hide': 0,
+ 'report_hide': 0,
+ 'reqd': 0,
+ 'search_index': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'assigned_by',
+ 'fieldtype': u'Link',
+ 'label': u'Assigned By',
+ 'options': u'Profile'
}
]
\ No newline at end of file
diff --git a/js/all-app.js b/js/all-app.js
index 839b8ef..0c8cad7 100644
--- a/js/all-app.js
+++ b/js/all-app.js
Binary files differ
diff --git a/js/all-web.js b/js/all-web.js
index 663dd45..33348c5 100644
--- a/js/all-web.js
+++ b/js/all-web.js
@@ -407,8 +407,9 @@
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='lib/images/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='lib/images/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='lib/images/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 growl_area;function show_alert(txt){if(!growl_area){growl_area=$a(popup_cont,'div','',{position:'fixed',bottom:'8px',right:'8px',width:'320px',zIndex:10});}
-var wrapper=$a(growl_area,'div','',{position:'relative'});var body=$a(wrapper,'div','notice');var c=$a(body,'div','wn-icon ic-round_delete',{cssFloat:'right'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);$(wrapper).hide().fadeIn(1000);}
+var growl_area;function show_alert(txt,id){if(!growl_area){growl_area=$a(popup_cont,'div','',{position:'fixed',bottom:'8px',right:'8px',width:'320px',zIndex:10});}
+var wrapper=$a(growl_area,'div','',{position:'relative'});var body=$a(wrapper,'div','notice');var c=$a(body,'div','wn-icon ic-round_delete',{cssFloat:'right'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);if(id){$(t).attr('id',id);}
+$(wrapper).hide().fadeIn(1000);}
/*
* lib/js/legacy/utils/shortcut.js
*/
@@ -1111,7 +1112,7 @@
var current_module;var is_system_manager=0;var module_content_dict={};var user_full_nm={};wn.provide('erpnext.startup');erpnext.startup.set_globals=function(){pscript.is_erpnext_saas=cint(wn.control_panel.sync_with_gateway)
if(inList(user_roles,'System Manager'))is_system_manager=1;}
erpnext.startup.start=function(){$('#startup_div').html('Starting up...').toggle(true);erpnext.startup.set_globals();if(user=='Guest'){$dh(page_body.left_sidebar);if(wn.boot.custom_css){set_style(wn.boot.custom_css);}
-if(wn.boot.website_settings.title_prefix){wn.title_prefix=wn.boot.website_settings.title_prefix;}}else{pscript.startup_make_sidebar();erpnext.toolbar.setup();$('footer').html('<div class="erpnext-footer">\
+if(wn.boot.website_settings.title_prefix){wn.title_prefix=wn.boot.website_settings.title_prefix;}}else{pscript.startup_make_sidebar();erpnext.toolbar.setup();erpnext.startup.set_periodic_updates();$('footer').html('<div class="erpnext-footer">\
Powered by <a href="https://erpnext.com">ERPNext</a></div>');}
$('#startup_div').toggle(false);}
show_chart_browser=function(nm,chart_type){var call_back=function(){if(nm=='Sales Browser'){var sb_obj=new SalesBrowser();sb_obj.set_val(chart_type);}
@@ -1121,6 +1122,10 @@
ModulePage=function(parent,module_name,module_label,help_page,callback){this.parent=parent;page_body.cur_page.module_page=this;this.wrapper=$a(parent,'div');this.module_name=module_name;this.transactions=[];this.page_head=new PageHeader(this.wrapper,module_label);if(help_page){var btn=this.page_head.add_button('Help',function(){loadpage(this.help_page)},1,'ui-icon-help')
btn.help_page=help_page;}
if(callback)this.callback=function(){callback();}}
+var update_messages=function(){if(inList(['Guest','Administrator'],user)){return;}
+$c_page('home','event_updates','get_unread_messages',null,function(r,rt){if(!r.exc){page_body.wntoolbar.set_new_comments(r.message);}});}
+erpnext.startup.set_periodic_updates=function(){wn.updates={};if(wn.updates.id){clearInterval(wn.updates.id);}
+wn.updates.id=setInterval(update_messages,180000);}
$(document).bind('startup',function(){erpnext.startup.start();});
/*
* erpnext/website/js/topbar.js
diff --git a/version.num b/version.num
index 1e27e32..6aedc8e 100644
--- a/version.num
+++ b/version.num
@@ -1 +1 @@
-478
\ No newline at end of file
+571