X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fmail%2Fstatic%2Fsrc%2Fjs%2Fmail.js;h=a42bc417683febb3ccc8122a29d1f7878b4ec3a0;hb=709c9868de7c4ac4985ed4e0055ae3e3e49742ad;hp=1d3b5a91176e137fc1da9bcf011ca84cf0c09dc1;hpb=75ff22286f2e0acf359860de0a883ae5e27cc033;p=odoo%2Fodoo.git diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index 1d3b5a9..a42bc41 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -6,6 +6,7 @@ openerp.mail = function (session) { openerp_mail_followers(session, mail); // import mail_followers.js openerp_FieldMany2ManyTagsEmail(session); // import manyy2many_tags_email.js + openerp_announcement(session); /** * ------------------------------------------------------------ @@ -75,8 +76,8 @@ openerp.mail = function (session) { */ get_text2html: function (text) { return text - .replace(/[\n\r]/g,'
') .replace(/((?:https?|ftp):\/\/[\S]+)/g,'$1 ') + .replace(/[\n\r]/g,'
') }, /* Returns the complete domain with "&" @@ -113,57 +114,6 @@ openerp.mail = function (session) { } return out; }, - - // returns the file type of a file based on its extension - // As it only looks at the extension it is quite approximative. - filetype: function(url){ - var url = url && url.filename || url; - var tokens = typeof url == 'string' ? url.split('.') : []; - if(tokens.length <= 1){ - return 'unknown'; - } - var extension = tokens[tokens.length -1]; - if(extension.length === 0){ - return 'unknown'; - }else{ - extension = extension.toLowerCase(); - } - var filetypes = { - 'webimage': ['png','jpg','jpeg','jpe','gif'], // those have browser preview - 'image': ['tif','tiff','tga', - 'bmp','xcf','psd','ppm','pbm','pgm','pnm','mng', - 'xbm','ico','icon','exr','webp','psp','pgf','xcf', - 'jp2','jpx','dng','djvu','dds'], - 'vector': ['ai','svg','eps','vml','cdr','xar','cgm','odg','sxd'], - 'print': ['dvi','pdf','ps'], - 'document': ['doc','docx','odm','odt'], - 'presentation': ['key','keynote','odp','pps','ppt'], - 'font': ['otf','ttf','woff','eot'], - 'archive': ['zip','7z','ace','apk','bzip2','cab','deb','dmg','gzip','jar', - 'rar','tar','gz','pak','pk3','pk4','lzip','lz','rpm'], - 'certificate': ['cer','key','pfx','p12','pem','crl','der','crt','csr'], - 'audio': ['aiff','wav','mp3','ogg','flac','wma','mp2','aac', - 'm4a','ra','mid','midi'], - 'video': ['asf','avi','flv','mkv','m4v','mpeg','mpg','mpe','wmv','mp4','ogm'], - 'text': ['txt','rtf','ass'], - 'html': ['html','xhtml','xml','htm','css'], - 'disk': ['iso','nrg','img','ccd','sub','cdi','cue','mds','mdx'], - 'script': ['py','js','c','cc','cpp','cs','h','java','bat','sh', - 'd','rb','pl','as','cmd','coffee','m','r','vbs','lisp'], - 'spreadsheet': ['123','csv','ods','numbers','sxc','xls','vc','xlsx'], - 'binary': ['exe','com','bin','app'], - }; - for(filetype in filetypes){ - var ext_list = filetypes[filetype]; - for(var i = 0, len = ext_list.length; i < len; i++){ - if(extension === ext_list[i]){ - return filetype; - } - } - } - return 'unknown'; - }, - }; @@ -225,6 +175,7 @@ openerp.mail = function (session) { this.name = datasets.name || false, this.record_name = datasets.record_name || false, this.body = datasets.body || '', + this.body_short = datasets.body_short || '', this.vote_nb = datasets.vote_nb || 0, this.has_voted = datasets.has_voted || false, this.is_favorite = datasets.is_favorite || false, @@ -234,7 +185,7 @@ openerp.mail = function (session) { this.attachment_ids = datasets.attachment_ids || [], this.partner_ids = datasets.partner_ids || []; this.date = datasets.date; - + this.user_pid = datasets.user_pid || false; this.format_data(); // update record_name: Partner profile @@ -302,7 +253,6 @@ openerp.mail = function (session) { var attach = this.attachment_ids[l]; if (!attach.formating) { attach.url = mail.ChatterUtils.get_attachment_url(this.session, this.id, attach.id); - attach.filetype = mail.ChatterUtils.filetype(attach.filename || attach.name); attach.name = mail.ChatterUtils.breakword(attach.name || attach.filename); attach.formating = true; } @@ -557,17 +507,15 @@ openerp.mail = function (session) { } $.when(recipient_done).done(function (partner_ids) { var context = { - 'default_composition_mode': default_composition_mode, 'default_parent_id': self.id, 'default_body': mail.ChatterUtils.get_text2html(self.$el ? (self.$el.find('textarea:not(.oe_compact)').val() || '') : ''), 'default_attachment_ids': _.map(self.attachment_ids, function (file) {return file.id;}), 'default_partner_ids': partner_ids, + 'default_is_log': self.is_log, 'mail_post_autofollow': true, 'mail_post_autofollow_partner_ids': partner_ids, + 'is_private': self.is_private }; - if (self.is_log) { - _.extend(context, {'mail_compose_log': true}); - } if (default_composition_mode != 'reply' && self.context.default_model && self.context.default_res_id) { context.default_model = self.context.default_model; context.default_res_id = self.context.default_res_id; @@ -723,6 +671,7 @@ openerp.mail = function (session) { var values = { 'body': this.$('textarea').val(), 'subject': false, + 'parent_id': this.context.default_parent_id, 'attachment_ids': _.map(this.attachment_ids, function (file) {return file.id;}), 'partner_ids': partner_ids, 'context': _.extend(this.parent_thread.context, { @@ -771,7 +720,7 @@ openerp.mail = function (session) { // if clicked: call for suggested recipients if (event.type == 'click') { this.is_log = $input.hasClass('oe_compose_log'); - suggested_partners = this.parent_thread.ds_thread.call('message_get_suggested_recipients', [[this.context.default_res_id]]).done(function (additional_recipients) { + suggested_partners = this.parent_thread.ds_thread.call('message_get_suggested_recipients', [[this.context.default_res_id], this.context]).done(function (additional_recipients) { var thread_recipients = additional_recipients[self.context.default_res_id]; _.each(thread_recipients, function (recipient) { var parsed_email = mail.ChatterUtils.parse_email(recipient[1]); @@ -831,7 +780,9 @@ openerp.mail = function (session) { // go to the parented message var message = this.parent_thread.parent_message; var parent_message = message.parent_id ? message.parent_thread.parent_message : message; - var messages = [parent_message].concat(parent_message.get_childs()); + if(parent_message){ + var messages = [parent_message].concat(parent_message.get_childs()); + } } else if (this.options.emails_from_on_composer) { // get all wall messages if is not a mail.Wall _.each(this.options.root_thread.messages, function (msg) {messages.push(msg); messages.concat(msg.get_childs());}); @@ -929,7 +880,7 @@ openerp.mail = function (session) { self.parent_thread.message_fetch(this.domain, this.context, false, function (arg, data) { self.id = false; // insert the message on dom after this message - self.parent_thread.switch_new_message( data, self.$el ); + self.parent_thread.switch_new_message( data, self.$el.parent() ); self.animated_destroy(200); }); @@ -943,7 +894,6 @@ openerp.mail = function (session) { start: function () { this._super.apply(this, arguments); - this.expender(); this.bind_events(); if(this.thread_level < this.options.display_indented_thread) { this.create_thread(); @@ -966,24 +916,99 @@ openerp.mail = function (session) { this.$('.oe_reply').on('click', this.on_message_reply); this.$('.oe_star').on('click', this.on_star); this.$('.oe_msg_vote').on('click', this.on_vote); + this.$('.oe_mail_vote_count').on('mouseenter', this.on_hover); + this.$('.oe_mail_expand').on('click', this.on_expand); + this.$('.oe_mail_reduce').on('click', this.on_expand); this.$('.oe_mail_action_model').on('click', this.on_record_clicked); + this.$('.oe_mail_action_author').on('click', this.on_record_author_clicked); }, - - on_record_clicked: function (event) { + on_hover : function(event){ + var self = this; + var voter = ""; + var limit = 10; event.stopPropagation(); + var $target = $(event.target).hasClass("fa-thumbs-o-up") ? $(event.target).parent() : $(event.target); + //Note: We can set data-content attr on target element once we fetch data so that next time when one moves mouse on element it saves call + //But if there is new like comes then we'll not have new likes in popover in that case + if ($target.data('liker-list')) + { + voter = $target.data('liker-list'); + self.bindTooltipTo($target, voter); + $target.tooltip('hide').tooltip('show'); + $(".tooltip").on("mouseleave", function () { + $(this).remove(); + }); + }else{ + this.ds_message.call('get_likers_list', [this.id, limit]) + .done(function (data) { + _.each(data, function(people, index) { + voter = voter + people.substring(0,1).toUpperCase() + people.substring(1); + if(index != data.length-1) { + voter = voter + "
"; + } + }); + $target.data('liker-list', voter); + self.bindTooltipTo($target, voter); + $target.tooltip('hide').tooltip('show'); + $(".tooltip").on("mouseleave", function () { + $(this).remove(); + }); + }); + } + return true; + }, + bindTooltipTo: function($el, value) { + $el.tooltip({ + 'title': value, + 'placement': 'top', + 'container': this.el, + 'html': true, + 'trigger': 'manual', + 'animation': false + }).on("mouseleave", function () { + setTimeout(function () { + if (!$(".tooltip:hover").length) { + $el.tooltip("hide"); + } + },100); + }); + }, + on_record_clicked: function (event) { + event.preventDefault(); + var self = this; var state = { 'model': this.model, 'id': this.res_id, 'title': this.record_name }; session.webclient.action_manager.do_push_state(state); - this.do_action({ - res_model: state.model, - res_id: state.id, - type: 'ir.actions.act_window', - views: [[false, 'form']] + this.context.params = { + model: this.model, + res_id: this.res_id, + }; + this.thread.ds_thread.call("message_redirect_action", {context: this.context}).then(function(action){ + self.do_action(action); }); - return false; + }, + + on_record_author_clicked: function (event) { + event.preventDefault(); + var partner_id = $(event.target).data('partner'); + var state = { + 'model': 'res.partner', + 'id': partner_id, + 'title': this.record_name + }; + session.webclient.action_manager.do_push_state(state); + var action = { + type:'ir.actions.act_window', + view_type: 'form', + view_mode: 'form', + res_model: 'res.partner', + views: [[false, 'form']], + res_id: partner_id, + } + this.do_action(action); }, /* Call the on_compose_message on the thread of this message. */ @@ -994,15 +1019,11 @@ openerp.mail = function (session) { return false; }, - expender: function () { - this.$('.oe_msg_body:first').expander({ - slicePoint: this.options.truncate_limit, - expandText: _t('read more'), - userCollapseText: _t('read less'), - detailClass: 'oe_msg_tail', - moreClass: 'oe_mail_expand', - lessClass: 'oe_mail_reduce', - }); + on_expand: function (event) { + event.stopPropagation(); + this.$('.oe_msg_body:first > .oe_msg_body_short:first').toggle(); + this.$('.oe_msg_body:first > .oe_msg_body_long:first').toggle(); + return false; }, /** @@ -1154,6 +1175,7 @@ openerp.mail = function (session) { this.$(".oe_msg_footer:first .oe_mail_vote_count").remove(); this.$(".oe_msg_footer:first .oe_msg_vote").replaceWith(vote_element); this.$('.oe_msg_vote').on('click', this.on_vote); + this.$('.oe_mail_vote_count').on('mouseenter', this.on_hover); }, /** @@ -1218,7 +1240,7 @@ openerp.mail = function (session) { init: function (parent, datasets, options) { var self = this; this._super(parent, options); - this.MailWidget = parent.__proto__ == mail.Widget.prototype ? parent : false; + this.MailWidget = parent instanceof mail.Widget ? parent : false; this.domain = options.domain || []; this.context = _.extend(options.context || {}); @@ -1240,9 +1262,9 @@ openerp.mail = function (session) { if (datasets.author_id && !_.contains(_.flatten(datasets.partner_ids),datasets.author_id[0]) && datasets.author_id[0]) { datasets.partner_ids.push(datasets.author_id); } + this.user_pid = datasets.user_pid || false; this.partner_ids = datasets.partner_ids; this.messages = []; - this.options.flat_mode = (this.options.display_indented_thread - this.thread_level > 0); // object compose message @@ -1435,7 +1457,7 @@ openerp.mail = function (session) { message_fetch: function (replace_domain, replace_context, ids, callback) { return this.ds_message.call('message_read', [ // ids force to read - ids == false ? undefined : ids, + ids === false ? undefined : ids, // domain + additional (replace_domain ? replace_domain : this.domain), // ids allready loaded @@ -1800,16 +1822,18 @@ openerp.mail = function (session) { 'read_action': 'unread', 'show_record_name': false, 'show_compact_message': 1, + 'display_log_button' : true, }, this.node.params); - if (this.node.attrs.placeholder) { this.node.params.compose_placeholder = this.node.attrs.placeholder; } if (this.node.attrs.readonly) { this.node.params.readonly = this.node.attrs.readonly; } - - this.domain = this.node.params && this.node.params.domain || []; + if ('display_log_button' in this.options) { + this.node.params.display_log_button = this.options.display_log_button; + } + this.domain = (this.node.params && this.node.params.domain) || (this.field && this.field.domain) || []; if (!this.ParentViewManager.is_action_enabled('edit')) { this.node.params.show_link = false; @@ -1943,11 +1967,11 @@ openerp.mail = function (session) { * @param {Object} defaults ?? */ load_searchview: function (defaults) { - var self = this; var ds_msg = new session.web.DataSetSearch(this, 'mail.message'); this.searchview = new session.web.SearchView(this, ds_msg, false, defaults || {}, false); - this.searchview.appendTo(this.$('.oe_view_manager_view_search')) - .then(function () { self.searchview.on('search_data', self, self.do_searchview_search); }); + this.searchview.on('search_data', this, this.do_searchview_search); + this.searchview.appendTo(this.$('.oe_view_manager_view_search'), + this.$('.oe_searchview_drawer_container')); if (this.searchview.has_defaults) { this.searchview.ready.then(this.searchview.do_search); } @@ -2012,49 +2036,6 @@ openerp.mail = function (session) { } }); - - /** - * ------------------------------------------------------------ - * UserMenu - * ------------------------------------------------------------ - * - * Add a link on the top user bar for write a full mail - */ - session.web.ComposeMessageTopButton = session.web.Widget.extend({ - template:'mail.ComposeMessageTopButton', - - start: function () { - this.$('button').on('click', this.on_compose_message ); - this._super(); - }, - - on_compose_message: function (event) { - event.stopPropagation(); - var action = { - type: 'ir.actions.act_window', - res_model: 'mail.compose.message', - view_mode: 'form', - view_type: 'form', - views: [[false, 'form']], - target: 'new', - context: {}, - }; - session.client.action_manager.do_action(action); - }, - }); - - session.web.UserMenu.include({ - do_update: function(){ - var self = this; - this._super.apply(this, arguments); - this.update_promise.then(function() { - var mail_button = new session.web.ComposeMessageTopButton(); - mail_button.appendTo(session.webclient.$el.find('.oe_systray')); - }); - }, - }); - - /** * ------------------------------------------------------------ * Sub-widgets loading