summaryrefslogtreecommitdiff
path: root/addons/mail/static/src
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail/static/src')
-rw-r--r--addons/mail/static/src/js/chatter.js70
-rw-r--r--addons/mail/static/src/js/chatter_composer.js25
-rw-r--r--addons/mail/static/src/js/services/chat_window_manager.js2
-rw-r--r--addons/mail/static/src/scss/composer.scss2
4 files changed, 84 insertions, 15 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/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;