/* Copyright 2016 x620 Copyright 2016 Ivan Yelizariev Copyright 2016 manawi Copyright 2017 Artyom Losev Copyright 2019 Artem Rafailov License MIT (https://opensource.org/licenses/MIT). */ odoo.define("mail_private", function(require) { "use strict"; var Chatter = require("mail.Chatter"); var MailComposer = require("mail_base.base").MailComposer; var chat_manager = require("mail.chat_manager"); var session = require("web.session"); var Model = require("web.Model"); var utils = require("mail.utils"); Chatter.include({ init: function() { this._super.apply(this, arguments); this.private = false; this.events["click .oe_compose_post_private"] = "on_open_composer_private_message"; }, on_post_message: function(message) { var self = this; if (this.private) { message.subtype = false; message.channel_ids = this.get_checked_channels_ids(); } var options = {model: this.model, res_id: this.res_id}; chat_manager .post_message(message, options) .then(function() { self.close_composer(); if (message.partner_ids.length) { self.refresh_followers(); } }) .fail(function() { // Todo: display notification }); }, on_open_composer_private_message: function(event) { var self = this; this.private = true; this.get_recipients_for_internal_message() .then(function(data) { self.recipients_for_internal_message = data; return self.get_channels_for_internal_message(); }) .then(function(data) { self.channels_for_internal_message = data; self.get_internal_users_ids().then(function(res_ids) { self.open_composer({is_private: true, internal_ids: res_ids}); }); }); }, on_open_composer_new_message: function() { this._super.apply(this, arguments); this.private = false; this.context.is_private = false; }, open_composer: function(options) { var self = this; this._super.apply(this, arguments); if (options && options.is_private) { self.internal_users_ids = options.internal_ids; this.composer.options.is_private = options.is_private; _.each(self.recipients_for_internal_message, function(partner) { self.composer.suggested_partners.push({ checked: _.intersection(self.internal_users_ids, partner.user_ids) .length > 0, partner_id: partner.id, full_name: partner.name, name: partner.name, email_address: partner.email, reason: _.include(partner.user_ids, self.session.uid) ? "Partner" : "Follower", }); }); _.each(self.channels_for_internal_message, function(channel) { self.composer.suggested_channels.push({ checked: true, channel_id: channel.id, full_name: channel.name, name: "# " + channel.name, }); }); } }, get_recipients_for_internal_message: function() { var self = this; self.result = {}; return new Model(this.context.default_model) .query(["message_follower_ids", "partner_id"]) .filter([["id", "=", self.context.default_res_id]]) .all() .then(function(thread) { var follower_ids = thread[0].message_follower_ids; self.result[self.context.default_res_id] = []; self.customer = thread[0].partner_id; // Fetch partner ids return new Model("mail.followers") .call("read", [follower_ids, ["partner_id"]]) .then(function(res_partners) { // Filter result and push to array var res_partners_filtered = _.map(res_partners, function( partner ) { if ( partner.partner_id[0] && partner.partner_id[0] !== session.partner_id ) { return partner.partner_id[0]; } }).filter(function(partner) { return typeof partner !== "undefined"; }); return new Model("res.partner") .call("read", [ res_partners_filtered, ["name", "email", "user_ids"], ]) .then(function(recipients) { return recipients; }); }); }); }, get_channels_for_internal_message: function() { var self = this; self.result = {}; return new Model(this.context.default_model) .query(["message_follower_ids", "partner_id"]) .filter([["id", "=", self.context.default_res_id]]) .all() .then(function(thread) { var follower_ids = thread[0].message_follower_ids; self.result[self.context.default_res_id] = []; self.customer = thread[0].partner_id; // Fetch channels ids return new Model("mail.followers") .call("read", [follower_ids, ["channel_id"]]) .then(function(res_channels) { // Filter result and push to array var res_channels_filtered = _.map(res_channels, function( channel ) { if (channel.channel_id[0]) { return channel.channel_id[0]; } }).filter(function(channel) { return typeof channel !== "undefined"; }); return new Model("mail.channel") .call("read", [res_channels_filtered, ["name", "id"]]) .then(function(recipients) { return recipients; }); }); }); }, get_internal_users_ids: function() { var ResUser = new Model("mail.compose.message"); this.users_ids = ResUser.call("get_internal_users_ids", [[]]).then(function( users_ids ) { return users_ids; }); return this.users_ids; }, get_checked_channels_ids: function() { var self = this; var checked_channels = []; this.$(".o_composer_suggested_channels input:checked").each(function() { var full_name = $(this) .data("fullname") .toString(); _.each(self.channels_for_internal_message, function(item) { if (full_name === item.name) { checked_channels.push(item.id); } }); }); return checked_channels; }, }); MailComposer.include({ init: function(parent, dataset, options) { this._super(parent, dataset, options); this.events["click .oe_composer_uncheck"] = "on_uncheck_recipients"; this.suggested_channels = []; }, on_uncheck_recipients: function() { this.$(".o_composer_suggested_partners input:checked").each(function() { $(this).prop("checked", false); }); this.$(".o_composer_suggested_channels input:checked").each(function() { $(this).prop("checked", false); }); }, preprocess_message: function() { var self = this; if (self.options.is_private) { self.context.is_private = true; } return this._super(); }, on_open_full_composer: function() { if (!this.do_check_attachment_upload()) { return false; } var self = this; var recipient_done = $.Deferred(); if (this.options.is_log) { recipient_done.resolve([]); } else { var checked_suggested_partners = this.get_checked_suggested_partners(); recipient_done = this.check_suggested_partners( checked_suggested_partners ); } recipient_done.then(function(partner_ids) { var context = { default_parent_id: self.id, default_body: utils.get_text2html(self.$input.val()), default_attachment_ids: _.pluck(self.get("attachment_ids"), "id"), default_partner_ids: partner_ids, default_is_log: self.options.is_log, mail_post_autofollow: true, }; if (self.options && self.options.is_private) { context.default_is_private = self.options.is_private; } if (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; } self.do_action( { type: "ir.actions.act_window", res_model: "mail.compose.message", view_mode: "form", view_type: "form", views: [[false, "form"]], target: "new", context: context, }, { on_close: function() { self.trigger("need_refresh"); var parent = self.getParent(); chat_manager.get_messages({ model: parent.model, res_id: parent.res_id, }); }, } ).then(self.trigger.bind(self, "close_composer")); }); }, get_checked_suggested_partners: function() { var checked_partners = this._super(this, arguments); // Workaround: odoo code works only when all partners are checked intially, // while may select only some of them (internal recepients) _.each(checked_partners, function(partner) { partner.checked = true; }); return checked_partners; }, }); });