diff options
| author | Sébastien Theys <seb@odoo.com> | 2020-12-09 14:00:00 +0000 |
|---|---|---|
| committer | Sébastien Theys <seb@odoo.com> | 2020-12-09 14:00:00 +0000 |
| commit | 1dfb90365c216d8767d173582bb14dc74242808e (patch) | |
| tree | baf213129e5b3f1b5ae994fbd38d7c4f2d45358f /addons/mail/static/src/models/thread/thread.js | |
| parent | 49b8f1bfde1792079c0fd9cdb218eab20f344be3 (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.js | 83 |
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 |
