[FIX] mail: only show suggested partners once

In the chatter composer, suggested partners were shown more than
necessary.

1. Create a new partner;
2. Open the chatter composer to send a message
(the new partner is suggested as a recipient);
3. Re-open the chatter composer
=> the partner is still suggested, but it is already a follower now!

Task-Id 2050102

closes odoo/odoo#35604

Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>


Co-authored-by: jbm-odoo <jbm@odoo.com>
This commit is contained in:
Lucas Lefèvre
2019-08-14 12:11:18 +00:00
committed by Alexandre Kühn
co-authored by jbm-odoo
parent 59f838d5b1
commit 14bb91e9ae
3 changed files with 102 additions and 6 deletions
+23 -6
View File
@@ -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
*/
@@ -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 {
+76
View File
@@ -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: `
<form string="Partners">
<sheet>
<field name="foo"/>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread" options="{'display_log_button': True}"/>
</div>
</form>`,
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 <jack@example.com>", "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 = {