[FIX] web: views: x2many form_view_ref when field already present and invisible

Have a form view that has twice the same x2many field, excpet the first one is invisible=1.
The second occurence has a context with the form_view_ref key.

The x2many should have at least one record.

```xml
<form>
    <field name="x2m" invisible="1" />
    <field name="x2m" context="{'form_view_ref': 'some_ref'}">
        <tree>
            <field name="display_name" />
        </tree>
    </field>
</form>
```

When opening a record, the context was not taken into account, yielding the wrong form view to open that record.

After this commit, the form_view_ref context key is taken into account, and the right form view opens.

opw-3845448

closes odoo/odoo#161253

Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
This commit is contained in:
Lucas Perais
2024-04-10 17:30:52 +00:00
parent 8574e18180
commit c1db28a260
3 changed files with 61 additions and 3 deletions
@@ -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,
@@ -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",
});
}
}
}
@@ -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": `
<form>
<div class="form_view_ref_partner_type">
<field name="display_name" />
</div>
</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: `
<form>
<field name="timmy" invisible="1" />
<field string="Partner Types" name="timmy" context="{
'default_partner_id': id,
'form_view_ref': 'foo_partner_type_form_view'
}">
<tree>
<field name="display_name" />
</tree>
</field>
</form>`,
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",