From 044cd8af7be6454d3874d59f4930890f645a5ef6 Mon Sep 17 00:00:00 2001 From: Renaud Thiry Date: Fri, 27 Oct 2023 07:31:54 +0200 Subject: [PATCH] [FIX] web: update reference resModel with props When ReferenceField uses an M2O field. The model is not updated along with the props when the model field is updated. Because of this, the onWillUpdateProps hook will keep trying to update its value. This results in an infinite render loop. task-3248500 closes odoo/odoo#139954 X-original-commit: f8f6aaa5e32967d6c7cd888fbe574acdc6f79dc6 Signed-off-by: Thibault Delavallee (tde) Signed-off-by: Renaud Thiry (reth) --- .../views/fields/reference_field_tests.js | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/addons/web/static/tests/views/fields/reference_field_tests.js b/addons/web/static/tests/views/fields/reference_field_tests.js index 978d2affd78..4a14d3d757b 100644 --- a/addons/web/static/tests/views/fields/reference_field_tests.js +++ b/addons/web/static/tests/views/fields/reference_field_tests.js @@ -975,6 +975,52 @@ QUnit.module("Fields", (hooks) => { } ); + QUnit.test( + "Change model field of a ReferenceField then select an invalid value (tree list in form view)", + async function (assert) { + serverData.models.turtle.records[0].partner_ids = [1]; + serverData.models.partner.records[0].reference = "product,41"; + serverData.models.partner.records[0].model_id = 20; + + await makeView({ + type: "form", + resModel: "turtle", + resId: 1, + serverData, + arch: ` +
+ + + + + + + +
`, + }); + assert.strictEqual(target.querySelector(".reference_field").textContent, "xpad"); + assert.strictEqual(target.querySelector(".o_list_many2one").textContent, "Product"); + + await click(target, ".o_list_table td.o_list_many2one"); + await click(target, ".o_list_table .o_list_many2one input"); + //Select the "Partner" option, different from original "Product" + const dropdownItems = [...target.querySelectorAll(".o_list_table .o_list_many2one .o_input_dropdown .dropdown-item")]; + await click(dropdownItems.filter(item => item.text === "Partner")[0]); + assert.strictEqual(target.querySelector(".reference_field input").value, ""); + assert.strictEqual(target.querySelector(".o_list_many2one input").value, "Partner"); + //Void the associated, required, "reference" field and make sure the form marks the field as required + await click(target, ".o_list_table .reference_field input"); + const textInput = target.querySelector(".o_list_table .reference_field input"); + textInput.setSelectionRange(0, textInput.value.length); + await triggerEvent(target, ".o_list_table .reference_field input", "keydown", { + key: "Backspace", + }); + await click(target, ".o_form_view_container"); + + assert.containsOnce(target, ".o_list_table .reference_field.o_field_invalid"); + } + ); + QUnit.test("model selector is displayed only when it should be", async function (assert) { //The model selector should be only displayed if //there is no hide_model=True options AND no model_field specified