From 4b2bd7b16fab1cfb4dace344a403ec3a4702ee90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Theys?= Date: Thu, 25 Aug 2022 11:27:12 +0000 Subject: [PATCH] [FIX] mail: fixes various issues introduced by recent changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix typo in model manager: "return" -> "continue" in loop - fix typo in model field: "models" read from record not from field itself - fix reading obsolete fields in message view - move listeners on records directly rather than storing a map on model manager (code a bit easier to read, and issues on deleted records easier to debug) - remove obsolete trigger of listener in _created (not possible to observe a record before it exists) closes odoo/odoo#98892 Signed-off-by: Alexandre Kühn (aku) --- .../static/src/components/message/message.xml | 2 +- addons/mail/static/src/model/model_field.js | 2 +- addons/mail/static/src/model/model_manager.js | 60 ++++++++----------- addons/mail/static/src/models/message_view.js | 9 +-- 4 files changed, 28 insertions(+), 45 deletions(-) diff --git a/addons/mail/static/src/components/message/message.xml b/addons/mail/static/src/components/message/message.xml index e2fa592bf68..b06505cac8d 100644 --- a/addons/mail/static/src/components/message/message.xml +++ b/addons/mail/static/src/components/message/message.xml @@ -19,7 +19,7 @@ 'o-starred': messageView.message.isStarred, 'o-currentAuthor': messageView.message.isCurrentUserOrGuestAuthor, 'mt-1': !messageView.isSquashed, - 'mt-5': !messageView.isSquashed and messageView.messageListViewOwner, + 'mt-5': !messageView.isSquashed and messageView.messageListViewMessageViewItemOwner, 'px-3': !messageView.isInChatWindow, 'px-1': messageView.isInChatWindow, 'opacity-50': (messageView.messageListViewMessageViewItemOwner and messageView.messageListViewMessageViewItemOwner.messageListViewOwner.threadViewOwner.replyingToMessageView) and !messageView.isSelected, diff --git a/addons/mail/static/src/model/model_field.js b/addons/mail/static/src/model/model_field.js index b749ab4eb5a..38505e299af 100644 --- a/addons/mail/static/src/model/model_field.js +++ b/addons/mail/static/src/model/model_field.js @@ -873,7 +873,7 @@ export class ModelField { return; } // support for inherited models (eg. relation targeting `Record`) - for (const subModel of Object.values(this.models)) { + for (const subModel of Object.values(record.models)) { if (!(subModel.prototype instanceof otherModel)) { continue; } diff --git a/addons/mail/static/src/model/model_manager.js b/addons/mail/static/src/model/model_manager.js index 1c017976096..fee3637ab46 100644 --- a/addons/mail/static/src/model/model_manager.js +++ b/addons/mail/static/src/model/model_manager.js @@ -71,15 +71,6 @@ export class ModelManager { * model. */ this._listenersObservingAllByModel = new Map(); - /** - * Map between record and a set of listeners that are using it. - */ - this._listenersObservingRecord = new Map(); - /** - * Map between fields of record and a set of listeners that are - * using it. - */ - this._listenersObservingFieldOfRecord = new Map(); /** * Map of listeners that should be notified at the end of the current * update cycle. Value contains list of info to help for debug. @@ -237,10 +228,7 @@ export class ModelManager { } for (const listener of this._listeners) { listener.lastObservedRecords.add(record); - if (!this._listenersObservingRecord.has(record)) { - this._listenersObservingRecord.set(record, new Map()); - } - const entry = this._listenersObservingRecord.get(record); + const entry = record.__listenersObservingRecord; const info = { listener, reason: this.isDebug && `findFromIdentifyingData record - ${record}`, @@ -310,8 +298,11 @@ export class ModelManager { this._listenersToNotifyInUpdateCycle.delete(listener); this._listenersToNotifyAfterUpdateCycle.delete(listener); for (const record of listener.lastObservedRecords) { - this._listenersObservingRecord.get(record).delete(listener); - const listenersObservingFieldOfRecord = this._listenersObservingFieldOfRecord.get(record); + if (!record.exists()) { + continue; + } + record.__listenersObservingRecord.delete(listener); + const listenersObservingFieldOfRecord = record.__listenersObservingFieldsOfRecord; for (const field of listener.lastObservedFieldsByRecord.get(record) || []) { listenersObservingFieldOfRecord.get(field).delete(listener); } @@ -648,6 +639,16 @@ export class ModelManager { // Listeners that are bound to this record, to be notified of // change in dependencies of compute, related and "on change". __listeners: [], + /** + * Map between listeners that are observing this record and array of + * information about how the record is observed. + */ + __listenersObservingRecord: new Map(), + /** + * Map between fields and a Map between listeners that are observing + * the field and array of information about how the field is observed. + */ + __listenersObservingFieldsOfRecord: new Map(), // Field values of record. __values: new Map(), [IS_RECORD]: true, @@ -673,10 +674,6 @@ export class ModelManager { } } } - if (!this._listenersObservingRecord.has(record)) { - this._listenersObservingRecord.set(record, new Map()); - } - this._listenersObservingFieldOfRecord.set(record, new Map()); /** * Register record. */ @@ -702,13 +699,6 @@ export class ModelManager { infoList, }); } - for (const [listener, infoList] of this._listenersObservingRecord.get(record)) { - this._markListenerToNotify(listener, { - listener, - reason: this.isDebug && `_create: record - ${record}`, - infoList, - }); - } return record; } @@ -745,7 +735,7 @@ export class ModelManager { this._createdRecordsCreated.delete(record); this._createdRecordsOnChange.delete(record); this._updatedRecordsCheckRequired.delete(record); - for (const [listener, infoList] of this._listenersObservingRecord.get(record)) { + for (const [listener, infoList] of record.__listenersObservingRecord) { this._markListenerToNotify(listener, { listener, reason: this.isDebug && `_delete: record - ${record}`, @@ -761,6 +751,8 @@ export class ModelManager { } delete record.__values; delete record.__listeners; + delete record.__listenersObservingRecord; + delete record.__listenersObservingFieldsOfRecord; model.__records.delete(record); delete record.localId; } @@ -1036,7 +1028,7 @@ export class ModelManager { * @param {ModelField} field */ _markRecordFieldAsChanged(record, field) { - for (const [listener, infoList] of this._listenersObservingFieldOfRecord.get(record).get(field) || []) { + for (const [listener, infoList] of record.__listenersObservingFieldsOfRecord.get(field) || []) { this._markListenerToNotify(listener, { listener, reason: this.isDebug && `_update: ${field} of ${record}`, @@ -1096,7 +1088,7 @@ export class ModelManager { _preInsertIdentifyingFieldsFromData(model, data) { for (const fieldName of model.__identifyingFieldNames) { if (data[fieldName] === undefined) { - return; + continue; } const field = model.__fieldMap.get(fieldName); if (!field.to) { @@ -1223,16 +1215,12 @@ export class ModelManager { Object.defineProperty(model.prototype, fieldName, { get: function getFieldValue() { // this is bound to record if (this.modelManager._listeners.size) { - let entryRecord = this.modelManager._listenersObservingRecord.get(this); - if (!entryRecord) { - entryRecord = new Map(); - this.modelManager._listenersObservingRecord.set(this, entryRecord); - } + let entryRecord = this.__listenersObservingRecord; const reason = this.modelManager.isDebug && `getField - ${field} of ${this}`; - let entryField = this.modelManager._listenersObservingFieldOfRecord.get(this).get(field); + let entryField = this.__listenersObservingFieldsOfRecord.get(field); if (!entryField) { entryField = new Map(); - this.modelManager._listenersObservingFieldOfRecord.get(this).set(field, entryField); + this.__listenersObservingFieldsOfRecord.set(field, entryField); } for (const listener of this.modelManager._listeners) { listener.lastObservedRecords.add(this); diff --git a/addons/mail/static/src/models/message_view.js b/addons/mail/static/src/models/message_view.js index ebdb9de7198..37025a6b696 100644 --- a/addons/mail/static/src/models/message_view.js +++ b/addons/mail/static/src/models/message_view.js @@ -261,13 +261,8 @@ registerModel({ return Boolean( this.isHovered || this.messagingAsClickedMessageView || - ( - this.messageActionList && - ( - this.messageActionList.reactionPopoverView || - this.messageActionList.deleteConfirmDialog - ) - ) + (this.messageActionList && this.messageActionList.actionReaction && this.messageActionList.actionReaction.messageActionView && this.messageActionList.actionReaction.messageActionView.reactionPopoverView) || + (this.messageActionList && this.messageActionList.actionDelete && this.messageActionList.actionDelete.messageActionView && this.messageActionList.actionDelete.messageActionView.deleteConfirmDialog) ); }, /**