diff --git a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml index a602cec4b63..ea9a2fcb687 100644 --- a/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml +++ b/addons/hr_holidays/static/src/components/partner_im_status_icon/partner_im_status_icon.xml @@ -2,13 +2,13 @@ - + - + - + diff --git a/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.js b/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.js index 4a9de33d679..16d12396d2a 100644 --- a/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.js +++ b/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.js @@ -28,10 +28,10 @@ export class PartnerImStatusIcon extends Component { */ _onClick(ev) { markEventHandled(ev, 'PartnerImStatusIcon.Click'); - if (!this.props.hasOpenChat) { + if (!this.props.hasOpenChat || !this.partnerImStatusIconView.persona.partner) { return; } - this.partnerImStatusIconView.partner.openChat(); + this.partnerImStatusIconView.persona.partner.openChat(); } } diff --git a/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.xml b/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.xml index da096b79009..8e1fcffa743 100644 --- a/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.xml +++ b/addons/mail/static/src/components/partner_im_status_icon/partner_im_status_icon.xml @@ -4,11 +4,11 @@ - + - + - + - + diff --git a/addons/mail/static/src/models/guest.js b/addons/mail/static/src/models/guest.js index 035b0284b70..7a05858d692 100644 --- a/addons/mail/static/src/models/guest.js +++ b/addons/mail/static/src/models/guest.js @@ -2,6 +2,7 @@ import { attr, many, one } from '@mail/model/model_field'; import { registerModel } from '@mail/model/model_core'; +import { insertAndReplace } from '@mail/model/model_field_command'; registerModel({ name: 'Guest', @@ -43,6 +44,13 @@ registerModel({ readonly: true, }), name: attr(), + persona: one('Persona', { + default: insertAndReplace(), + inverse: 'guest', + isCausal: true, + readonly: true, + required: true, + }), rtcSessions: many('RtcSession', { inverse: 'guest', }), diff --git a/addons/mail/static/src/models/partner.js b/addons/mail/static/src/models/partner.js index 5f22add87b6..941832654db 100644 --- a/addons/mail/static/src/models/partner.js +++ b/addons/mail/static/src/models/partner.js @@ -2,7 +2,7 @@ import { registerModel } from '@mail/model/model_core'; import { attr, many, one } from '@mail/model/model_field'; -import { clear, insert, link } from '@mail/model/model_field_command'; +import { clear, insert, insertAndReplace, link } from '@mail/model/model_field_command'; import { cleanSearchTerm } from '@mail/utils/utils'; registerModel({ @@ -441,6 +441,13 @@ registerModel({ inverse: 'partner', isCausal: true, }), + persona: one('Persona', { + default: insertAndReplace(), + inverse: 'partner', + isCausal: true, + readonly: true, + required: true, + }), rtcSessions: many('RtcSession', { inverse: 'partner', }), diff --git a/addons/mail/static/src/models/partner_im_status_icon_view.js b/addons/mail/static/src/models/partner_im_status_icon_view.js index 15f3cd4b8e3..327999ab44e 100644 --- a/addons/mail/static/src/models/partner_im_status_icon_view.js +++ b/addons/mail/static/src/models/partner_im_status_icon_view.js @@ -20,27 +20,27 @@ registerModel({ * @private * @returns {FieldCommand} */ - _computePartner() { + _computePersona() { if (this.channelInvitationFormSelectablePartnerViewOwner) { - return replace(this.channelInvitationFormSelectablePartnerViewOwner.partner); + return replace(this.channelInvitationFormSelectablePartnerViewOwner.partner.persona); } if (this.channelMemberViewOwner) { - return replace(this.channelMemberViewOwner.channelMember.partner); + return replace(this.channelMemberViewOwner.channelMember.partner.persona); } if (this.composerSuggestionViewOwner) { - return replace(this.composerSuggestionViewOwner.partner); + return replace(this.composerSuggestionViewOwner.partner.persona); } if (this.messageViewOwner) { - return replace(this.messageViewOwner.message.author); + return replace(this.messageViewOwner.message.author.persona); } if (this.notificationRequestViewOwner) { - return replace(this.messaging.partnerRoot); + return replace(this.messaging.partnerRoot.persona); } if (this.threadNeedactionPreviewViewOwner) { - return replace(this.threadNeedactionPreviewViewOwner.thread.correspondent); + return replace(this.threadNeedactionPreviewViewOwner.thread.correspondent.persona); } if (this.threadPreviewViewOwner) { - return replace(this.threadPreviewViewOwner.thread.correspondent); + return replace(this.threadPreviewViewOwner.thread.correspondent.persona); } return clear(); }, @@ -74,8 +74,8 @@ registerModel({ inverse: 'partnerImStatusIconView', readonly: true, }), - partner: one('Partner', { - compute: '_computePartner', + persona: one('Persona', { + compute: '_computePersona', readonly: true, required: true, }), diff --git a/addons/mail/static/src/models/persona.js b/addons/mail/static/src/models/persona.js new file mode 100644 index 00000000000..d4b4f32c8af --- /dev/null +++ b/addons/mail/static/src/models/persona.js @@ -0,0 +1,56 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { attr, one } from '@mail/model/model_field'; +import { clear } from '@mail/model/model_field_command'; + +registerModel({ + name: 'Persona', + identifyingFields: [['guest', 'partner']], + recordMethods: { + /** + * @private + * @returns {string|FieldCommand} + */ + _computeImStatus() { + if (this.guest) { + return this.guest.im_status || clear(); + } + if (this.partner) { + return this.partner.im_status || clear(); + } + return clear(); + }, + /** + * @private + * @returns {string|FieldCommand} + */ + _computeName() { + if (this.guest) { + return this.guest.name || clear(); + } + if (this.partner) { + return this.partner.nameOrDisplayName || clear(); + } + return clear(); + }, + }, + fields: { + guest: one('Guest', { + inverse: 'persona', + readonly: true, + }), + im_status: attr({ + compute: '_computeImStatus', + readonly: true, + }), + name: attr({ + compute: '_computeName', + readonly: true, + }), + partner: one('Partner', { + inverse: 'persona', + readonly: true, + }), + }, +});