diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index f561919939d..4e0fd04b6b8 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -230,8 +230,6 @@ class mail_message(osv.Model):
# TDE note: is this useful ? to check
'partner_ids': partner_ids,
'parent_id': message['parent_id'] and message['parent_id'][0] or False,
- # TDE note: see with CHM about votes, how they are displayed (only number, or name_get ?)
- # vote: should only use number of votes
'vote_nb': len(message['vote_user_ids']),
'has_voted': has_voted,
'is_private': message['model'] and message['res_id'],
@@ -310,7 +308,6 @@ class mail_message(osv.Model):
'type': 'expandable',
'parent_id': parent_id,
'id': -1,
- 'max_limit': True,
})
return message_list
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index d70be673fd4..f6b6c0e43bc 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -89,6 +89,28 @@ openerp.mail = function(session) {
return text
.replace(/[\n\r]/g,'
')
.replace(/((?:https?|ftp):\/\/[\S]+)/g,'$1 ')
+ },
+
+ /**
+ * return the complete domain with "&"
+ */
+ expend_domain: function (domain) {
+ var new_domain = [];
+ var nb_and = -1;
+
+ for ( var k = domain.length-1; k >= 0 ; k-- ) {
+ if ( typeof domain[k] != 'array' ) {
+ nb_and -= 2;
+ continue;
+ }
+ nb_and += 1;
+ }
+
+ for (var k = 0; k < nb_and ; k++){
+ domain.unshift('&');
+ }
+
+ return domain;
}
};
@@ -134,6 +156,7 @@ openerp.mail = function(session) {
this.parent_thread= parent.messages!= undefined ? parent : false;
this.ds_attachment = new session.web.DataSetSearch(this, 'ir.attachment');
+ this.show_delete_attachment = true;
this.fileupload_id = _.uniqueId('oe_fileupload_temp');
$(window).on(self.fileupload_id, self.on_attachment_loaded);
@@ -365,6 +388,7 @@ openerp.mail = function(session) {
]).then(function(records){
self.parent_thread.switch_new_message(records);
self.on_cancel();
+ self.do_show_compact();
//session.web.unblockUI();
});
return true;
@@ -454,7 +478,7 @@ openerp.mail = function(session) {
this.nb_messages = datasets.nb_messages || 0,
this.thread_level = datasets.thread_level || 0,
this.type = 'expandable',
- this.max_limit = datasets.max_limit || false,
+ this.max_limit = this.id < 0 || false,
this.flag_used = false,
this.parent_thread= parent.messages!= undefined ? parent : options.options._parents[0] ;
},
@@ -465,12 +489,18 @@ openerp.mail = function(session) {
this.bind_events();
},
+ reinit: function () {
+ var $render = $(session.web.qweb.render('mail.thread.expandable', {'widget': this}));
+ this.$el.replaceWith( $render );
+ this.$el = $render;
+ this.bind_events();
+ },
+
/**
* Bind events in the widget. Each event is slightly described
* in the function. */
bind_events: function() {
- var self = this;
- this.$el.on('click', 'a.oe_msg_fetch_more', self.on_expandable);
+ this.$el.on('click', 'a.oe_msg_fetch_more', this.on_expandable);
},
animated_destroy: function(options) {
@@ -692,11 +722,11 @@ openerp.mail = function(session) {
//graphic effects
if(options && options.fadeTime) {
self.$el.fadeOut(options.fadeTime, function(){
- self.destroy();
+ self.parent_thread.message_to_expandable(self);
});
self.thread.$el.fadeOut(options.fadeTime);
} else {
- self.destroy();
+ self.parent_thread.message_to_expandable(self);
}
},
@@ -719,20 +749,19 @@ openerp.mail = function(session) {
* @param {object} mouse envent
*/
on_message_read_unread: function (event) {
- // TDE note: code here seems complicated... just check that current message is read (value coming from server)
- // and send its opposite to set_message_read
event.stopPropagation();
- // if this message is read, all childs message display is read
- var ids = [this.id].concat( this.get_child_ids() );
- var read = $(event.srcElement).hasClass("oe_read");
- this.$el.removeClass(read ? 'oe_msg_unread':'oe_msg_read').addClass(read ? 'oe_msg_read':'oe_msg_unread');
+ var self=this;
- if( (read && this.options.typeof_thread == 'inbox') ||
- (!read && this.options.typeof_thread == 'archives')) {
+ if( (this.to_read && this.options.typeof_thread == 'inbox') ||
+ (!this.to_read && this.options.typeof_thread == 'archives')) {
this.animated_destroy({fadeTime:250});
}
- // TDE note: should have a context here
- this.ds_notification.call('set_message_read', [ids, read]);
+
+ // if this message is read, all childs message display is read
+ this.ds_notification.call('set_message_read', [ [this.id].concat( this.get_child_ids() ) , this.to_read, this.context]).pipe(function(){
+ self.$el.removeClass(this.to_read ? 'oe_msg_unread':'oe_msg_read').addClass(self.to_read ? 'oe_msg_read':'oe_msg_unread');
+ self.to_read = !self.to_read;
+ });
return false;
},
@@ -787,8 +816,7 @@ openerp.mail = function(session) {
event.stopPropagation();
var self=this;
return this.ds_message.call('vote_toggle', [[self.id]]).pipe(function(vote){
- // TDE note: to update, because vote_user_ids is about to disappear to be replaced by vote_nb (number of votes)
- self.has_voted=vote;
+ self.has_voted = vote;
self.vote_nb += self.has_voted ? 1 : -1;
self.display_vote();
});
@@ -929,7 +957,7 @@ openerp.mail = function(session) {
this.$('.oe_msg_expandable:last');
var message = this.messages[this.messages.length-1];
- if(message && message.type=="expandable" && message.max_limit){
+ if(message && message.type=="expandable" && message.max_limit) {
var pos = message.$el.position();
if(pos.top){
/* bottom of the screen */
@@ -1016,11 +1044,12 @@ openerp.mail = function(session) {
return this;
}
- if(options.id)
- for(var i in this.messages){
- if(this.messages[i].thread){
- var res=this.messages[i].thread.browse_thread({'id':options.id, '_go_thread_wall':true});
- if(res) return res;
+ if(options.id){
+ for(var i in this.messages){
+ if(this.messages[i].thread){
+ var res=this.messages[i].thread.browse_thread({'id':options.id, '_go_thread_wall':true});
+ if(res) return res;
+ }
}
}
@@ -1167,13 +1196,11 @@ openerp.mail = function(session) {
if(message.id > 0){
for(var i in thread_messages){
if(thread_messages[i].id > message.id){
- if(!parent_newer ||
- parent_newer.id > thread_messages[i].id) {
+ if(!parent_newer || parent_newer.id > thread_messages[i].id) {
parent_newer = thread_messages[i];
}
} else if(thread_messages[i].id > 0 && thread_messages[i].id < message.id) {
- if(!parent_older ||
- parent_older.id < thread_messages[i].id) {
+ if(!parent_older || parent_older.id < thread_messages[i].id) {
parent_older = thread_messages[i];
}
}
@@ -1182,23 +1209,41 @@ openerp.mail = function(session) {
var sort = (!!self.thread_level || message.id<0);
- if(parent_older){
- if(sort){
- message.insertAfter(parent_older.thread ? parent_older.thread.$el : parent_older.$el);
- } else {
- message.insertBefore(parent_older.$el);
- }
- } else if(parent_newer){
- if(sort || parent_newer.id<0){
+
+ if (sort) {
+ if (parent_older) {
+
+ message.insertAfter(parent_older.$el);
+
+ } else if(parent_newer) {
+
message.insertBefore(parent_newer.$el);
+
+ } else if(message.id < 0) {
+
+ message.appendTo(thread.$el);
+
} else {
- message.insertAfter(parent_newer.thread ? parent_newer.thread.$el : parent_newer.$el);
+
+ message.prependTo(thread.$el);
}
} else {
- if(sort && message.id>0) {
+ if (parent_older) {
+
+ message.insertBefore(parent_older.$el);
+
+ } else if(parent_newer) {
+
+ message.insertAfter(parent_newer.$el);
+
+ } else if(message.id < 0) {
+
message.prependTo(thread.$el);
+
} else {
+
message.appendTo(thread.$el);
+
}
}
@@ -1224,6 +1269,88 @@ openerp.mail = function(session) {
}).create_message_object( record );
});
},
+
+ /**
+ * Convert a destroyed message into a expandable message
+ */
+ message_to_expandable: function (message) {
+
+ if(!this.thread_level || message.isDestroyed()) {
+ message.destroy();
+ return false;
+ }
+
+ var messages = _.sortBy( _.filter(this.messages, function (val) { return !val.isDestroyed(); }), function (val) { return val.id; });
+ var it = _.indexOf( messages, message );
+
+ var msg_up = messages[it-1];
+ var msg_down = messages[it+1];
+
+ var message_dom = [ '&', ["id","in",[message.id]], ['parent_id', '=', message.parent_id] ];
+
+ if ( msg_up && msg_up.type == "expandable" && msg_down && msg_down.type == "expandable") {
+ // concat two expandable message and add this message to this dom
+ msg_up.domain = mail.ChatterUtils.expend_domain( msg_up.domain );
+ msg_down.domain = mail.ChatterUtils.expend_domain( msg_down.domain );
+
+ msg_down.domain = ['|','|'].concat( msg_up.domain ).concat( message_dom ).concat( msg_down.domain );
+
+ if( !msg_down.max_limit ){
+ msg_down.nb_messages += 1 + msg_up.nb_messages;
+ }
+
+ msg_up.$el.remove();
+ msg_up.destroy();
+
+ msg_down.reinit();
+
+ } else if ( msg_up && msg_up.type == "expandable") {
+ // concat preview expandable message and this message to this dom
+ msg_up.domain = mail.ChatterUtils.expend_domain( msg_up.domain );
+ msg_up.domain = ['|'].concat( msg_up.domain ).concat( message_dom );
+
+ msg_up.nb_messages++;
+
+ msg_up.reinit();
+
+ } else if ( msg_down && msg_down.type == "expandable") {
+ // concat next expandable message and this message to this dom
+ msg_down.domain = mail.ChatterUtils.expend_domain( msg_down.domain );
+ msg_down.domain = ['|'].concat( msg_down.domain ).concat( message_dom );
+
+ // it's maybe a message expandable for the max limit read message
+ if( !msg_down.max_limit ){
+ msg_down.nb_messages++;
+ }
+
+ msg_down.reinit();
+
+ } else {
+ // create a expandable message
+ var expandable = new mail.ThreadExpandable(this, {
+ 'id': message.id,
+ 'model': message.model,
+ 'parent_id': message.parent_id,
+ 'nb_messages': 1,
+ 'thread_level': message.thread_level,
+ }, {
+ 'domain': message_dom,
+ 'context': {
+ 'default_model': message.model || this.context.default_model,
+ 'default_res_id': message.res_id || this.context.default_res_id,
+ 'default_parent_id': this.id },
+ });
+
+ // add object on array and DOM
+ this.messages.push(expandable);
+ expandable.insertAfter(message.$el);
+ }
+
+ // destroy message
+ message.destroy();
+
+ return true;
+ },
});
/**
diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml
index 07fefa0304b..a1c5169ad36 100644
--- a/addons/mail/static/src/xml/mail.xml
+++ b/addons/mail/static/src/xml/mail.xml
@@ -82,10 +82,9 @@
-
+
x
-