[IMP] mail: introduce MessageSeenIndicator/text

Task-2793280

closes odoo/odoo#87372

Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
Alexandre Kühn
2022-03-30 19:26:36 +02:00
parent e3c9e29a44
commit c6daa388f1
3 changed files with 71 additions and 70 deletions
@@ -10,74 +10,6 @@ export class MessageSeenIndicator extends Component {
// Public
//--------------------------------------------------------------------------
/**
* @returns {string}
*/
get indicatorTitle() {
if (!this.messageSeenIndicator) {
return '';
}
if (this.messageSeenIndicator.hasEveryoneSeen) {
return this.env._t("Seen by Everyone");
}
if (this.messageSeenIndicator.hasSomeoneSeen) {
const partnersThatHaveSeen = this.messageSeenIndicator.partnersThatHaveSeen.map(partner => {
if (this.message.originThread) {
return this.message.originThread.getMemberName(partner);
}
return partner.nameOrDisplayName;
});
if (partnersThatHaveSeen.length === 1) {
return _.str.sprintf(
this.env._t("Seen by %s"),
partnersThatHaveSeen[0]
);
}
if (partnersThatHaveSeen.length === 2) {
return _.str.sprintf(
this.env._t("Seen by %s and %s"),
partnersThatHaveSeen[0],
partnersThatHaveSeen[1]
);
}
return _.str.sprintf(
this.env._t("Seen by %s, %s and more"),
partnersThatHaveSeen[0],
partnersThatHaveSeen[1]
);
}
if (this.messageSeenIndicator.hasEveryoneFetched) {
return this.env._t("Received by Everyone");
}
if (this.messageSeenIndicator.hasSomeoneFetched) {
const partnersThatHaveFetched = this.messageSeenIndicator.partnersThatHaveFetched.map(partner => {
if (this.message.originThread) {
return this.message.originThread.getMemberName(partner);
}
return partner.nameOrDisplayName;
});
if (partnersThatHaveFetched.length === 1) {
return _.str.sprintf(
this.env._t("Received by %s"),
partnersThatHaveFetched[0]
);
}
if (partnersThatHaveFetched.length === 2) {
return _.str.sprintf(
this.env._t("Received by %s and %s"),
partnersThatHaveFetched[0],
partnersThatHaveFetched[1]
);
}
return _.str.sprintf(
this.env._t("Received by %s, %s and more"),
partnersThatHaveFetched[0],
partnersThatHaveFetched[1]
);
}
return '';
}
/**
* @returns {Message}
*/
@@ -3,7 +3,7 @@
<t t-name="mail.MessageSeenIndicator" owl="1">
<t t-if="messageSeenIndicator">
<span class="o_MessageSeenIndicator" t-att-class="{ 'o-all-seen': messageSeenIndicator.hasEveryoneSeen }" t-attf-class="{{ className }}" t-att-title="indicatorTitle" t-ref="root">
<span class="o_MessageSeenIndicator" t-att-class="{ 'o-all-seen': messageSeenIndicator.hasEveryoneSeen }" t-attf-class="{{ className }}" t-att-title="messageSeenIndicator.text" t-ref="root">
<t t-if="!messageSeenIndicator.isMessagePreviousToLastCurrentPartnerMessageSeenByEveryone">
<t t-if="messageSeenIndicator.hasSomeoneFetched or messageSeenIndicator.hasSomeoneSeen">
<i class="o_MessageSeenIndicator_icon o-first fa fa-check"/>
@@ -2,7 +2,7 @@
import { registerModel } from '@mail/model/model_core';
import { attr, many, one } from '@mail/model/model_field';
import { replace, unlinkAll } from '@mail/model/model_field_command';
import { clear, replace, unlinkAll } from '@mail/model/model_field_command';
registerModel({
name: 'MessageSeenIndicator',
@@ -165,6 +165,71 @@ registerModel({
}
return replace(otherPartnersThatHaveSeen);
},
/**
* @private
* @returns {string|FieldCommand}
*/
_computeText() {
if (this.hasEveryoneSeen) {
return this.env._t("Seen by Everyone");
}
if (this.hasSomeoneSeen) {
const partnersThatHaveSeen = this.partnersThatHaveSeen.map(partner => {
if (this.message.originThread) {
return this.message.originThread.getMemberName(partner);
}
return partner.nameOrDisplayName;
});
if (partnersThatHaveSeen.length === 1) {
return _.str.sprintf(
this.env._t("Seen by %s"),
partnersThatHaveSeen[0]
);
}
if (partnersThatHaveSeen.length === 2) {
return _.str.sprintf(
this.env._t("Seen by %s and %s"),
partnersThatHaveSeen[0],
partnersThatHaveSeen[1]
);
}
return _.str.sprintf(
this.env._t("Seen by %s, %s and more"),
partnersThatHaveSeen[0],
partnersThatHaveSeen[1]
);
}
if (this.hasEveryoneFetched) {
return this.env._t("Received by Everyone");
}
if (this.hasSomeoneFetched) {
const partnersThatHaveFetched = this.partnersThatHaveFetched.map(partner => {
if (this.message.originThread) {
return this.message.originThread.getMemberName(partner);
}
return partner.nameOrDisplayName;
});
if (partnersThatHaveFetched.length === 1) {
return _.str.sprintf(
this.env._t("Received by %s"),
partnersThatHaveFetched[0]
);
}
if (partnersThatHaveFetched.length === 2) {
return _.str.sprintf(
this.env._t("Received by %s and %s"),
partnersThatHaveFetched[0],
partnersThatHaveFetched[1]
);
}
return _.str.sprintf(
this.env._t("Received by %s, %s and more"),
partnersThatHaveFetched[0],
partnersThatHaveFetched[1]
);
}
return clear();
},
},
fields: {
hasEveryoneFetched: attr({
@@ -201,6 +266,10 @@ registerModel({
partnersThatHaveSeen: many('Partner', {
compute: '_computePartnersThatHaveSeen',
}),
text: attr({
compute: '_computeText',
default: '',
}),
/**
* The thread concerned by this seen indicator.
*/