From 943e672d35f9d8baa4880e6205ec6cf003203ac0 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Fri, 7 Oct 2022 14:55:23 +0000 Subject: [PATCH] [FIX] web: discard invalid row in list view Before this commit, in a list view, if you clicked the discard button for an invalid row, it would not be discarded and the discard button would disappear. Why did this happen? Invalid fields in the record were not deleted. How to reproduce? - Go to a list view with a required char field - Edit the char field of a record with an empty string - Click outside the record (it becomes invalid) - Click on the discard button Before this commit: The record is not discarded (its values do not change and it remains in edit mode) and the discard button disappears After this commit: The record is correctly discarded and the discard button disappears closes odoo/odoo#102763 X-original-commit: 73ba2217ec56819ff979020a43d0c13f8ff0b697 Signed-off-by: Aaron Bohy (aab) --- .../web/static/src/views/relational_model.js | 2 ++ .../web/static/tests/views/list_view_tests.js | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) 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",