From 0c9a024110c00bf1fe520ba7a43184752f03a026 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Tue, 28 Mar 2023 08:20:42 +0000 Subject: [PATCH] [FIX] web: m2x_tags_avatar is in edit mode Since commit 2ecfed335d469459b50df5e1973d72cf2a47afcf, m2x_tags_avatar are based on dynamic.readonly to know if they are readonly or not. This is a mistake, the only information that depends on dynamic.readonly is the presence or absence of the popover. In this commit, we'll set the initial value to readonly and add the isEditable props that will tell iif you can delete or add records with the popover. closes odoo/odoo#116782 Signed-off-by: Aaron Bohy (aab) --- .../many2many_tags_avatar_field.js | 12 +++++++++--- .../many2many_tags_avatar_field.xml | 2 +- .../many2one_avatar/many2one_avatar_field.js | 16 +++++++++++----- .../fields/many2many_tags_avatar_field_tests.js | 3 ++- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.js b/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.js index bf1e5adaf64..9dd5d289f2a 100644 --- a/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.js +++ b/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.js @@ -144,15 +144,21 @@ export class KanbanMany2ManyTagsAvatarField extends Many2ManyTagsAvatarField { ...Many2ManyTagsAvatarField.components, TagsList: KanbanMany2ManyTagsAvatarFieldTagsList, }; + static props = { + ...Many2ManyTagsAvatarField.props, + isEditable: { type: Boolean, optional: true }, + }; itemsVisible = 2; get popoverProps() { - return { + const props = { ...this.props, - readonly: this.props.readonly, + readonly: false, deleteTag: this.deleteTag.bind(this), updateTag: this.updateTag.bind(this), }; + delete props.isEditable; + return props; } async deleteTag(id) { super.deleteTag(id); @@ -178,7 +184,7 @@ export const kanbanMany2ManyTagsAvatarField = { component: KanbanMany2ManyTagsAvatarField, extractProps(fieldInfo, dynamicInfo) { const props = many2ManyTagsAvatarField.extractProps(...arguments); - props.readonly = dynamicInfo.readonly; + props.isEditable = !dynamicInfo.readonly; return props; }, }; diff --git a/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.xml b/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.xml index 8a35d491578..3c9c06782c4 100644 --- a/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.xml +++ b/addons/web/static/src/views/fields/many2many_tags_avatar/many2many_tags_avatar_field.xml @@ -47,7 +47,7 @@ owl="1"> popoverProps - props.readonly + !props.isEditable diff --git a/addons/web/static/src/views/fields/many2one_avatar/many2one_avatar_field.js b/addons/web/static/src/views/fields/many2one_avatar/many2one_avatar_field.js index db857e92468..c9b215c4b8d 100644 --- a/addons/web/static/src/views/fields/many2one_avatar/many2one_avatar_field.js +++ b/addons/web/static/src/views/fields/many2one_avatar/many2one_avatar_field.js @@ -55,6 +55,10 @@ export class Many2OneFieldPopover extends Many2OneField { export class KanbanMany2OneAvatarField extends Many2OneAvatarField { static template = "web.KanbanMany2OneAvatarField"; + static props = { + ...Many2OneAvatarField.props, + isEditable: { type: Boolean, optional: true }, + }; setup() { super.setup(); this.popover = usePopover(); @@ -65,13 +69,15 @@ export class KanbanMany2OneAvatarField extends Many2OneAvatarField { this.closePopoverFn = null; } get popoverProps() { - return { + const props = { ...this.props, readonly: false, }; + delete props.isEditable; + return props; } openPopover(ev) { - if (this.props.readonly) { + if (!this.props.isEditable) { return; } if (this.closePopoverFn) { @@ -93,10 +99,10 @@ export class KanbanMany2OneAvatarField extends Many2OneAvatarField { } get canDisplayDelete() { - return !this.props.readonly && this.props.record.data[this.props.name] && !isMobileOS(); + return this.props.isEditable && this.props.record.data[this.props.name] && !isMobileOS(); } async remove(ev) { - if (this.props.readonly) { + if (!this.props.isEditable) { return; } await this.props.record.update({ [this.props.name]: false }); @@ -110,7 +116,7 @@ export const kanbanMany2OneAvatarField = { additionalClasses: ["o_field_many2one_avatar_kanban"], extractProps(fieldInfo, dynamicInfo) { const props = many2OneField.extractProps(...arguments); - props.readonly = dynamicInfo.readonly; + props.isEditable = !dynamicInfo.readonly; return props; }, }; diff --git a/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js b/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js index e76e05bc731..ff024656352 100644 --- a/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js @@ -279,7 +279,7 @@ QUnit.module("Fields", (hooks) => { ); QUnit.test("widget many2many_tags_avatar in kanban view", async function (assert) { - assert.expect(16); + assert.expect(17); const records = []; for (let id = 5; id <= 15; id++) { @@ -400,6 +400,7 @@ QUnit.module("Fields", (hooks) => { "9+", "should have 9+ in o_m2m_avatar_empty" ); + assert.containsNone(target, ".o_field_many2many_tags_avatar .o_field_many2many_selection"); // check delete const firstTag = target.querySelector(