summaryrefslogtreecommitdiff
path: root/addons/mail/static/src
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2016-01-12 15:30:29 +0100
committerChristophe Simonis <chs@odoo.com>2016-01-12 15:30:29 +0100
commit7fa6f73302709d7e7b6b19ebd16d338b3dd0e2db (patch)
tree1487b6fe232e0b9477a6e68018d5bc5d3432372f /addons/mail/static/src
parent2a834c22b0570b3a0d5ec5b4a8a0b378e3a6e12b (diff)
parentcb79297a41b7747a9318fd4794dce422ee931060 (diff)
[MERGE] forward port of branch 9.0 up to cb79297
Diffstat (limited to 'addons/mail/static/src')
-rw-r--r--addons/mail/static/src/js/chat_manager.js35
-rw-r--r--addons/mail/static/src/js/chatter.js21
-rw-r--r--addons/mail/static/src/js/client_action.js4
-rw-r--r--addons/mail/static/src/js/composer.js20
-rw-r--r--addons/mail/static/src/less/chatter.less7
-rw-r--r--addons/mail/static/src/xml/chatter.xml6
-rw-r--r--addons/mail/static/src/xml/client_action.xml15
7 files changed, 71 insertions, 37 deletions
diff --git a/addons/mail/static/src/js/chat_manager.js b/addons/mail/static/src/js/chat_manager.js
index 7796226da10..f05a3e8b506 100644
--- a/addons/mail/static/src/js/chat_manager.js
+++ b/addons/mail/static/src/js/chat_manager.js
@@ -30,7 +30,7 @@ var discuss_ids = {};
var global_unread_counter = 0;
var pinned_dm_partners = []; // partner_ids we have a pinned DM with
-// Window focus/unfocus, beep and title
+// Utils: Window focus/unfocus, beep, tab title, parsing html strings
//----------------------------------------------------------------------------------
var beep = (function () {
if (typeof(Audio) === "undefined") {
@@ -76,6 +76,36 @@ function notify_incoming_message (msg, options) {
}
}
+function parse_and_transform(html_string, transform_function) {
+ var open_token = "OPEN" + Date.now();
+ var string = html_string.replace(/&lt;/g, open_token);
+ var children = $('<div>').html(string).contents();
+ return _parse_and_transform(children, transform_function)
+ .replace(new RegExp(open_token, "g"), "&lt;");
+}
+
+function _parse_and_transform(nodes, transform_function) {
+ return _.map(nodes, function (node) {
+ return transform_function(node, function () {
+ return _parse_and_transform(node.childNodes, transform_function);
+ });
+ }).join("");
+}
+
+// suggested regexp (gruber url matching regexp, adapted to js, see https://gist.github.com/gruber/8891611)
+var url_regexp = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;
+function add_link (node, transform_children) {
+ if (node.nodeType === 3) { // text node
+ return node.data.replace(url_regexp, function (url) {
+ var href = (!/^(f|ht)tps?:\/\//i.test(url)) ? "http://" + url : url;
+ return '<a href="' + href + '">' + url + '</a>';
+ });
+ }
+ if (node.tagName === "A") return node.outerHTML;
+ node.innerHTML = transform_children();
+ return node.outerHTML;
+}
+
// Message and channel manipulation helpers
//----------------------------------------------------------------------------------
@@ -207,6 +237,9 @@ function make_message (data) {
msg.avatar_src = "/mail/static/src/img/smiley/avatar.jpg";
}
+ // add anchor tags to urls
+ msg.body = parse_and_transform(msg.body, add_link);
+
// Compute url of attachments
_.each(msg.attachment_ids, function(a) {
a.url = '/web/content/' + a.id + '?download=true';
diff --git a/addons/mail/static/src/js/chatter.js b/addons/mail/static/src/js/chatter.js
index 5f4ef8a3060..28a269379df 100644
--- a/addons/mail/static/src/js/chatter.js
+++ b/addons/mail/static/src/js/chatter.js
@@ -114,7 +114,7 @@ var Followers = form_common.AbstractField.extend({
var follower_id = $currentTarget.data('oe-id');
var is_channel = $currentTarget.data('oe-model') === 'mail.channel';
self.dialog = new Dialog(this, {
- size: 'small',
+ size: 'medium',
title: _t('Edit Subscription of ') + $currentTarget.siblings('a').text(),
buttons: [
{
@@ -131,7 +131,7 @@ var Followers = form_common.AbstractField.extend({
},
],
}).open();
- return self.fetch_subtypes($currentTarget.data('id'));
+ return self.fetch_subtypes($currentTarget.data('id'), $currentTarget.data('oe-model'));
},
on_invite_follower: function (channel_only) {
@@ -270,8 +270,10 @@ var Followers = form_common.AbstractField.extend({
/** Fetch subtypes, only if current user is follower or if follower_id is given, i.e. if
* the current user is editing the subtypes of another follower
+ * @param {int} [follower_id] the id of the follower
+ * @param {string} [follower_model] 'res.partner' or 'mail.channel'
*/
- fetch_subtypes: function (follower_id) {
+ fetch_subtypes: function (follower_id, follower_model) {
var self = this;
var dialog = false;
@@ -292,7 +294,7 @@ var Followers = form_common.AbstractField.extend({
res_id: this.view.datarecord.id,
follower_id: follower_id,
}).then(function (data) {
- self.display_subtypes(data, dialog);
+ self.display_subtypes(data, dialog, (follower_model === 'mail.channel'));
});
} else {
return $.Deferred().resolve();
@@ -300,11 +302,11 @@ var Followers = form_common.AbstractField.extend({
},
/** Display subtypes: {'name': default, followed} */
- display_subtypes:function (data, dialog) {
+ display_subtypes:function (data, dialog, display_warning) {
var old_parent_model;
var $list;
if (dialog) {
- $list = this.dialog.$el;
+ $list = $('<ul>').appendTo(this.dialog.$el);
} else {
$list = this.$('.o_subtypes_list ul');
}
@@ -324,9 +326,14 @@ var Followers = form_common.AbstractField.extend({
old_parent_model = record.parent_model;
record.followed = record.followed || undefined;
$(qweb.render('mail.Followers.subtype', {'record': record,
- 'dialog': dialog}))
+ 'dialog': dialog,
+ 'display_warning': display_warning && record.internal}))
.appendTo($list);
});
+
+ if (display_warning) {
+ $(qweb.render('mail.Followers.subtypes.warning')).appendTo(this.dialog.$el);
+ }
},
do_follow: function () {
diff --git a/addons/mail/static/src/js/client_action.js b/addons/mail/static/src/js/client_action.js
index ce505e569c1..a0c22add842 100644
--- a/addons/mail/static/src/js/client_action.js
+++ b/addons/mail/static/src/js/client_action.js
@@ -143,7 +143,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.options = options || {};
this.channels_scrolltop = {};
this.throttled_render_sidebar = _.throttle(this.render_sidebar.bind(this), 100, { leading: false });
- this.notification_bar = (window.Notification.permission === "default");
+ this.notification_bar = (window.Notification && window.Notification.permission === "default");
},
willStart: function () {
@@ -210,7 +210,7 @@ var ChatAction = Widget.extend(ControlPanelMixin, {
this.extended_composer.on('post_message', this, this.on_post_message);
this.extended_composer.on('input_focused', this, this.on_composer_input_focused);
- var def1 = this.thread.prependTo(this.$('.o_mail_chat_content'));
+ var def1 = this.thread.appendTo(this.$('.o_mail_chat_content'));
var def2 = this.basic_composer.appendTo(this.$('.o_mail_chat_content'));
var def3 = this.extended_composer.appendTo(this.$('.o_mail_chat_content'));
var def4 = this.searchview.appendTo($("<div>"));
diff --git a/addons/mail/static/src/js/composer.js b/addons/mail/static/src/js/composer.js
index 751b4c2ccc7..a02a3966333 100644
--- a/addons/mail/static/src/js/composer.js
+++ b/addons/mail/static/src/js/composer.js
@@ -5,6 +5,7 @@ var chat_manager = require('mail.chat_manager');
var core = require('web.core');
var data = require('web.data');
+var dom_utils = require('web.dom_utils');
var Model = require('web.Model');
var session = require('web.session');
var Widget = require('web.Widget');
@@ -366,7 +367,7 @@ var BasicComposer = Widget.extend({
this.$input.focus(function () {
self.trigger('input_focused');
});
- this.resize_input();
+ dom_utils.autoresize(this.$input, {parent: this, min_height: this.options.input_min_height});
// Attachments
$(window).on(this.fileupload_id, this.on_attachment_loaded);
@@ -421,7 +422,6 @@ var BasicComposer = Widget.extend({
// Empty input, selected partners and attachments
self.$input.val('');
- self.resize_input();
self.mention_manager.reset_selections();
self.set('attachment_ids', []);
@@ -429,19 +429,6 @@ var BasicComposer = Widget.extend({
});
},
- /**
- * Resizes the textarea according to its scrollHeight
- * @param {Boolean} [force_resize] if not true, only reset the size if empty
- */
- resize_input: function (force_resize) {
- if (this.$input.val() === '') {
- this.$input.css('height', this.options.input_min_height);
- } else if (force_resize) {
- var height = this.$input.prop('scrollHeight') + this.options.input_baseline;
- this.$input.css('height', Math.min(this.options.input_max_height, height));
- }
- },
-
// Events
on_click_add_attachment: function () {
this.$('input.o_form_input_file').click();
@@ -481,8 +468,6 @@ var BasicComposer = Widget.extend({
} else if (!this.prevent_send(event)) {
event.preventDefault();
this.send_message();
- } else {
- this.resize_input(true);
}
break;
}
@@ -508,7 +493,6 @@ var BasicComposer = Widget.extend({
// Otherwise, check if a mention is typed
default:
this.mention_manager.detect_delimiter();
- this.resize_input();
}
},
diff --git a/addons/mail/static/src/less/chatter.less b/addons/mail/static/src/less/chatter.less
index 35d5b3b7a76..839e419e88e 100644
--- a/addons/mail/static/src/less/chatter.less
+++ b/addons/mail/static/src/less/chatter.less
@@ -125,8 +125,11 @@
}
// Edit subtypes in dialog
-.modal .modal-body > li.o_subtype {
- list-style: none;
+.modal .modal-body > ul {
+ padding-left: 0;
+ > li.o_subtype {
+ list-style: none;
+ }
}
@media print {
diff --git a/addons/mail/static/src/xml/chatter.xml b/addons/mail/static/src/xml/chatter.xml
index 6207cdb3980..cf6096bc8a9 100644
--- a/addons/mail/static/src/xml/chatter.xml
+++ b/addons/mail/static/src/xml/chatter.xml
@@ -154,7 +154,13 @@
<span t-att-for="'input_mail_followers_subtype_'+record.id+(dialog ? '_in_dialog': '')">
<t t-esc="record.name"/>
</span>
+ <i t-if="display_warning" class="fa fa-warning text-warning"/>
</li>
</t>
+ <t t-name="mail.Followers.subtypes.warning">
+ <span class="text-warning">
+ <i class="fa fa-warning"/> Be careful with channels following internal notifications
+ </span>
+ </t>
</templates>
diff --git a/addons/mail/static/src/xml/client_action.xml b/addons/mail/static/src/xml/client_action.xml
index 18fef4a4ed6..da2e29057e0 100644
--- a/addons/mail/static/src/xml/client_action.xml
+++ b/addons/mail/static/src/xml/client_action.xml
@@ -4,14 +4,15 @@
<!-- Client Action -->
<t t-name="mail.client_action">
<div class="o_mail_chat">
- <t t-if="widget.notification_bar">
- <div class="o_mail_annoying_notification_bar">
- <span class="o_mail_request_permission">Odoo needs your permission to <a href="#"> enable desktop notifications</a>.</span>
- <span class="fa fa-close"></span>
- </div>
- </t>
<div class="o_mail_chat_sidebar"/>
- <div class="o_mail_chat_content"/>
+ <div class="o_mail_chat_content">
+ <t t-if="widget.notification_bar">
+ <div class="o_mail_annoying_notification_bar">
+ <span class="o_mail_request_permission">Odoo needs your permission to <a href="#"> enable desktop notifications</a>.</span>
+ <span class="fa fa-close"></span>
+ </div>
+ </t>
+ </div>
</div>
</t>
<t t-name="mail.chat.Sidebar">