From ed95be9a95466cc87f61cb18295cf91ba30b590b Mon Sep 17 00:00:00 2001 From: "Michael (mcm)" Date: Tue, 17 Jan 2023 10:10:09 +0000 Subject: [PATCH] [FIX] web: fix field_digits monetary options Before this commit, the `field_digits` options of the monetary field has not been reimplemented since the owl conversion and so the digits of the currency was used. Now, when the `field_digits` option is given, the digits of the field is used instead of the currency digits. task 3072702 closes odoo/odoo#111308 X-original-commit: 996cc74745a2fb72547053991a79d233d6916587 Related: odoo/enterprise#36568 Signed-off-by: Aaron Bohy (aab) --- .../web/static/src/views/fields/formatters.js | 4 +- .../views/fields/monetary/monetary_field.js | 15 +++---- .../tests/views/fields/formatters_tests.js | 42 +++++++++++++------ .../views/fields/monetary_field_tests.js | 2 +- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/addons/web/static/src/views/fields/formatters.js b/addons/web/static/src/views/fields/formatters.js index ed08da8f356..979acaaaa30 100644 --- a/addons/web/static/src/views/fields/formatters.js +++ b/addons/web/static/src/views/fields/formatters.js @@ -362,7 +362,7 @@ export function formatMonetary(value, options = {}) { currencyId = Array.isArray(dataValue) ? dataValue[0] : dataValue; } const currency = session.currencies[currencyId]; - const digits = (currency && currency.digits) || options.digits; + const digits = options.digits || (currency && currency.digits); let formattedValue; if (options.humanReadable) { @@ -448,7 +448,7 @@ export function formatText(value) { } export function formatJson(value) { - return value && JSON.stringify(value) || ""; + return (value && JSON.stringify(value)) || ""; } registry diff --git a/addons/web/static/src/views/fields/monetary/monetary_field.js b/addons/web/static/src/views/fields/monetary/monetary_field.js index 81d6742e2e5..a6199ed1167 100644 --- a/addons/web/static/src/views/fields/monetary/monetary_field.js +++ b/addons/web/static/src/views/fields/monetary/monetary_field.js @@ -22,9 +22,10 @@ export class MonetaryField extends Component { } get currencyId() { - const currencyField = this.props.currencyField || - this.props.record.fields[this.props.name].currency_field || - "currency_id"; + const currencyField = + this.props.currencyField || + this.props.record.fields[this.props.name].currency_field || + "currency_id"; const currency = this.props.record.data[currencyField]; return currency && currency[0]; } @@ -40,8 +41,8 @@ export class MonetaryField extends Component { } get currencyDigits() { - if (this.props.digits) { - return this.props.digits; + if (this.props.useFieldDigits) { + return this.props.record.fields[this.props.name].digits; } if (!this.currency) { return null; @@ -66,7 +67,7 @@ MonetaryField.props = { ...standardFieldProps, currencyField: { type: String, optional: true }, inputType: { type: String, optional: true }, - digits: { type: Array, optional: true }, + useFieldDigits: { type: Boolean, optional: true }, hideSymbol: { type: Boolean, optional: true }, placeholder: { type: String, optional: true }, }; @@ -82,7 +83,7 @@ MonetaryField.extractProps = ({ attrs }) => { return { currencyField: attrs.options.currency_field, inputType: attrs.type, - digits: [16, 2], // FIXME WOWL + useFieldDigits: attrs.options.field_digits, hideSymbol: attrs.options.no_symbol, placeholder: attrs.placeholder, }; diff --git a/addons/web/static/tests/views/fields/formatters_tests.js b/addons/web/static/tests/views/fields/formatters_tests.js index cac649da49a..86c83187e0a 100644 --- a/addons/web/static/tests/views/fields/formatters_tests.js +++ b/addons/web/static/tests/views/fields/formatters_tests.js @@ -169,9 +169,18 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual(formatFloatTime(3.5), "03:30"); assert.strictEqual(formatFloatTime(0.25), "00:15"); assert.strictEqual(formatFloatTime(2 / 60, { displaySeconds: true }), "00:02:00"); - assert.strictEqual(formatFloatTime(2 / 60 + 1 / 3600, { displaySeconds: true }), "00:02:01"); - assert.strictEqual(formatFloatTime(2 / 60 + 2 / 3600, { displaySeconds: true }), "00:02:02"); - assert.strictEqual(formatFloatTime(2 / 60 + 3 / 3600, { displaySeconds: true }), "00:02:03"); + assert.strictEqual( + formatFloatTime(2 / 60 + 1 / 3600, { displaySeconds: true }), + "00:02:01" + ); + assert.strictEqual( + formatFloatTime(2 / 60 + 2 / 3600, { displaySeconds: true }), + "00:02:02" + ); + assert.strictEqual( + formatFloatTime(2 / 60 + 3 / 3600, { displaySeconds: true }), + "00:02:03" + ); assert.strictEqual(formatFloatTime(0.25, { displaySeconds: true }), "00:15:00"); assert.strictEqual(formatFloatTime(0.25 + 15 / 3600, { displaySeconds: true }), "00:15:15"); assert.strictEqual(formatFloatTime(0.25 + 45 / 3600, { displaySeconds: true }), "00:15:45"); @@ -182,17 +191,26 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual(formatFloatTime(2, options), "2:00"); assert.strictEqual(formatFloatTime(3.5, options), "3:30"); assert.strictEqual(formatFloatTime(3.5, { ...options, displaySeconds: true }), "3:30:00"); - assert.strictEqual(formatFloatTime(3.5 + 15 / 3600, { ...options, displaySeconds: true }), "3:30:15"); - assert.strictEqual(formatFloatTime(3.5 + 45 / 3600, { ...options, displaySeconds: true }), "3:30:45"); - assert.strictEqual(formatFloatTime(56 / 3600, { ...options, displaySeconds: true }), "0:00:56"); + assert.strictEqual( + formatFloatTime(3.5 + 15 / 3600, { ...options, displaySeconds: true }), + "3:30:15" + ); + assert.strictEqual( + formatFloatTime(3.5 + 45 / 3600, { ...options, displaySeconds: true }), + "3:30:45" + ); + assert.strictEqual( + formatFloatTime(56 / 3600, { ...options, displaySeconds: true }), + "0:00:56" + ); assert.strictEqual(formatFloatTime(-0.5, options), "-0:30"); }); QUnit.test("formatJson", function (assert) { - assert.strictEqual(formatJson(false), ''); - assert.strictEqual(formatJson({}), '{}'); - assert.strictEqual(formatJson({1: 111}), '{"1":111}'); - assert.strictEqual(formatJson({"9": 11, 666: 42}), '{"9":11,"666":42}'); + assert.strictEqual(formatJson(false), ""); + assert.strictEqual(formatJson({}), "{}"); + assert.strictEqual(formatJson({ 1: 111 }), '{"1":111}'); + assert.strictEqual(formatJson({ 9: 11, 666: 42 }), '{"9":11,"666":42}'); }); QUnit.test("formatInteger", function (assert) { @@ -273,8 +291,8 @@ QUnit.module("Fields", (hooks) => { ); assert.deepEqual( formatMonetary(1234567.654, { currencyId: 11, digits: [69, 1] }), - "$\u00a01,234,567.65", - "currency digits should take over options digits when both are defined" + "$\u00a01,234,567.7", + "options digits should take over currency digits when both are defined" ); // GES TODO do we keep below behavior ? diff --git a/addons/web/static/tests/views/fields/monetary_field_tests.js b/addons/web/static/tests/views/fields/monetary_field_tests.js index f33a148877e..610f7dded3f 100644 --- a/addons/web/static/tests/views/fields/monetary_field_tests.js +++ b/addons/web/static/tests/views/fields/monetary_field_tests.js @@ -872,7 +872,7 @@ QUnit.module("Fields", (hooks) => { name: "USD", symbol: "$", position: "before", - digits: [0, 1], + digits: [0, 4], }, }, });