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',