From 178c0a441bba113dfdac83ad60e53f6ddfa2eba1 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Fri, 11 Jun 2021 10:01:19 +0200 Subject: [PATCH] Move unlocalize_currency filter to a PriceParser service - It's no longer a filter but more a service: it's therefore more logic. --- .../controllers/units_controller.js.coffee | 4 +- .../variant_units_controller.js.coffee | 4 +- .../products/services/unit_prices.js.coffee | 4 +- .../filters/unlocalize_currency.js.coffee | 26 ------- .../utils/services/price_parser.js.coffee | 24 ++++++ .../services/price_parser_spec.js.coffee} | 77 ++++++++++--------- 6 files changed, 69 insertions(+), 70 deletions(-) delete mode 100644 app/assets/javascripts/admin/utils/filters/unlocalize_currency.js.coffee create mode 100644 app/assets/javascripts/admin/utils/services/price_parser.js.coffee rename spec/javascripts/unit/admin/{filters/unlocalize_currency_spec.js.coffee => utils/services/price_parser_spec.js.coffee} (60%) diff --git a/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee b/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee index 77960b295c..89a7027e07 100644 --- a/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee +++ b/app/assets/javascripts/admin/products/controllers/units_controller.js.coffee @@ -1,5 +1,5 @@ angular.module("admin.products") - .controller "unitsCtrl", ($scope, VariantUnitManager, OptionValueNamer, UnitPrices, unlocalizeCurrencyFilter) -> + .controller "unitsCtrl", ($scope, VariantUnitManager, OptionValueNamer, UnitPrices, PriceParser) -> $scope.product = { master: {} } $scope.product.master.product = $scope.product $scope.placeholder_text = "" @@ -28,7 +28,7 @@ angular.module("admin.products") if $scope.product.master.hasOwnProperty("unit_value_with_description") match = $scope.product.master.unit_value_with_description.match(/^([\d\.,]+(?= *|$)|)( *)(.*)$/) if match - $scope.product.master.unit_value = unlocalizeCurrencyFilter(match[1]) + $scope.product.master.unit_value = PriceParser.parse(match[1]) $scope.product.master.unit_value = null if isNaN($scope.product.master.unit_value) $scope.product.master.unit_value *= $scope.product.variant_unit_scale if $scope.product.master.unit_value && $scope.product.variant_unit_scale $scope.product.master.unit_description = match[3] diff --git a/app/assets/javascripts/admin/products/controllers/variant_units_controller.js.coffee b/app/assets/javascripts/admin/products/controllers/variant_units_controller.js.coffee index 41327872dc..39400c036e 100644 --- a/app/assets/javascripts/admin/products/controllers/variant_units_controller.js.coffee +++ b/app/assets/javascripts/admin/products/controllers/variant_units_controller.js.coffee @@ -1,4 +1,4 @@ -angular.module("admin.products").controller "variantUnitsCtrl", ($scope, VariantUnitManager, $timeout, UnitPrices, unlocalizeCurrencyFilter) -> +angular.module("admin.products").controller "variantUnitsCtrl", ($scope, VariantUnitManager, $timeout, UnitPrices, PriceParser) -> $scope.unitName = (scale, type) -> VariantUnitManager.getUnitName(scale, type) @@ -23,7 +23,7 @@ angular.module("admin.products").controller "variantUnitsCtrl", ($scope, Variant $scope.updateValue = -> unit_value_human = angular.element('#unit_value_human').val() - $scope.unit_value = unlocalizeCurrencyFilter(unit_value_human) * $scope.scale + $scope.unit_value = PriceParser.parse(unit_value_human) * $scope.scale variant_unit_value = angular.element('#variant_unit_value').val() $scope.unit_value_human = variant_unit_value / $scope.scale diff --git a/app/assets/javascripts/admin/products/services/unit_prices.js.coffee b/app/assets/javascripts/admin/products/services/unit_prices.js.coffee index a5cb4d67de..f5da0569f9 100644 --- a/app/assets/javascripts/admin/products/services/unit_prices.js.coffee +++ b/app/assets/javascripts/admin/products/services/unit_prices.js.coffee @@ -1,7 +1,7 @@ -angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, localizeCurrencyFilter, unlocalizeCurrencyFilter) -> +angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, localizeCurrencyFilter, PriceParser) -> class UnitPrices @displayableUnitPrice: (price, scale, unit_type, unit_value, variant_unit_name) -> - price = unlocalizeCurrencyFilter(price) + price = PriceParser.parse(price) if price && !isNaN(price) && unit_type && unit_value value = localizeCurrencyFilter(UnitPrices.price(price, scale, unit_type, unit_value, variant_unit_name)) unit = UnitPrices.unit(scale, unit_type, variant_unit_name) diff --git a/app/assets/javascripts/admin/utils/filters/unlocalize_currency.js.coffee b/app/assets/javascripts/admin/utils/filters/unlocalize_currency.js.coffee deleted file mode 100644 index 59f0513193..0000000000 --- a/app/assets/javascripts/admin/utils/filters/unlocalize_currency.js.coffee +++ /dev/null @@ -1,26 +0,0 @@ -angular.module("admin.utils").filter "unlocalizeCurrency", ()-> - # Convert string to number using injected currency configuration. - (price) -> - if (!price) - return null - # used decimal and thousands separators from currency configuration - decimal_separator = I18n.toCurrency(.1, {precision: 1, unit: ''}).substring(1,2) - thousands_separator = I18n.toCurrency(1000, {precision: 1, unit: ''}).substring(1,2) - - # Replace comma used as a decimal separator and remplace by "." - if (price.match(/^[0-9]*(,{1})[0-9]{1,2}$/g)) - price = price.replace(",", ".") - - # Remove configured thousands separator if it is actually a thousands separator - if (new RegExp("^([0-9]*(" + thousands_separator + "{1})[0-9]{3}[0-9\.,]*)*$", "g").test(price)) - price = price.replaceAll(thousands_separator, '') - - if (decimal_separator == ",") - price = price.replace(",", ".") - - price = parseFloat(price) - - if (isNaN(price)) - return null - - return price diff --git a/app/assets/javascripts/admin/utils/services/price_parser.js.coffee b/app/assets/javascripts/admin/utils/services/price_parser.js.coffee new file mode 100644 index 0000000000..492fbe48a0 --- /dev/null +++ b/app/assets/javascripts/admin/utils/services/price_parser.js.coffee @@ -0,0 +1,24 @@ +angular.module("admin.utils").factory "PriceParser", -> + new class PriceParser + parse: (price) => + return null unless price + # used decimal and thousands separators from currency configuration + decimal_separator = I18n.toCurrency(.1, {precision: 1, unit: ''}).substring(1,2) + thousands_separator = I18n.toCurrency(1000, {precision: 1, unit: ''}).substring(1,2) + + # Replace comma used as a decimal separator and remplace by "." + if (price.match(/^[0-9]*(,{1})[0-9]{1,2}$/g)) + price = price.replace(",", ".") + + # Remove configured thousands separator if it is actually a thousands separator + if (new RegExp("^([0-9]*(" + thousands_separator + "{1})[0-9]{3}[0-9\.,]*)*$", "g").test(price)) + price = price.replaceAll(thousands_separator, '') + + if (decimal_separator == ",") + price = price.replace(",", ".") + + price = parseFloat(price) + + return null if isNaN(price) + + return price diff --git a/spec/javascripts/unit/admin/filters/unlocalize_currency_spec.js.coffee b/spec/javascripts/unit/admin/utils/services/price_parser_spec.js.coffee similarity index 60% rename from spec/javascripts/unit/admin/filters/unlocalize_currency_spec.js.coffee rename to spec/javascripts/unit/admin/utils/services/price_parser_spec.js.coffee index 8a92d99b5e..3d3dffd1ae 100644 --- a/spec/javascripts/unit/admin/filters/unlocalize_currency_spec.js.coffee +++ b/spec/javascripts/unit/admin/utils/services/price_parser_spec.js.coffee @@ -1,10 +1,10 @@ -describe 'convert string to number with configurated currency', -> - filter = null +describe "PriceParser service", -> + priceParser = null beforeEach -> - module 'ofn.admin' - inject ($filter) -> - filter = $filter('unlocalizeCurrency') + module('admin.utils') + inject (PriceParser) -> + priceParser = PriceParser describe "with point as decimal separator and comma as thousands separator for I18n service", -> @@ -16,34 +16,34 @@ describe 'convert string to number with configurated currency', -> return "1,000" it "handle point as decimal separator", -> - expect(filter("1.00")).toEqual 1.0 + expect(priceParser.parse("1.00")).toEqual 1.0 it "handle point as decimal separator", -> - expect(filter("1.000")).toEqual 1.0 + expect(priceParser.parse("1.000")).toEqual 1.0 it "also handle comma as decimal separator", -> - expect(filter("1,0")).toEqual 1.0 + expect(priceParser.parse("1,0")).toEqual 1.0 it "also handle comma as decimal separator", -> - expect(filter("1,00")).toEqual 1.0 + expect(priceParser.parse("1,00")).toEqual 1.0 it "also handle comma as decimal separator", -> - expect(filter("11,00")).toEqual 11.0 + expect(priceParser.parse("11,00")).toEqual 11.0 it "handle comma as decimal separator but not confusing with thousands separator", -> - expect(filter("11,000")).toEqual 11000 + expect(priceParser.parse("11,000")).toEqual 11000 it "handle point as decimal separator and comma as thousands separator", -> - expect(filter("1,000,000.00")).toEqual 1000000 + expect(priceParser.parse("1,000,000.00")).toEqual 1000000 it "handle integer number", -> - expect(filter("10")).toEqual 10 + expect(priceParser.parse("10")).toEqual 10 it "handle integer number with comma as thousands separator", -> - expect(filter("1,000")).toEqual 1000 + expect(priceParser.parse("1,000")).toEqual 1000 it "handle integer number with no thousands separator", -> - expect(filter("1000")).toEqual 1000 + expect(priceParser.parse("1000")).toEqual 1000 describe "with comma as decimal separator and final point as thousands separator for I18n service", -> @@ -55,34 +55,34 @@ describe 'convert string to number with configurated currency', -> return "1.000" it "handle comma as decimal separator", -> - expect(filter("1,00")).toEqual 1.0 + expect(priceParser.parse("1,00")).toEqual 1.0 it "handle comma as decimal separator with one digit after the comma", -> - expect(filter("11,0")).toEqual 11.0 + expect(priceParser.parse("11,0")).toEqual 11.0 it "handle comma as decimal separator with two digit after the comma", -> - expect(filter("11,00")).toEqual 11.0 + expect(priceParser.parse("11,00")).toEqual 11.0 it "handle comma as decimal separator with three digit after the comma", -> - expect(filter("11,000")).toEqual 11.0 + expect(priceParser.parse("11,000")).toEqual 11.0 it "also handle point as decimal separator", -> - expect(filter("1.00")).toEqual 1.0 + expect(priceParser.parse("1.00")).toEqual 1.0 it "also handle point as decimal separator with integer part with two digits", -> - expect(filter("11.00")).toEqual 11.0 + expect(priceParser.parse("11.00")).toEqual 11.0 it "handle point as decimal separator and final point as thousands separator", -> - expect(filter("1.000.000,00")).toEqual 1000000 + expect(priceParser.parse("1.000.000,00")).toEqual 1000000 it "handle integer number", -> - expect(filter("10")).toEqual 10 + expect(priceParser.parse("10")).toEqual 10 it "handle integer number with final point as thousands separator", -> - expect(filter("1.000")).toEqual 1000 + expect(priceParser.parse("1.000")).toEqual 1000 it "handle integer number with no thousands separator", -> - expect(filter("1000")).toEqual 1000 + expect(priceParser.parse("1000")).toEqual 1000 describe "with comma as decimal separator and space as thousands separator for I18n service", -> @@ -94,41 +94,42 @@ describe 'convert string to number with configurated currency', -> return "1 000" it "handle comma as decimal separator", -> - expect(filter("1,00")).toEqual 1.0 + expect(priceParser.parse("1,00")).toEqual 1.0 it "handle comma as decimal separator with one digit after the comma", -> - expect(filter("11,0")).toEqual 11.0 + expect(priceParser.parse("11,0")).toEqual 11.0 it "handle comma as decimal separator with two digit after the comma", -> - expect(filter("11,00")).toEqual 11.0 + expect(priceParser.parse("11,00")).toEqual 11.0 it "handle comma as decimal separator with three digit after the comma", -> - expect(filter("11,000")).toEqual 11.0 + expect(priceParser.parse("11,000")).toEqual 11.0 it "also handle final point as decimal separator", -> - expect(filter("1.00")).toEqual 1.0 + expect(priceParser.parse("1.00")).toEqual 1.0 it "also handle final point as decimal separator with integer part with two digits", -> - expect(filter("11.00")).toEqual 11.0 + expect(priceParser.parse("11.00")).toEqual 11.0 it "handle point as decimal separator and space as thousands separator", -> - expect(filter("1 000 000,00")).toEqual 1000000 + expect(priceParser.parse("1 000 000,00")).toEqual 1000000 it "handle integer number", -> - expect(filter("10")).toEqual 10 + expect(priceParser.parse("10")).toEqual 10 it "handle integer number with space as thousands separator", -> - expect(filter("1 000")).toEqual 1000 + expect(priceParser.parse("1 000")).toEqual 1000 it "handle integer number with no thousands separator", -> - expect(filter("1000")).toEqual 1000 + expect(priceParser.parse("1000")).toEqual 1000 describe "handle null/undefined case", -> it "null case", -> - expect(filter(null)).toEqual null + expect(priceParser.parse(null)).toEqual null it "undefined case ", -> - expect(filter(undefined)).toEqual null + expect(priceParser.parse(undefined)).toEqual null it "wtf case", -> - expect(filter("wtf")).toEqual null + expect(priceParser.parse("wtf")).toEqual null +