Files
odoo_source/addons/mail/static/src/js/chat_window.js
T
Aaron Bohy 4010c09e68 [FIX] mail: automatically open DM and livechat on new message
When a new message arrives in a DM or a livechat, the channel is automatically
open in a chat window if we aren't currently in Discuss.

Don't apply this behavior in mobile and we probably don't want to see a full
screen chat window everytime someone sends us a message.
2016-02-08 08:47:10 +01:00

145 lines
4.6 KiB
JavaScript

odoo.define('mail.ChatWindow', function (require) {
"use strict";
var ChatThread = require('mail.ChatThread');
var config = require('web.config');
var core = require('web.core');
var Widget = require('web.Widget');
var QWeb = core.qweb;
var _t = core._t;
var HEIGHT_OPEN = '400px';
var HEIGHT_FOLDED = '28px';
return Widget.extend({
template: "mail.ChatWindow",
events: {
"click .o_chat_input": "focus_input", // focus even if jquery's blockUI is enabled
"keydown .o_chat_input": "on_keydown",
"keypress .o_chat_input": "on_keypress",
"click .o_chat_window_close": "on_click_close",
"click .o_chat_title": "on_click_fold",
},
init: function (parent, channel_id, title, is_folded, unread_msgs, options) {
this._super(parent);
this.title = title;
this.channel_id = channel_id;
this.folded = is_folded;
this.options = _.defaults(options || {}, {
autofocus: true,
display_stars: true,
display_reply_icon: false,
placeholder: _t("Say something"),
input_less: false,
});
this.status = this.options.status;
this.unread_msgs = unread_msgs || 0;
this.is_hidden = false;
},
start: function () {
this.$input = this.$('.o_chat_input input');
this.$header = this.$('.o_chat_header');
this.thread = new ChatThread(this, {
channel_id: this.channel_id,
display_needactions: false,
display_stars: this.options.display_stars,
});
this.thread.on('toggle_star_status', null, this.trigger.bind(this, 'toggle_star_status'));
this.thread.on('redirect_to_channel', null, this.trigger.bind(this, 'redirect_to_channel'));
this.thread.on('redirect', null, this.trigger.bind(this, 'redirect'));
if (this.folded) {
this.$el.css('height', HEIGHT_FOLDED);
} else if (this.options.autofocus) {
this.focus_input();
}
var def = this.thread.replace(this.$('.o_chat_content'));
return $.when(this._super(), def);
},
render: function (messages) {
this.update_unread(this.unread_msgs);
this.thread.render(messages, {display_load_more: false});
},
update_unread: function (counter) {
this.unread_msgs = counter;
this.render_header();
},
update_status: function (status) {
this.status = status;
this.render_header();
},
render_header: function () {
this.$header.html(QWeb.render('mail.ChatWindowHeaderContent', {
status: this.status,
title: this.title,
unread_counter: this.unread_msgs,
}));
},
fold: function () {
this.$el.animate({
height: this.folded ? HEIGHT_FOLDED : HEIGHT_OPEN
});
},
toggle_fold: function (fold) {
this.folded = _.isBoolean(fold) ? fold : !this.folded;
if (!this.folded) {
this.thread.scroll_to();
this.focus_input();
}
this.fold();
},
focus_input: function () {
if (!config.device.touch) {
this.$input.focus();
}
},
do_show: function () {
this.is_hidden = false;
this._super.apply(this, arguments);
},
do_hide: function () {
this.is_hidden = true;
this._super.apply(this, arguments);
},
do_toggle: function (display) {
this.is_hidden = _.isBoolean(display) ? !display : !this.is_hidden;
this._super.apply(this, arguments);
},
on_keypress: function (event) {
event.stopPropagation(); // to prevent jquery's blockUI to cancel event
},
on_keydown: function (event) {
event.stopPropagation(); // to prevent jquery's blockUI to cancel event
// ENTER key (avoid requiring jquery ui for external livechat)
if (event.which === 13) {
var content = _.str.trim(this.$input.val());
var message = {
content: content,
attachment_ids: [],
partner_ids: [],
};
this.$input.val('');
if (content) {
this.trigger('post_message', message, this.channel_id);
}
}
},
on_click_close: function (event) {
event.stopPropagation();
event.preventDefault();
this.trigger("close_chat_session");
},
on_click_fold: function () {
if (config.device.size_class !== config.device.SIZES.XS) {
this.toggle_fold();
this.trigger("fold_channel", this.channel_id, this.folded);
}
},
});
});