Example #1
0
odoo.define('im_support.chat_discuss', function (require) {
"use strict";

/**
 * This module includes Discuss to handle the case of the Support channel.
 */

var Discuss = require('mail.chat_discuss');

Discuss.include({
    //--------------------------------------------------------------------------
    // Private
    //--------------------------------------------------------------------------

    /**
     * Overrides to hide stars in the Support channel, as this feature does not
     * work in that channel.
     *
     * @override
     * @private
     */
    _getThreadRenderingOptions: function () {
        var options = this._super.apply(this, arguments);
        if (this.channel.supportChannel) {
            options.display_stars = false;
        }
        return options;
    },
    /**
     * Overrides to hide the attachment button in the composer of the Support
     * channel, as this feature does not work in that channel. Also hides the
     * composer when no operator is available.
     *
     * @override
     * @private
     */
    _setChannel: function (channel) {
        var self = this;
        return this._super.apply(this, arguments).then(function () {
            var $buttonAddAttachment = self.basicComposer.$('.o_composer_button_add_attachment');
            if (channel.supportChannel) {
                if (!channel.available) {
                    self.basicComposer.do_hide();
                }
                $buttonAddAttachment.hide();
            } else {
                $buttonAddAttachment.show();
            }
        });
    },
    /**
     * Overrides to handle the Support channel case (hide all buttons).
     *
     * @override
     * @private
     */
    _updateControlPanelButtons: function (channel) {
        this._super.apply(this, arguments);
        if (channel.supportChannel) {
            this.$buttons.find('button').hide();
        }
    },
});

});
Example #2
0
odoo.define('mail.chat_discuss_mobile', function (require) {
"use strict";

var Discuss = require('mail.chat_discuss');

var config = require('web.config');
var core = require('web.core');

var QWeb = core.qweb;

if (!config.device.isMobile) {
    return;
}

Discuss.include({
    template: 'mail.discuss_mobile',
    need_control_panel: false, // in mobile, we use a custom control panel
    events: _.extend(Discuss.prototype.events, {
        'click .o_mail_mobile_tab': '_onMobileTabClicked',
        'click .o_channel_inbox_item': '_onMobileInboxButtonClicked',
        'click .o_mail_channel_preview': '_onMobileChannelClicked',
    }),

    /**
     * @override
     */
    init: function () {
        this._super.apply(this, arguments);
        this.currentState = this.defaultChannelID;
    },
    /**
     * @override
     */
    start: function () {
        this.$mainContent = this.$('.o_mail_chat_content');
        return this._super.apply(this, arguments)
            .then(this._updateControlPanel.bind(this));
    },
    /**
     * @override
     */
    on_attach_callback: function () {
        if (this.channel && this._isInInboxTab()) {
            this.thread.scroll_to({offset: this.channelsScrolltop[this.channel.id]});
        }
    },
    /**
     * @override
     */
    on_detach_callback: function () {
        if (this._isInInboxTab()) {
            this.channelsScrolltop[this.channel.id] = this.thread.get_scrolltop();
        }
    },

    //--------------------------------------------------------------------------
    // Private
    //--------------------------------------------------------------------------

    /**
     * @private
     * @returns {Boolean} true iff we currently are in the Inbox tab
     */
    _isInInboxTab: function () {
        return _.contains(['channel_inbox', 'channel_starred'], this.currentState);
    },
    /**
     * @override
     * @private
     */
    _renderButtons: function () {
        var self = this;
        this._super.apply(this, arguments);
        _.each(['dm', 'public', 'private'], function (type) {
            var selector = '.o_mail_chat_button_' + type;
            self.$buttons.on('click', selector, self._onAddChannel.bind(self));
        });
    },
    /**
     * Overrides to only store the channel state if we are in the Inbox tab, as
     * this is the only tab in which we actually have a displayed channel
     *
     * @override
     * @private
     */
    _restoreChannelState: function () {
        if (this._isInInboxTab()) {
            this._super.apply(this, arguments);
        }
    },
    /**
     * Overrides to toggle the visibility of the tabs when a message is selected
     *
     * @override
     * @private
     */
    _selectMessage: function () {
        this._super.apply(this, arguments);
        this.$('.o_mail_mobile_tabs').addClass('o_hidden');
    },
    /**
     * @override
     * @private
     * @param {Object} channel
     */
    _setChannel: function (channel) {
        if (channel.type !== 'static') {
            this.call('chat_manager', 'detachChannel', channel.id);
        } else {
            this._super.apply(this, arguments);
        }
    },
    /**
     * Overrides to only store the channel state if we are in the Inbox tab, as
     * this is the only tab in which we actually have a displayed channel
     *
     * @override
     * @private
     */
    _storeChannelState: function () {
        if (this.channel && this._isInInboxTab()) {
            this._super.apply(this, arguments);
        }
    },
    /**
     * @private
     */
    _toggleSearchView: function () {
        this.searchviewDisplayed = !this.searchviewDisplayed;
        this.searchview.$el.toggleClass('o_hidden', !this.searchviewDisplayed);
        this.$buttons.toggleClass('o_hidden', this.searchviewDisplayed);
    },
    /**
     * Overrides to toggle the visibility of the tabs when a message is unselected
     *
     * @override
     * @private
     */
    _unselectMessage: function () {
        this._super.apply(this, arguments);
        this.$('.o_mail_mobile_tabs').removeClass('o_hidden');
    },
    /**
     * @override
     * @private
     */
    _updateChannels: function () {
        return this._updateContent(this.currentState);
    },
    /**
     * Redraws the content of the client action according to its current state.
     *
     * @private
     * @param {string} type the channel's type to display (e.g. 'channel_inbox',
     *   'channel_starred', 'dm'...).
     */
    _updateContent: function (type) {
        var self = this;
        var inInbox = type === 'channel_inbox' || type === 'channel_starred';
        if (!inInbox && this._isInInboxTab()) {
            // we're leaving the inbox, so store the thread scrolltop
            this._storeChannelState();
        }
        var previouslyInInbox = this._isInInboxTab();
        this.currentState = type;

        // fetch content to display
        var def;
        if (inInbox) {
            def = this._fetchAndRenderThread();
        } else {
            var allChannels = this.call('chat_manager', 'getChannels');
            var channels = _.where(allChannels, {type: type});
            def = this.call('chat_manager', 'getChannelsPreview', channels);
        }
        return $.when(def).then(function (channelsPreview) {
            // update content
            if (inInbox) {
                if (!previouslyInInbox) {
                    self.$('.o_mail_chat_tab_pane').remove();
                    self.$mainContent.append(self.thread.$el);
                    self.$mainContent.append(self.extendedComposer.$el);
                }
                self._restoreChannelState();
            } else {
                self.thread.$el.detach();
                self.extendedComposer.$el.detach();
                var $content = $(QWeb.render("mail.chat.MobileTabPane", {
                    channels: channelsPreview,
                    type: type,
                }));
                self._prepareAddChannelInput($content.find('.o_mail_add_channel input'), type);
                self.$mainContent.html($content);
            }

            // update control panel
            self.$buttons.find('button').addClass('o_hidden');
            self.$buttons.find('.o_mail_chat_button_' + type).removeClass('o_hidden');
            self.$buttons.find('.o_mail_chat_button_mark_read').toggleClass('o_hidden', type !== 'channel_inbox');
            self.$buttons.find('.o_mail_chat_button_unstar_all').toggleClass('o_hidden', type !== 'channel_starred');
            self.$('.o_enable_searchview').toggleClass('o_hidden', !inInbox);
            if (!inInbox && self.searchviewDisplayed) {
                self._toggleSearchView(); // close the searchview when leaving Inbox
            }

            // update Inbox page buttons
            if (inInbox) {
                self.$('.o_mail_chat_mobile_inbox_buttons').removeClass('o_hidden');
                self.$('.o_channel_inbox_item').removeClass('btn-primary').addClass('btn-default');
                self.$('.o_channel_inbox_item[data-type=' + type + ']').removeClass('btn-default').addClass('btn-primary');
            } else {
                self.$('.o_mail_chat_mobile_inbox_buttons').addClass('o_hidden');
            }

            // update bottom buttons
            self.$('.o_mail_mobile_tab').removeClass('active');
            // channel_inbox and channel_starred share the same tab
            type = type === 'channel_starred' ? 'channel_inbox' : type;
            self.$('.o_mail_mobile_tab[data-type=' + type + ']').addClass('active');
        });
    },
    /**
     * @override
     */
    _updateControlPanel: function () {
        this.$buttons.appendTo(this.$('.o_mail_chat_mobile_control_panel'));
        this.searchview.$el.appendTo(this.$('.o_mail_chat_mobile_control_panel'));
        var $enable_searchview = $('<button/>', {type: 'button'})
            .addClass('o_enable_searchview btn fa fa-search')
            .on('click', this._toggleSearchView.bind(this));
        $enable_searchview.insertAfter(this.searchview.$el);
    },

    //--------------------------------------------------------------------------
    // Handlers
    //--------------------------------------------------------------------------

    /**
     * @private
     */
    _onAddChannel: function () {
        this.$('.o_mail_add_channel').show().find('input').focus();
    },
    /**
     * Switches to the clicked channel in the Inbox page (Inbox or Starred).
     *
     * @private
     * @param {MouseEvent}
     */
    _onMobileInboxButtonClicked: function (event) {
        var channel = this.call('chat_manager', 'getChannel', $(event.currentTarget).data('type'));
        this._setChannel(channel);
        this._updateContent(this.channel.id);
    },
    /**
     * Switches to another tab.
     *
     * @private
     * @param {MouseEvent}
     */
    _onMobileTabClicked: function (event) {
        var type = $(event.currentTarget).data('type');
        if (type === 'channel_inbox') {
            var channel = this.call('chat_manager', 'getChannel', 'channel_inbox');
            this._setChannel(channel);
        }
        this._updateContent(type);
    },
    /**
     * Opens a channel in a chat windown (full screen in mobile).
     *
     * @private
     * @param {MouseEvent}
     */
    _onMobileChannelClicked: function (event) {
        var channelID = $(event.currentTarget).data("channel_id");
        this.call('chat_manager', 'detachChannel', channelID);
    },
});

});