diff --git a/addons/web/static/src/views/fields/relational_utils.xml b/addons/web/static/src/views/fields/relational_utils.xml
index 643ed852894..c654691a21b 100644
--- a/addons/web/static/src/views/fields/relational_utils.xml
+++ b/addons/web/static/src/views/fields/relational_utils.xml
@@ -57,6 +57,7 @@
onChange.bind="onChange"
dropdown="props.dropdown"
autofocus="props.autofocus"
+ resetOnSelect="props.value === ''"
/>
diff --git a/addons/web/static/tests/core/autocomplete_tests.js b/addons/web/static/tests/core/autocomplete_tests.js
index 06a77b78d42..75ee1e0f326 100644
--- a/addons/web/static/tests/core/autocomplete_tests.js
+++ b/addons/web/static/tests/core/autocomplete_tests.js
@@ -103,6 +103,49 @@ QUnit.module("Components", (hooks) => {
assert.verifySteps(["Hello"]);
});
+ QUnit.test("autocomplete with resetOnSelect='true'", async (assert) => {
+ class Parent extends Component {
+ setup() {
+ this.state = useState({
+ value: "Hello",
+ });
+ }
+ get sources() {
+ return [
+ {
+ options: [{ label: "World" }, { label: "Hello" }],
+ },
+ ];
+ }
+ onSelect(option) {
+ this.state.value = option.label;
+ assert.step(option.label);
+ }
+ }
+ Parent.components = { AutoComplete };
+ Parent.template = xml`
+
+ `;
+
+ await mount(Parent, target, { env });
+ assert.strictEqual(target.querySelector(".test_value").textContent, "Hello");
+ assert.strictEqual(target.querySelector(".o-autocomplete--input").value, "");
+
+ await editInput(target, ".o-autocomplete--input", "Blip");
+ await click(target.querySelectorAll(".o-autocomplete--dropdown-item")[1]);
+ assert.strictEqual(target.querySelector(".test_value").textContent, "Hello");
+ assert.strictEqual(target.querySelector(".o-autocomplete--input").value, "");
+ assert.verifySteps(["Hello"]);
+ });
+
QUnit.test("open dropdown on input", async (assert) => {
class Parent extends Component {}
Parent.components = { AutoComplete };
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 da265a3dea7..e30517ea403 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
@@ -3,12 +3,15 @@
import {
click,
clickSave,
+ editInput,
getFixture,
+ patchWithCleanup,
selectDropdownItem,
triggerEvent,
} from "@web/../tests/helpers/utils";
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";
import { triggerHotkey } from "../../helpers/utils";
+import { browser } from "@web/core/browser/browser";
let serverData;
let target;
@@ -604,4 +607,57 @@ QUnit.module("Fields", (hooks) => {
);
}
);
+
+ QUnit.test("widget many2many_tags_avatar", async function (assert) {
+ patchWithCleanup(browser, {
+ setTimeout: (fn) => fn(),
+ });
+ await makeView({
+ type: "form",
+ resModel: "turtle",
+ serverData,
+ arch: `
+ `,
+ resId: 1,
+ });
+
+ assert.deepEqual(
+ [...target.querySelectorAll("[name='partner_ids'] .o_tag")].map((el) => el.textContent),
+ []
+ );
+ assert.strictEqual(
+ target.querySelector("[name='partner_ids'] .o_input_dropdown input").value,
+ ""
+ );
+
+ await editInput(target, "[name='partner_ids'] .o_input_dropdown input", "first record");
+ await triggerEvent(target, "[name='partner_ids'] .o_input_dropdown input", "keydown", {
+ key: "Enter",
+ });
+ assert.deepEqual(
+ [...target.querySelectorAll("[name='partner_ids'] .o_tag")].map((el) => el.textContent),
+ ["first record"]
+ );
+ assert.strictEqual(
+ target.querySelector("[name='partner_ids'] .o_input_dropdown input").value,
+ ""
+ );
+
+ await editInput(target, "[name='partner_ids'] .o_input_dropdown input", "abc");
+ await triggerEvent(target, "[name='partner_ids'] .o_input_dropdown input", "keydown", {
+ key: "Enter",
+ });
+ assert.deepEqual(
+ [...target.querySelectorAll("[name='partner_ids'] .o_tag")].map((el) => el.textContent),
+ ["first record", "abc"]
+ );
+ assert.strictEqual(
+ target.querySelector("[name='partner_ids'] .o_input_dropdown input").value,
+ ""
+ );
+ });
});