diff --git a/addons/web/static/src/views/fields/relational_utils.js b/addons/web/static/src/views/fields/relational_utils.js index 13f1bfb618f..09f20f90acc 100644 --- a/addons/web/static/src/views/fields/relational_utils.js +++ b/addons/web/static/src/views/fields/relational_utils.js @@ -631,7 +631,7 @@ X2ManyFieldDialog.props = { }; X2ManyFieldDialog.template = "web.X2ManyFieldDialog"; -async function getFormViewInfo({ list, activeField, viewService, userService, env }) { +async function getFormViewInfo({ list, context, activeField, viewService, userService, env }) { let formArchInfo = activeField.views.form; let fields = activeField.fields; const comodel = list.resModel; @@ -641,7 +641,7 @@ async function getFormViewInfo({ list, activeField, viewService, userService, en relatedModels, views, } = await viewService.loadViews({ - context: list.context, + context: makeContext([list.context, context]), resModel: comodel, views: [[false, "form"]], }); @@ -707,6 +707,7 @@ export function useOpenX2ManyRecord({ const list = getList(); const { archInfo, fields: _fields } = await getFormViewInfo({ list, + context, activeField, viewService, userService, diff --git a/addons/web/static/src/views/fields/x2many/x2many_field.js b/addons/web/static/src/views/fields/x2many/x2many_field.js index 2ea871369c8..6ead9d68aef 100644 --- a/addons/web/static/src/views/fields/x2many/x2many_field.js +++ b/addons/web/static/src/views/fields/x2many/x2many_field.js @@ -268,7 +268,11 @@ export class X2ManyField extends Component { async openRecord(record) { if (this.canOpenRecord) { - return this._openRecord({ record, mode: this.props.readonly ? "readonly" : "edit" }); + return this._openRecord({ + record, + context: this.props.context, + mode: this.props.readonly ? "readonly" : "edit", + }); } } } 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 de8260f41cc..84d4865bc03 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -1228,6 +1228,59 @@ QUnit.module("Views", (hooks) => { assert.verifySteps(["get_views (res.company)", "onchange (res.company)"]); }); + QUnit.test("x2many form_view_ref with defined list", async (assert) => { + serverData.models.partner.records = [{ id: 1, timmy: [1] }]; + serverData.models.partner_type.records = [{ id: 1, display_name: "Timmy 1" }]; + serverData.views = { + "partner_type,foo_partner_type_form_view,form": ` +
+
+ +
+
`, + }; + const userContext = { + lang: "en", + tz: "taht", + uid: 7, + }; + const expectedContexts = new Map(); + + expectedContexts.set("partner", { ...userContext }); + expectedContexts.set("partner_type", { + ...userContext, + form_view_ref: "foo_partner_type_form_view", + }); + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+ + + + + + + `, + resId: 1, + mockRPC: (route, { method, model, kwargs }) => { + if (method === "get_views") { + const { context } = kwargs; + assert.step(`${method} (${model})`); + assert.deepEqual(context, expectedContexts.get(model)); + } + }, + }); + assert.verifySteps(["get_views (partner)"]); + await click(target, ".o_field_widget[name='timmy'] .o_field_cell"); + assert.verifySteps(["get_views (partner_type)"]); + }); + QUnit.test("invisible fields are properly hidden", async function (assert) { await makeView({ type: "form",