diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js index 164a24cd7b8..9f0299565d2 100644 --- a/addons/mail/static/src/js/chatter.js +++ b/addons/mail/static/src/js/chatter.js @@ -31,6 +31,7 @@ var Chatter = Widget.extend({ discard_record_changes: '_onDiscardRecordChanges', reload_attachment_box: '_onReloadAttachmentBox', reload_mail_fields: '_onReloadMailFields', + reset_suggested_partners: '_onResetSuggestedPartners', }, events: { 'click .o_chatter_button_new_message': '_onOpenComposerMessage', @@ -68,6 +69,7 @@ var Chatter = Widget.extend({ // suggestions as well once fetched this._mentionPartnerSuggestions = this.call('mail_service', 'getMentionPartnerSuggestions'); this._mentionSuggestions = this._mentionPartnerSuggestions; + this._suggestedPartnersProm = undefined; if (mailFields.mail_activity) { this.fields.activity = new Activity(this, mailFields.mail_activity, record, options); @@ -406,6 +408,12 @@ var Chatter = Widget.extend({ } }).then(always).guardedCatch(always); }, + /** + * @private + */ + _resetSuggestedPartners() { + this._suggestedPartnersProm = undefined; + }, /** * @private * @param {Object} record @@ -422,9 +430,9 @@ var Chatter = Widget.extend({ default_res_id: record.res_id || false, default_model: record.model || false, }; - // reset the suggested_partners_def to ensure a reload of the + // reset the _suggestedPartnersProm to ensure a reload of the // suggested partners when opening the composer on another record - this.suggested_partners_def = undefined; + this._resetSuggestedPartners(); } this.record = record; this.recordName = record.data.display_name; @@ -475,6 +483,7 @@ var Chatter = Widget.extend({ }); }, + //-------------------------------------------------------------------------- // Handlers //-------------------------------------------------------------------------- @@ -537,8 +546,8 @@ var Chatter = Widget.extend({ }, _onOpenComposerMessage: function () { var self = this; - if (!this.suggested_partners_def) { - this.suggested_partners_def = new Promise(function (resolve, reject) { + if (!this._suggestedPartnersProm) { + this._suggestedPartnersProm = new Promise(function (resolve, reject) { self._rpc({ route: '/mail/get_suggested_recipients', params: { @@ -546,7 +555,7 @@ var Chatter = Widget.extend({ res_ids: [self.context.default_res_id], }, }).then(function (result) { - if (!self.suggested_partners_def) { + if (!self._suggestedPartnersProm) { return; // widget has been reset (e.g. we just switched to another record) } var suggested_partners = []; @@ -566,7 +575,7 @@ var Chatter = Widget.extend({ }); }); } - this.suggested_partners_def.then(function (suggested_partners) { + this._suggestedPartnersProm.then(function (suggested_partners) { self._openComposer({ isLog: false, suggested_partners: suggested_partners }); }); }, @@ -610,6 +619,14 @@ var Chatter = Widget.extend({ keepChanges: true, }); }, + /** + * @private + * @param {OdooEvent} ev + */ + _onResetSuggestedPartners(ev) { + ev.stopPropagation(); + this._resetSuggestedPartners(); + }, /** * @private */ diff --git a/addons/mail/static/src/js/composers/chatter_composer.js b/addons/mail/static/src/js/composers/chatter_composer.js index 3109528cfed..4b20e5b2d25 100644 --- a/addons/mail/static/src/js/composers/chatter_composer.js +++ b/addons/mail/static/src/js/composers/chatter_composer.js @@ -224,6 +224,9 @@ var ChatterComposer = BasicComposer.extend({ message.context = _.defaults({}, message.context, { mail_post_autofollow: true, }); + if (partnerIDs.length) { + self.trigger_up('reset_suggested_partners'); + } resolve(message); }); } else { diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js index 1c57150e28c..f0f3394c1e1 100644 --- a/addons/mail/static/tests/chatter_tests.js +++ b/addons/mail/static/tests/chatter_tests.js @@ -3074,6 +3074,82 @@ QUnit.test('chatter: mention prefetched partners (followers & employees)', async form.destroy(); }); +QUnit.test('chatter: display suggested partners only once', async function (assert) { + assert.expect(3); + + let isMessageSent = false; + + const form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + services: this.services, + arch: ` +
+ + + +
+ + +
+
`, + res_id: 2, + async mockRPC(route, args) { + if (route === '/mail/read_followers') { + return { + followers: [], + subtypes: [], + }; + } + if (route === '/mail/get_suggested_recipients') { + if (isMessageSent) { + return { + 2: [], + }; + } + return { + 2: [[2, "Jack ", "Partner Profile"]], + }; + } + if (args.method === 'message_post') { + isMessageSent = true; + return 57923; + } + if (args.method === 'message_format') { + return [{ + author_id: ["42", "Me"], + model: 'partner', + }]; + } + return this._super(route, args); + }, + session: {}, + }); + + await testUtils.dom.click(form.$('.o_chatter_button_new_message')); + const $input = form.$('.oe_chatter .o_composer_text_field:first()'); + assert.containsOnce( + form, + 'div.o_composer_suggested_partners input', + "should show one suggested recipient"); + assert.strictEqual( + form.$('div.o_composer_suggested_partners label').text().replace(/\s+/g, ''), + "Jack(jack@example.com)", + "should have the correct label"); + + $input.val("BBQ and beers tonight! Are you in?"); + await testUtils.dom.click(form.$('.o_composer_button_send')); + // Open composer for new message + await testUtils.dom.click(form.$('.o_chatter_button_new_message')); + assert.containsNone( + form, + 'div.o_composer_suggested_partners input', + "should no longer show the suggested recipient"); + + form.destroy(); +}); + QUnit.module('FieldMany2ManyTagsEmail', { beforeEach: function () { this.data = {