diff --git a/addons/web/static/src/core/utils/hooks.js b/addons/web/static/src/core/utils/hooks.js index c870d5e8659..809ee0fd3e9 100644 --- a/addons/web/static/src/core/utils/hooks.js +++ b/addons/web/static/src/core/utils/hooks.js @@ -42,7 +42,8 @@ export function useAutofocus(params = {}) { const selector = params.selector || "[autofocus]"; let forceFocusCount = 0; useEffect( - function autofocus(target) { + function autofocus() { + const target = comp.el.querySelector(selector); if (target) { target.focus(); if (["INPUT", "TEXTAREA"].includes(target.tagName)) { @@ -51,7 +52,7 @@ export function useAutofocus(params = {}) { } } }, - () => [comp.el.querySelector(selector), forceFocusCount] + () => [forceFocusCount] ); return function focusOnUpdate() { diff --git a/addons/web/static/tests/core/utils/hooks_tests.js b/addons/web/static/tests/core/utils/hooks_tests.js index 632b35ed537..93fbef14ddd 100644 --- a/addons/web/static/tests/core/utils/hooks_tests.js +++ b/addons/web/static/tests/core/utils/hooks_tests.js @@ -1,6 +1,7 @@ /** @odoo-module **/ -import { useBus, useEffect, useListener, useService } from "@web/core/utils/hooks"; +import { uiService } from "@web/core/ui/ui_service"; +import { useAutofocus, useBus, useEffect, useListener, useService } from "@web/core/utils/hooks"; import { registry } from "@web/core/registry"; import { makeTestEnv } from "../../helpers/mock_env"; import { click, getFixture, nextTick } from "../../helpers/utils"; @@ -11,6 +12,73 @@ const serviceRegistry = registry.category("services"); QUnit.module("utils", () => { QUnit.module("Hooks", () => { + QUnit.module("useAutofocus"); + + QUnit.test("useAutofocus: simple usecase", async function (assert) { + class MyComponent extends Component { + setup() { + useAutofocus(); + } + } + MyComponent.template = tags.xml` + + + + `; + + registry.category("services").add("ui", uiService); + + const env = await makeTestEnv(); + const target = getFixture(); + const comp = await mount(MyComponent, { env, target }); + await nextTick(); + + assert.strictEqual(document.activeElement, comp.el.querySelector("input")); + + comp.render(); + await nextTick(); + assert.strictEqual(document.activeElement, comp.el.querySelector("input")); + + comp.destroy(); + }); + + QUnit.test("useAutofocus: conditional autofocus", async function (assert) { + class MyComponent extends Component { + setup() { + this.forceFocus = useAutofocus(); + this.showInput = true; + } + } + MyComponent.template = tags.xml` + + + + `; + + registry.category("services").add("ui", uiService); + + const env = await makeTestEnv(); + const target = getFixture(); + const comp = await mount(MyComponent, { env, target }); + await nextTick(); + + assert.strictEqual(document.activeElement, comp.el.querySelector("input")); + + comp.showInput = false; + comp.forceFocus(); + comp.render(); + await nextTick(); + assert.notStrictEqual(document.activeElement, comp.el.querySelector("input")); + + comp.showInput = true; + comp.forceFocus(); + comp.render(); + await nextTick(); + assert.strictEqual(document.activeElement, comp.el.querySelector("input")); + + comp.destroy(); + }); + QUnit.module("useBus"); QUnit.test("useBus hook: simple usecase", async function (assert) {