diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-06-29 12:46:00 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-06-29 12:46:00 +0200 |
| commit | 49edee1f4bd74bc342863d8ef50eb86de0b4c55f (patch) | |
| tree | 20f449f08ba1f4a548c9cb2d82f67f2545048419 /addons/mail/static/src | |
| parent | 4a08388492c6667b7f4a11f1397b8557c355b208 (diff) | |
| parent | d54a3726eca6ad48d969d5b4a6e559f783809832 (diff) | |
[MERGE] forward port branch saas-11.4 up to d54a3726eca
Diffstat (limited to 'addons/mail/static/src')
| -rw-r--r-- | addons/mail/static/src/js/chatter.js | 70 | ||||
| -rw-r--r-- | addons/mail/static/src/js/chatter_composer.js | 25 | ||||
| -rw-r--r-- | addons/mail/static/src/js/services/chat_window_manager.js | 2 | ||||
| -rw-r--r-- | addons/mail/static/src/js/systray.js | 2 | ||||
| -rw-r--r-- | addons/mail/static/src/scss/composer.scss | 2 |
5 files changed, 85 insertions, 16 deletions
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js index e48a7c60028..63948b8429a 100644 --- a/addons/mail/static/src/js/chatter.js +++ b/addons/mail/static/src/js/chatter.js @@ -24,6 +24,7 @@ var QWeb = core.qweb; var Chatter = Widget.extend({ template: 'mail.Chatter', custom_events: { + discard_record_changes: '_onDiscardRecordChanges', reload_mail_fields: '_onReloadMailFields', }, events: { @@ -155,6 +156,37 @@ var Chatter = Widget.extend({ } }, /** + * Discard changes on the record. + * + * @private + * @returns {$.Deferred} resolved if successfully discarding changes on + * the record, rejected otherwise + */ + _discardChanges: function () { + var def = $.Deferred(); + this.trigger_up('discard_changes', { + recordID: this.record.id, + onSuccess: def.resolve.bind(def), + onFailure: def.reject.bind(def), + }); + return def; + }, + /** + * Discard changes on the record if the message will reload the record + * after posting it + * + * @private + * @param {Object} message + * @return {$.Deferred} resolved if no reload or proceed to discard the + * changes on the record, rejected otherwise + */ + _discardOnReload: function (message) { + if (this._reloadAfterPost(message)) { + return this._discardChanges(); + } + return $.when(); + }, + /** * @private */ _disableChatter: function () { @@ -199,11 +231,13 @@ var Chatter = Widget.extend({ self.composer.focus(); } self.composer.on('post_message', self, function (message) { - self.fields.thread.postMessage(message).then(function () { - self._closeComposer(true); - if (self.postRefresh === 'always' || (self.postRefresh === 'recipients' && message.partner_ids.length)) { - self.trigger_up('reload'); - } + self._discardOnReload(message).then(function () { + self.fields.thread.postMessage(message).then(function () { + self._closeComposer(true); + if (self._reloadAfterPost(message)) { + self.trigger_up('reload'); + } + }); }); }); self.composer.on('need_refresh', self, self.trigger_up.bind(self, 'reload')); @@ -216,6 +250,24 @@ var Chatter = Widget.extend({ }); }, /** + * State if the record will be reloaded after posting a message. + * Useful to warn the user of unsaved changes if the record is dirty. + * + * @private + * @param {Object} message + * @param {Array} [message.partner_ids] list of recipients of a message + * @return {boolean} true if record will be reloaded after posting the + * message, false otherwise + */ + _reloadAfterPost: function (message) { + return this.postRefresh === 'always' || + ( + this.postRefresh === 'recipients' && + message.partner_ids && + message.partner_ids.length + ); + }, + /** * @private * @param {Deferred} def * @returns {Deferred} @@ -314,8 +366,16 @@ var Chatter = Widget.extend({ //-------------------------------------------------------------------------- /** + * Discard changes on the record. + * This is notified by the composer, when opening the full-composer. + * * @private + * @param {OdooEvent} ev + * @param {function} ev.data.proceed callback to tell to proceed */ + _onDiscardRecordChanges: function (ev) { + this._discardChanges().then(ev.data.proceed); + }, _onOpenComposerMessage: function () { var self = this; if (!this.suggested_partners_def) { diff --git a/addons/mail/static/src/js/chatter_composer.js b/addons/mail/static/src/js/chatter_composer.js index da85f331863..b5c17f3f593 100644 --- a/addons/mail/static/src/js/chatter_composer.js +++ b/addons/mail/static/src/js/chatter_composer.js @@ -202,14 +202,23 @@ var ChatterComposer = composer.BasicComposer.extend({ } var self = this; - var recipient_done = $.Deferred(); - if (this.options.is_log) { - recipient_done.resolve([]); - } else { - var checked_suggested_partners = this.get_checked_suggested_partners(); - recipient_done = this.check_suggested_partners(checked_suggested_partners); - } - recipient_done.then(function (partner_ids) { + var recipientDoneDef = $.Deferred(); + + // any operation on the full-composer will reload the record, so + // warn the user that any unsaved changes on the record will be lost. + this.trigger_up('discard_record_changes', { + proceed: function () { + if (self.options.is_log) { + recipientDoneDef.resolve([]); + } else { + var checked_suggested_partners = self.get_checked_suggested_partners(); + self.check_suggested_partners(checked_suggested_partners) + .then(recipientDoneDef.resolve.bind(recipientDoneDef)); + } + }, + }); + + recipientDoneDef.then(function (partner_ids) { var context = { default_parent_id: self.id, default_body: utils.get_text2html(self.$input.val()), diff --git a/addons/mail/static/src/js/services/chat_window_manager.js b/addons/mail/static/src/js/services/chat_window_manager.js index bea6eaf0ace..fd45b336c23 100644 --- a/addons/mail/static/src/js/services/chat_window_manager.js +++ b/addons/mail/static/src/js/services/chat_window_manager.js @@ -108,7 +108,7 @@ var ChatWindowManager = AbstractService.extend({ uuid: session.uuid, name: session.name, keep_unread: options.passively, // don't automatically mark unread messages as seen - window: new ExtendedChatWindow(web_client, session.id, prefix + session.name, session.is_folded, session.unread_counter, windowOptions), + window: new ExtendedChatWindow(this, session.id, prefix + session.name, session.is_folded, session.unread_counter, windowOptions), }; chatSession.window.on("close_chat_session", null, function () { self._closeChat(chatSession); diff --git a/addons/mail/static/src/js/systray.js b/addons/mail/static/src/js/systray.js index 30191cd3845..18e9511cf25 100644 --- a/addons/mail/static/src/js/systray.js +++ b/addons/mail/static/src/js/systray.js @@ -163,7 +163,7 @@ var MessagingMenu = Widget.extend({ views: [[false, 'form']], res_id: resID }); - } else if (resModel) { + } else if (resModel && resModel !== 'mail.channel' && !resID) { this.do_action({ name: "Mail failures", type: 'ir.actions.act_window', diff --git a/addons/mail/static/src/scss/composer.scss b/addons/mail/static/src/scss/composer.scss index cb079f81558..fed625ace35 100644 --- a/addons/mail/static/src/scss/composer.scss +++ b/addons/mail/static/src/scss/composer.scss @@ -152,7 +152,7 @@ &.o_chat_inline_composer { .o_composer_container { - @include o-flex(1, 0, auto); + @include o-flex(1, 1, auto); } .o_composer { padding: $o-mail-chatter-gap $o-mail-chatter-gap 0 $o-mail-chatter-gap; |
