summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/js
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2016-01-27 12:17:12 +0100
committerChristophe Simonis <chs@odoo.com>2016-01-27 12:17:12 +0100
commit6f923cbdcdc9a78d1999999b3bbd917eb8b4e921 (patch)
treee33942eb0be8605f6219853a66b66df54f94f329 /addons/mail/static/src/js
parente5e7c4c1217c04d93820cf6007fd8ceed30d0cfa (diff)
parent4bbddc7476ff26098207ed80e89ce881f6dd161a (diff)
[MERGE] forward port of branch 9.0 up to 4bbddc7
Diffstat (limited to 'addons/mail/static/src/js')
-rw-r--r--addons/mail/static/src/js/chat_manager.js52
-rw-r--r--addons/mail/static/src/js/chat_window.js10
-rw-r--r--addons/mail/static/src/js/chatter.js21
-rw-r--r--addons/mail/static/src/js/client_action.js10
-rw-r--r--addons/mail/static/src/js/composer.js3
-rw-r--r--addons/mail/static/src/js/window_manager.js6
6 files changed, 73 insertions, 29 deletions
diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js
index aff51c721cf..75b1819ddd2 100644
--- a/addons/mail/static/src/js/chat_manager.js
+++ b/addons/mail/static/src/js/chat_manager.js
@@ -118,7 +118,7 @@ function strip_html (node, transform_children) {
function inline (node, transform_children) {
if (node.nodeType === 3) return node.data;
if (node.tagName === "BR") return " ";
- if (node.tagName.match(/^(A|P|DIV)$/)) return transform_children();
+ if (node.tagName.match(/^(A|P|DIV|PRE)$/)) return transform_children();
node.innerHTML = transform_children();
return node.outerHTML;
}
@@ -133,7 +133,7 @@ function add_message (data, options) {
if (!msg) {
msg = make_message(data);
- // Keep the array ordered by date when inserting the new message
+ // Keep the array ordered by id when inserting the new message
messages.splice(_.sortedIndex(messages, msg, 'id'), 0, msg);
_.each(msg.channel_ids, function (channel_id) {
var channel = chat_manager.get_channel(channel_id);
@@ -457,9 +457,7 @@ function update_channel_unread_counter (channel, counter) {
}
var channel_seen = _.throttle(function (channel) {
- return ChannelModel.call('channel_seen', [[channel.id]]).then(function (last_seen_message_id) {
- channel.last_seen_message_id = last_seen_message_id;
- });
+ return ChannelModel.call('channel_seen', [[channel.id]], {}, {shadow: true});
}, 3000);
// Notification handlers
@@ -573,7 +571,7 @@ function on_mark_as_read_notification (data) {
_.each(data.channel_ids, function (channel_id) {
var channel = chat_manager.get_channel(channel_id);
if (channel) {
- channel.needaction_counter -= data.message_ids.length;
+ channel.needaction_counter = Math.max(channel.needaction_counter - data.message_ids.length, 0);
}
});
} else { // if no channel_ids specified, this is a 'mark all read' in the inbox
@@ -581,7 +579,7 @@ function on_mark_as_read_notification (data) {
channel.needaction_counter = 0;
});
}
- needaction_counter -= data.message_ids.length;
+ needaction_counter = Math.max(needaction_counter - data.message_ids.length, 0);
chat_manager.bus.trigger('update_needaction', needaction_counter);
}
@@ -609,8 +607,11 @@ function on_mark_as_unread_notification (data) {
function on_channel_seen_notification (data) {
var channel = chat_manager.get_channel(data.id);
- if (channel && channel.unread_counter) {
- update_channel_unread_counter(channel, 0);
+ if (channel) {
+ channel.last_seen_message_id = data.last_message_id;
+ if (channel.unread_counter) {
+ update_channel_unread_counter(channel, 0);
+ }
}
}
@@ -781,7 +782,7 @@ var chat_manager = {
}
if (!channel.members_deferred) {
channel.members_deferred = ChannelModel
- .call("channel_fetch_listeners", [channel.uuid])
+ .call("channel_fetch_listeners", [channel.uuid], {}, {shadow: true})
.then(function (members) {
var suggestions = [];
_.each(mention_partner_suggestions, function (partners) {
@@ -790,7 +791,7 @@ var chat_manager = {
}));
});
- return [members].concat(suggestions);
+ return [members];
});
}
return channel.members_deferred;
@@ -807,12 +808,27 @@ var chat_manager = {
return chat_unread_counter;
},
+ get_last_seen_message: function (channel) {
+ if (channel.last_seen_message_id) {
+ var messages = channel.cache['[]'].messages;
+ var msg = _.findWhere(messages, {id: channel.last_seen_message_id});
+ if (msg) {
+ var i = _.sortedIndex(messages, msg, 'id') + 1;
+ while (i < messages.length && messages[i].author_id && messages[i].author_id[0] === session.partner_id) {
+ msg = messages[i];
+ i++;
+ }
+ return msg;
+ }
+ }
+ },
+
get_discuss_ids: function () {
return discuss_ids;
},
detach_channel: function (channel) {
- return ChannelModel.call("channel_minimize", [channel.uuid, true]);
+ return ChannelModel.call("channel_minimize", [channel.uuid, true], {}, {shadow: true});
},
remove_chatter_messages: function (model) {
messages = _.reject(messages, function (message) {
@@ -864,7 +880,7 @@ var chat_manager = {
},
close_chat_session: function (channel_id) {
var channel = this.get_channel(channel_id);
- ChannelModel.call("channel_fold", [], {uuid : channel.uuid, state : "closed"});
+ ChannelModel.call("channel_fold", [], {uuid : channel.uuid, state : "closed"}, {shadow: true});
},
fold_channel: function (channel_id, folded) {
var args = {
@@ -873,7 +889,7 @@ var chat_manager = {
if (_.isBoolean(folded)) {
args.state = folded ? 'folded' : 'open';
}
- return ChannelModel.call("channel_fold", [], args);
+ return ChannelModel.call("channel_fold", [], args, {shadow: true});
},
/**
* Special redirection handling for given model and id
@@ -948,8 +964,8 @@ var chat_manager = {
return parse_and_transform(message_body, inline);
},
- search_partner: function (search_val) {
- return PartnerModel.call('im_search', [search_val, 20]).then(function(result) {
+ search_partner: function (search_val, limit) {
+ return PartnerModel.call('im_search', [search_val, limit || 20], {}, {shadow: true}).then(function(result) {
var values = [];
_.each(result, function(user) {
var escaped_name = _.escape(user.name);
@@ -994,8 +1010,8 @@ function init () {
});
var ir_model = new Model("ir.model.data");
- var load_menu_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_menu_root_chat"]);
- var load_action_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_action_client_chat"]);
+ var load_menu_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_menu_root_chat"], {}, {shadow: true});
+ var load_action_id = ir_model.call("xmlid_to_res_id", ["mail.mail_channel_action_client_chat"], {}, {shadow: true});
bus.on('notification', null, on_notification);
diff --git a/addons/mail/static/src/js/chat_window.js b/addons/mail/static/src/js/chat_window.js
index 851c7fa56d2..95ac9dd8897 100644
--- a/addons/mail/static/src/js/chat_window.js
+++ b/addons/mail/static/src/js/chat_window.js
@@ -24,10 +24,10 @@ return Widget.extend({
this._super(parent);
this.title = title;
this.channel_id = channel_id;
- this.placeholder = _t("Say something");
this.folded = is_folded;
this.options = _.defaults(options || {}, {
display_stars: true,
+ placeholder: _t("Say something"),
});
this.unread_msgs = unread_msgs || 0;
this.is_hidden = false;
@@ -46,6 +46,8 @@ return Widget.extend({
if (this.folded) {
this.$el.css('height', HEIGHT_FOLDED);
+ } else {
+ this.focus_input();
}
var def = this.thread.replace(this.$('.o_chat_content'));
return $.when(this._super(), def);
@@ -67,9 +69,15 @@ return Widget.extend({
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);
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js
index c0613666be3..dc528b2b1aa 100644
--- a/addons/mail/static/src/js/chatter.js
+++ b/addons/mail/static/src/js/chatter.js
@@ -451,6 +451,7 @@ var ChatterComposer = composer.BasicComposer.extend({
record_name: false,
is_log: false,
internal_subtypes: [],
+ default_body: '',
});
if (this.options.is_log) {
this.options.send_text = _('Log');
@@ -467,6 +468,13 @@ var ChatterComposer = composer.BasicComposer.extend({
return $.when(this._super.apply(this, arguments), this.message_get_suggested_recipients());
},
+ start: function () {
+ var self = this;
+ return this._super().then(function () {
+ self.$input.val(self.options.default_body);
+ });
+ },
+
should_send: function () {
return false;
},
@@ -866,6 +874,8 @@ var Chatter = form_common.AbstractField.extend({
// destroy current composer, if any
if (this.composer) {
this.composer.destroy();
+ this.composer = undefined;
+ this.mute_new_message_button(false);
}
// fetch and render messages of current document
@@ -895,6 +905,7 @@ var Chatter = form_common.AbstractField.extend({
internal_subtypes: this.options.internal_subtypes,
is_log: options && options.is_log,
record_name: this.record_name,
+ default_body: old_composer && old_composer.$input.val(),
});
this.composer.on('input_focused', this, function () {
this.composer.mention_set_prefetched_partners(this.mention_suggestions || []);
@@ -910,11 +921,19 @@ var Chatter = form_common.AbstractField.extend({
self.composer.on('post_message', self, self.on_post_message);
self.composer.on('need_refresh', self, self.refresh_followers);
});
-
+ this.mute_new_message_button(true);
},
close_composer: function () {
if (this.composer.is_empty()) {
this.composer.do_hide();
+ this.mute_new_message_button(false);
+ }
+ },
+ mute_new_message_button: function (mute) {
+ if (mute) {
+ this.$('.o_chatter_button_new_message').removeClass('btn-primary').addClass('btn-default');
+ } else if (!mute) {
+ this.$('.o_chatter_button_new_message').removeClass('btn-default').addClass('btn-primary');
}
},
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index 38cc26e8997..82b36f3425d 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -171,8 +171,8 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.searchview = new SearchView(this, dataset, view_id, {}, options);
this.searchview.on('search_data', this, this.on_search);
- this.basic_composer = new composer.BasicComposer(this);
- this.extended_composer = new composer.ExtendedComposer(this);
+ this.basic_composer = new composer.BasicComposer(this, {mention_partners_restricted: true});
+ this.extended_composer = new composer.ExtendedComposer(this, {mention_partners_restricted: true});
this.thread = new ChatThread(this, {
display_help: true,
shorten_messages: false,
@@ -423,13 +423,11 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
// Compute position of the 'New messages' separator, only once when joining
// a channel to keep it in the thread when new messages arrive
if (_.isUndefined(this.messages_separator_position)) {
- var msg_id = this.last_seen_message_id;
if (!this.unread_counter) {
this.messages_separator_position = false; // no unread message -> don't display separator
- } else if ((msg_id === false) || !_.findWhere(messages, {id: msg_id})) {
- this.messages_separator_position = 'top'; // all displayed messages are unread
} else {
- this.messages_separator_position = msg_id; // last read message is msg_id
+ var msg = chat_manager.get_last_seen_message(this.channel);
+ this.messages_separator_position = msg ? msg.id : 'top';
}
}
return {
diff --git a/addons/mail/static/src/js/composer.js b/addons/mail/static/src/js/composer.js
index dae8cdc4241..5d6de2bad50 100644
--- a/addons/mail/static/src/js/composer.js
+++ b/addons/mail/static/src/js/composer.js
@@ -331,6 +331,7 @@ var BasicComposer = Widget.extend({
input_max_height: 150,
input_min_height: 28,
mention_fetch_limit: 8,
+ mention_partners_restricted: false, // set to true to only suggest prefetched partners
send_text: _('Send'),
});
this.context = this.options.context;
@@ -620,7 +621,7 @@ var BasicComposer = Widget.extend({
}
}
});
- if (!suggestions.length) {
+ if (!suggestions.length && !self.options.mention_partners_restricted) {
// no result found among prefetched partners, fetch other suggestions
var kwargs = {
limit: limit,
diff --git a/addons/mail/static/src/js/window_manager.js b/addons/mail/static/src/js/window_manager.js
index 05afc816712..65488129884 100644
--- a/addons/mail/static/src/js/window_manager.js
+++ b/addons/mail/static/src/js/window_manager.js
@@ -343,8 +343,10 @@ core.bus.on('web_client_ready', null, function () {
var chat_session = _.findWhere(chat_sessions, {id: channel.id});
if (!chat_session || chat_session.window.folded) {
chat_manager.detach_channel(channel);
- } else if (chat_session && chat_session.window.is_hidden) {
+ } else if (chat_session.window.is_hidden) {
make_session_visible(chat_session);
+ } else {
+ chat_session.window.focus_input();
}
});
@@ -370,7 +372,7 @@ return ChatWindow.extend({
self.$('.o_chat_search_input input')
.autocomplete({
source: function(request, response) {
- chat_manager.search_partner(request.term).done(response);
+ chat_manager.search_partner(request.term, 10).done(response);
},
select: function(event, ui) {
self.trigger('open_dm_session', ui.item.id);