[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:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user