From f3cc86ef2577a29064a639f2e51a05918b00ba15 Mon Sep 17 00:00:00 2001 From: Tom Robinson <tlrobinson@gmail.com> Date: Tue, 26 Jul 2016 18:13:19 -0700 Subject: [PATCH] Scalar settings --- .../metabase/lib/visualization_settings.js | 11 +++--- frontend/src/metabase/vendor.js | 2 ++ .../src/metabase/visualizations/Scalar.jsx | 35 ++++++++++++++----- npm-shrinkwrap.json | 3 ++ package.json | 1 + 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/frontend/src/metabase/lib/visualization_settings.js b/frontend/src/metabase/lib/visualization_settings.js index 18114f0954f..4e1525c9901 100644 --- a/frontend/src/metabase/lib/visualization_settings.js +++ b/frontend/src/metabase/lib/visualization_settings.js @@ -291,17 +291,18 @@ const SETTINGS = { widget: ChartSettingToggle, default: true }, - "scalar.separator": { + "scalar.locale": { title: "Separator", widget: ChartSettingSelect, props: { options: [ - { name: "None", value: "" }, - { name: "Comma", value: "," }, - { name: "Period", value: "." }, + { name: "123456.78", value: null }, + { name: "123,456.78", value: "en" }, + { name: "123 456,78", value: "fr" }, + { name: "123.456,78", value: "de" } ] }, - default: "," + default: null }, "scalar.decimals": { title: "Number of decimal places", diff --git a/frontend/src/metabase/vendor.js b/frontend/src/metabase/vendor.js index 7aa04850978..afbfd93a6fc 100644 --- a/frontend/src/metabase/vendor.js +++ b/frontend/src/metabase/vendor.js @@ -25,3 +25,5 @@ import 'ace/snippets/mysql'; import 'ace/snippets/pgsql'; import 'ace/snippets/sqlserver'; import 'ace/snippets/json'; + +import 'number-to-locale-string'; diff --git a/frontend/src/metabase/visualizations/Scalar.jsx b/frontend/src/metabase/visualizations/Scalar.jsx index 775b856d7ca..aec5b0d86ae 100644 --- a/frontend/src/metabase/visualizations/Scalar.jsx +++ b/frontend/src/metabase/visualizations/Scalar.jsx @@ -100,15 +100,34 @@ export default class Scalar extends Component { let scalarValue = i.getIn(data, ["rows", 0, 0]); - const scale = parseFloat(settings["scalar.scale"]); - if (typeof scalarValue === "number" && !isNaN(scale)) { - scalarValue *= scale; - } + try { + if (typeof scalarValue === "number") { + // scale + const scale = parseFloat(settings["scalar.scale"]); + if (!isNaN(scale)) { + scalarValue *= scale; + } + + // round + let decimals = parseFloat(settings["scalar.decimals"]); + if (!isNaN(decimals)) { + scalarValue = Math.round(scalarValue * Math.pow(10, decimals)) / Math.pow(10, decimals); + } else { + decimals = undefined; + } - // const decimals = parseFloat(settings["scalar.decimals"]); - // if (typeof scalarValue === "number" && !isNaN(decimals)) { - // scalarValue = Math.round(scalarValue * Math.pow(10, decimals)) / Math.pow(10, decimals); - // } + // format with separators and correct number of decimals + const locale = settings["scalar.locale"]; + if (locale) { + scalarValue = scalarValue.toLocaleString(locale, { minimumFractionDigits: decimals }); + } else { + // HACK: no locales that don't thousands separators? + scalarValue = scalarValue.toLocaleString("en", { minimumFractionDigits: decimals }).replace(/,/g, ""); + } + } + } catch (e) { + console.warn("error formatting scalar", e); + } let compactScalarValue = scalarValue == undefined ? "" : formatValue(scalarValue, { column: i.getIn(data, ["cols", 0]), compact: isSmall }); diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 3d6a6adc437..05b5ec7330c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -10277,6 +10277,9 @@ } } }, + "number-to-locale-string": { + "version": "1.0.1" + }, "password-generator": { "version": "2.0.2", "dependencies": { diff --git a/package.json b/package.json index 7e4c03ea95a..9efe1f4b210 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "moment": "^2.12.0", "node-libs-browser": "^0.5.3", "normalizr": "^2.0.0", + "number-to-locale-string": "^1.0.1", "password-generator": "^2.0.1", "react": "^15.2.1", "react-addons-css-transition-group": "^15.2.1", -- GitLab