From 4c1feefd13b6b63798be89005c60baff1d677567 Mon Sep 17 00:00:00 2001 From: "Lucas Perais (lpe)" Date: Mon, 4 Nov 2019 15:25:17 +0000 Subject: [PATCH] [IMP] web: Numeric fields can be non-formatted This commit introduces a new option in fields inheriting from type Numeric which is `format`. By default, Numeric fields are formatted according to their subtypes and locale Adding, in a view, the option format set to a falsy value will prevent the field's value from being formatted. ``` ``` Task 2050119 --- .../web/static/src/js/fields/basic_fields.js | 12 +++- .../static/tests/fields/basic_fields_tests.js | 64 +++++++++++++++++++ doc/reference/javascript_reference.rst | 18 ++++++ 3 files changed, 93 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js index 1f8362d090e..2ec474bc2b3 100644 --- a/addons/web/static/src/js/fields/basic_fields.js +++ b/addons/web/static/src/js/fields/basic_fields.js @@ -365,6 +365,16 @@ var InputField = DebouncedField.extend({ var NumericField = InputField.extend({ tagName: 'span', + /** + * @override + */ + init() { + this._super.apply(this, arguments); + this.shouldFormat = Boolean( + JSON.parse('format' in this.nodeOptions ? this.nodeOptions.format : true) + ); + }, + //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- @@ -427,7 +437,7 @@ var NumericField = InputField.extend({ * @private */ _formatValue: function (value) { - if (this.mode === 'edit' && this.nodeOptions.type === 'number') { + if (!this.shouldFormat || (this.mode === 'edit' && this.nodeOptions.type === 'number')) { return value; } return this._super.apply(this, arguments); diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index 710dd66e40e..5ffd7251216 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -4812,6 +4812,70 @@ QUnit.module('basic_fields', { form.destroy(); }); + QUnit.test('integer field without formatting', async function (assert) { + assert.expect(3); + + this.data.partner.records = [{ + 'id': 999, + 'int_field': 8069, + }]; + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '', + res_id: 999, + translateParameters: { + thousands_sep: ",", + grouping: [3, 0], + }, + }); + + assert.ok(form.$('.o_form_view').hasClass('o_form_readonly'), 'Form in readonly mode'); + assert.strictEqual(form.$('.o_field_widget[name=int_field]').text(), '8069', + 'Integer value must not be formatted'); + await testUtils.form.clickEdit(form); + + assert.strictEqual(form.$('.o_field_widget').val(), '8069', + 'Integer value must not be formatted'); + + form.destroy(); + }); + + QUnit.test('integer field is formatted by default', async function (assert) { + assert.expect(3); + + this.data.partner.records = [{ + 'id': 999, + 'int_field': 8069, + }]; + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '', + res_id: 999, + translateParameters: { + thousands_sep: ",", + grouping: [3, 0], + }, + }); + assert.ok(form.$('.o_form_view').hasClass('o_form_readonly'), 'Form in readonly mode'); + assert.strictEqual(form.$('.o_field_widget[name=int_field]').text(), '8,069', + 'Integer value must be formatted by default'); + await testUtils.form.clickEdit(form); + + assert.strictEqual(form.$('.o_field_widget').val(), '8,069', + 'Integer value must be formatted by default'); + + form.destroy(); + }); QUnit.module('FieldFloatTime'); diff --git a/doc/reference/javascript_reference.rst b/doc/reference/javascript_reference.rst index f2b9685006f..9069916a250 100644 --- a/doc/reference/javascript_reference.rst +++ b/doc/reference/javascript_reference.rst @@ -1570,6 +1570,15 @@ order. + - format: should the number be formatted. (true by default) + + By default, numbers are formatted according to locale parameters. + This option will prevent the field's value from being formatted. + + .. code-block:: xml + + + - float (FieldFloat) This is the default field type for fields of type *float*. @@ -1602,6 +1611,15 @@ order. + - format: should the number be formatted. (true by default) + + By default, numbers are formatted according to locale parameters. + This option will prevent the field's value from being formatted. + + .. code-block:: xml + + + - float_time (FieldFloatTime) The goal of this widget is to display properly a float value that represents a time interval (in hours). So, for example, 0.5 should be formatted as 0:30,