From e1b037dc4c8e29a3c1cdf08fb8fa2b6230a2d9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Fri, 15 Apr 2022 15:19:54 +0000 Subject: [PATCH] [IMP] mail: introduce AutocompleteInputView (step 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit moves some business logic from component AutocompleteInput To model AutocompleteInputView, as a step to move further to having essentially all business code in models. Having code in models is desirable to have very maintainable code, thanks to robust and declarative code with an ORM-like architecture. Task-2817076 closes odoo/odoo#89077 Signed-off-by: Alexandre Kühn (aku) --- .../autocomplete_input/autocomplete_input.js | 14 ++++--- .../autocomplete_input/autocomplete_input.xml | 2 +- .../components/chat_window/chat_window.xml | 3 +- .../static/src/components/discuss/discuss.js | 20 ---------- .../static/src/components/discuss/discuss.xml | 4 +- .../discuss_sidebar_category.xml | 2 +- .../messaging_menu/messaging_menu.js | 8 ---- .../messaging_menu/messaging_menu.xml | 4 +- .../src/models/autocomplete_input_view.js | 40 ++++++++++++++++++- addons/mail/static/src/models/discuss_view.js | 16 ++++++++ .../mail/static/src/models/messaging_menu.js | 3 ++ 11 files changed, 73 insertions(+), 43 deletions(-) diff --git a/addons/mail/static/src/components/autocomplete_input/autocomplete_input.js b/addons/mail/static/src/components/autocomplete_input/autocomplete_input.js index d5c27b082b1..a2da7d6bdc9 100644 --- a/addons/mail/static/src/components/autocomplete_input/autocomplete_input.js +++ b/addons/mail/static/src/components/autocomplete_input/autocomplete_input.js @@ -57,6 +57,13 @@ export class AutocompleteInput extends Component { $(this.root.el).autocomplete('destroy'); } + /** + * @returns {AutocompleteInputView} + */ + get autocompleteInputView() { + return this.messaging && this.messaging.models['AutocompleteInputView'].get(this.props.localId); + } + //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- @@ -154,8 +161,6 @@ Object.assign(AutocompleteInput, { defaultProps: { isFocusOnMount: false, isHtml: false, - placeholder: '', - onFocusin: () => {}, }, props: { customClass: { @@ -174,10 +179,7 @@ Object.assign(AutocompleteInput, { type: Boolean, optional: true, }, - onFocusin: { - type: Function, - optional: true, - }, + localId: String, onHide: { type: Function, optional: true, diff --git a/addons/mail/static/src/components/autocomplete_input/autocomplete_input.xml b/addons/mail/static/src/components/autocomplete_input/autocomplete_input.xml index 0946b325944..9f7a3ad68b1 100644 --- a/addons/mail/static/src/components/autocomplete_input/autocomplete_input.xml +++ b/addons/mail/static/src/components/autocomplete_input/autocomplete_input.xml @@ -2,7 +2,7 @@ - + diff --git a/addons/mail/static/src/components/chat_window/chat_window.xml b/addons/mail/static/src/components/chat_window/chat_window.xml index 9d79424b9fe..7d74faad3d5 100644 --- a/addons/mail/static/src/components/chat_window/chat_window.xml +++ b/addons/mail/static/src/components/chat_window/chat_window.xml @@ -40,10 +40,9 @@ diff --git a/addons/mail/static/src/components/discuss/discuss.js b/addons/mail/static/src/components/discuss/discuss.js index 1e81074a169..23695f41bca 100644 --- a/addons/mail/static/src/components/discuss/discuss.js +++ b/addons/mail/static/src/components/discuss/discuss.js @@ -12,7 +12,6 @@ export class Discuss extends LegacyComponent { setup() { this._updateLocalStoreProps(); // bind since passed as props - this._onMobileAddItemHeaderInputSelect = this._onMobileAddItemHeaderInputSelect.bind(this); this._onMobileAddItemHeaderInputSource = this._onMobileAddItemHeaderInputSource.bind(this); useUpdate({ func: () => this._update() }); this._onHideMobileAddItemHeader = this._onHideMobileAddItemHeader.bind(this); @@ -93,25 +92,6 @@ export class Discuss extends LegacyComponent { this.discussView.discuss.clearIsAddingItem(); } - /** - * @private - * @param {Event} ev - * @param {Object} ui - * @param {Object} ui.item - * @param {integer} ui.item.id - */ - _onMobileAddItemHeaderInputSelect(ev, ui) { - if (!this.discussView) { - return; - } - const discuss = this.discussView.discuss; - if (discuss.isAddingChannel) { - discuss.handleAddChannelAutocompleteSelect(ev, ui); - } else { - discuss.handleAddChatAutocompleteSelect(ev, ui); - } - } - /** * @private * @param {Object} req diff --git a/addons/mail/static/src/components/discuss/discuss.xml b/addons/mail/static/src/components/discuss/discuss.xml index 229e96e8f7b..3217126a528 100644 --- a/addons/mail/static/src/components/discuss/discuss.xml +++ b/addons/mail/static/src/components/discuss/discuss.xml @@ -33,8 +33,8 @@ className="'o_Discuss_mobileAddItemHeaderInput'" isFocusOnMount="true" isHtml="discussView.discuss.isAddingChannel" - placeholder="discussView.discuss.isAddingChannel ? discussView.discuss.addChannelInputPlaceholder : discussView.discuss.addChatInputPlaceholder" - select="_onMobileAddItemHeaderInputSelect" + localId="discussView.mobileAddItemHeaderAutocompleteInputView.localId" + select="discussView.onMobileAddItemHeaderInputSelect" source="_onMobileAddItemHeaderInputSource" onHide="_onHideMobileAddItemHeader" /> diff --git a/addons/mail/static/src/components/discuss_sidebar_category/discuss_sidebar_category.xml b/addons/mail/static/src/components/discuss_sidebar_category/discuss_sidebar_category.xml index 5ca3cbe1dc1..e66d479a496 100644 --- a/addons/mail/static/src/components/discuss_sidebar_category/discuss_sidebar_category.xml +++ b/addons/mail/static/src/components/discuss_sidebar_category/discuss_sidebar_category.xml @@ -31,9 +31,9 @@ this._mounted()); onWillUnmount(() => this._willUnmount()); } @@ -67,13 +66,6 @@ export class MessagingMenu extends Component { this.messagingMenu.close(); } - /** - * @private - */ - _onHideMobileNewMessage() { - this.messagingMenu.toggleMobileNewMessage(); - } - /** * @private * @param {Event} ev diff --git a/addons/mail/static/src/components/messaging_menu/messaging_menu.xml b/addons/mail/static/src/components/messaging_menu/messaging_menu.xml index cb1644c8379..dd6ccc53808 100644 --- a/addons/mail/static/src/components/messaging_menu/messaging_menu.xml +++ b/addons/mail/static/src/components/messaging_menu/messaging_menu.xml @@ -43,10 +43,10 @@ className="'o_MessagingMenu_mobileNewMessageInput'" customClass="id + '_mobileNewMessageInputAutocomplete'" isFocusOnMount="true" - placeholder="messagingMenu.mobileNewMessageInputPlaceholder" + localId="messagingMenu.mobileNewMessageAutocompleteInputView.localId" select="_onMobileNewMessageInputSelect" source="_onMobileNewMessageInputSource" - onHide="_onHideMobileNewMessage" + onHide="messagingMenu.onHideMobileNewMessage" /> diff --git a/addons/mail/static/src/models/autocomplete_input_view.js b/addons/mail/static/src/models/autocomplete_input_view.js index b901cb6a047..1bda453b5ad 100644 --- a/addons/mail/static/src/models/autocomplete_input_view.js +++ b/addons/mail/static/src/models/autocomplete_input_view.js @@ -1,7 +1,8 @@ /** @odoo-module **/ import { registerModel } from '@mail/model/model_core'; -import { one } from '@mail/model/model_field'; +import { attr, one } from '@mail/model/model_field'; +import { clear } from '@mail/model/model_field_command'; registerModel({ name: 'AutocompleteInputView', @@ -11,6 +12,40 @@ registerModel({ 'discussViewOwnerAsMobileAddItemHeader', 'messagingMenuOwnerAsMobileNewMessageInput', ]], + recordMethods: { + /** + * @param {FocusEvent} ev + */ + onFocusin(ev) { + if (this.chatWindowOwnerAsNewMessage) { + this.chatWindowOwnerAsNewMessage.onFocusInNewMessageFormInput(ev); + return; + } + }, + /** + * @private + * @returns {string} + */ + _computePlaceholder() { + if (this.chatWindowOwnerAsNewMessage) { + return this.chatWindowOwnerAsNewMessage.newMessageFormInputPlaceholder; + } + if (this.discussViewOwnerAsMobileAddItemHeader) { + if (this.discussViewOwnerAsMobileAddItemHeader.discuss.isAddingChannel) { + return this.discussViewOwnerAsMobileAddItemHeader.discuss.addChannelInputPlaceholder; + } else { + return this.discussViewOwnerAsMobileAddItemHeader.discuss.addChatInputPlaceholder; + } + } + if (this.discussSidebarCategoryOwnerAsAddingItem) { + return this.discussSidebarCategoryOwnerAsAddingItem.newItemPlaceholderText; + } + if (this.messagingMenuOwnerAsMobileNewMessageInput) { + return this.messagingMenuOwnerAsMobileNewMessageInput.mobileNewMessageInputPlaceholder; + } + return clear(); + }, + }, fields: { chatWindowOwnerAsNewMessage: one('ChatWindow', { inverse: 'newMessageAutocompleteInputView', @@ -28,5 +63,8 @@ registerModel({ inverse: 'mobileNewMessageAutocompleteInputView', readonly: true, }), + placeholder: attr({ + compute: '_computePlaceholder', + }), }, }); diff --git a/addons/mail/static/src/models/discuss_view.js b/addons/mail/static/src/models/discuss_view.js index 780a83e6fd1..0fb0d46d4cb 100644 --- a/addons/mail/static/src/models/discuss_view.js +++ b/addons/mail/static/src/models/discuss_view.js @@ -59,6 +59,22 @@ registerModel({ } mailbox.open(); }, + /** + * @param {Event} ev + * @param {Object} ui + * @param {Object} ui.item + * @param {integer} ui.item.id + */ + onMobileAddItemHeaderInputSelect(ev, ui) { + if (!this.exists()) { + return; + } + if (this.discuss.isAddingChannel) { + this.discuss.handleAddChannelAutocompleteSelect(ev, ui); + } else { + this.discuss.handleAddChatAutocompleteSelect(ev, ui); + } + }, /** * @private * @returns {FieldCommand} diff --git a/addons/mail/static/src/models/messaging_menu.js b/addons/mail/static/src/models/messaging_menu.js index 2506144eef8..329f1c4b734 100644 --- a/addons/mail/static/src/models/messaging_menu.js +++ b/addons/mail/static/src/models/messaging_menu.js @@ -42,6 +42,9 @@ registerModel({ } this.toggleOpen(); }, + onHideMobileNewMessage() { + this.update({ isMobileNewMessageToggled: false }); + }, /** * Toggle the visibility of the messaging menu "new message" input in * mobile.