diff --git a/frappe/public/js/frappe/form/controls/text_editor.js b/frappe/public/js/frappe/form/controls/text_editor.js index 50b625f248..be0983fc73 100644 --- a/frappe/public/js/frappe/form/controls/text_editor.js +++ b/frappe/public/js/frappe/form/controls/text_editor.js @@ -195,7 +195,9 @@ frappe.ui.form.ControlTextEditor = class ControlTextEditor extends frappe.ui.for let values = await frappe.xcall(method, { search_term }); - renderList(values, search_term); + + let sorted_values = me.prioritize_involved_users_in_mention(values); + renderList(sorted_values, search_term); }, 300), renderItem(item) { let value = item.value; @@ -204,6 +206,16 @@ frappe.ui.form.ControlTextEditor = class ControlTextEditor extends frappe.ui.for }; } + prioritize_involved_users_in_mention(values) { + const involved_users = this.frm?.get_involved_users() // input on form + || cur_frm?.get_involved_users() // comment box / dialog on active form + || []; + + return values + .filter(val => involved_users.includes(val.id)) + .concat(values.filter(val => !involved_users.includes(val.id))); + } + get_toolbar_options() { return [ [{ header: [1, 2, 3, false] }], diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 4e38a5ee7e..ea37c80e5e 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1873,6 +1873,29 @@ frappe.ui.form.Form = class FrappeForm { get_active_tab() { return this.active_tab_map && this.active_tab_map[this.docname]; } + + get_involved_users() { + let user_fields = this.meta.fields + .filter(d => d.fieldtype === 'Link' && d.options === 'User') + .map(d => d.fieldname); + + user_fields = [...user_fields, "owner", "modified_by"]; + let involved_users = user_fields.map(field => this.doc[field]); + + const docinfo = this.get_docinfo(); + + involved_users = involved_users.concat( + docinfo.communications.map(d => d.sender && d.delivery_status === 'sent'), + docinfo.comments.map(d => d.owner), + docinfo.versions.map(d => d.owner), + docinfo.assignments.map(d => d.owner) + ); + + return involved_users + .uniqBy(u => u) + .filter(user => !['Administrator', frappe.session.user].includes(user)) + .filter(Boolean); + } }; frappe.validated = 0; diff --git a/frappe/public/js/frappe/form/sidebar/review.js b/frappe/public/js/frappe/form/sidebar/review.js index 2d54ad4329..242f6f0435 100644 --- a/frappe/public/js/frappe/form/sidebar/review.js +++ b/frappe/public/js/frappe/form/sidebar/review.js @@ -38,30 +38,9 @@ frappe.ui.form.Review = class Review { review_button.click(() => this.show_review_dialog()); } } - get_involved_users() { - const user_fields = this.frm.meta.fields - .filter(d => d.fieldtype === 'Link' && d.options === 'User') - .map(d => d.fieldname); - user_fields.push('owner'); - let involved_users = user_fields.map(field => this.frm.doc[field]); - - const docinfo = this.frm.get_docinfo(); - - involved_users = involved_users.concat( - docinfo.communications.map(d => d.sender && d.delivery_status === 'sent'), - docinfo.comments.map(d => d.owner), - docinfo.versions.map(d => d.owner), - docinfo.assignments.map(d => d.owner) - ); - - return involved_users - .uniqBy(u => u) - .filter(user => !['Administrator', frappe.session.user].includes(user)) - .filter(Boolean); - } show_review_dialog() { - const user_options = this.get_involved_users(); + const user_options = this.frm.get_involved_users(); const review_dialog = new frappe.ui.Dialog({ 'title': __('Add Review'), 'fields': [{