From 87ee170473595f9ef613b2d2004f6b5bc673c280 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Tue, 9 Aug 2022 07:21:57 +0000 Subject: [PATCH] [FIX] web: toggle a bool in a x2m with the view in edition Before this commit, in a form view in edition, if you clicked a toggle boolean in an X2many, the view was saved. A toggle boolean should not do a save if the main view is in edit mode. The solution is to save the record only if the view's root datapoint is in edition. How to reproduce: - Go to a form view in edit mode with an X2many that contains a toggle boolean field. - Click on the toggle boolean in the x2many Result before: The view is saved. Result after: The view is not saved and is still in edit mode. closes odoo/odoo#97673 Signed-off-by: Samuel Degueldre --- addons/web/static/src/views/fields/field.js | 7 ++-- .../web/static/src/views/relational_model.js | 4 +++ .../views/fields/one2many_field_tests.js | 32 +++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) 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"]); + }); });