diff --git a/addons/web/static/src/views/basic_relational_model.js b/addons/web/static/src/views/basic_relational_model.js index 60ced130e8a..4d9c58d4d64 100644 --- a/addons/web/static/src/views/basic_relational_model.js +++ b/addons/web/static/src/views/basic_relational_model.js @@ -453,7 +453,7 @@ export class Record extends DataPoint { async checkX2ManyValidity(fieldName) { const list = this.data[fieldName]; const record = list.editedRecord; - if (record && record.isNew && !(await record.checkValidity())) { + if (record && !(await record.checkValidity())) { if (record.canBeAbandoned && !record.isDirty) { list.abandonRecord(record.id); } else { 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 489137e9c1a..df81de8b74d 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -3654,6 +3654,41 @@ QUnit.module("Fields", (hooks) => { } ); + QUnit.test("save a record with not new, dirty and invalid subrecord", async function (assert) { + serverData.models.partner.records[0].p = [2]; + serverData.models.partner.records[1].display_name = ""; // invalid record + + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+ + + + + + +
`, + resId: 1, + mockRPC(route, args) { + if (args.method === "write") { + throw new Error("Should not call write as record is invalid"); + } + }, + mode: "edit", + }); + + assert.containsOnce(target, ".o_form_editable"); + await click(target.querySelector(".o_data_cell")); // edit the first row + assert.hasClass(target.querySelector(".o_data_row"), "o_selected_row"); + await editInput(target, ".o_field_widget[name=int_field] input", 44); + await click(target.querySelector(".o_form_button_save")); + assert.containsOnce(target, ".o_form_editable"); + assert.containsOnce(target, ".o_invalid_cell"); + }); + QUnit.test("editable one2many list, adding, discarding, and pager", async function (assert) { serverData.models.partner.records[0].turtles = [1];