diff --git a/addons/web/static/src/views/basic_relational_model.js b/addons/web/static/src/views/basic_relational_model.js index 69fae62578c..4ba0d9397c5 100644 --- a/addons/web/static/src/views/basic_relational_model.js +++ b/addons/web/static/src/views/basic_relational_model.js @@ -790,8 +790,12 @@ export class StaticList extends DataPoint { } if (editedRecord) { const isValid = editedRecord.checkValidity(); - if (!isValid && editedRecord.canBeAbandoned) { - this.abandonRecord(editedRecord.id); + if (!isValid) { + if (editedRecord.canBeAbandoned) { + this.abandonRecord(editedRecord.id); + } else { + return false; + } } else { await editedRecord.switchMode("readonly"); } 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 bc0a0a563d4..e781d0ee9d6 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -7890,6 +7890,44 @@ QUnit.module("Fields", (hooks) => { } ); + QUnit.test("one2many with invalid value and click on another row", async function (assert) { + serverData.models.partner.records[0].p = [2, 4]; + + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
`, + resId: 1, + }); + await clickEdit(target); + + let rows = target.querySelectorAll(".o_data_row"); + await click(rows[0].querySelector(".o_data_cell")); + assert.containsOnce(target, ".o_data_row.o_selected_row"); + rows = target.querySelectorAll(".o_data_row"); + assert.hasClass(rows[0], "o_selected_row"); + assert.doesNotHaveClass(rows[1], "o_selected_row"); + + await editInput(target, ".o_data_row [name='int_field'] input", "abc"); + rows = target.querySelectorAll(".o_data_row"); + await click(rows[1].querySelector(".o_data_cell")); + // Stays on the invalid row + assert.containsOnce(target, ".o_data_row.o_selected_row"); + rows = target.querySelectorAll(".o_data_row"); + assert.hasClass(rows[0], "o_selected_row"); + assert.containsOnce(rows[0], "[name='int_field'] .o_field_invalid"); + assert.doesNotHaveClass(rows[1], "o_selected_row"); + }); + QUnit.test( "default value for nested one2manys (coming from onchange)", async function (assert) {