diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar.js b/frappe/public/js/frappe/form/sidebar/form_sidebar.js index a145e47149..34b5fb3535 100644 --- a/frappe/public/js/frappe/form/sidebar/form_sidebar.js +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar.js @@ -6,7 +6,7 @@ import './share'; import './review'; import './document_follow'; import './user_image'; -import './form_viewers'; +import './form_sidebar_users'; frappe.ui.form.Sidebar = Class.extend({ init: function(opts) { @@ -28,7 +28,7 @@ frappe.ui.form.Sidebar = Class.extend({ this.make_attachments(); this.make_review(); this.make_shared(); - this.make_viewers(); + this.make_sidebar_users(); this.make_tags(); this.make_like(); @@ -177,10 +177,10 @@ frappe.ui.form.Sidebar = Class.extend({ parent: this.sidebar.find(".form-shared") }); }, - make_viewers: function() { - this.frm.viewers = new frappe.ui.form.Viewers({ + make_sidebar_users: function() { + this.frm.viewers = new frappe.ui.form.SidebarUsers({ frm: this.frm, - parent: this.sidebar.find(".form-viewers") + $wrapper: this.sidebar, }); }, add_user_action: function(label, click) { diff --git a/frappe/public/js/frappe/form/sidebar/form_sidebar_users.js b/frappe/public/js/frappe/form/sidebar/form_sidebar_users.js new file mode 100644 index 0000000000..16f0f32376 --- /dev/null +++ b/frappe/public/js/frappe/form/sidebar/form_sidebar_users.js @@ -0,0 +1,87 @@ +frappe.ui.form.SidebarUsers = Class.extend({ + init: function(opts) { + $.extend(this, opts); + }, + get_users: function(type) { + let docinfo = this.frm.get_docinfo(); + return docinfo ? docinfo[type] || null: null; + }, + refresh: function(data_updated, type) { + this.parent = type == 'viewers'? this.$wrapper.find('.form-viewers'): this.$wrapper.find('.form-typers'); + this.parent.empty(); + + const users = this.get_users(type); + users && this.show_in_sidebar(users, type, data_updated); + }, + show_in_sidebar: function(users, type, show_alert) { + let sidebar_users = []; + let new_users = []; + let current_users = []; + + const message = type == 'viewers' ? 'viewing this document': 'typing...'; + + users.current.forEach(username => { + if (username === frappe.session.user) { + // current user + return; + } + + var user_info = frappe.user_info(username); + sidebar_users.push({ + image: user_info.image, + fullname: user_info.fullname, + abbr: user_info.abbr, + color: user_info.color, + title: __("{0} is currently {1}", [user_info.fullname, message]) + }); + + if (users.new.indexOf(username) !== -1) { + new_users.push(user_info.fullname); + } + + current_users.push(user_info.fullname); + }); + + if (sidebar_users.length) { + this.parent.parent().removeClass('hidden'); + this.parent.append(frappe.render_template('users_in_sidebar', {'users': sidebar_users})); + } else { + this.parent.parent().addClass('hidden'); + } + + // For typers always show the alert + // For viewers show the alert to new user viewing this document + const alert_users = type == 'viewers' ? new_users : current_users; + show_alert && this.show_alert(alert_users, message); + }, + show_alert(users, message) { + if (users.length) { + if (users.length===1) { + frappe.show_alert(__('{0} is currently {1}', [users[0], message])); + } else { + frappe.show_alert(__('{0} are currently {1}', [frappe.utils.comma_and(users), message])); + } + + } + } +}); + +frappe.ui.form.set_users = function(data, type) { + const doctype = data.doctype; + const docname = data.docname; + const docinfo = frappe.model.get_docinfo(doctype, docname); + + const past_users = ((docinfo && docinfo[type]) || {}).past || []; + const users = data.users || []; + const new_users = users.filter(user => !past_users.includes(user)); + + frappe.model.set_docinfo(doctype, docname, type, { + past: past_users.concat(new_users), + new: new_users, + current: users + }); + + if (cur_frm && cur_frm.doc && cur_frm.doc.doctype===doctype && cur_frm.doc.name==docname) { + cur_frm.viewers.refresh(true, type); + } +} \ No newline at end of file diff --git a/frappe/public/js/frappe/form/sidebar/form_viewers.js b/frappe/public/js/frappe/form/sidebar/form_viewers.js deleted file mode 100644 index 72f4984e94..0000000000 --- a/frappe/public/js/frappe/form/sidebar/form_viewers.js +++ /dev/null @@ -1,80 +0,0 @@ - - -frappe.ui.form.Viewers = Class.extend({ - init: function(opts) { - $.extend(this, opts); - }, - get_viewers: function() { - let docinfo = this.frm.get_docinfo(); - if (docinfo) { - return docinfo.viewers || {}; - } else { - return {}; - } - }, - refresh: function(data_updated) { - this.parent.empty(); - - var viewers = this.get_viewers(); - - var users = []; - var new_users = []; - for (var i=0, l=(viewers.current || []).length; i < l; i++) { - var username = viewers.current[i]; - if (username===frappe.session.user) { - // current user - continue; - } - - var user_info = frappe.user_info(username); - users.push({ - image: user_info.image, - fullname: user_info.fullname, - abbr: user_info.abbr, - color: user_info.color, - title: __("{0} is currently viewing this document", [user_info.fullname]) - }); - - if (viewers.new.indexOf(username)!==-1) { - new_users.push(user_info.fullname); - } - } - - if (users.length) { - this.parent.parent().removeClass("hidden"); - this.parent.append(frappe.render_template("users_in_sidebar", {"users": users})); - } else { - this.parent.parent().addClass("hidden"); - } - - if (data_updated && new_users.length) { - // new user viewing this document, who wasn't viewing in the past - if (new_users.length===1) { - frappe.show_alert(__("{0} is currently viewing this document", [new_users[0]])); - } else { - frappe.show_alert(__("{0} are currently viewing this document", [frappe.utils.comma_and(new_users)])); - } - - } - } -}); - -frappe.ui.form.set_viewers = function(data) { - var doctype = data.doctype; - var docname = data.docname; - var docinfo = frappe.model.get_docinfo(doctype, docname); - var past_viewers = ((docinfo && docinfo.viewers) || {}).past || []; - var viewers = data.viewers || []; - - var new_viewers = viewers.filter(viewer => !past_viewers.includes(viewer)); - - frappe.model.set_docinfo(doctype, docname, "viewers", { - past: past_viewers.concat(new_viewers), - new: new_viewers, - current: viewers - }); - - if (cur_frm && cur_frm.doc && cur_frm.doc.doctype===doctype && cur_frm.doc.name==docname) { - cur_frm.viewers.refresh(true); - } -} diff --git a/frappe/public/js/frappe/form/templates/form_sidebar.html b/frappe/public/js/frappe/form/templates/form_sidebar.html index c3f2de9c7e..77bff50461 100644 --- a/frappe/public/js/frappe/form/templates/form_sidebar.html +++ b/frappe/public/js/frappe/form/templates/form_sidebar.html @@ -78,6 +78,10 @@