diff --git a/addons/web/static/src/views/fields/field.js b/addons/web/static/src/views/fields/field.js index 853333198c6..835c3837d9c 100644 --- a/addons/web/static/src/views/fields/field.js +++ b/addons/web/static/src/views/fields/field.js @@ -121,7 +121,10 @@ export class Field extends Component { const modifiers = fieldInfo.modifiers || {}; const required = evalDomain(modifiers.required, evalContext); const readonlyFromModifiers = evalDomain(modifiers.readonly, evalContext); - const readonlyFromViewMode = !this.props.record.isInEdition; + const readonlyFromRecord = !record.isInEdition; + const readonlyFromViewMode = record.model.root + ? !record.model.root.isInEdition + : readonlyFromRecord; const emptyRequiredValue = required && !this.props.value; // Decoration props @@ -166,7 +169,7 @@ export class Field extends Component { }, value: this.props.record.data[this.props.name], decorations: decorationMap, - readonly: readonlyFromViewMode || readonlyFromModifiers || false, + readonly: readonlyFromRecord || readonlyFromModifiers || false, ...propsFromAttrs, ...props, type: field.type, diff --git a/addons/web/static/src/views/relational_model.js b/addons/web/static/src/views/relational_model.js index df67830ff4a..b866f14d932 100644 --- a/addons/web/static/src/views/relational_model.js +++ b/addons/web/static/src/views/relational_model.js @@ -1393,6 +1393,10 @@ class DynamicList extends DataPoint { // Getters // ------------------------------------------------------------------------- + get isInEdition() { + return !!this.editedRecord; + } + get currentParams() { return JSON.stringify([this.domain, this.groupBy]); } diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index fff8aab00e8..27b8fb81456 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -12369,4 +12369,36 @@ QUnit.module("Fields", (hooks) => { await clickSave(target); }); + + QUnit.test("toggle boolean in o2m with the formView in edition", async function (assert) { + serverData.models.partner.onchanges = { + turtles: () => {}, + }; + serverData.models.turtle.onchanges = { + turtle_bar: () => {}, + }; + + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
`, + resId: 1, + mockRPC(route, args) { + assert.step(args.method + " " + args.model); + }, + }); + await clickEdit(target); + assert.verifySteps(["get_views partner", "read partner", "read turtle"]); + + await click(target, ".o_boolean_toggle"); + assert.verifySteps(["onchange turtle", "onchange partner"]); + }); });