summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/js
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-02-26 16:39:30 +0100
committerChristophe Simonis <chs@odoo.com>2019-02-26 16:39:30 +0100
commitff9c9341d6ed4e9ab18a0aa02e79441999d658f1 (patch)
tree47ffd01e071d3783cff6013cfc4b6c3d8e47a841 /addons/mail/static/src/js
parentbc84fdf71b15ad419f8693861aea682ee751f85c (diff)
parentfcb972db9dc778eeaf7d6b6ba3638c78d93998ad (diff)
[MERGE] forward port branch saas-12.2 up to fcb972db9dc
Diffstat (limited to 'addons/mail/static/src/js')
-rw-r--r--addons/mail/static/src/js/chatter.js9
-rw-r--r--addons/mail/static/src/js/models/threads/channel.js26
-rw-r--r--addons/mail/static/src/js/models/threads/dm_chat.js4
-rw-r--r--addons/mail/static/src/js/models/threads/mixins/channel_seen_mixin.js38
-rw-r--r--addons/mail/static/src/js/services/mail_manager.js31
-rw-r--r--addons/mail/static/src/js/services/mail_notification_manager.js31
-rw-r--r--addons/mail/static/src/js/thread_widget.js1
-rw-r--r--addons/mail/static/src/js/thread_windows/thread_window.js3
8 files changed, 78 insertions, 65 deletions
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js
index 330e56b77b4..72971fbeee9 100644
--- a/addons/mail/static/src/js/chatter.js
+++ b/addons/mail/static/src/js/chatter.js
@@ -90,6 +90,7 @@ var Chatter = Widget.extend({
this._$topbar = this.$('.o_chatter_topbar');
if(!this._disableAttachmentBox) {
this.$('.o_topbar_right_area').append(QWeb.render('mail.chatter.Attachment.Button', {
+ displayCounter: !!this.fields.thread,
count: this.record.data.message_attachment_count || 0,
}));
}
@@ -362,7 +363,9 @@ var Chatter = Widget.extend({
if (this._isAttachmentBoxOpen) {
this._fetchAttachments().then(this._openAttachmentBox.bind(this));
}
- this.trigger_up('reload', { fieldNames: ['message_attachment_count'] });
+ if (this.fields.thread) {
+ this.trigger_up('reload', { fieldNames: ['message_attachment_count'] });
+ }
},
/**
* @private
@@ -490,7 +493,9 @@ var Chatter = Widget.extend({
})
.then(function () {
self._reloadAttachmentBox();
- self.fields.thread.removeAttachments([ev.data.attachmentId]);
+ if (self.fields.thread) {
+ self.fields.thread.removeAttachments([ev.data.attachmentId]);
+ }
self.trigger_up('reload');
});
}
diff --git a/addons/mail/static/src/js/models/threads/channel.js b/addons/mail/static/src/js/models/threads/channel.js
index 7db3474ebb2..9f0f37264db 100644
--- a/addons/mail/static/src/js/models/threads/channel.js
+++ b/addons/mail/static/src/js/models/threads/channel.js
@@ -1,7 +1,6 @@
odoo.define('mail.model.Channel', function (require) {
"use strict";
-var ChannelSeenMixin = require('mail.model.ChannelSeenMixin');
var SearchableThread = require('mail.model.SearchableThread');
var ThreadTypingMixin = require('mail.model.ThreadTypingMixin');
var mailUtils = require('mail.utils');
@@ -17,7 +16,7 @@ var time = require('web.time');
* Any piece of code in JS that make use of channels must ideally interact with
* such objects, instead of direct data from the server.
*/
-var Channel = SearchableThread.extend(ChannelSeenMixin, ThreadTypingMixin, {
+var Channel = SearchableThread.extend(ThreadTypingMixin, {
/**
* @override
* @param {Object} params
@@ -50,7 +49,6 @@ var Channel = SearchableThread.extend(ChannelSeenMixin, ThreadTypingMixin, {
init: function (params) {
var self = this;
this._super.apply(this, arguments);
- ChannelSeenMixin.init.apply(this, arguments);
ThreadTypingMixin.init.apply(this, arguments);
var data = params.data;
@@ -387,24 +385,10 @@ var Channel = SearchableThread.extend(ChannelSeenMixin, ThreadTypingMixin, {
*/
_markAsRead: function () {
var superDef = this._super.apply(this, arguments);
- var seenDef = this._throttleNotifySeen();
+ var seenDef = this._notifySeen();
return $.when(superDef, seenDef);
},
/**
- * @override {mail.model.ThreadSeenMixin}
- * @private
- * @returns {$.Promise}
- */
- _notifyFetched: function () {
- return this._rpc({
- model: 'mail.channel',
- method: 'channel_fetched',
- args: [[this._id]],
- }, {
- shadow: true
- });
- },
- /**
* @override {mail.model.ThreadTypingMixin}
* @private
* @param {Object} params
@@ -420,20 +404,16 @@ var Channel = SearchableThread.extend(ChannelSeenMixin, ThreadTypingMixin, {
}, { shadow: true });
},
/**
- * @override {mail.model.ThreadSeenMixin}
* @private
* @returns {$.Promise<integer>} resolved with ID of last seen message
*/
_notifySeen: function () {
var self = this;
- this._cancelThrottledNotifyFetched();
return this._rpc({
model: 'mail.channel',
method: 'channel_seen',
args: [[this._id]],
- }, {
- shadow: true
- }).then(function (lastSeenMessageID) {
+ }, { shadow: true }).then(function (lastSeenMessageID) {
self._lastSeenMessageID = lastSeenMessageID;
return lastSeenMessageID;
});
diff --git a/addons/mail/static/src/js/models/threads/dm_chat.js b/addons/mail/static/src/js/models/threads/dm_chat.js
index fb524515193..c0ba9c527b0 100644
--- a/addons/mail/static/src/js/models/threads/dm_chat.js
+++ b/addons/mail/static/src/js/models/threads/dm_chat.js
@@ -1,6 +1,7 @@
odoo.define('mail.model.DMChat', function (require) {
"use strict";
+var ChannelSeenMixin = require('mail.model.ChannelSeenMixin');
var TwoUserChannel = require('mail.model.TwoUserChannel');
var core = require('web.core');
@@ -11,7 +12,7 @@ var _t = core._t;
* Any piece of code in JS that make use of DMs must ideally interact with
* such objects, instead of direct data from the server.
*/
-var DMChat = TwoUserChannel.extend({
+var DMChat = TwoUserChannel.extend(ChannelSeenMixin, {
/**
* @override
* @param {Object} params
@@ -27,6 +28,7 @@ var DMChat = TwoUserChannel.extend({
*/
init: function (params) {
this._super.apply(this, arguments);
+ ChannelSeenMixin.init.apply(this, arguments);
var data = params.data;
diff --git a/addons/mail/static/src/js/models/threads/mixins/channel_seen_mixin.js b/addons/mail/static/src/js/models/threads/mixins/channel_seen_mixin.js
index 8a59db70aa2..20a5bba5407 100644
--- a/addons/mail/static/src/js/models/threads/mixins/channel_seen_mixin.js
+++ b/addons/mail/static/src/js/models/threads/mixins/channel_seen_mixin.js
@@ -1,8 +1,6 @@
odoo.define('mail.model.ChannelSeenMixin', function (require) {
"use strict";
-var CCThrottleFunction = require('mail.model.CCThrottleFunction');
-
var session = require('web.session');
/**
@@ -25,12 +23,6 @@ var ChannelSeenMixin = {
init: function (params) {
this._seenPartnersInfo = params.data.seen_partners_info || [];
- this._throttleNotifySeen = _.throttle(this._notifySeen.bind(this), 3000);
- this._throttleNotifyFetched = CCThrottleFunction({
- duration: 3000,
- func: this._notifyFetched.bind(this),
- });
-
this.on('message_added', this, this._onSeenMessageAdded);
},
@@ -221,34 +213,6 @@ var ChannelSeenMixin = {
},
//--------------------------------------------------------------------------
- // Private
- //--------------------------------------------------------------------------
-
- /**
- * @private
- */
- _cancelThrottledNotifyFetched: function () {
- this._throttleNotifyFetched.cancel();
- this._throttleNotifyFetched.clear();
- },
- /**
- * @abstract
- * @private
- * @returns {$.Promise}
- */
- _notifyFetched: function () {
- return $.when();
- },
- /**
- * @abstract
- * @private
- * @returns {$.Promise<integer>} resolved with ID of last seen message
- */
- _notifySeen: function () {
- return $.when();
- },
-
- //--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
@@ -256,7 +220,7 @@ var ChannelSeenMixin = {
* @private
*/
_onSeenMessageAdded: function () {
- this._throttleNotifyFetched();
+ this.call('mail_service', 'notifyChannelFetched', { channelID: this._id });
},
};
diff --git a/addons/mail/static/src/js/services/mail_manager.js b/addons/mail/static/src/js/services/mail_manager.js
index 204a88bb8e9..5eb588d24e7 100644
--- a/addons/mail/static/src/js/services/mail_manager.js
+++ b/addons/mail/static/src/js/services/mail_manager.js
@@ -53,6 +53,12 @@ var MailManager = AbstractService.extend({
*/
start: function () {
this._super.apply(this, arguments);
+
+ this._throttleNotifyChannelFetched = _.throttle(this._notifyChannelFetched.bind(this), 3000);
+ // List of channel that have requested the service to notify when
+ // it has been fetched, so that throttled RPCs batch the ids.
+ this._toNotifyChannelFetchedIDs = [];
+
this._initializeInternalState();
this._listenOnBuses();
this._fetchMailStateFromServer();
@@ -339,6 +345,14 @@ var MailManager = AbstractService.extend({
}
},
/**
+ * @param {Object} data
+ * @param {integer} data.channelID
+ */
+ notifyChannelFetched: function (data) {
+ this._toNotifyChannelFetchedIDs = _.uniq(this._toNotifyChannelFetchedIDs.concat(data.channelID));
+ this._throttleNotifyChannelFetched();
+ },
+ /**
* @param {integer|string} threadID
*/
openThread: function (threadID) {
@@ -919,6 +933,23 @@ var MailManager = AbstractService.extend({
return new Message(this, data);
},
/**
+ * @private
+ * @returns {$.Promise}
+ */
+ _notifyChannelFetched: function () {
+ var channelIDs = this._toNotifyChannelFetchedIDs;
+ this._toNotifyChannelFetchedIDs = [];
+ if (_.isEmpty(channelIDs)) {
+ // no channel to notify fetched
+ return $.when();
+ }
+ return this._rpc({
+ model: 'mail.channel',
+ method: 'channel_fetched',
+ args: [channelIDs],
+ }, { shadow: true });
+ },
+ /**
* shows a popup to notify a new received message.
* This will also rename the browser tab if this is not the active tab.
*
diff --git a/addons/mail/static/src/js/services/mail_notification_manager.js b/addons/mail/static/src/js/services/mail_notification_manager.js
index b77fa3e65fd..fb3527b2b90 100644
--- a/addons/mail/static/src/js/services/mail_notification_manager.js
+++ b/addons/mail/static/src/js/services/mail_notification_manager.js
@@ -80,7 +80,9 @@ MailManager.include({
if (!channel) {
return;
}
- channel.updateSeenPartnersInfo(data);
+ if (channel.hasSeenFeature()) {
+ channel.updateSeenPartnersInfo(data);
+ }
},
/**
* Called when a new or updated message is received on a channel
@@ -126,7 +128,9 @@ MailManager.include({
if (!channel) {
return;
}
- channel.updateSeenPartnersInfo(data);
+ if (channel.hasSeenFeature()) {
+ channel.updateSeenPartnersInfo(data);
+ }
if (session.partner_id !== data.partner_id) {
return;
}
@@ -236,6 +240,27 @@ MailManager.include({
}
},
/**
+ * Called when receiving a multi_user_channel seen notification. Only
+ * the current user is notified. This must be handled as if this is a
+ * channel seen notification.
+ *
+ * Note that this is a 'res.partner' notification because only the current
+ * user is notified on channel seen. This is a consequence from disabling
+ * the seen feature on multi_user_channel, because we still need to get
+ * the last seen message ID in order to display the "New Messages" separator
+ * in Discuss.
+ *
+ * @private
+ * @param {Object} data
+ * @param {integer} data.channel_id
+ * @param {string} data.info 'channel_seen'
+ * @param {integer} data.last_message_id
+ * @param {integer} data.partner_id
+ */
+ _handlePartnerChannnelSeenNotification: function (data) {
+ this._handleChannelSeenNotification(data.channel_id, data);
+ },
+ /**
* Add or remove failure when receiving a failure update message
*
* @private
@@ -387,6 +412,8 @@ MailManager.include({
this._handlePartnerMailFailureNotification(data);
} else if (data.type === 'user_connection') {
this._handlePartnerUserConnectionNotification(data);
+ } else if (data.info === 'channel_seen') {
+ this._handlePartnerChannnelSeenNotification(data);
} else {
this._handlePartnerChannelNotification(data);
}
diff --git a/addons/mail/static/src/js/thread_widget.js b/addons/mail/static/src/js/thread_widget.js
index 2e2b7e222c6..cbac2c3b417 100644
--- a/addons/mail/static/src/js/thread_widget.js
+++ b/addons/mail/static/src/js/thread_widget.js
@@ -103,6 +103,7 @@ var ThreadWidget = Widget.extend({
this._messageSeenPopover.popover('hide');
}
this._destroyOpenSeenPopoverIDs();
+ this._super();
},
/**
* @param {mail.model.AbstractThread} thread the thread to render.
diff --git a/addons/mail/static/src/js/thread_windows/thread_window.js b/addons/mail/static/src/js/thread_windows/thread_window.js
index 11a7f8a7926..e5496e0bc3c 100644
--- a/addons/mail/static/src/js/thread_windows/thread_window.js
+++ b/addons/mail/static/src/js/thread_windows/thread_window.js
@@ -402,6 +402,9 @@ var ThreadWindow = AbstractThreadWindow.extend({
* @param {integer} channelID
*/
_onUpdateChannel: function (channelID) {
+ if (!this.hasThread()) {
+ return;
+ }
if (this._thread.getID() !== channelID) {
return;
}