diff --git a/frappe/config/desk.py b/frappe/config/desk.py index 9677ecdd9c..22b1eb0e83 100644 --- a/frappe/config/desk.py +++ b/frappe/config/desk.py @@ -22,7 +22,7 @@ def get_data(): }, { "type": "page", - "label": _("Messages"), + "label": _("Chat"), "name": "messages", "description": _("Chat messages and other notifications."), "data_doctype": "Communication" diff --git a/frappe/desk/page/chat/__init__.py b/frappe/desk/page/chat/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/desk/page/messages/messages.css b/frappe/desk/page/chat/chat.css similarity index 100% rename from frappe/desk/page/messages/messages.css rename to frappe/desk/page/chat/chat.css diff --git a/frappe/desk/page/messages/messages.js b/frappe/desk/page/chat/chat.js similarity index 81% rename from frappe/desk/page/messages/messages.js rename to frappe/desk/page/chat/chat.js index 6e6299d144..6e6fbc6b39 100644 --- a/frappe/desk/page/messages/messages.js +++ b/frappe/desk/page/chat/chat.js @@ -1,32 +1,27 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // MIT License. See license.txt -// TODO -// new message popup - -frappe.provide('frappe.desk.pages.messages'); - -frappe.pages.messages.on_page_load = function(parent) { +frappe.pages.chat.on_page_load = function(parent) { var page = frappe.ui.make_app_page({ parent: parent, }); - page.set_title('' + page.set_title('' + ''); - $(".navbar-center").html(__("Messages")); + $(".navbar-center").html(__("Chat")); - frappe.desk.pages.messages = new frappe.desk.pages.Messages(parent); + frappe.pages.chat.chat = new frappe.Chat(parent); } -frappe.pages.messages.on_page_show = function() { +frappe.pages.chat.on_page_show = function() { // clear title prefix frappe.utils.set_title_prefix(""); frappe.breadcrumbs.add("Desk"); } -frappe.desk.pages.Messages = Class.extend({ +frappe.Chat = Class.extend({ init: function(wrapper, page) { this.wrapper = wrapper; this.page = wrapper.page; @@ -46,7 +41,7 @@ frappe.desk.pages.Messages = Class.extend({ var me = this; frappe.realtime.on('new_message', function(comment) { if(comment.modified_by !== user || comment.communication_type === 'Bot') { - if(frappe.get_route()[0] === 'messages') { + if(frappe.get_route()[0] === 'chat') { var current_contact = $(cur_page.page).find('[data-contact]').data('contact'); var on_broadcast_page = current_contact === user; if ((current_contact == comment.owner) @@ -56,7 +51,7 @@ frappe.desk.pages.Messages = Class.extend({ setTimeout(function() { me.prepend_comment(comment); }, 1000); } } else { - frappe.utils.notify(__("Message from {0}", [comment.sender_full_name]), comment.content); + frappe.utils.notify(__("Message from {0}", [frappe.user_info(comment.owner).fullname]), comment.content); } } }); @@ -64,23 +59,23 @@ frappe.desk.pages.Messages = Class.extend({ prepend_comment: function(comment) { var $row = $('
'); - frappe.desk.pages.messages.list.data.unshift(comment); - frappe.desk.pages.messages.list.render_row($row, comment); - frappe.desk.pages.messages.list.$w.prepend($row); + frappe.pages.chat.chat.list.data.unshift(comment); + frappe.pages.chat.chat.list.render_row($row, comment); + frappe.pages.chat.chat.list.$w.prepend($row); }, make_sidebar: function() { var me = this; return frappe.call({ module:'frappe.desk', - page:'messages', + page:'chat', method:'get_active_users', callback: function(r,rt) { // sort r.message.sort(function(a, b) { return cint(b.has_session) - cint(a.has_session); }); // render - me.page.sidebar.html(frappe.render_template("messages_sidebar", {data: r.message})); + me.page.sidebar.html(frappe.render_template("chat_sidebar", {data: r.message})); // bind click me.page.sidebar.find("a").on("click", function() { @@ -105,7 +100,7 @@ frappe.desk.pages.Messages = Class.extend({ make_messages: function(contact) { var me = this; - this.page.main.html($(frappe.render_template("messages_main", { "contact": contact }))); + this.page.main.html($(frappe.render_template("chat_main", { "contact": contact }))); var text_area = this.page.main.find(".messages-textarea").on("focusout", function() { // on touchscreen devices, scroll to top @@ -127,7 +122,7 @@ frappe.desk.pages.Messages = Class.extend({ if(txt) { return frappe.call({ module: 'frappe.desk', - page:'messages', + page:'chat', method:'post', args: { txt: txt, @@ -164,7 +159,7 @@ frappe.desk.pages.Messages = Class.extend({ this.list = new frappe.ui.Listing({ parent: this.page.main.find(".message-list"), page: this.page, - method: 'frappe.desk.page.messages.messages.get_list', + method: 'frappe.desk.page.chat.chat.get_list', args: { contact: contact }, @@ -172,7 +167,7 @@ frappe.desk.pages.Messages = Class.extend({ freeze: false, render_row: function(wrapper, data) { me.prepare(data); - var row = $(frappe.render_template("messages_row", { + var row = $(frappe.render_template("chat_row", { data: data })).appendTo(wrapper); row.find(".avatar, .indicator").tooltip(); @@ -184,7 +179,7 @@ frappe.desk.pages.Messages = Class.extend({ delete: function(ele) { $(ele).parent().css('opacity', 0.6); return frappe.call({ - method: 'frappe.desk.page.messages.messages.delete', + method: 'frappe.desk.page.chat.chat.delete', args: {name : $(ele).attr('data-name')}, callback: function() { $(ele).parents(".list-row:first").toggle(false); @@ -220,6 +215,10 @@ frappe.desk.pages.Messages = Class.extend({ data.is_mine = true; } + if(data.owner==data.reference_name && data.communication_type === "Bot") { + data.owner = 'bot'; + } + data.content = frappe.markdown(data.content); } diff --git a/frappe/desk/page/chat/chat.json b/frappe/desk/page/chat/chat.json new file mode 100644 index 0000000000..891ea9d935 --- /dev/null +++ b/frappe/desk/page/chat/chat.json @@ -0,0 +1,23 @@ +{ + "content": null, + "creation": "2012-06-14 18:44:56", + "docstatus": 0, + "doctype": "Page", + "icon": "", + "idx": 1, + "modified": "2016-03-31 02:02:13.503910", + "modified_by": "Administrator", + "module": "Desk", + "name": "chat", + "owner": "Administrator", + "page_name": "messages", + "roles": [ + { + "role": "All" + } + ], + "script": null, + "standard": "Yes", + "style": null, + "title": "Chat" +} \ No newline at end of file diff --git a/frappe/desk/page/messages/messages.py b/frappe/desk/page/chat/chat.py similarity index 97% rename from frappe/desk/page/messages/messages.py rename to frappe/desk/page/chat/chat.py index 4cd770cfc7..53c2043b34 100644 --- a/frappe/desk/page/messages/messages.py +++ b/frappe/desk/page/chat/chat.py @@ -41,6 +41,7 @@ def get_list(arg=None): return frappe.db.sql("""select * from `tabCommunication` where communication_type in ('Chat', 'Notification') + and comment_type != 'Bot' and reference_doctype ='User' and (owner=%(contact)s or reference_name=%(user)s @@ -78,7 +79,8 @@ def get_active_users(): # in case of administrator data.append({"name": frappe.session.user, "has_session": 100}) - data.append({"name": "Bot", "has_session": 100}) + if 'System Manager' in frappe.get_roles(): + data.append({"name": "Bot", "has_session": 100}) return data diff --git a/frappe/desk/page/messages/messages_main.html b/frappe/desk/page/chat/chat_main.html similarity index 100% rename from frappe/desk/page/messages/messages_main.html rename to frappe/desk/page/chat/chat_main.html diff --git a/frappe/desk/page/messages/messages_row.html b/frappe/desk/page/chat/chat_row.html similarity index 75% rename from frappe/desk/page/messages/messages_row.html rename to frappe/desk/page/chat/chat_row.html index fae334fe65..64c90f7ac2 100644 --- a/frappe/desk/page/messages/messages_row.html +++ b/frappe/desk/page/chat/chat_row.html @@ -9,16 +9,12 @@ style="width: 20px; height: 16px; display: inline-block;"> {% } %} -
+
{%= data.content %}
@@ -26,7 +22,7 @@
{%= comment_when(data.modified) %}
diff --git a/frappe/desk/page/messages/messages_sidebar.html b/frappe/desk/page/chat/chat_sidebar.html similarity index 100% rename from frappe/desk/page/messages/messages_sidebar.html rename to frappe/desk/page/chat/chat_sidebar.html diff --git a/frappe/desk/page/messages/README.md b/frappe/desk/page/messages/README.md deleted file mode 100644 index e37bf64e3c..0000000000 --- a/frappe/desk/page/messages/README.md +++ /dev/null @@ -1 +0,0 @@ -Chat-like interface with list of messages, updates by various users, transactions. \ No newline at end of file diff --git a/frappe/desk/page/messages/__init__.py b/frappe/desk/page/messages/__init__.py deleted file mode 100644 index 0e57cb68c3..0000000000 --- a/frappe/desk/page/messages/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors -# MIT License. See license.txt - diff --git a/frappe/desk/page/messages/messages.json b/frappe/desk/page/messages/messages.json deleted file mode 100644 index 97d2c7da90..0000000000 --- a/frappe/desk/page/messages/messages.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "creation": "2012-06-14 18:44:56.000000", - "docstatus": 0, - "doctype": "Page", - "icon": "icon-envelope", - "idx": 1, - "modified": "2013-07-11 14:43:32.000001", - "modified_by": "Administrator", - "module": "Desk", - "name": "messages", - "owner": "Administrator", - "page_name": "messages", - "roles": [ - { - "role": "All" - } - ], - "standard": "Yes", - "title": "Messages" -} diff --git a/frappe/model/utils/link_count.py b/frappe/model/utils/link_count.py index 0d543ee859..bc521824e4 100644 --- a/frappe/model/utils/link_count.py +++ b/frappe/model/utils/link_count.py @@ -24,11 +24,13 @@ def notify_link_count(doctype, name): def update_link_count(): '''increment link count in the `idx` column for the given document''' link_count = frappe.cache().get_value('_link_count') + + # reset the count + frappe.cache().delete_value('_link_count') + if link_count: for key, count in link_count.iteritems(): if key[0] not in ignore_doctypes: frappe.db.sql('update `tab{0}` set idx = idx + {1} where name=%s'.format(key[0], count), key[1]) - # reset the count - frappe.cache().delete_value('_link_count') diff --git a/frappe/public/images/ui/bot.png b/frappe/public/images/ui/bot.png new file mode 100644 index 0000000000..02aeea0371 Binary files /dev/null and b/frappe/public/images/ui/bot.png differ diff --git a/frappe/public/js/frappe/desk.js b/frappe/public/js/frappe/desk.js index b2fdeddbf3..dc5f4c2562 100644 --- a/frappe/public/js/frappe/desk.js +++ b/frappe/public/js/frappe/desk.js @@ -259,6 +259,14 @@ frappe.Application = Class.extend({ } return false; }) + .keydown("meta+b ctrl+b", function(e) { + e.preventDefault(); + var route = frappe.get_route(); + if(route[0]==='Form' || route[0]==='List') { + new_doc(route[1]); + } + return false; + }) .keydown("esc", function(e) { // close open grid row var open_row = $(".grid-row-open"); diff --git a/frappe/public/js/frappe/misc/user.js b/frappe/public/js/frappe/misc/user.js index 73aeffd77a..7399aa095d 100644 --- a/frappe/public/js/frappe/misc/user.js +++ b/frappe/public/js/frappe/misc/user.js @@ -7,6 +7,14 @@ frappe.user_info = function(uid) { if(!uid) uid = user; + if(uid.toLowerCase()==="bot") { + return { + fullname: __("Bot"), + image: "/assets/frappe/images/ui/bot.png", + abbr: "B" + } + } + if(!(frappe.boot.user_info && frappe.boot.user_info[uid])) { var user_info = {fullname: toTitle(uid.split("@")[0]) || "Unknown"}; } else { diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 0bd13c4c22..283a4a72c8 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -329,12 +329,16 @@ _f.Frm.prototype.show_web_link = function() { if(!doc.__islocal && doc.__onload && doc.__onload.is_website_generator) { me.web_link && me.web_link.remove(); if(doc.__onload.published) { - me.web_link = me.sidebar.add_user_action("See on Website", - function() {}).attr("href", "/" + doc.__onload.website_route).attr("target", "_blank"); + me.add_web_link("/" + doc.__onload.website_route) } } } +_f.Frm.prototype.add_web_link = function(path) { + this.web_link = this.sidebar.add_user_action("See on Website", + function() {}).attr("href", path).attr("target", "_blank"); +} + _f.Frm.prototype.check_doc_perm = function() { // get perm var dt = this.parent_doctype?this.parent_doctype : this.doctype; diff --git a/frappe/tests/test_document.py b/frappe/tests/test_document.py index 1e51d051db..2f965457d8 100644 --- a/frappe/tests/test_document.py +++ b/frappe/tests/test_document.py @@ -210,10 +210,6 @@ class TestDocument(unittest.TestCase): self.assertEquals(old_count + 1, new_count) - # hack - for travis so that it does not batch idx updates (?) - import time - time.sleep(1) - before_update = frappe.db.get_value(doctype, name, 'idx') update_link_count()