diff --git a/addons/mail/static/src/components/channel_member/channel_member.xml b/addons/mail/static/src/components/channel_member/channel_member.xml index 6ce857ded8d..1caa9928a94 100644 --- a/addons/mail/static/src/components/channel_member/channel_member.xml +++ b/addons/mail/static/src/components/channel_member/channel_member.xml @@ -13,7 +13,6 @@ 'o-isDeviceSmall': messaging.device.isSmall, 'small': !messaging.device.isSmall, }" - hasOpenChat="channelMemberView.hasOpenChat" record="channelMemberView.personaImStatusIconView" /> diff --git a/addons/mail/static/src/components/composer_suggestion_view/composer_suggestion_view.xml b/addons/mail/static/src/components/composer_suggestion_view/composer_suggestion_view.xml index 8e3206c6350..b69aba08d11 100644 --- a/addons/mail/static/src/components/composer_suggestion_view/composer_suggestion_view.xml +++ b/addons/mail/static/src/components/composer_suggestion_view/composer_suggestion_view.xml @@ -19,7 +19,6 @@ diff --git a/addons/mail/static/src/components/message/message.xml b/addons/mail/static/src/components/message/message.xml index c88a02819d0..9c1d123f783 100644 --- a/addons/mail/static/src/components/message/message.xml +++ b/addons/mail/static/src/components/message/message.xml @@ -42,7 +42,6 @@ 'small': !messaging.device.isSmall, 'text-100': messageView.message.is_note and !messageView.isSelected, }" - hasOpenChat="messageView.hasAuthorOpenChat" record="messageView.personaImStatusIconView" /> diff --git a/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.js b/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.js index 31f20650eda..d1e21f710ab 100644 --- a/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.js +++ b/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.js @@ -1,16 +1,11 @@ /** @odoo-module **/ import { registerMessagingComponent } from '@mail/utils/messaging_component'; -import { markEventHandled } from '@mail/utils/utils'; const { Component } = owl; export class PersonaImStatusIcon extends Component { - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - /** * @returns {PersonaImStatusIconView} */ @@ -18,38 +13,10 @@ export class PersonaImStatusIcon extends Component { return this.props.record; } - //-------------------------------------------------------------------------- - // Handlers - //-------------------------------------------------------------------------- - - /** - * @private - * @param {MouseEvent} ev - */ - _onClick(ev) { - markEventHandled(ev, 'PersonaImStatusIcon.Click'); - if (!this.props.hasOpenChat || !this.personaImStatusIconView.persona.partner) { - return; - } - this.personaImStatusIconView.persona.partner.openChat(); - } - } Object.assign(PersonaImStatusIcon, { - defaultProps: { - hasBackground: true, - hasOpenChat: false, - }, - props: { - hasBackground: { type: Boolean, optional: true }, - /** - * Determines whether a click on `this` should open a chat with - * `this.partner`. - */ - hasOpenChat: { type: Boolean, optional: true }, - record: Object, - }, + props: { record: Object }, template: 'mail.PersonaImStatusIcon', }); diff --git a/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.xml b/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.xml index af1adae48ea..8507972d937 100644 --- a/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.xml +++ b/addons/mail/static/src/components/persona_im_status_icon/persona_im_status_icon.xml @@ -6,16 +6,16 @@ t-att-class="{ 'o-away': personaImStatusIconView.persona.im_status === 'away', 'o-bot': messaging.partnerRoot.persona === personaImStatusIconView.persona, - 'o-has-open-chat cursor-pointer': props.hasOpenChat, + 'o-has-open-chat cursor-pointer': personaImStatusIconView.hasOpenChat, 'o-offline': personaImStatusIconView.persona.im_status === 'offline', 'o-online': personaImStatusIconView.persona.im_status === 'online', }" t-attf-class="{{ className }}" - t-on-click="_onClick" + t-on-click="personaImStatusIconView.onClick" t-ref="root" name="root" > - + diff --git a/addons/mail/static/src/models/persona_im_status_icon_view.js b/addons/mail/static/src/models/persona_im_status_icon_view.js index 823c2600cfb..dc944f14080 100644 --- a/addons/mail/static/src/models/persona_im_status_icon_view.js +++ b/addons/mail/static/src/models/persona_im_status_icon_view.js @@ -1,12 +1,25 @@ /** @odoo-module **/ -import { one } from '@mail/model/model_field'; +import { attr, one } from '@mail/model/model_field'; import { registerModel } from '@mail/model/model_core'; import { clear } from '@mail/model/model_field_command'; +import { markEventHandled } from '@mail/utils/utils'; registerModel({ name: 'PersonaImStatusIconView', identifyingMode: 'xor', + recordMethods: { + /** + * @param {MouseEvent} ev + */ + onClick(ev) { + markEventHandled(ev, 'PersonaImStatusIcon.Click'); + if (!this.hasOpenChat || !this.persona.partner) { + return; + } + this.persona.partner.openChat(); + }, + }, fields: { channelInvitationFormSelectablePartnerViewOwner: one('ChannelInvitationFormSelectablePartnerView', { identifying: true, @@ -24,6 +37,31 @@ registerModel({ identifying: true, inverse: 'personaImStatusIconView', }), + hasBackground: attr({ + compute() { + if (this.composerSuggestionViewOwner) { + return false; + } + return clear(); + }, + default: true, + }), + /** + * Determines whether a click on this view should open a chat with the + * corresponding persona. + */ + hasOpenChat: attr({ + compute() { + if (this.channelMemberViewOwner) { + return this.channelMemberViewOwner.hasOpenChat; + } + if (this.messageViewOwner) { + return this.messageViewOwner.hasAuthorOpenChat; + } + return clear(); + }, + default: false, + }), messageViewOwner: one('MessageView', { identifying: true, inverse: 'personaImStatusIconView',