[FIX] web: fix field update

When a field in readonly view can be modified, it should write to the
backend immediately. (No changes are stored to be comited later)

For some reason, a bit of code was preventing this if the field was
required and had a falsy value. Furthermore, the code seemed incorrect
or at least misplaced. Removing these lines didn't affect the test.

The fix simply remove this extra check.

There was a condition in the update code for required field in readonly
views that prevented the correct flow to be executed. Since no test are
broken removing this check but it fixes the problem, it is removed.

closes odoo/odoo#98978

Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
This commit is contained in:
Simon Genin (ges)
2022-08-30 09:23:13 +02:00
parent cbee4b0c06
commit 5e754ffd4d
2 changed files with 34 additions and 3 deletions
+1 -3
View File
@@ -119,13 +119,11 @@ export class Field extends Component {
const fieldInfo = this.props.fieldInfo;
const modifiers = fieldInfo.modifiers || {};
const required = evalDomain(modifiers.required, evalContext);
const readonlyFromModifiers = evalDomain(modifiers.readonly, evalContext);
const readonlyFromRecord = !record.isInEdition;
const readonlyFromViewMode = record.model.root
? !record.model.root.isInEdition
: readonlyFromRecord;
const emptyRequiredValue = required && !this.props.value;
// Decoration props
const decorationMap = {};
@@ -162,7 +160,7 @@ export class Field extends Component {
return;
}
// We save only if we're on view mode readonly and no readonly field modifier
if (readonlyFromViewMode && !readonlyFromModifiers && !emptyRequiredValue) {
if (readonlyFromViewMode && !readonlyFromModifiers) {
// TODO: maybe move this in the model
return record.save();
}
@@ -508,4 +508,37 @@ QUnit.module("Fields", (hooks) => {
);
assert.deepEqual(dropdownItemTexts, ["Custom blocked", "Custom done"]);
});
QUnit.test("works when required in a readonly view ", async function (assert) {
serverData.models.partner.records[0].selection = "normal";
serverData.models.partner.records = [serverData.models.partner.records[0]];
await makeView({
type: "kanban",
resModel: "partner",
serverData,
arch: `
<kanban>
<templates>
<t t-name="kanban-box">
<div>
<field name="selection" widget="state_selection" required="1"/>
</div>
</t>
</templates>
</kanban>`,
mockRPC: (route, args, performRPC) => {
if (route === "/web/dataset/call_kw/partner/write") {
assert.step("write");
}
return performRPC(route, args);
},
});
await click(target, ".o_field_state_selection button");
const doneItem = target.querySelectorAll(".dropdown-item")[1]; // item "done";
await click(doneItem);
assert.verifySteps(["write"]);
assert.hasClass(target.querySelector(".o_field_state_selection span"), "o_status_green");
});
});