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(