From 9ffaaab0d3c37755407d7d01c5da603897de2dfa Mon Sep 17 00:00:00 2001 From: Leonardo Pavan Rocha Date: Fri, 6 Oct 2023 17:06:55 +0200 Subject: [PATCH] [IMP] web: popover service prevent click away to cause a click event MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the popover service is closed when you click away from the popover. However, it’s not expected that the click event that closes the popover, triggers another click event. This was causing a frustrating issue in calendar where you would close the popover by clicking on the calendar, and it would open the “new event” form view. The solution is to prevent default when closing the popover. task-3455051 task-3389317 Part-of: odoo/odoo#138670 --- .../src/core/popover/popover_controller.js | 1 + .../core/popover/popover_service_tests.js | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/addons/web/static/src/core/popover/popover_controller.js b/addons/web/static/src/core/popover/popover_controller.js index 32eeb20218d..b82c1fc35ce 100644 --- a/addons/web/static/src/core/popover/popover_controller.js +++ b/addons/web/static/src/core/popover/popover_controller.js @@ -42,6 +42,7 @@ export class PopoverController extends Component { !this.popoverRef.el.contains(target) ) { this.props.close(); + ev.preventDefault(); } } diff --git a/addons/web/static/tests/core/popover/popover_service_tests.js b/addons/web/static/tests/core/popover/popover_service_tests.js index 02f90c09512..619150668d5 100644 --- a/addons/web/static/tests/core/popover/popover_service_tests.js +++ b/addons/web/static/tests/core/popover/popover_service_tests.js @@ -85,6 +85,30 @@ QUnit.test("close on click away", async (assert) => { assert.containsNone(fixture, ".o_popover #comp"); }); +QUnit.test("close on click away should be default prevented", async (assert) => { + assert.expect(6); + class Comp extends Component {} + Comp.template = xml`
in popover
`; + + popovers.add(popoverTarget, Comp, {}); + await nextTick(); + + assert.containsOnce(fixture, ".o_popover"); + assert.containsOnce(fixture, ".o_popover #comp"); + const closeButton = fixture.querySelector("#close"); + function clickListener(ev) { + assert.step(`click-event-${ev.defaultPrevented ? "default-prevented" : ""}`); + } + closeButton.addEventListener("pointerdown", clickListener); + + await click(fixture, "#close"); + + assert.containsNone(fixture, ".o_popover"); + assert.containsNone(fixture, ".o_popover #comp"); + assert.verifySteps(["click-event-default-prevented"]); + closeButton.removeEventListener("pointerdown", clickListener); +}); + QUnit.test("close on 'Escape' keydown", async (assert) => { class Comp extends Component {} Comp.template = xml`
in popover
`;