From bc4f8e577e1b5c5f2a62c06d1e6a9a576a9a64da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Wed, 23 Mar 2022 15:47:17 +0000 Subject: [PATCH] [IMP] mail: turn 'ComposerView/extraSuggestions' into field MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-2793280 closes odoo/odoo#87095 Signed-off-by: Sébastien Theys (seb) --- .../composer_suggestion_list.xml | 8 +- .../static/src/models/composer_suggestion.js | 7 +- .../mail/static/src/models/composer_view.js | 80 +++++++++++-------- 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/addons/mail/static/src/components/composer_suggestion_list/composer_suggestion_list.xml b/addons/mail/static/src/components/composer_suggestion_list/composer_suggestion_list.xml index 779357e0b76..3ff1df35377 100644 --- a/addons/mail/static/src/components/composer_suggestion_list/composer_suggestion_list.xml +++ b/addons/mail/static/src/components/composer_suggestion_list/composer_suggestion_list.xml @@ -14,15 +14,15 @@ recordLocalId="suggestion.record.localId" /> - + diff --git a/addons/mail/static/src/models/composer_suggestion.js b/addons/mail/static/src/models/composer_suggestion.js index a48d9639753..a40c3b88ca1 100644 --- a/addons/mail/static/src/models/composer_suggestion.js +++ b/addons/mail/static/src/models/composer_suggestion.js @@ -12,7 +12,7 @@ import { clear, replace } from '@mail/model/model_field_command'; */ registerModel({ name: 'ComposerSuggestion', - identifyingFields: ['composerViewOwnerAsMainSuggestion', ['cannedResponse', 'channelCommand', 'partner', 'thread']], + identifyingFields: [['composerViewOwnerAsExtraSuggestion', 'composerViewOwnerAsMainSuggestion'], ['cannedResponse', 'channelCommand', 'partner', 'thread']], recordMethods: { /** * @private @@ -41,10 +41,13 @@ registerModel({ channelCommand: one('ChannelCommand', { readonly: true, }), + composerViewOwnerAsExtraSuggestion: one('ComposerView', { + inverse: 'extraSuggestions', + readonly: true, + }), composerViewOwnerAsMainSuggestion: one('ComposerView', { inverse: 'mainSuggestions', readonly: true, - required: true, }), record: one('Record', { compute: '_computeRecord', diff --git a/addons/mail/static/src/models/composer_view.js b/addons/mail/static/src/models/composer_view.js index 4a168c652f1..ddfe74ccd49 100644 --- a/addons/mail/static/src/models/composer_view.js +++ b/addons/mail/static/src/models/composer_view.js @@ -408,52 +408,52 @@ registerModel({ * considered together. */ setFirstSuggestionActive() { - const suggestedRecords = this.mainSuggestions.map(suggestion => suggestion.record).concat(this.extraSuggestedRecords); - const firstRecord = suggestedRecords[0]; - this.update({ activeSuggestedRecord: link(firstRecord) }); + const suggestions = this.mainSuggestions.concat(this.extraSuggestions); + const firstSuggestion = suggestions[0]; + this.update({ activeSuggestedRecord: link(firstSuggestion.record) }); }, /** * Sets the last suggestion as active. Main and extra records are * considered together. */ setLastSuggestionActive() { - const suggestedRecords = this.mainSuggestions.map(suggestion => suggestion.record).concat(this.extraSuggestedRecords); - const { length, [length - 1]: lastRecord } = suggestedRecords; - this.update({ activeSuggestedRecord: link(lastRecord) }); + const suggestions = this.mainSuggestions.concat(this.extraSuggestions); + const { length, [length - 1]: lastSuggestion } = suggestions; + this.update({ activeSuggestedRecord: link(lastSuggestion.record) }); }, /** * Sets the next suggestion as active. Main and extra records are * considered together. */ setNextSuggestionActive() { - const suggestedRecords = this.mainSuggestions.map(suggestion => suggestion.record).concat(this.extraSuggestedRecords); - const activeElementIndex = suggestedRecords.findIndex( - suggestion => suggestion === this.activeSuggestedRecord + const suggestions = this.mainSuggestions.concat(this.extraSuggestions); + const activeElementIndex = suggestions.findIndex( + suggestion => suggestion.record === this.activeSuggestedRecord ); - if (activeElementIndex === suggestedRecords.length - 1) { + if (activeElementIndex === suggestions.length - 1) { // loop when reaching the end of the list this.setFirstSuggestionActive(); return; } - const nextRecord = suggestedRecords[activeElementIndex + 1]; - this.update({ activeSuggestedRecord: link(nextRecord) }); + const nextSuggestion = suggestions[activeElementIndex + 1]; + this.update({ activeSuggestedRecord: link(nextSuggestion.record) }); }, /** * Sets the previous suggestion as active. Main and extra records are * considered together. */ setPreviousSuggestionActive() { - const suggestedRecords = this.mainSuggestions.map(suggestion => suggestion.record).concat(this.extraSuggestedRecords); - const activeElementIndex = suggestedRecords.findIndex( - suggestion => suggestion === this.activeSuggestedRecord + const suggestions = this.mainSuggestions.concat(this.extraSuggestions); + const activeElementIndex = suggestions.findIndex( + suggestion => suggestion.record === this.activeSuggestedRecord ); if (activeElementIndex === 0) { // loop when reaching the start of the list this.setLastSuggestionActive(); return; } - const previousRecord = suggestedRecords[activeElementIndex - 1]; - this.update({ activeSuggestedRecord: link(previousRecord) }); + const previousSuggestion = suggestions[activeElementIndex - 1]; + this.update({ activeSuggestedRecord: link(previousSuggestion.record) }); }, /** * Update a posted message when the message is ready. @@ -496,19 +496,19 @@ registerModel({ _computeActiveSuggestedRecord() { if ( this.mainSuggestions.length === 0 && - this.extraSuggestedRecords.length === 0 + this.extraSuggestions.length === 0 ) { return unlink(); } if ( this.mainSuggestions.map(suggestion => suggestion.record).includes(this.activeSuggestedRecord) || - this.extraSuggestedRecords.includes(this.activeSuggestedRecord) + this.extraSuggestions.map(suggestion => suggestion.record).includes(this.activeSuggestedRecord) ) { return; } - const suggestedRecords = this.mainSuggestions.map(suggestion => suggestion.record).concat(this.extraSuggestedRecords); - const firstRecord = suggestedRecords[0]; - return link(firstRecord); + const suggestions = this.mainSuggestions.concat(this.extraSuggestions); + const firstSuggestion = suggestions[0]; + return link(firstSuggestion.record); }, /** * @private @@ -556,18 +556,18 @@ registerModel({ return '/web/static/img/user_menu_avatar.png'; }, /** - * Clears the extra suggested record on closing mentions, and ensures + * Clears the extra suggestions on closing mentions, and ensures * the extra list does not contain any element already present in the * main list, which is a requirement for the navigation process. * * @private - * @returns {Record[]} + * @returns {FieldCommand} */ - _computeExtraSuggestedRecords() { + _computeExtraSuggestions() { if (this.suggestionDelimiterPosition === undefined) { return clear(); } - return unlink(this.mainSuggestions.map(suggestion => suggestion.record)); + return unlink(this.mainSuggestions); }, /** * @private @@ -607,7 +607,7 @@ registerModel({ * @return {boolean} */ _computeHasSuggestions() { - return this.mainSuggestions.length > 0 || this.extraSuggestedRecords.length > 0; + return this.mainSuggestions.length > 0 || this.extraSuggestions.length > 0; }, /** * @private @@ -986,7 +986,20 @@ registerModel({ mainSuggestedRecords.length = Math.min(mainSuggestedRecords.length, limit); extraSuggestedRecords.length = Math.min(extraSuggestedRecords.length, limit - mainSuggestedRecords.length); this.update({ - extraSuggestedRecords: replace(extraSuggestedRecords), + extraSuggestions: insertAndReplace( + extraSuggestedRecords.map(record => { + switch (record.constructor.name) { + case 'CannedResponse': + return { cannedResponse: replace(record) }; + case 'ChannelCommand': + return { channelCommand: replace(record) }; + case 'Partner': + return { partner: replace(record) }; + case 'Thread': + return { thread: replace(record) }; + } + }), + ), hasToScrollToActiveSuggestion: true, mainSuggestions: insertAndReplace( mainSuggestedRecords.map(record => { @@ -1064,13 +1077,12 @@ registerModel({ isCausal: true, }), /** - * Determines the extra records that are currently suggested. - * Allows to have different model types of mentions through a dynamic - * process. 2 arbitrary lists can be provided and the second is defined - * as "extra". + * Determines the extra suggestions. */ - extraSuggestedRecords: many('Record', { - compute: '_computeExtraSuggestedRecords', + extraSuggestions: many('ComposerSuggestion', { + compute: '_computeExtraSuggestions', + inverse: 'composerViewOwnerAsExtraSuggestion', + isCausal: true, }), fileUploader: one('FileUploader', { default: insertAndReplace(),