diff --git a/addons/web/static/src/core/dropdown/dropdown.js b/addons/web/static/src/core/dropdown/dropdown.js index 753412d31e1..9368fce9d61 100644 --- a/addons/web/static/src/core/dropdown/dropdown.js +++ b/addons/web/static/src/core/dropdown/dropdown.js @@ -167,6 +167,8 @@ export class Dropdown extends Component { (isOpen) => { if (isOpen) { this.props.onOpened(); + } else { + this.position.unlock(); } }, () => [this.state.open] diff --git a/addons/web/static/tests/core/dropdown_tests.js b/addons/web/static/tests/core/dropdown_tests.js index 3769aec5f36..36d6ca0a72c 100644 --- a/addons/web/static/tests/core/dropdown_tests.js +++ b/addons/web/static/tests/core/dropdown_tests.js @@ -268,6 +268,36 @@ QUnit.module("Components", ({ beforeEach }) => { assert.strictEqual(menuBox3.top - menuBox1.top, 100); }); + QUnit.test("unlock position after close", async (assert) => { + class Parent extends Component { + static template = xml` +
+ + +
+ `; + static components = { Dropdown }; + } + env = await makeTestEnv(); + await mount(Parent, target, { env }); + assert.containsNone(target, ".dropdown-menu"); + await click(target, "button.dropdown-toggle"); + assert.containsOnce(target, ".dropdown-menu"); + const menuBox1 = target.querySelector(".dropdown-menu").getBoundingClientRect(); + + // Pointer enter the dropdown menu to lock the menu + await mouseEnter(target, ".dropdown-menu"); + // close the menu + await click(target); + assert.containsNone(target, ".dropdown-menu"); + + // and reopen it + await click(target, "button.dropdown-toggle"); + assert.containsOnce(target, ".dropdown-menu"); + const menuBox2 = target.querySelector(".dropdown-menu").getBoundingClientRect(); + assert.strictEqual(menuBox2.left - menuBox1.left, 0); + }); + QUnit.test("payload received on item selection", async (assert) => { class Parent extends Component { onItemSelected(value) {