From e8023a1c89cffe8b77c99fc0d534810bb8d2e663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Theys?= Date: Wed, 15 Jun 2022 15:33:59 +0000 Subject: [PATCH] [IMP] mail: introduce PartnerImStatusIconView model In preparation to move common code of guest and user to dedicated model. Part of task-2883466 Part-of: odoo/odoo#93731 --- .../partner_im_status_icon.xml | 6 +- ...nel_invitation_form_selectable_partner.xml | 4 +- .../channel_member/channel_member.xml | 4 +- .../composer_suggestion.xml | 3 +- .../static/src/components/message/message.xml | 4 +- .../notification_request.xml | 3 +- .../partner_im_status_icon.js | 10 +-- .../partner_im_status_icon.xml | 18 ++-- .../thread_needaction_preview.xml | 4 +- .../thread_preview/thread_preview.xml | 4 +- ...invitation_form_selectable_partner_view.js | 16 ++++ .../static/src/models/channel_member_view.js | 14 ++++ .../static/src/models/composer_suggestion.js | 15 +++- addons/mail/static/src/models/message_view.js | 13 +++ .../src/models/notification_request_view.js | 15 +++- addons/mail/static/src/models/partner.js | 11 +++ .../src/models/partner_im_status_icon_view.js | 83 +++++++++++++++++++ .../models/thread_needaction_preview_view.js | 15 +++- .../static/src/models/thread_preview_view.js | 15 +++- 19 files changed, 223 insertions(+), 34 deletions(-) create mode 100644 addons/mail/static/src/models/partner_im_status_icon_view.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 dd7ba153d82..a602cec4b63 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/channel_invitation_form_selectable_partner/channel_invitation_form_selectable_partner.xml b/addons/mail/static/src/components/channel_invitation_form_selectable_partner/channel_invitation_form_selectable_partner.xml index aa80645a420..d9d2d5b7fbd 100644 --- a/addons/mail/static/src/components/channel_invitation_form_selectable_partner/channel_invitation_form_selectable_partner.xml +++ b/addons/mail/static/src/components/channel_invitation_form_selectable_partner/channel_invitation_form_selectable_partner.xml @@ -5,14 +5,14 @@
Avatar - +
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 0468595565a..35dd22bef00 100644 --- a/addons/mail/static/src/components/channel_member/channel_member.xml +++ b/addons/mail/static/src/components/channel_member/channel_member.xml @@ -6,14 +6,14 @@
Avatar - +
diff --git a/addons/mail/static/src/components/composer_suggestion/composer_suggestion.xml b/addons/mail/static/src/components/composer_suggestion/composer_suggestion.xml index 52f09408570..7ed0b05f676 100644 --- a/addons/mail/static/src/components/composer_suggestion/composer_suggestion.xml +++ b/addons/mail/static/src/components/composer_suggestion/composer_suggestion.xml @@ -17,9 +17,10 @@ diff --git a/addons/mail/static/src/components/message/message.xml b/addons/mail/static/src/components/message/message.xml index c0f7ae6269e..7a363f13645 100644 --- a/addons/mail/static/src/components/message/message.xml +++ b/addons/mail/static/src/components/message/message.xml @@ -35,7 +35,7 @@
- +
diff --git a/addons/mail/static/src/components/notification_request/notification_request.xml b/addons/mail/static/src/components/notification_request/notification_request.xml index 7ee86e0c5b1..9579b43a3d3 100644 --- a/addons/mail/static/src/components/notification_request/notification_request.xml +++ b/addons/mail/static/src/components/notification_request/notification_request.xml @@ -8,9 +8,10 @@
Avatar of OdooBot
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 a734a102340..4a9de33d679 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 @@ -12,10 +12,10 @@ export class PartnerImStatusIcon extends Component { //-------------------------------------------------------------------------- /** - * @returns {Partner} + * @returns {PartnerImStatusIconView} */ - get partner() { - return this.props.partner; + get partnerImStatusIconView() { + return this.props.record; } //-------------------------------------------------------------------------- @@ -31,7 +31,7 @@ export class PartnerImStatusIcon extends Component { if (!this.props.hasOpenChat) { return; } - this.partner.openChat(); + this.partnerImStatusIconView.partner.openChat(); } } @@ -42,13 +42,13 @@ Object.assign(PartnerImStatusIcon, { hasOpenChat: false, }, props: { - partner: Object, 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, }, template: 'mail.PartnerImStatusIcon', }); 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 9f480441b38..da096b79009 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 @@ -2,14 +2,13 @@ - - + - + - + - + - diff --git a/addons/mail/static/src/components/thread_needaction_preview/thread_needaction_preview.xml b/addons/mail/static/src/components/thread_needaction_preview/thread_needaction_preview.xml index 09da4b6e65b..57b270bf108 100644 --- a/addons/mail/static/src/components/thread_needaction_preview/thread_needaction_preview.xml +++ b/addons/mail/static/src/components/thread_needaction_preview/thread_needaction_preview.xml @@ -11,14 +11,14 @@
Thread Image - +
diff --git a/addons/mail/static/src/components/thread_preview/thread_preview.xml b/addons/mail/static/src/components/thread_preview/thread_preview.xml index d1f52a63612..a63ca3a15e6 100644 --- a/addons/mail/static/src/components/thread_preview/thread_preview.xml +++ b/addons/mail/static/src/components/thread_preview/thread_preview.xml @@ -11,7 +11,7 @@
Thread Image - +
diff --git a/addons/mail/static/src/models/channel_invitation_form_selectable_partner_view.js b/addons/mail/static/src/models/channel_invitation_form_selectable_partner_view.js index 6f49f6e1841..0d7cd49c1d2 100644 --- a/addons/mail/static/src/models/channel_invitation_form_selectable_partner_view.js +++ b/addons/mail/static/src/models/channel_invitation_form_selectable_partner_view.js @@ -2,10 +2,20 @@ import { registerModel } from '@mail/model/model_core'; import { one } from '@mail/model/model_field'; +import { clear, insertAndReplace } from '@mail/model/model_field_command'; registerModel({ name: 'ChannelInvitationFormSelectablePartnerView', identifyingFields: ['channelInvitationFormOwner', 'partner'], + recordMethods: { + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.partner.isImStatusSet ? insertAndReplace() : clear(); + }, + }, fields: { channelInvitationFormOwner: one('ChannelInvitationForm', { inverse: 'selectablePartnerViews', @@ -17,5 +27,11 @@ registerModel({ readonly: true, required: true, }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'channelInvitationFormSelectablePartnerViewOwner', + isCausal: true, + readonly: true, + }), }, }); diff --git a/addons/mail/static/src/models/channel_member_view.js b/addons/mail/static/src/models/channel_member_view.js index 58db969bec5..4df82fe6ad8 100644 --- a/addons/mail/static/src/models/channel_member_view.js +++ b/addons/mail/static/src/models/channel_member_view.js @@ -2,6 +2,7 @@ import { registerModel } from '@mail/model/model_core'; import { one } from '@mail/model/model_field'; +import { clear, insertAndReplace } from '@mail/model/model_field_command'; registerModel({ name: 'ChannelMemberView', @@ -27,6 +28,13 @@ registerModel({ } this.channelMember.partner.openProfile(); }, + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.channelMember.partner && this.channelMember.partner.isImStatusSet ? insertAndReplace() : clear(); + }, }, fields: { channelMemberListCategoryViewOwner: one('ChannelMemberListCategoryView', { @@ -39,5 +47,11 @@ registerModel({ readonly: true, required: true, }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'channelMemberViewOwner', + isCausal: true, + readonly: true, + }), }, }); diff --git a/addons/mail/static/src/models/composer_suggestion.js b/addons/mail/static/src/models/composer_suggestion.js index a48cd47ebd8..e4df0827b69 100644 --- a/addons/mail/static/src/models/composer_suggestion.js +++ b/addons/mail/static/src/models/composer_suggestion.js @@ -2,7 +2,7 @@ import { registerModel } from '@mail/model/model_core'; import { attr, one } from '@mail/model/model_field'; -import { clear, replace } from '@mail/model/model_field_command'; +import { clear, insertAndReplace, replace } from '@mail/model/model_field_command'; import { sprintf } from '@web/core/utils/strings'; /** @@ -66,6 +66,13 @@ registerModel({ return this.thread.name; } }, + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.partner && this.partner.isImStatusSet ? insertAndReplace() : clear(); + }, /** * @private * @returns {FieldCommand} @@ -143,6 +150,12 @@ registerModel({ partner: one('Partner', { readonly: true, }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'composerSuggestionViewOwner', + isCausal: true, + readonly: true, + }), thread: one('Thread', { readonly: true, }), diff --git a/addons/mail/static/src/models/message_view.js b/addons/mail/static/src/models/message_view.js index f2fe31398d4..9fe0ee592b6 100644 --- a/addons/mail/static/src/models/message_view.js +++ b/addons/mail/static/src/models/message_view.js @@ -294,6 +294,13 @@ registerModel({ } return clear(); }, + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.message.author && this.message.author.isImStatusSet ? insertAndReplace() : clear(); + }, }, fields: { /** @@ -439,6 +446,12 @@ registerModel({ messagingAsClickedMessageView: one('Messaging', { inverse: 'clickedMessageView', }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'messageViewOwner', + isCausal: true, + readonly: true, + }), /** * States the thread view that is displaying this messages (if any). */ diff --git a/addons/mail/static/src/models/notification_request_view.js b/addons/mail/static/src/models/notification_request_view.js index aa694e2383f..dd0c36f7b55 100644 --- a/addons/mail/static/src/models/notification_request_view.js +++ b/addons/mail/static/src/models/notification_request_view.js @@ -2,7 +2,7 @@ import { registerModel } from '@mail/model/model_core'; import { attr, one } from '@mail/model/model_field'; -import { clear } from '@mail/model/model_field_command'; +import { clear, insertAndReplace } from '@mail/model/model_field_command'; import { sprintf } from '@web/core/utils/strings'; @@ -23,6 +23,13 @@ registerModel({ { odoobotName: this.messaging.partnerRoot.nameOrDisplayName }, ); }, + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.messaging.partnerRoot.isImStatusSet ? insertAndReplace() : clear(); + }, }, fields: { headerText: attr({ @@ -33,5 +40,11 @@ registerModel({ required: true, readonly: true, }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'notificationRequestViewOwner', + isCausal: true, + readonly: true, + }), }, }); diff --git a/addons/mail/static/src/models/partner.js b/addons/mail/static/src/models/partner.js index bb710e8aaf5..5f22add87b6 100644 --- a/addons/mail/static/src/models/partner.js +++ b/addons/mail/static/src/models/partner.js @@ -346,6 +346,13 @@ registerModel({ _computeDisplayName() { return this.display_name || this.user && this.user.display_name; }, + /** + * @private + * @returns {boolean} + */ + _computeIsImStatusSet() { + return Boolean(this.im_status && this.im_status !== 'im_partner'); + }, /** * @private * @returns {boolean} @@ -410,6 +417,10 @@ registerModel({ required: true, }), im_status: attr(), + isImStatusSet: attr({ + compute: '_computeIsImStatusSet', + readonly: true, + }), /** * States whether this partner is online. */ 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 new file mode 100644 index 00000000000..15f3cd4b8e3 --- /dev/null +++ b/addons/mail/static/src/models/partner_im_status_icon_view.js @@ -0,0 +1,83 @@ +/** @odoo-module **/ + +import { one } from '@mail/model/model_field'; +import { registerModel } from '@mail/model/model_core'; +import { clear, replace } from '@mail/model/model_field_command'; + +registerModel({ + name: 'PartnerImStatusIconView', + identifyingFields: [[ + 'channelInvitationFormSelectablePartnerViewOwner', + 'channelMemberViewOwner', + 'composerSuggestionViewOwner', + 'messageViewOwner', + 'notificationRequestViewOwner', + 'threadNeedactionPreviewViewOwner', + 'threadPreviewViewOwner', + ]], + recordMethods: { + /** + * @private + * @returns {FieldCommand} + */ + _computePartner() { + if (this.channelInvitationFormSelectablePartnerViewOwner) { + return replace(this.channelInvitationFormSelectablePartnerViewOwner.partner); + } + if (this.channelMemberViewOwner) { + return replace(this.channelMemberViewOwner.channelMember.partner); + } + if (this.composerSuggestionViewOwner) { + return replace(this.composerSuggestionViewOwner.partner); + } + if (this.messageViewOwner) { + return replace(this.messageViewOwner.message.author); + } + if (this.notificationRequestViewOwner) { + return replace(this.messaging.partnerRoot); + } + if (this.threadNeedactionPreviewViewOwner) { + return replace(this.threadNeedactionPreviewViewOwner.thread.correspondent); + } + if (this.threadPreviewViewOwner) { + return replace(this.threadPreviewViewOwner.thread.correspondent); + } + return clear(); + }, + }, + fields: { + channelInvitationFormSelectablePartnerViewOwner: one('ChannelInvitationFormSelectablePartnerView', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + channelMemberViewOwner: one('ChannelMemberView', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + composerSuggestionViewOwner: one('ComposerSuggestion', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + messageViewOwner: one('MessageView', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + notificationRequestViewOwner: one('NotificationRequestView', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + threadNeedactionPreviewViewOwner: one('ThreadNeedactionPreviewView', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + threadPreviewViewOwner: one('ThreadPreviewView', { + inverse: 'partnerImStatusIconView', + readonly: true, + }), + partner: one('Partner', { + compute: '_computePartner', + readonly: true, + required: true, + }), + }, +}); diff --git a/addons/mail/static/src/models/thread_needaction_preview_view.js b/addons/mail/static/src/models/thread_needaction_preview_view.js index a66ad3fcdad..d4de697351b 100644 --- a/addons/mail/static/src/models/thread_needaction_preview_view.js +++ b/addons/mail/static/src/models/thread_needaction_preview_view.js @@ -75,6 +75,13 @@ registerModel({ } return clear(); }, + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.thread.correspondent && this.thread.correspondent.isImStatusSet ? insertAndReplace() : clear(); + }, }, fields: { inlineLastNeedactionMessageAsOriginThreadBody: attr({ @@ -87,7 +94,7 @@ registerModel({ readonly: true, }), lastTrackingValue: one('TrackingValue', { - compute:'_computeLastTrackingValue', + compute: '_computeLastTrackingValue', readonly: true, }), /** @@ -105,6 +112,12 @@ registerModel({ readonly: true, required: true, }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'threadNeedactionPreviewViewOwner', + isCausal: true, + readonly: true, + }), thread: one('Thread', { inverse: 'threadNeedactionPreviewViews', readonly: true, diff --git a/addons/mail/static/src/models/thread_preview_view.js b/addons/mail/static/src/models/thread_preview_view.js index eb12c6e7e1e..8cf8a91532b 100644 --- a/addons/mail/static/src/models/thread_preview_view.js +++ b/addons/mail/static/src/models/thread_preview_view.js @@ -74,6 +74,13 @@ registerModel({ } return clear(); }, + /** + * @private + * @returns {FieldCommand} + */ + _computePartnerImStatusIconView() { + return this.thread.correspondent && this.thread.correspondent.isImStatusSet ? insertAndReplace() : clear(); + }, }, fields: { inlineLastMessageBody: attr({ @@ -86,7 +93,7 @@ registerModel({ readonly: true, }), lastTrackingValue: one('TrackingValue', { - compute:'_computeLastTrackingValue', + compute: '_computeLastTrackingValue', readonly: true, }), /** @@ -104,6 +111,12 @@ registerModel({ readonly: true, required: true, }), + partnerImStatusIconView: one('PartnerImStatusIconView', { + compute: '_computePartnerImStatusIconView', + inverse: 'threadPreviewViewOwner', + isCausal: true, + readonly: true, + }), thread: one('Thread', { inverse: 'threadPreviewViews', readonly: true,