From 0e8b1721b580fe2ecb516871249f4f73c8589afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Theys?= Date: Wed, 15 Jun 2022 16:31:56 +0000 Subject: [PATCH] [IMP] mail: introduce Persona model for guest and partner And use it on partner im status. This will allow displaying the im status of guest without any other change to components. Part of task-2883466 Part-of: odoo/odoo#93731 --- .../partner_im_status_icon.xml | 6 +- .../partner_im_status_icon.js | 4 +- .../partner_im_status_icon.xml | 16 +++--- addons/mail/static/src/models/guest.js | 8 +++ addons/mail/static/src/models/partner.js | 9 ++- .../src/models/partner_im_status_icon_view.js | 20 +++---- addons/mail/static/src/models/persona.js | 56 +++++++++++++++++++ 7 files changed, 95 insertions(+), 24 deletions(-) create mode 100644 addons/mail/static/src/models/persona.js 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, + }), + }, +});