From d71d52d16b1bd7e64ed714dee1ef1b5674ee4a12 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Tue, 21 Nov 2023 09:52:49 +0100 Subject: [PATCH] [FIX] web: popover clickAway don't preventDefault by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since commit 3d218e1, clicking outside a popover closes the popover and performs a preventDefault on the event. As a consequence, changes made in the property definition popover are no longer applied when the popover is closed by clicking outside. Problem: The preventDefault has the consequence of cancelling the input change event allowing the change to be applied to the property definition when the popover is closed. Solution: Remove the preventDefault by default and only use it in the case of the calendar view, which is the only use case that wants to prevent the click event so as not to open a record creation dialog (see commit 3d218e1). How to reproduce the PropertyField bug: - Go to a form view with a properties field - Click on the edit property button - A popover opens so that you can edit the field definition - Type a few characters in the label input - Click outside the popover Before this commit: The value inserted in the popover is ignored After this commit: The value inserted in the popover is applied to the property. It is not possible to write a test reproducing this native browser behaviour. closes odoo/odoo#142842 Signed-off-by: Michaƫl Mattiello (mcm) --- .../src/core/popover/popover_controller.js | 1 - .../calendar_common_popover.js | 4 +++- .../core/popover/popover_service_tests.js | 24 ------------------- 3 files changed, 3 insertions(+), 26 deletions(-) diff --git a/addons/web/static/src/core/popover/popover_controller.js b/addons/web/static/src/core/popover/popover_controller.js index 41ecddf0ce5..14e9cca5807 100644 --- a/addons/web/static/src/core/popover/popover_controller.js +++ b/addons/web/static/src/core/popover/popover_controller.js @@ -56,7 +56,6 @@ export class PopoverController extends Component { const target = ev.composedPath()[0]; if (this.props.closeOnClickAway(target) && !this.isInside(target)) { this.props.close(); - ev.preventDefault(); } } diff --git a/addons/web/static/src/views/calendar/calendar_common/calendar_common_popover.js b/addons/web/static/src/views/calendar/calendar_common/calendar_common_popover.js index dad8d04e28b..52b1e4774f1 100644 --- a/addons/web/static/src/views/calendar/calendar_common/calendar_common_popover.js +++ b/addons/web/static/src/views/calendar/calendar_common/calendar_common_popover.js @@ -8,7 +8,7 @@ import { Field } from "@web/views/fields/field"; import { Record } from "@web/model/record"; import { getFormattedDateSpan } from "@web/views/calendar/utils"; -import { Component } from "@odoo/owl"; +import { Component, useExternalListener } from "@odoo/owl"; export class CalendarCommonPopover extends Component { setup() { @@ -17,6 +17,8 @@ export class CalendarCommonPopover extends Component { this.date = null; this.dateDuration = null; + useExternalListener(window, "pointerdown", (e) => e.preventDefault(), { capture: true }); + this.computeDateTimeAndDuration(); } 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 619150668d5..02f90c09512 100644 --- a/addons/web/static/tests/core/popover/popover_service_tests.js +++ b/addons/web/static/tests/core/popover/popover_service_tests.js @@ -85,30 +85,6 @@ 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
`;