summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/models/thread/thread.js
diff options
context:
space:
mode:
authorSébastien Theys <seb@odoo.com>2020-12-09 14:00:00 +0000
committerSébastien Theys <seb@odoo.com>2020-12-09 14:00:00 +0000
commit1dfb90365c216d8767d173582bb14dc74242808e (patch)
treebaf213129e5b3f1b5ae994fbd38d7c4f2d45358f /addons/mail/static/src/models/thread/thread.js
parent49b8f1bfde1792079c0fd9cdb218eab20f344be3 (diff)
[FIX] mail: only highlight needaction on their origin thread
task-2391170 closes odoo/odoo#62981 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Diffstat (limited to 'addons/mail/static/src/models/thread/thread.js')
-rw-r--r--addons/mail/static/src/models/thread/thread.js83
1 files changed, 81 insertions, 2 deletions
diff --git a/addons/mail/static/src/models/thread/thread.js b/addons/mail/static/src/models/thread/thread.js
index e692f00fe87..4e1f1119351 100644
--- a/addons/mail/static/src/models/thread/thread.js
+++ b/addons/mail/static/src/models/thread/thread.js
@@ -656,7 +656,16 @@ function factory(dependencies) {
}
/**
- * Mark all needaction messages of this thread as read.
+ * Marks as read all needaction messages with this thread as origin.
+ */
+ async markNeedactionMessagesAsOriginThreadAsRead() {
+ await this.async(() =>
+ this.env.models['mail.message'].markAsRead(this.needactionMessagesAsOriginThread)
+ );
+ }
+
+ /**
+ * Mark as read all needaction messages of this thread.
*/
async markNeedactionMessagesAsRead() {
await this.async(() =>
@@ -1240,6 +1249,24 @@ function factory(dependencies) {
/**
* @private
+ * @returns {mail.message|undefined}
+ */
+ _computeLastNeedactionMessageAsOriginThread() {
+ const orderedNeedactionMessagesAsOriginThread = this.needactionMessagesAsOriginThread.sort(
+ (m1, m2) => m1.id < m2.id ? -1 : 1
+ );
+ const {
+ length: l,
+ [l - 1]: lastNeedactionMessageAsOriginThread,
+ } = orderedNeedactionMessagesAsOriginThread;
+ if (lastNeedactionMessageAsOriginThread) {
+ return [['link', lastNeedactionMessageAsOriginThread]];
+ }
+ return [['unlink']];
+ }
+
+ /**
+ * @private
* @returns {mail.thread_cache}
*/
_computeMainCache() {
@@ -1251,6 +1278,10 @@ function factory(dependencies) {
* @returns {integer}
*/
_computeLocalMessageUnreadCounter() {
+ if (this.model !== 'mail.channel') {
+ // unread counter only makes sense on channels
+ return clear();
+ }
// By default trust the server up to the last message it used
// because it's not possible to do better.
let baseCounter = this.serverMessageUnreadCounter;
@@ -1296,6 +1327,14 @@ function factory(dependencies) {
/**
* @private
+ * @returns {mail.message[]}
+ */
+ _computeNeedactionMessagesAsOriginThread() {
+ return [['replace', this.messagesAsOriginThread.filter(message => message.isNeedaction)]];
+ }
+
+ /**
+ * @private
* @returns {mail.message|undefined}
*/
_computeMessageAfterNewMessageSeparator() {
@@ -1809,6 +1848,15 @@ function factory(dependencies) {
dependencies: ['needactionMessages'],
}),
/**
+ * States the last known needaction message having this thread as origin.
+ */
+ lastNeedactionMessageAsOriginThread: many2one('mail.message', {
+ compute: '_computeLastNeedactionMessageAsOriginThread',
+ dependencies: [
+ 'needactionMessagesAsOriginThread',
+ ],
+ }),
+ /**
* Last non-transient message.
*/
lastNonTransientMessage: many2one('mail.message', {
@@ -1881,12 +1929,30 @@ function factory(dependencies) {
inverse: 'threads',
}),
/**
+ * All messages that have been originally posted in this thread.
+ */
+ messagesAsOriginThread: one2many('mail.message', {
+ inverse: 'originThread',
+ }),
+ /**
+ * Serves as compute dependency.
+ */
+ messagesAsOriginThreadIsNeedaction: attr({
+ related: 'messagesAsOriginThread.isNeedaction',
+ }),
+ /**
* All messages that are contained on this channel on the server.
* Equivalent to the inverse of python field `channel_ids`.
*/
messagesAsServerChannel: many2many('mail.message', {
inverse: 'serverChannels',
}),
+ /**
+ * Serves as compute dependency.
+ */
+ messagesIsNeedaction: attr({
+ related: 'messages.isNeedaction',
+ }),
messageSeenIndicators: one2many('mail.message_seen_indicator', {
inverse: 'thread',
isCausal: true,
@@ -1912,7 +1978,20 @@ function factory(dependencies) {
name: attr(),
needactionMessages: many2many('mail.message', {
compute: '_computeNeedactionMessages',
- dependencies: ['messages'],
+ dependencies: [
+ 'messages',
+ 'messagesIsNeedaction',
+ ],
+ }),
+ /**
+ * States all known needaction messages having this thread as origin.
+ */
+ needactionMessagesAsOriginThread: many2many('mail.message', {
+ compute: '_computeNeedactionMessagesAsOriginThread',
+ dependencies: [
+ 'messagesAsOriginThread',
+ 'messagesAsOriginThreadIsNeedaction',
+ ],
}),
/**
* Not a real field, used to trigger `_onChangeFollowersPartner` when one of