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