summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorAlexandre Kühn <aku@odoo.com>2018-12-05 14:35:21 +0000
committerAlexandre Kühn <aku@odoo.com>2018-12-06 16:18:09 +0000
commit50dfa865ea32c88d55e7eb0fce6a6ae978c9c3b4 (patch)
treedd0e28f5c15e79d123c43168eb9cfe070dad8e2b /addons
parentf372ac541f6a90a741253acdfd35cf5f2cc97696 (diff)
[IMP] mail: discard replying to a message in discuss
This commit adds a button to discard replying to a message from the Discuss inbox. Task-ID 1881001
Diffstat (limited to 'addons')
-rw-r--r--addons/mail/static/src/js/composers/extended_composer.js38
-rw-r--r--addons/mail/static/src/js/discuss.js11
-rw-r--r--addons/mail/static/src/scss/composer.scss5
-rw-r--r--addons/mail/static/src/xml/composer.xml1
-rw-r--r--addons/mail/static/src/xml/thread.xml2
-rw-r--r--addons/mail/static/tests/discuss_tests.js67
6 files changed, 123 insertions, 1 deletions
diff --git a/addons/mail/static/src/js/composers/extended_composer.js b/addons/mail/static/src/js/composers/extended_composer.js
index f6e8560da8f..917b71fa880 100644
--- a/addons/mail/static/src/js/composers/extended_composer.js
+++ b/addons/mail/static/src/js/composers/extended_composer.js
@@ -3,7 +3,14 @@ odoo.define('mail.composer.Extended', function (require) {
var BasicComposer = require('mail.composer.Basic');
+var core = require('web.core');
+
+var QWeb = core.qweb;
+
var ExtendedComposer = BasicComposer.extend({
+ events: _.extend({}, BasicComposer.prototype.events, {
+ 'click .o_composer_button_discard': '_onClickDiscard',
+ }),
/**
* @override
*/
@@ -67,6 +74,26 @@ var ExtendedComposer = BasicComposer.extend({
setSubject: function (subject) {
this.$('.o_composer_subject input').val(subject);
},
+ /**
+ * Show the button 'discard' next to the send button. This is useful while
+ * replying to a message, when in the end we do not want to reply.
+ */
+ showDiscardButton: function () {
+ var $discard = this.$('.o_composer_button_discard');
+ $discard.removeClass('d-none');
+ $discard.addClass('d-md-inline-block');
+ },
+ /**
+ * Hide the button 'discard' next to the send button. This is useful when
+ * we were replying to a message from a certain thread, then we discard it
+ * with some other actions (i.e. switch thread). The discard button only
+ * makes sense during the selection of a message.
+ */
+ hideDiscardButton: function () {
+ var $discard = this.$('.o_composer_button_discard');
+ $discard.removeClass('d-md-inline-block');
+ $discard.addClass('d-none');
+ },
//--------------------------------------------------------------------------
// Private
@@ -93,6 +120,17 @@ var ExtendedComposer = BasicComposer.extend({
_shouldSend: function () {
return false;
},
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _onClickDiscard: function () {
+ this.trigger_up('discard_extended_composer');
+ },
});
return ExtendedComposer;
diff --git a/addons/mail/static/src/js/discuss.js b/addons/mail/static/src/js/discuss.js
index 5a5bc9e106e..dc2a1933be7 100644
--- a/addons/mail/static/src/js/discuss.js
+++ b/addons/mail/static/src/js/discuss.js
@@ -243,6 +243,7 @@ var ModeratorRejectMessageDialog = Dialog.extend({
var Discuss = AbstractAction.extend(ControlPanelMixin, {
template: 'mail.discuss',
custom_events: {
+ discard_extended_composer: '_onDiscardExtendedComposer',
message_moderation: '_onMessageModeration',
search: '_onSearch',
update_moderation_buttons: '_onUpdateModerationButtons',
@@ -927,6 +928,7 @@ var Discuss = AbstractAction.extend(ControlPanelMixin, {
this._selectedMessage = message;
var subject = "Re: " + message.getDocumentName();
this._extendedComposer.setSubject(subject);
+ this._extendedComposer.showDiscardButton();
if (this._thread.getType() !== 'mailbox') {
this._basicComposer.do_hide();
@@ -1053,6 +1055,7 @@ var Discuss = AbstractAction.extend(ControlPanelMixin, {
_unselectMessage: function () {
this._basicComposer.do_toggle(this._thread.getType() !== 'mailbox' && !this._thread.isMassMailing());
this._extendedComposer.do_toggle(this._thread.isMassMailing());
+ this._extendedComposer.hideDiscardButton();
if (!config.device.isMobile) {
var composer = this._thread.getType() !== 'mailbox' && this._thread.isMassMailing() ?
@@ -1315,6 +1318,14 @@ var Discuss = AbstractAction.extend(ControlPanelMixin, {
composer.mentionSetPrefetchedPartners(partners);
},
/**
+ * @private
+ * @param {OdooEvent} ev
+ */
+ _onDiscardExtendedComposer: function (ev) {
+ ev.stopPropagation();
+ this._unselectMessage();
+ },
+ /**
* When clicking on an item in the sidebar
*
* @private
diff --git a/addons/mail/static/src/scss/composer.scss b/addons/mail/static/src/scss/composer.scss
index f12e195abe9..bd9307bdd2f 100644
--- a/addons/mail/static/src/scss/composer.scss
+++ b/addons/mail/static/src/scss/composer.scss
@@ -147,6 +147,11 @@
}
.o_composer_send {
margin-top: $o-mail-chatter-gap;
+
+ > .o_composer_button_discard:not(:hover) {
+ background: theme-color('light');
+ border-color: transparent;
+ }
}
}
diff --git a/addons/mail/static/src/xml/composer.xml b/addons/mail/static/src/xml/composer.xml
index 6147197cd17..ec95a6d5b61 100644
--- a/addons/mail/static/src/xml/composer.xml
+++ b/addons/mail/static/src/xml/composer.xml
@@ -28,6 +28,7 @@
</div>
<div class="o_composer_send">
<button tabindex="3" class="btn btn-primary o_composer_button_send d-none d-md-inline-block" type="button"><t t-esc="widget.options.sendText"/></button>
+ <button tabindex="3" class="btn btn-secondary o_composer_button_discard d-none" type="button">Discard</button>
</div>
<span class="d-none">
<t t-call="HiddenInputFile">
diff --git a/addons/mail/static/src/xml/thread.xml b/addons/mail/static/src/xml/thread.xml
index a1e2d52e2ad..748b9d4edc6 100644
--- a/addons/mail/static/src/xml/thread.xml
+++ b/addons/mail/static/src/xml/thread.xml
@@ -259,7 +259,7 @@
@param {integer} [options.selectedMessageID]
-->
<t t-name="mail.widget.Thread.Message">
- <div t-att-class="'o_thread_message' + (message.getID() === options.selectedMessageID ? 'o_thread_selected_message ' : ' ') + (message.isDiscussion() or message.isNotification() ? ' o_mail_discussion' : ' o_mail_not_discussion')" t-att-data-message-id="message.getID()">
+ <div t-att-class="'o_thread_message ' + (message.getID() === options.selectedMessageID ? 'o_thread_selected_message ' : ' ') + (message.isDiscussion() or message.isNotification() ? ' o_mail_discussion ' : ' o_mail_not_discussion ')" t-att-data-message-id="message.getID()">
<div t-if="options.displayAvatars" class="o_thread_message_sidebar">
<t t-if="message.hasAuthor()">
<img t-if="displayAuthorMessages[message.getID()]"
diff --git a/addons/mail/static/tests/discuss_tests.js b/addons/mail/static/tests/discuss_tests.js
index 993cc1581d2..63a498e56d0 100644
--- a/addons/mail/static/tests/discuss_tests.js
+++ b/addons/mail/static/tests/discuss_tests.js
@@ -1223,6 +1223,73 @@ QUnit.test('reply to message from inbox', function (assert) {
});
});
+QUnit.test('discard replying to message from inbox', function (assert) {
+ var done = assert.async();
+ assert.expect(4);
+
+ var self = this;
+ this.data['mail.message'].records = [{
+ author_id: [5, 'Demo User'],
+ body: '<p>test 1</p>',
+ id: 1,
+ needaction: true,
+ needaction_partner_ids: [3],
+ res_id: 100,
+ model: 'some.document',
+ record_name: 'SomeDocument',
+ }];
+ this.data.initMessaging = {
+ needaction_inbox_counter: 1,
+ };
+
+ createDiscuss({
+ id: 1,
+ context: {},
+ params: {},
+ data: this.data,
+ services: this.services,
+ session: { partner_id: 3 },
+ mockRPC: function (route, args) {
+ if (args.method === 'message_post') {
+ assert.step(args.method);
+ assert.strictEqual(args.model, 'some.document',
+ "should post message to correct document model");
+ assert.strictEqual(args.args[0], 100,
+ "should post message to correct document ID");
+
+ self.data['mail.message'].records.push({
+ author_id: [3, 'Me'],
+ body: args.kwargs.body,
+ id: 2,
+ res_id: 100,
+ model: 'some.document',
+ record_name: 'SomeDocument',
+ });
+ return $.when(2);
+ }
+ return this._super.apply(this, arguments);
+ },
+ })
+ .then(function (discuss) {
+ testUtils.dom.click(discuss.$('.o_thread_message_reply'));
+ assert.containsOnce(discuss, '.o_thread_selected_message',
+ "should have a message selected");
+
+ var $composer = discuss.$('.o_thread_composer_extended');
+ assert.containsOnce($composer, '.o_composer_button_discard',
+ "should have button to discard replying to message");
+
+ testUtils.dom.click($composer.find('.o_composer_button_discard'));
+ assert.isNotVisible($composer,
+ "extended composer should become hidden on discard");
+ assert.containsNone(discuss, '.o_thread_selected_message',
+ "should not longer have a message selected");
+
+ discuss.destroy();
+ done();
+ });
+});
+
QUnit.test('no quick search channels in the sidebar with less than 20 channels', function (assert) {
assert.expect(3);
var done = assert.async();