diff --git a/addons/im_livechat/static/src/models/discuss_sidebar_category.js b/addons/im_livechat/static/src/models/discuss_sidebar_category.js index fd34017603b..efa7145bb5d 100644 --- a/addons/im_livechat/static/src/models/discuss_sidebar_category.js +++ b/addons/im_livechat/static/src/models/discuss_sidebar_category.js @@ -1,6 +1,6 @@ /** @odoo-module **/ -import { addFields, patchIdentifyingFields } from '@mail/model/model_core'; +import { addFields, patchIdentifyingFields, patchRecordMethods } from '@mail/model/model_core'; import { one } from '@mail/model/model_field'; // ensure that the model definition is loaded before the patch import '@mail/models/discuss_sidebar_category'; @@ -15,3 +15,33 @@ addFields('DiscussSidebarCategory', { patchIdentifyingFields('DiscussSidebarCategory', identifyingFields => { identifyingFields[0].push('discussAsLivechat'); }); + +patchRecordMethods('DiscussSidebarCategory', { + /** + * @override + */ + _computeName() { + if (this.discussAsLivechat) { + return this.env._t("Livechat"); + } + return this._super(); + }, + /** + * @override + */ + _computeSortComputeMethod() { + if (this.discussAsLivechat) { + return 'last_action'; + } + return this._super(); + }, + /** + * @override + */ + _computeSupportedChannelTypes() { + if (this.discussAsLivechat) { + return ['livechat']; + } + 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 1f7a4f2e918..1239eac1773 100644 --- a/addons/im_livechat/static/src/models/messaging_initializer.js +++ b/addons/im_livechat/static/src/models/messaging_initializer.js @@ -15,10 +15,7 @@ patchRecordMethods('MessagingInitializer', { this.messaging.discuss.update({ categoryLivechat: insertAndReplace({ isServerOpen: is_discuss_sidebar_category_livechat_open, - name: this.env._t("Livechat"), serverStateKey: 'is_discuss_sidebar_category_livechat_open', - sortComputeMethod: 'last_action', - supportedChannelTypes: ['livechat'], }), }); this._super(...arguments); diff --git a/addons/mail/static/src/components/activity/activity.xml b/addons/mail/static/src/components/activity/activity.xml index a007ceb04f1..b77def5d760 100644 --- a/addons/mail/static/src/components/activity/activity.xml +++ b/addons/mail/static/src/components/activity/activity.xml @@ -122,7 +122,6 @@ - - - - - diff --git a/addons/mail/static/src/main.js b/addons/mail/static/src/main.js index 359034f4e81..91b025eaf31 100644 --- a/addons/mail/static/src/main.js +++ b/addons/mail/static/src/main.js @@ -3,6 +3,7 @@ import { ChatWindowManagerContainer } from '@mail/components/chat_window_manager_container/chat_window_manager_container'; import { DialogManagerContainer } from '@mail/components/dialog_manager_container/dialog_manager_container'; import { DiscussContainer } from '@mail/components/discuss_container/discuss_container'; +import { PopoverManagerContainer } from '@mail/components/popover_manager_container/popover_manager_container'; import { messagingService } from '@mail/services/messaging_service'; import { systrayService } from '@mail/services/systray_service'; import { makeMessagingToLegacyEnv } from '@mail/utils/make_messaging_to_legacy_env'; @@ -25,3 +26,4 @@ registry.category('actions').add('mail.action_discuss', DiscussContainer); registry.category('main_components').add('DialogManagerContainer', { Component: DialogManagerContainer }); registry.category('main_components').add('ChatWindowManagerContainer', { Component: ChatWindowManagerContainer }); +registry.category('main_components').add('PopoverManagerContainer', { Component: PopoverManagerContainer }); diff --git a/addons/mail/static/src/models/discuss_sidebar_category.js b/addons/mail/static/src/models/discuss_sidebar_category.js index 55b1c624795..0ac7b0ababf 100644 --- a/addons/mail/static/src/models/discuss_sidebar_category.js +++ b/addons/mail/static/src/models/discuss_sidebar_category.js @@ -73,6 +73,32 @@ registerModel({ } return clear(); }, + /** + * @private + * @returns {string|FieldCommand} + */ + _computeAutocompleteMethod() { + if (this.discussAsChannel) { + return 'channel'; + } + if (this.discussAsChat) { + return 'chat'; + } + return clear(); + }, + /** + * @private + * @returns {string|FieldCommand} + */ + _computeCommandAddTitleText() { + if (this.discussAsChannel) { + return this.env._t("Add or join a channel"); + } + if (this.discussAsChat) { + return this.env._t("Start a conversation"); + } + return clear(); + }, /** * @private * @returns {FieldCommand} @@ -89,6 +115,29 @@ registerModel({ } return replace(categoryItems); }, + /** + * @private + * @returns {boolean|FieldCommand} + */ + _computeHasAddCommand() { + if (this.discussAsChannel) { + return true; + } + if (this.discussAsChat) { + return true; + } + return clear(); + }, + /** + * @private + * @returns {boolean|FieldCommand} + */ + _computeHasViewCommand() { + if (this.discussAsChannel) { + return true; + } + return clear(); + }, /** * @private * @returns {boolean} @@ -96,6 +145,58 @@ registerModel({ _computeIsOpen() { return this.isPendingOpen !== undefined ? this.isPendingOpen : this.isServerOpen; }, + /** + * @private + * @returns {string|FieldCommand} + */ + _computeName() { + if (this.discussAsChannel) { + return this.env._t("Channels"); + } + if (this.discussAsChat) { + return this.env._t("Direct Messages"); + } + return clear(); + }, + /** + * @private + * @returns {string|FieldCommand} + */ + _computeNewItemPlaceholderText() { + if (this.discussAsChannel) { + return this.env._t("Find or create a channel..."); + } + if (this.discussAsChat) { + return this.env._t("Find or start a conversation..."); + } + return clear(); + }, + /** + * @private + * @returns {string|FieldCommand} + */ + _computeSortComputeMethod() { + if (this.discussAsChannel) { + return 'name'; + } + if (this.discussAsChat) { + return 'last_action'; + } + return clear(); + }, + /** + * @private + * @returns {string[]|FieldCommand} + */ + _computeSupportedChannelTypes() { + if (this.discussAsChannel) { + return ['channel']; + } + if (this.discussAsChat) { + return ['chat', 'group']; + } + return clear(); + }, /** * @private * @returns {Array[]} @@ -213,11 +314,17 @@ registerModel({ * Determines how the autocomplete of this category should behave. * Must be one of: 'channel', 'chat'. */ - autocompleteMethod: attr(), + autocompleteMethod: attr({ + compute: '_computeAutocompleteMethod', + default: '', + }), /** * The title text in UI for command `add` */ - commandAddTitleText: attr(), + commandAddTitleText: attr({ + compute: '_computeCommandAddTitleText', + default: '', + }), /** * Determines the discuss sidebar category items that are displayed by * this discuss sidebar category. @@ -255,17 +362,22 @@ registerModel({ /** * Display name of the category. */ - name: attr(), + name: attr({ + compute: '_computeName', + default: '', + }), /** * Boolean that determines whether this category has a 'add' command. */ hasAddCommand: attr({ + compute: '_computeHasAddCommand', default: false, }), /** * Boolean that determines whether this category has a 'view' command. */ hasViewCommand: attr({ + compute: '_computeHasViewCommand', default: false, }), /** @@ -295,7 +407,9 @@ registerModel({ /** * The placeholder text used when a new item is being added in UI. */ - newItemPlaceholderText: attr(), + newItemPlaceholderText: attr({ + compute: '_computeNewItemPlaceholderText', + }), /** * The key used in the server side for the category state */ @@ -308,12 +422,14 @@ registerModel({ * Must be one of: 'name', 'last_action'. */ sortComputeMethod: attr({ + compute: '_computeSortComputeMethod', required: true, }), /** * Channel type which is supported by the category. */ supportedChannelTypes: attr({ + compute: '_computeSupportedChannelTypes', required: true, readonly: true, }), diff --git a/addons/mail/static/src/models/messaging.js b/addons/mail/static/src/models/messaging.js index 8a645e23402..5b58d2c64e3 100644 --- a/addons/mail/static/src/models/messaging.js +++ b/addons/mail/static/src/models/messaging.js @@ -461,6 +461,11 @@ registerModel({ default: 0, }), partnerRoot: one('Partner'), + popoverManager: one('PopoverManager', { + default: insertAndReplace(), + isCausal: true, + readonly: true, + }), /** * Determines which partners should be considered the public partners, * which are special partners notably used in livechat. diff --git a/addons/mail/static/src/models/messaging_initializer.js b/addons/mail/static/src/models/messaging_initializer.js index 9ebe4977f17..0d44b60e355 100644 --- a/addons/mail/static/src/models/messaging_initializer.js +++ b/addons/mail/static/src/models/messaging_initializer.js @@ -247,27 +247,12 @@ registerModel({ }); this.messaging.discuss.update({ categoryChannel: insertAndReplace({ - autocompleteMethod: 'channel', - commandAddTitleText: this.env._t("Add or join a channel"), - hasAddCommand: true, - hasViewCommand: true, isServerOpen: is_discuss_sidebar_category_channel_open, - name: this.env._t("Channels"), - newItemPlaceholderText: this.env._t("Find or create a channel..."), serverStateKey: 'is_discuss_sidebar_category_channel_open', - sortComputeMethod: 'name', - supportedChannelTypes: ['channel'], }), categoryChat: insertAndReplace({ - autocompleteMethod: 'chat', - commandAddTitleText: this.env._t("Start a conversation"), - hasAddCommand: true, isServerOpen: is_discuss_sidebar_category_chat_open, - name: this.env._t("Direct Messages"), - newItemPlaceholderText: this.env._t("Find or start a conversation..."), serverStateKey: 'is_discuss_sidebar_category_chat_open', - sortComputeMethod: 'last_action', - supportedChannelTypes: ['chat', 'group'], }), }); }, diff --git a/addons/mail/static/src/models/popover_manager.js b/addons/mail/static/src/models/popover_manager.js new file mode 100644 index 00000000000..cd94df48090 --- /dev/null +++ b/addons/mail/static/src/models/popover_manager.js @@ -0,0 +1,16 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { many } from '@mail/model/model_field'; + +registerModel({ + name: 'PopoverManager', + identifyingFields: ['messaging'], + fields: { + // FIXME: dependent on implementation that uses insert order in relations!! + popoverViews: many('PopoverView', { + inverse: 'manager', + isCausal: true, + }), + }, +}); diff --git a/addons/mail/static/src/models/popover_view.js b/addons/mail/static/src/models/popover_view.js index c360553926c..64f8e9dc48c 100644 --- a/addons/mail/static/src/models/popover_view.js +++ b/addons/mail/static/src/models/popover_view.js @@ -123,6 +123,16 @@ registerModel({ } return clear(); }, + /** + * @private + * @returns {FieldCommand} + */ + _computeManager() { + if (this.messaging.popoverManager) { + return replace(this.messaging.popoverManager); + } + return clear(); + }, /** * @private * @returns {string} @@ -231,6 +241,11 @@ registerModel({ isCausal: true, readonly: true, }), + manager: one('PopoverManager', { + compute: '_computeManager', + inverse: 'popoverViews', + readonly: true, + }), /** * If set, this popover view is owned by a message action list. */ diff --git a/addons/mail/static/tests/helpers/webclient_setup.js b/addons/mail/static/tests/helpers/webclient_setup.js index 98073ba8289..3c39d81f7c3 100644 --- a/addons/mail/static/tests/helpers/webclient_setup.js +++ b/addons/mail/static/tests/helpers/webclient_setup.js @@ -7,6 +7,7 @@ import BusService from 'bus.BusService'; import { ChatWindowManagerContainer } from '@mail/components/chat_window_manager_container/chat_window_manager_container'; import { DialogManagerContainer } from '@mail/components/dialog_manager_container/dialog_manager_container'; import { DiscussContainer } from '@mail/components/discuss_container/discuss_container'; +import { PopoverManagerContainer } from '@mail/components/popover_manager_container/popover_manager_container'; import { messagingService } from '@mail/services/messaging_service'; import { makeMessagingToLegacyEnv } from '@mail/utils/make_messaging_to_legacy_env'; @@ -36,6 +37,7 @@ const SERVICES_PARAMETER_NAMES = new Set([ mainComponentRegistry.add('ChatWindowManagerContainer', { Component: ChatWindowManagerContainer }); mainComponentRegistry.add('DialogManagerContainer', { Component: DialogManagerContainer }); registry.category('actions').add('mail.action_discuss', DiscussContainer); + mainComponentRegistry.add('PopoverManagerContainer', { Component: PopoverManagerContainer }); } /**