diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js index bdcde4357af..ee006faf0a3 100644 --- a/addons/web/static/src/views/relational_model.js +++ b/addons/web/static/src/views/relational_model.js @@ -657,6 +657,8 @@ export class Record extends DataPoint { this.data[fieldName] = this._values[fieldName]; } } + this._invalidFields.clear(); + if (!this.isVirtual) { this.switchMode("readonly"); } diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index eff558a40ff..d179b309324 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -13419,6 +13419,30 @@ QUnit.module("Views", (hooks) => { } ); + QUnit.test("discard an invalid row in a list", async function (assert) { + await makeView({ + type: "list", + resModel: "foo", + serverData, + arch: '', + }); + + await click(target.querySelector(".o_data_cell")); + assert.containsNone(target, ".o_field_invalid"); + assert.containsOnce(target, ".o_selected_row"); + + await editInput(target, "[name='foo'] input", ""); + await click(target, ".o_list_view"); + assert.containsOnce(target, ".o_field_invalid"); + assert.containsOnce(target, ".o_selected_row"); + assert.strictEqual(target.querySelector("[name='foo'] input").value, ""); + + await clickDiscard(target); + assert.containsNone(target, ".o_field_invalid"); + assert.containsNone(target, ".o_selected_row"); + assert.strictEqual(target.querySelector("[name='foo']").textContent, "yop"); + }); + QUnit.test('editable grouped list with create="0"', async function (assert) { await makeView({ type: "list",