diff --git a/addons/web/static/src/views/list/list_renderer.js b/addons/web/static/src/views/list/list_renderer.js index bfaf66f7bb5..b8060288d59 100644 --- a/addons/web/static/src/views/list/list_renderer.js +++ b/addons/web/static/src/views/list/list_renderer.js @@ -1138,7 +1138,7 @@ export class ListRenderer extends Component { // add a line if (record.checkValidity()) { const { context } = this.creates[0]; - this.props.onAdd(context); + this.props.onAdd({ context }); } } else if ( activeActions.create && diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index 02e8404eb1b..906c45f2636 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -9337,6 +9337,45 @@ QUnit.module("Fields", (hooks) => { } ); + QUnit.test("o2m add a line custom control create editable with 'tab'", async function (assert) { + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
`, + resId: 1, + mockRPC(route, args) { + const { method, kwargs } = args; + if (method === "onchange") { + assert.step("onchange"); + assert.strictEqual(kwargs.context.default_turtle_foo, "soft"); + } + }, + }); + await clickEdit(target); + + await click(target.querySelector(".o_data_row .o_data_cell")); + await editInput(target, "[name='turtle_foo'] input", "Test"); + assert.containsOnce(target, ".o_data_row"); + + triggerHotkey("Tab"); + await nextTick(); + assert.containsN(target, ".o_data_row", 2); + assert.verifySteps(["onchange"]); + }); + QUnit.test("one2many with onchange, required field, shortcut enter", async function (assert) { serverData.models.turtle.onchanges = { turtle_foo: function () {},