diff --git a/addons/web/static/src/views/fields/float/float_field.js b/addons/web/static/src/views/fields/float/float_field.js index 6b5d50efbcb..ade8dd2daf0 100644 --- a/addons/web/static/src/views/fields/float/float_field.js +++ b/addons/web/static/src/views/fields/float/float_field.js @@ -49,12 +49,20 @@ FloatField.supportedTypes = ["float"]; FloatField.isEmpty = () => false; FloatField.extractProps = ({ attrs, field }) => { + // Sadly, digits param was available as an option and an attr. + // The option version could be removed with some xml refactoring. + let digits; + if (attrs.digits) { + digits = JSON.parse(attrs.digits); + } else if (attrs.options.digits) { + digits = attrs.options.digits; + } else if (Array.isArray(field.digits)) { + digits = field.digits; + } return { inputType: attrs.options.type, step: attrs.options.step, - // Sadly, digits param was available as an option and an attr. - // The option version could be removed with some xml refactoring. - digits: (attrs.digits ? JSON.parse(attrs.digits) : attrs.options.digits) || field.digits, + digits, placeholder: attrs.placeholder, }; }; diff --git a/addons/web/static/src/views/fields/float_toggle/float_toggle_field.js b/addons/web/static/src/views/fields/float_toggle/float_toggle_field.js index 23200d00022..4b5e15db9f0 100644 --- a/addons/web/static/src/views/fields/float_toggle/float_toggle_field.js +++ b/addons/web/static/src/views/fields/float_toggle/float_toggle_field.js @@ -48,8 +48,16 @@ FloatToggleField.supportedTypes = ["float"]; FloatToggleField.isEmpty = () => false; FloatToggleField.extractProps = ({ attrs, field }) => { + let digits; + if (attrs.digits) { + digits = JSON.parse(attrs.digits); + } else if (attrs.options.digits) { + digits = attrs.options.digits; + } else if (Array.isArray(field.digits)) { + digits = field.digits; + } return { - digits: (attrs.digits ? JSON.parse(attrs.digits) : attrs.options.digits) || field.digits, + digits, range: attrs.options.range, factor: attrs.options.factor, disableReadOnly: attrs.options.force_button || false, diff --git a/addons/web/static/src/views/fields/percentage/percentage_field.js b/addons/web/static/src/views/fields/percentage/percentage_field.js index 99f74697098..84649231e16 100644 --- a/addons/web/static/src/views/fields/percentage/percentage_field.js +++ b/addons/web/static/src/views/fields/percentage/percentage_field.js @@ -42,8 +42,16 @@ PercentageField.displayName = _lt("Percentage"); PercentageField.supportedTypes = ["integer", "float"]; PercentageField.extractProps = ({ attrs, field }) => { + let digits; + if (attrs.digits) { + digits = JSON.parse(attrs.digits); + } else if (attrs.options.digits) { + digits = attrs.options.digits; + } else if (Array.isArray(field.digits)) { + digits = field.digits; + } return { - digits: (attrs.digits ? JSON.parse(attrs.digits) : attrs.options.digits) || field.digits, + digits, placeholder: attrs.placeholder, }; }; diff --git a/addons/web/static/src/views/fields/stat_info/stat_info_field.js b/addons/web/static/src/views/fields/stat_info/stat_info_field.js index 2bc1e524239..bba74cc8a03 100644 --- a/addons/web/static/src/views/fields/stat_info/stat_info_field.js +++ b/addons/web/static/src/views/fields/stat_info/stat_info_field.js @@ -33,10 +33,18 @@ StatInfoField.supportedTypes = ["float", "integer", "monetary"]; StatInfoField.isEmpty = () => false; StatInfoField.extractProps = ({ attrs, field }) => { + let digits; + if (attrs.digits) { + digits = JSON.parse(attrs.digits); + } else if (attrs.options.digits) { + digits = attrs.options.digits; + } else if (Array.isArray(field.digits)) { + digits = field.digits; + } return { labelField: attrs.options.label_field, noLabel: archParseBoolean(attrs.nolabel), - digits: (attrs.digits ? JSON.parse(attrs.digits) : attrs.options.digits) || field.digits, + digits, }; }; diff --git a/addons/web/static/tests/views/fields/float_field_tests.js b/addons/web/static/tests/views/fields/float_field_tests.js index 478825efa80..5cdfd133ade 100644 --- a/addons/web/static/tests/views/fields/float_field_tests.js +++ b/addons/web/static/tests/views/fields/float_field_tests.js @@ -453,4 +453,27 @@ QUnit.module("Fields", (hooks) => { target.querySelectorAll(".o_field_widget[name=float_field] input")[1].value ); }); + + QUnit.test("float field with digits=0", async function (assert) { + // This isn't in the orm documentation, so it shouldn't be supported, but + // people do it and thus now we need to support it. + // Historically, it behaves like "no digits attribute defined", so it + // fallbacks on a precision of 2 digits. + // We will change that in master s.t. we do not round anymore in that case. + serverData.models.partner.fields.float_field.digits = 0; + + await makeView({ + type: "form", + serverData, + resModel: "partner", + resId: 1, + arch: '
', + }); + + assert.strictEqual( + target.querySelector(".o_field_float input").value, + "0.36", + "should contain a number rounded to 1 decimal" + ); + }); });