diff --git a/addons/mail/i18n/mail.pot b/addons/mail/i18n/mail.pot index 69766609493..490ffe7340e 100644 --- a/addons/mail/i18n/mail.pot +++ b/addons/mail/i18n/mail.pot @@ -10320,6 +10320,13 @@ msgstr "" msgid "Your name" msgstr "" +#. module: mail +#. odoo-javascript +#: code:addons/mail/static/src/core/web/recipient_list.js:0 +#, python-format +msgid "[%(name)s] (no email address)" +msgstr "" + #. module: mail #. odoo-python #: code:addons/mail/models/mail_alias.py:0 diff --git a/addons/mail/static/src/core/web/chatter.js b/addons/mail/static/src/core/web/chatter.js index 5c09a534049..72c047ba4e0 100644 --- a/addons/mail/static/src/core/web/chatter.js +++ b/addons/mail/static/src/core/web/chatter.js @@ -236,9 +236,9 @@ export class Chatter extends Component { .slice(0, 5) .map(({ partner }) => { const text = partner.email ? partner.emailWithoutDomain : partner.name; - return `${escape( - text - )}`; + return `${escape(text)}`; }); const formatter = new Intl.ListFormat( this.store.env.services["user"].lang?.replace("_", "-"), diff --git a/addons/mail/static/src/core/web/recipient_list.js b/addons/mail/static/src/core/web/recipient_list.js index 6fe45992c18..a2d2cc42f37 100644 --- a/addons/mail/static/src/core/web/recipient_list.js +++ b/addons/mail/static/src/core/web/recipient_list.js @@ -3,6 +3,8 @@ import { useVisible } from "@mail/utils/common/hooks"; import { Component, useState } from "@odoo/owl"; import { useService } from "@web/core/utils/hooks"; +import { _t } from "@web/core/l10n/translation"; +import { sprintf } from "@web/core/utils/strings"; /** * @typedef {Object} Props @@ -22,4 +24,11 @@ export class RecipientList extends Component { } }); } + + getRecipientText(recipient) { + return ( + recipient.partner.email || + sprintf(_t("[%(name)s] (no email address)"), { name: recipient.partner.name }) + ); + } } diff --git a/addons/mail/static/src/core/web/recipient_list.xml b/addons/mail/static/src/core/web/recipient_list.xml index 5b4c7613b9d..866262f746d 100644 --- a/addons/mail/static/src/core/web/recipient_list.xml +++ b/addons/mail/static/src/core/web/recipient_list.xml @@ -5,7 +5,7 @@
diff --git a/addons/mail/static/tests/web/follower_list_menu_tests.js b/addons/mail/static/tests/web/follower_list_menu_tests.js index 51f900bd8cc..5df0a3088c2 100644 --- a/addons/mail/static/tests/web/follower_list_menu_tests.js +++ b/addons/mail/static/tests/web/follower_list_menu_tests.js @@ -279,6 +279,34 @@ QUnit.test("Load 100 recipients at once", async () => { await contains(".o-mail-RecipientList span", { count: 0, text: "Load more" }); }); +QUnit.test("Load recipient without email", async () => { + const pyEnv = await startServer(); + const [partnerId_1, partnerId_2] = pyEnv["res.partner"].create([ + { name: "Luigi" }, + { name: "Mario" }, + ]); + pyEnv["mail.followers"].create([ + { + is_active: true, + partner_id: pyEnv.currentPartnerId, + res_id: partnerId_1, + res_model: "res.partner", + }, + { + is_active: true, + partner_id: partnerId_2, + res_id: partnerId_1, + res_model: "res.partner", + }, + ]); + const { openFormView } = await start(); + await openFormView("res.partner", partnerId_1); + await click("button", { text: "Send message" }); + await contains("span[title='no email address']", { text: "Mario" }); + await click("button[title='Show all recipients']"); + await contains(".o-mail-RecipientList li", { text: "[Mario] (no email address)" }); +}); + QUnit.test( 'Show "Add follower" and subtypes edition/removal buttons on all followers if user has write access', async () => {