[IMP] web: popover service prevent click away to cause a click event

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
This commit is contained in:
Leonardo Pavan Rocha
2023-10-23 20:07:23 +00:00
parent 6e4ba770f6
commit 9ffaaab0d3
2 changed files with 25 additions and 0 deletions
@@ -42,6 +42,7 @@ export class PopoverController extends Component {
!this.popoverRef.el.contains(target)
) {
this.props.close();
ev.preventDefault();
}
}
@@ -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`<div id="comp">in popover</div>`;
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`<div id="comp">in popover</div>`;