From c096cccb4ddf44bfdc6c6cd91188014c878da67c Mon Sep 17 00:00:00 2001 From: Achraf Date: Thu, 18 Jan 2024 12:13:41 +0000 Subject: [PATCH] [FIX] web: usable *_activity widget in many2many subview Example of steps: - Install `web_studio` - add a `many2many` field from res.partner - create a record - add a line by selecting a partner In this case `_parseServerValue` will crash https://github.com/odoo/odoo/blob/29d55e44035b6e6c6aba6fa4a114d555a766b7c7/addons/web/static/src/legacy/js/views/abstract_model.js#L101-L111 Because `field.selection` is undefined this code is getting field from this line https://github.com/odoo/odoo/blob/d3ef5891e8e92636dd61b8f2b7186ad139e8b42a/addons/mail/static/src/web/fields/kanban_activity/kanban_activity.js#L14 Instead of specifying `selection: []` in the fieldDependencies this pr fixes this issue generally and prevents these kind of fixes https://github.com/odoo/odoo/pull/125052 opw-3671417 closes odoo/odoo#150445 X-original-commit: 139e107a58ff4be4f03a57df07806355cb7d6236 Signed-off-by: Lucas Perais (lpe) --- .../src/model/relational_model/utils.js | 6 ++- .../tests/views/form/form_view_tests.js | 54 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/model/relational_model/utils.js b/addons/web/static/src/model/relational_model/utils.js index ca558b7bb3e..e877d59ed6e 100644 --- a/addons/web/static/src/model/relational_model/utils.js +++ b/addons/web/static/src/model/relational_model/utils.js @@ -65,13 +65,17 @@ export function addFieldDependencies(activeFields, fields, fieldDependencies = [ activeFields[field.name] = makeActiveField(field); } if (!fields[field.name]) { - fields[field.name] = omit(field, [ + const newField = omit(field, [ "context", "invisible", "required", "readonly", "onChange", ]); + fields[field.name] = newField; + if (newField.type === "selection" && !Array.isArray(newField.selection)) { + newField.selection = []; + } } } } diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js index e1ee2e1d752..5fae239f2a1 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -765,6 +765,60 @@ QUnit.module("Views", (hooks) => { assert.containsOnce(target, ".modal .o_form_view .o_field_widget[name=p]"); }); + QUnit.test( + "form with o2m having a selection field with fieldDependencies", + async function (assert) { + class MyField extends CharField {} + fieldRegistry.add("my_widget", { + component: MyField, + fieldDependencies: [{ name: "selection", type: "selection" }], + }); + + serverData.models.partner.fields.o2m = { type: "one2many", relation: "partner_type" }; + serverData.models.partner.records[1].o2m = []; + serverData.views = { + "partner_type,false,form": `
`, + }; + + serverData.models.partner_type.fields.selection = { + type: "selection", + selection: [ + ["a", "A"], + ["b", "B"], + ], + }; + serverData.models.partner_type.records = [ + { + id: 1, + display_name: "first partner_type", + selection: false, + }, + ]; + + serverData.models.partner.records[1].o2m = [1]; + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+ + + + + +
`, + resId: 2, + }); + + assert.containsOnce(target, ".o_field_widget[name=o2m] .o_data_row"); + await click( + target.querySelector(".o_field_widget[name=o2m] .o_field_x2many_list_row_add a") + ); + assert.containsOnce(target, ".modal .o_form_view .o_field_widget[name=display_name]"); + } + ); + QUnit.test("fieldDependencies are readonly by default", async function (assert) { class MyField extends CharField {} fieldRegistry.add("my_widget", {