From 79ed7b15c62814f2f10c32e6fecfc00c0c70ecb7 Mon Sep 17 00:00:00 2001 From: Romain Estievenart Date: Wed, 26 Jul 2023 12:57:26 +0000 Subject: [PATCH] [FIX] web: Remove M2M tags avatars doesn't work on kanban Quick assigns Steps to reproduce: - Open a kanban view inside the project app - Click on the "Quick Assign icon" - Select a user A - Directly unselect this user - Close the dropdown and open the edited record - you can see the user A is still assigned => bug This bug was occurred by a missing awaiting promise inside the deleteTag method. closes odoo/odoo#129996 X-original-commit: b345af5389cd0cc3eb5e373d50ea62afc4e46b22 Signed-off-by: Francois Georis (fge) Signed-off-by: Romain Estievenart (res) --- .../autosave_many2many_tags.js | 6 +-- .../many2many_tags/many2many_tags_field.js | 4 +- .../many2many_tags_avatar_field.js | 6 +-- .../many2many_tags_avatar_field_tests.js | 40 +++++++++++++++++++ 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/addons/account/static/src/components/autosave_many2many_tags/autosave_many2many_tags.js b/addons/account/static/src/components/autosave_many2many_tags/autosave_many2many_tags.js index 76f195efdf7..c7149677186 100644 --- a/addons/account/static/src/components/autosave_many2many_tags/autosave_many2many_tags.js +++ b/addons/account/static/src/components/autosave_many2many_tags/autosave_many2many_tags.js @@ -22,9 +22,9 @@ export class AutosaveMany2ManyTagsField extends Many2ManyTagsField { }; } - deleteTag(id) { - super.deleteTag(id); - this._saveOnUpdate(); + async deleteTag(id) { + await super.deleteTag(id); + await this._saveOnUpdate(); } willUpdateProps(nextProps) { diff --git a/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js b/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js index 045fa4ebffd..0305076da5c 100644 --- a/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js +++ b/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js @@ -138,14 +138,14 @@ export class Many2ManyTagsField extends Component { return !this.props.readonly; } - deleteTag(id) { + async deleteTag(id) { const tagRecord = this.props.record.data[this.props.name].records.find( (record) => record.id === id ); const ids = this.props.record.data[this.props.name].currentIds.filter( (id) => id !== tagRecord.resId ); - this.props.record.data[this.props.name].replaceWith(ids); + await this.props.record.data[this.props.name].replaceWith(ids); } getDomain() { 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 e6dee65b111..91a500c0689 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 @@ -67,9 +67,9 @@ export class Many2ManyTagsAvatarFieldPopover extends Many2ManyTagsAvatarField { }; } - deleteTag(id) { - super.deleteTag(id); - this._saveUpdate(); + async deleteTag(id) { + await super.deleteTag(id); + await this._saveUpdate(); } async _saveUpdate() { 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 930a85da227..b2f75cf2672 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 @@ -443,6 +443,46 @@ QUnit.module("Fields", (hooks) => { ); }); + QUnit.test( + "widget many2many_tags_avatar add/remove tags in kanban view", + async function (assert) { + assert.expect(3); + + await makeView({ + type: "kanban", + resModel: "turtle", + serverData, + arch: ` + + + +
+ + +
+
+
+
`, + async mockRPC(route, { method, args }) { + if (method === "write") { + assert.step(`write: ${args[1].partner_ids[0][2]}`); + } + }, + }); + await click(target, ".o_kanban_record:first-child .o_quick_assign", true); + // add and directly remove an item + await click(target, ".o_popover .o-autocomplete--dropdown-item:first-child"); + await click(target, ".o_popover .o_tag .o_delete"); + assert.verifySteps(["write: 1", "write: "]); + } + ); + QUnit.test("widget many2many_tags_avatar delete tag", async function (assert) { await makeView({ type: "form",