diff --git a/addons/web/static/lib/bootstrap/js/dropdown.js b/addons/web/static/lib/bootstrap/js/dropdown.js index 2d011d75513..d1ccec1f550 100644 --- a/addons/web/static/lib/bootstrap/js/dropdown.js +++ b/addons/web/static/lib/bootstrap/js/dropdown.js @@ -111,7 +111,7 @@ var Selector = { DATA_TOGGLE: '[data-toggle="dropdown"]', FORM_CHILD: '.dropdown form', - MENU: '.dropdown-menu', + MENU: '.dropdown-menu:not(.o-dropdown--menu)', // Odoo fix task-2764821 NAVBAR_NAV: '.navbar-nav', VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' }; diff --git a/addons/web/static/tests/core/dropdown_tests.js b/addons/web/static/tests/core/dropdown_tests.js index a2c2eb2975a..45406ba9ae1 100644 --- a/addons/web/static/tests/core/dropdown_tests.js +++ b/addons/web/static/tests/core/dropdown_tests.js @@ -665,6 +665,37 @@ QUnit.module("Components", ({ beforeEach }) => { assert.verifySteps(["1", "2"], "items should have been selected in this order"); }); + QUnit.test("dropdowns keynav is not impacted by bootstrap", async (assert) => { + class Parent extends Component {} + Parent.components = { Dropdown }; + Parent.template = xml` + + + + `; + env = await makeTestEnv(); + await mount(Parent, target, { env }); + assert.containsOnce(target, ".dropdown-menu", "menu is opened at start"); + const menu = target.querySelector(".dropdown-menu"); + + // This class presence makes bootstrap ignore the below event + assert.hasClass(menu, "o-dropdown--menu"); + + const select = menu.querySelector("select"); + const ev = new KeyboardEvent("keydown", { + bubbles: true, + // Define the ESC key with standard API (for hotkey_service) + key: "Escape", + code: "Escape", + // Define the ESC key with deprecated API (for bootstrap) + keyCode: 27, + which: 27, + }); + select.dispatchEvent(ev); + await nextTick(); + assert.containsNone(target, ".dropdown-menu", "menu is now closed"); + }); + QUnit.test("props toggler='parent'", async (assert) => { class Parent extends Component {} Parent.template = xml`