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