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.