diff --git a/addons/project/static/src/components/subtask_one2many_field/subtask_list_renderer.js b/addons/project/static/src/components/subtask_one2many_field/subtask_list_renderer.js index efb4c7976c9..b9c75104ce9 100644 --- a/addons/project/static/src/components/subtask_one2many_field/subtask_list_renderer.js +++ b/addons/project/static/src/components/subtask_one2many_field/subtask_list_renderer.js @@ -5,10 +5,23 @@ import { useService } from "@web/core/utils/hooks"; import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; import { ListRenderer } from '@web/views/list/list_renderer'; +import { useEffect } from "@odoo/owl"; + export class SubtaskListRenderer extends ListRenderer { setup() { super.setup(); this.dialog = useService("dialog"); + useEffect( + () => this.focusName(this.props.list.editedRecord), + () => [this.props.list.editedRecord] + ); + } + + focusName(editedRecord) { + if (editedRecord?.isNew && !editedRecord.dirty) { + const col = this.state.columns.find((c) => c.name === "name"); + this.focusCell(col); + } } async onDeleteRecord(record) { diff --git a/addons/project/static/tests/project_subtask_kanban_list_form_tests.js b/addons/project/static/tests/project_subtask_kanban_list_form_tests.js index 2c97b024a1d..f0b21b41a00 100644 --- a/addons/project/static/tests/project_subtask_kanban_list_form_tests.js +++ b/addons/project/static/tests/project_subtask_kanban_list_form_tests.js @@ -6,6 +6,7 @@ import { addModelNamesToFetch } from "@bus/../tests/helpers/model_definitions_he import { start } from "@mail/../tests/helpers/test_utils"; import { + editInput, click, getFixture, clickOpenedDropdownItem, @@ -68,6 +69,7 @@ QUnit.module('Subtask Kanban List tests', { + ` @@ -146,8 +148,25 @@ QUnit.module('Subtask Kanban List tests', { await click(target.querySelector(".o_field_x2many_list_row_add a")); await clickDropdown(target, 'project_id'); await clickOpenedDropdownItem(target, 'project_id', 'Project One'); + await editInput(target, ".o_data_row > td[name='name'] > div > input", "aaa"); await click(target, ".o_form_button_save"); assert.equal(target.querySelector('.o_field_project').textContent.trim(), 'Project One') }); + QUnit.test("focus new subtask's name", async function (assert) { + const views = this.views; + const { openView } = await start({ serverData: { views } }); + await openView({ + res_model: "project.task", + views: [[false, "form"]], + }); + + await click(target.querySelector(".o_field_x2many_list_row_add a")); + + assert.strictEqual( + document.activeElement, + target.querySelector(".o_data_row > td[name='name'] > div > input"), + "Upon clicking on 'Add a line', the new subtask's name should be focused." + ); + }); });