From 8e017ee296d955713f86f1395d00a7d9d9e59985 Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Tue, 20 Mar 2018 16:54:49 +0100 Subject: [PATCH] [IMP] web: add a percentage formatter This rev. adds a new formatter for numerical values to fieldsUtils. --- .../web/static/src/js/fields/field_utils.js | 21 +++++++++++++++---- .../static/tests/fields/field_utils_tests.js | 16 +++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/js/fields/field_utils.js b/addons/web/static/src/js/fields/field_utils.js index 5a11f1b0ba8..989f99c5fef 100644 --- a/addons/web/static/src/js/fields/field_utils.js +++ b/addons/web/static/src/js/fields/field_utils.js @@ -29,12 +29,12 @@ var _t = core._t; /** * Convert binary to bin_size - * + * * @param {string} [value] base64 representation of the binary (might be already a bin_size!) * @param {Object} [field] - * a description of the field (note: this parameter is ignored) + * a description of the field (note: this parameter is ignored) * @param {Object} [options] additional options (note: this parameter is ignored) - * + * * @returns {string} bin_size (which is human-readable) */ function formatBinary(value, field, options) { @@ -320,7 +320,19 @@ function formatMonetary(value, field, options) { return currency.symbol + ' ' + formatted_value; } } - +/** + * Returns a string representing the given value (multiplied by 100) + * concatenated with '%'. + * + * @param {number | false} value + * @param {Object} [field] + * @param {Object} [options] + * @returns {string} + */ +function formatPercentage(value, field, options) { + value = formatFloat(value * 100, field, options) || '0'; + return parseFloat(value) + "%"; +} /** * Returns a string representing the value of the selection. * @@ -591,6 +603,7 @@ return { many2one: formatMany2one, monetary: formatMonetary, one2many: formatX2Many, + percentage: formatPercentage, reference: formatMany2one, selection: formatSelection, text: formatChar, diff --git a/addons/web/static/tests/fields/field_utils_tests.js b/addons/web/static/tests/fields/field_utils_tests.js index e24571ea1d8..0947bfbbd4b 100644 --- a/addons/web/static/tests/fields/field_utils_tests.js +++ b/addons/web/static/tests/fields/field_utils_tests.js @@ -4,7 +4,6 @@ odoo.define('web.field_utils_tests', function (require) { var core = require('web.core'); var session = require('web.session'); var fieldUtils = require('web.field_utils'); -var testUtils = require('web.test_utils'); QUnit.module('fields', {}, function () { @@ -133,7 +132,22 @@ QUnit.test('format binary', function (assert) { // base64 estimated size (bytes) = value.length / 1.37 (http://en.wikipedia.org/wiki/Base64#MIME) // Here: 4 / 1.37 = 2.91970800 => 2.92 (rounded 2 decimals by utils.human_size) assert.strictEqual(fieldUtils.format.binary('Cg=='), '2.92 Bytes'); +}); +QUnit.test('format percentage', function (assert) { + assert.expect(8); + + assert.strictEqual(fieldUtils.format.percentage(0), '0%'); + assert.strictEqual(fieldUtils.format.percentage(0.5), '50%'); + assert.strictEqual(fieldUtils.format.percentage(1), '100%'); + + assert.strictEqual(fieldUtils.format.percentage(-0.2), '-20%'); + assert.strictEqual(fieldUtils.format.percentage(2.5), '250%'); + + assert.strictEqual(fieldUtils.format.percentage(0.125), '12.5%'); + assert.strictEqual(fieldUtils.format.percentage(0.666666), '66.67%'); + + assert.strictEqual(fieldUtils.format.percentage(false), '0%'); }); QUnit.test('parse float', function(assert) {