diff options
| author | Alexandre Kühn <aku@odoo.com> | 2018-12-05 14:35:21 +0000 |
|---|---|---|
| committer | Alexandre Kühn <aku@odoo.com> | 2018-12-06 16:18:09 +0000 |
| commit | 50dfa865ea32c88d55e7eb0fce6a6ae978c9c3b4 (patch) | |
| tree | dd0e28f5c15e79d123c43168eb9cfe070dad8e2b /addons | |
| parent | f372ac541f6a90a741253acdfd35cf5f2cc97696 (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.js | 38 | ||||
| -rw-r--r-- | addons/mail/static/src/js/discuss.js | 11 | ||||
| -rw-r--r-- | addons/mail/static/src/scss/composer.scss | 5 | ||||
| -rw-r--r-- | addons/mail/static/src/xml/composer.xml | 1 | ||||
| -rw-r--r-- | addons/mail/static/src/xml/thread.xml | 2 | ||||
| -rw-r--r-- | addons/mail/static/tests/discuss_tests.js | 67 |
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(); |
