From 190feb8d6d8745eb6c0d3c99c7a8f55b2dd967b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Fri, 3 Jun 2022 09:31:52 +0000 Subject: [PATCH] [IMP] im_livechat, *: make JS models available in livechat external lib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit make messaging service available in the frontend and in the livechat external lib bundle. This is preparation to refactoring JS livechat to use models and OWL. *: bus, mail, survey, web, website_livechat Task-2870899 closes odoo/odoo#92786 Signed-off-by: Sébastien Theys (seb) --- addons/bus/__manifest__.py | 1 + addons/im_livechat/__manifest__.py | 41 +++++++++++++++++ addons/im_livechat/controllers/main.py | 2 +- .../src/legacy/widgets/livechat_button.js | 7 +-- .../static/src/models/livechat_button_view.js | 8 ++++ .../static/src/models/messaging.js | 46 ++++++++++++++++++- .../src/models/messaging_initializer.js | 10 ++++ addons/im_livechat/static/src/public/main.js | 26 +++++++++++ .../im_livechat/static/src/public/session.js | 7 +++ .../src/services/public_livechat_service.js | 16 +++++++ .../views/im_livechat_channel_templates.xml | 26 +++-------- addons/mail/__manifest__.py | 9 ++++ addons/mail/static/src/models/messaging.js | 13 +++++- .../src/models/messaging_initializer.js | 24 +++++++--- .../static/src/models/thread_view_topbar.js | 8 +++- addons/survey/__manifest__.py | 1 - addons/web/__manifest__.py | 2 + addons/website_livechat/__manifest__.py | 10 ---- .../website_livechat_chatbot_test_script.js | 17 +++++-- 19 files changed, 221 insertions(+), 53 deletions(-) create mode 100644 addons/im_livechat/static/src/models/livechat_button_view.js create mode 100644 addons/im_livechat/static/src/public/main.js create mode 100644 addons/im_livechat/static/src/public/session.js create mode 100644 addons/im_livechat/static/src/services/public_livechat_service.js diff --git a/addons/bus/__manifest__.py b/addons/bus/__manifest__.py index 96fcf0dbcde..c9f9242377d 100644 --- a/addons/bus/__manifest__.py +++ b/addons/bus/__manifest__.py @@ -17,6 +17,7 @@ 'bus/static/src/js/crosstab_bus.js', 'bus/static/src/js/services/bus_service.js', 'bus/static/src/js/services/legacy/*.js', + 'bus/static/src/js/*.js', ], 'web.qunit_suite_tests': [ 'bus/static/tests/*.js', diff --git a/addons/im_livechat/__manifest__.py b/addons/im_livechat/__manifest__.py index 8a2bd941aa2..ee91e8d1381 100644 --- a/addons/im_livechat/__manifest__.py +++ b/addons/im_livechat/__manifest__.py @@ -50,6 +50,20 @@ Help your customers with this chat, and analyse their feedback. 'im_livechat/static/src/components/*/*', 'im_livechat/static/src/models/*.js', ], + 'web.assets_frontend': [ + 'im_livechat/static/src/models/*.js', + 'im_livechat/static/src/public/main.js', + 'im_livechat/static/src/services/*.js', + 'im_livechat/static/src/legacy/public_livechat_constants.js', + 'im_livechat/static/src/legacy/public_livechat_history_tracking.js', + 'im_livechat/static/src/legacy/models/*', + 'im_livechat/static/src/legacy/widgets/*', + 'im_livechat/static/src/legacy/widgets/*/*', + 'im_livechat/static/src/legacy/public_livechat_chatbot.js', + 'im_livechat/static/src/legacy/website_livechat_message_chatbot.js', + 'im_livechat/static/src/legacy/public_livechat.scss', + 'im_livechat/static/src/legacy/public_livechat_chatbot.scss', + ], 'web.assets_backend': [ 'im_livechat/static/src/js/im_livechat_channel_form_view.js', 'im_livechat/static/src/js/im_livechat_channel_form_controller.js', @@ -189,6 +203,33 @@ Help your customers with this chat, and analyse their feedback. 'im_livechat/static/src/scss/im_livechat_bootstrap.scss', 'im_livechat/static/src/legacy/public_livechat.scss', 'im_livechat/static/src/legacy/public_livechat_chatbot.scss', + + + 'web/static/src/core/utils/transitions.scss', + + 'mail/static/src/utils/*.js', + 'mail/static/src/js/emojis.js', + 'mail/static/src/component_hooks/*.js', + 'mail/static/src/model/*.js', + 'mail/static/src/models/*.js', + 'im_livechat/static/src/models/*.js', + 'mail/static/src/services/messaging_service.js', + # Framework JS + 'bus/static/src/js/*.js', + 'bus/static/src/js/services/bus_service.js', + 'bus/static/src/js/services/legacy/legacy_bus_service.js', + 'web/static/lib/luxon/luxon.js', + 'web/static/src/core/**/*', + # FIXME: debug menu currently depends on webclient, once it doesn't we don't need to remove the contents of the debug folder + ('remove', 'web/static/src/core/debug/**/*'), + 'web/static/src/env.js', + 'web/static/src/legacy/js/core/dialog.js', + 'web/static/src/legacy/js/core/owl_dialog.js', + 'web/static/src/legacy/js/core/misc.js', + 'web/static/src/legacy/js/fields/field_utils.js', + + 'im_livechat/static/src/public/*.js', + 'im_livechat/static/src/services/*.js', ] }, 'license': 'LGPL-3', diff --git a/addons/im_livechat/controllers/main.py b/addons/im_livechat/controllers/main.py index a419cf17561..34e8d79253d 100644 --- a/addons/im_livechat/controllers/main.py +++ b/addons/im_livechat/controllers/main.py @@ -45,7 +45,7 @@ class LivechatController(http.Controller): username = kwargs.get("username", _("Visitor")) channel = request.env['im_livechat.channel'].sudo().browse(channel_id) info = channel.get_livechat_info(username=username) - return request.render('im_livechat.loader', {'info': info, 'web_session_required': True}, headers=[('Content-Type', 'application/javascript')]) + return request.render('im_livechat.loader', {'info': info}, headers=[('Content-Type', 'application/javascript')]) @http.route('/im_livechat/init', type='json', auth="public", cors="*") def livechat_init(self, channel_id): diff --git a/addons/im_livechat/static/src/legacy/widgets/livechat_button.js b/addons/im_livechat/static/src/legacy/widgets/livechat_button.js index 2f7955f5dbf..23d8e693872 100644 --- a/addons/im_livechat/static/src/legacy/widgets/livechat_button.js +++ b/addons/im_livechat/static/src/legacy/widgets/livechat_button.js @@ -28,9 +28,10 @@ const LivechatButton = Widget.extend({ events: { 'click': '_openChat' }, - init(parent, serverURL, options) { + init(parent, messaging) { this._super(parent); - this.options = _.defaults(options || {}, { + this.messaging = messaging; + this.options = _.defaults(this.messaging.publicLivechatOptions || {}, { input_placeholder: _t("Ask something ..."), default_username: _t("Visitor"), button_text: _t("Chat with one of our collaborators"), @@ -43,7 +44,7 @@ const LivechatButton = Widget.extend({ // livechat window this._chatWindow = null; this._messages = []; - this._serverURL = serverURL; + this._serverURL = this.messaging.publicLivechatServerUrl; }, async willStart() { const cookie = utils.get_cookie('im_livechat_session'); diff --git a/addons/im_livechat/static/src/models/livechat_button_view.js b/addons/im_livechat/static/src/models/livechat_button_view.js new file mode 100644 index 00000000000..23e8957e8d9 --- /dev/null +++ b/addons/im_livechat/static/src/models/livechat_button_view.js @@ -0,0 +1,8 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; + +registerModel({ + name: 'LivechatButtonView', + identifyingFields: ['messaging'], +}); diff --git a/addons/im_livechat/static/src/models/messaging.js b/addons/im_livechat/static/src/models/messaging.js index 0453edb6a7d..3895166f897 100644 --- a/addons/im_livechat/static/src/models/messaging.js +++ b/addons/im_livechat/static/src/models/messaging.js @@ -1,11 +1,22 @@ /** @odoo-module **/ -import { addFields } from '@mail/model/model_core'; -import { many } from '@mail/model/model_field'; +import { addFields, addRecordMethods, patchRecordMethods } from '@mail/model/model_core'; +import { attr, many, one } from '@mail/model/model_field'; +import { clear, insertAndReplace } from '@mail/model/model_field_command'; // ensure that the model definition is loaded before the patch import '@mail/models/messaging'; addFields('Messaging', { + isInPublicLivechat: attr({ + default: false, + }), + isPublicLivechatAvailable: attr({ + default: false, + }), + livechatButtonView: one('LivechatButtonView', { + compute: '_computeLivechatButtonView', + isCausal: true, + }), /** * All pinned livechats that are known. */ @@ -13,4 +24,35 @@ addFields('Messaging', { inverse: 'messagingAsPinnedLivechat', readonly: true, }), + publicLivechatOptions: attr({ + default: {}, + }), + publicLivechatServerUrl: attr({ + default: '', + }), +}); + +addRecordMethods('Messaging', { + /** + * @private + * @returns {FieldCommand} + */ + _computeLivechatButtonView() { + if (this.isInPublicLivechat && this.isPublicLivechatAvailable) { + return insertAndReplace(); + } + return clear(); + }, +}); + +patchRecordMethods('Messaging', { + /** + * @override + */ + _computeNotificationHandler() { + if (this.isInPublicLivechat) { + return clear(); + } + return this._super(); + }, }); diff --git a/addons/im_livechat/static/src/models/messaging_initializer.js b/addons/im_livechat/static/src/models/messaging_initializer.js index 1239eac1773..8083a119dab 100644 --- a/addons/im_livechat/static/src/models/messaging_initializer.js +++ b/addons/im_livechat/static/src/models/messaging_initializer.js @@ -6,6 +6,16 @@ import { insert, insertAndReplace } from '@mail/model/model_field_command'; import '@mail/models/messaging_initializer'; patchRecordMethods('MessagingInitializer', { + /** + * @override + */ + async performInitRpc() { + if (this.messaging.isInPublicLivechat) { + return {}; + } else { + return this._super(); + } + }, /** * @override * @param {Object} resUsersSettings diff --git a/addons/im_livechat/static/src/public/main.js b/addons/im_livechat/static/src/public/main.js new file mode 100644 index 00000000000..0638886f74e --- /dev/null +++ b/addons/im_livechat/static/src/public/main.js @@ -0,0 +1,26 @@ +/** @odoo-module **/ + +import { publicLivechatService } from '@im_livechat/services/public_livechat_service'; +import { isAvailable, options, serverUrl } from 'im_livechat.loaderData'; + +import { messagingService } from '@mail/services/messaging_service'; +import { makeMessagingToLegacyEnv } from '@mail/utils/make_messaging_to_legacy_env'; + +import { registry } from '@web/core/registry'; + +const messagingValuesService = { + start() { + return { + isInPublicLivechat: true, + isPublicLivechatAvailable: isAvailable, + publicLivechatOptions: options, + publicLivechatServerUrl: serverUrl, + }; + } +}; + +const serviceRegistry = registry.category('services'); +serviceRegistry.add('messaging', messagingService); +serviceRegistry.add('messagingValues', messagingValuesService); +serviceRegistry.add('messaging_service_to_legacy_env', makeMessagingToLegacyEnv(owl.Component.env)); +serviceRegistry.add('public_livechat_service', publicLivechatService); diff --git a/addons/im_livechat/static/src/public/session.js b/addons/im_livechat/static/src/public/session.js new file mode 100644 index 00000000000..f963661604c --- /dev/null +++ b/addons/im_livechat/static/src/public/session.js @@ -0,0 +1,7 @@ +odoo.define('web.session', function (require) { + + const Session = require('web.Session'); + const { serverUrl } = require('im_livechat.loaderData'); + + return new Session(undefined, serverUrl, { use_cors: true }); +}); diff --git a/addons/im_livechat/static/src/services/public_livechat_service.js b/addons/im_livechat/static/src/services/public_livechat_service.js new file mode 100644 index 00000000000..74da48b285f --- /dev/null +++ b/addons/im_livechat/static/src/services/public_livechat_service.js @@ -0,0 +1,16 @@ +/** @odoo-module **/ + +import LivechatButton from '@im_livechat/legacy/widgets/livechat_button'; + +import rootWidget from 'root.widget'; + +export const publicLivechatService = { + dependencies: ['messaging'], + async start(env, { messaging: messagingService }) { + const messaging = await messagingService.get(); + if (messaging.livechatButtonView) { + const livechatButton = new LivechatButton(rootWidget, messaging); + livechatButton.appendTo(document.body); + } + }, +}; diff --git a/addons/im_livechat/views/im_livechat_channel_templates.xml b/addons/im_livechat/views/im_livechat_channel_templates.xml index d8a68fd73cc..2c9feb4cd2a 100644 --- a/addons/im_livechat/views/im_livechat_channel_templates.xml +++ b/addons/im_livechat/views/im_livechat_channel_templates.xml @@ -91,26 +91,12 @@