From 46e812347775d73dbe8f4148d1026dde1777a0de Mon Sep 17 00:00:00 2001 From: kriddles <54413450+kriddles@users.noreply.github.com> Date: Tue, 20 Oct 2020 13:08:54 -0500 Subject: [PATCH] Allow price up to 4 decimals instead of 2 (#1077) * Allow price to be 4 decimals * remove logging * Finalize custom decimal places by user setting * Typo Co-authored-by: Bernd Bestel --- config-dist.php | 2 + public/js/grocy.js | 4 +- public/viewjs/consume.js | 22 +++---- public/viewjs/inventory.js | 14 ++--- public/viewjs/productform.js | 10 ++-- public/viewjs/purchase.js | 59 +++++++++---------- public/viewjs/recipeform.js | 1 - public/viewjs/recipeposform.js | 10 ++-- public/viewjs/shoppinglistitemform.js | 4 +- public/viewjs/stockentryform.js | 12 ++-- public/viewjs/stocksettings.js | 2 + public/viewjs/transfer.js | 8 +-- services/StockService.php | 3 +- views/choreform.blade.php | 4 +- views/components/numberpicker.blade.php | 2 +- .../components/productamountpicker.blade.php | 4 +- views/consume.blade.php | 4 +- views/inventory.blade.php | 4 +- views/mealplan.blade.php | 4 +- views/productbarcodesform.blade.php | 4 +- views/productform.blade.php | 16 ++--- views/purchase.blade.php | 14 ++--- views/quantityunitconversionform.blade.php | 4 +- views/quantityunitpluraltesting.blade.php | 4 +- views/recipeform.blade.php | 8 +-- views/recipeposform.blade.php | 4 +- views/recipes.blade.php | 4 +- views/shoppinglistitemform.blade.php | 6 +- views/stockentryform.blade.php | 8 +-- views/stocksettings.blade.php | 26 +++++++- views/transfer.blade.php | 4 +- 31 files changed, 147 insertions(+), 128 deletions(-) diff --git a/config-dist.php b/config-dist.php index d52b155e..fb8e179b 100644 --- a/config-dist.php +++ b/config-dist.php @@ -106,6 +106,8 @@ DefaultUserSetting('keep_screen_on_when_fullscreen_card', false); // Keep the sc DefaultUserSetting('product_presets_location_id', -1); // Default location id for new products (-1 means no location is preset) DefaultUserSetting('product_presets_product_group_id', -1); // Default product group id for new products (-1 means no product group is preset) DefaultUserSetting('product_presets_qu_id', -1); // Default quantity unit id for new products (-1 means no quantity unit is preset) +DefaultUserSetting('stock_decimal_places_amounts', 4); // Default decimal places allowed for amounts +DefaultUserSetting('stock_decimal_places_prices', 4); // Default decimal places allowed for prices DefaultUserSetting('stock_expiring_soon_days', 5); DefaultUserSetting('stock_default_purchase_amount', 0); DefaultUserSetting('stock_default_consume_amount', 1); diff --git a/public/js/grocy.js b/public/js/grocy.js index 5d675dbe..a7b2019b 100644 --- a/public/js/grocy.js +++ b/public/js/grocy.js @@ -553,7 +553,7 @@ function RefreshLocaleNumberDisplay(rootSelector = "#page-content") return; } - $(this).text(parseFloat($(this).text()).toLocaleString(undefined, { style: "currency", currency: Grocy.Currency })); + $(this).text(parseFloat($(this).text()).toLocaleString(undefined, { style: "currency", currency: Grocy.Currency, minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices })); }); $(rootSelector + " .locale-number.locale-number-quantity-amount").each(function() @@ -563,7 +563,7 @@ function RefreshLocaleNumberDisplay(rootSelector = "#page-content") return; } - $(this).text(parseFloat($(this).text()).toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 3 })); + $(this).text(parseFloat($(this).text()).toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); }); $(rootSelector + " .locale-number.locale-number-generic").each(function() diff --git a/public/viewjs/consume.js b/public/viewjs/consume.js index c4045316..f2f94a69 100644 --- a/public/viewjs/consume.js +++ b/public/viewjs/consume.js @@ -95,7 +95,7 @@ $("#amount").attr("max", "999999"); $("#amount").attr("step", "1"); $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); - $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); + $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); $('#amount_qu_unit').text(""); $("#tare-weight-handling-info").addClass("d-none"); Grocy.Components.ProductPicker.Clear(); @@ -159,7 +159,7 @@ $('#save-mark-as-open-button').on('click', function(e) Grocy.FrontendHelpers.EndUiBusy("consume-form"); toastr.success(__t('Marked %1$s of %2$s as opened', jsonForm.amount + " " + __n(jsonForm.amount, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural), productDetails.product.name) + '
' + __t("Undo") + ''); - $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); + $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); Grocy.Components.ProductPicker.Clear(); Grocy.Components.ProductPicker.GetInputElement().focus(); Grocy.FrontendHelpers.ValidateForm('consume-form'); @@ -326,15 +326,15 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#amount").attr("min", "0.0001"); - $("#amount").attr("step", ".0001"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', 0.0001.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }), parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1", parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); } else { $("#amount").attr("min", "1"); $("#amount").attr("step", "1"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); } if (productDetails.product.enable_tare_weight_handling == 1) @@ -380,7 +380,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) } }); -$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); +$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); Grocy.FrontendHelpers.ValidateForm('consume-form'); $('#amount').on('focus', function(e) @@ -571,15 +571,15 @@ function RefreshForm() if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#amount").attr("min", "0.0001"); - $("#amount").attr("step", ".0001"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', 0.0001.toLocaleString(), parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1", parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); } else { $("#amount").attr("min", "1"); $("#amount").attr("step", "1"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); } $('#amount').attr('max', sumValue); diff --git a/public/viewjs/inventory.js b/public/viewjs/inventory.js index b2819260..b5e33906 100644 --- a/public/viewjs/inventory.js +++ b/public/viewjs/inventory.js @@ -11,7 +11,7 @@ var price = ""; if (!jsonForm.price.toString().isEmpty()) { - price = parseFloat(jsonForm.price).toFixed(2); + price = parseFloat(jsonForm.price).toFixed(Grocy.UserSettings.stock_decimal_places_prices); } var jsonData = {}; @@ -132,21 +132,21 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#new_amount").attr("min", "0.0001"); - $("#new_amount").attr("step", ".0001"); - $("#new_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s or equal %2$s', 0.0001.toLocaleString(), productDetails.stock_amount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#new_amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#new_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s or equal %2$s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1", productDetails.stock_amount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); } else { $("#new_amount").attr("min", "0"); $("#new_amount").attr("step", "1"); - $("#new_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s or equal %2$s', '0', productDetails.stock_amount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#new_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s or equal %2$s', '0', productDetails.stock_amount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); } if (productDetails.product.enable_tare_weight_handling == 1) { $("#new_amount").attr("min", productDetails.product.tare_weight); - $("#new_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s or equal %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 2 }), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString())); + $("#new_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s or equal %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString())); $("#tare-weight-handling-info").removeClass("d-none"); } else @@ -154,7 +154,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) $("#tare-weight-handling-info").addClass("d-none"); } - $('#price').val(parseFloat(productDetails.last_price).toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 })); + $('#price').val(parseFloat(productDetails.last_price).toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices })); if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) { Grocy.Components.ShoppingLocationPicker.SetId(productDetails.last_shopping_location_id); diff --git a/public/viewjs/productform.js b/public/viewjs/productform.js index 0b49dfef..0bdf24f3 100644 --- a/public/viewjs/productform.js +++ b/public/viewjs/productform.js @@ -324,11 +324,11 @@ $("#allow_partial_units_in_stock").on("click", function() { if (this.checked) { - $("#min_stock_amount").attr("min", "0.0000"); - $("#min_stock_amount").attr("step", ".0001"); - $("#qu_factor_purchase_to_stock").attr("min", "0.0001"); - $("#qu_factor_purchase_to_stock").attr("step", ".0001"); - $("#qu_factor_purchase_to_stock").parent().find(".invalid-feedback").text(__t('This cannot be lower than %1$s and must be a valid number with max. %2$s decimal places', 0.0001.toLocaleString(undefined, { minimumFractionDigits: 0, maximumFractionDigits: 4 }), '4')); + $("#min_stock_amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts))); + $("#min_stock_amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#qu_factor_purchase_to_stock").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#qu_factor_purchase_to_stock").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#qu_factor_purchase_to_stock").parent().find(".invalid-feedback").text(__t('This cannot be lower than %1$s and must be a valid number with max. %2$s decimal places', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1", Grocy.UserSettings.stock_decimal_places_amounts)); } else { diff --git a/public/viewjs/purchase.js b/public/viewjs/purchase.js index 883a0320..c92cbfe6 100644 --- a/public/viewjs/purchase.js +++ b/public/viewjs/purchase.js @@ -8,27 +8,23 @@ Grocy.Api.Get('stock/products/' + jsonForm.product_id, function(productDetails) { - var amount = jsonForm.amount * jsonForm.qu_factor_purchase_to_stock; - - var price = ""; - if (!jsonForm.price.toString().isEmpty()) - { - // price is saved as 1 QU to stock - price = parseFloat(jsonForm.price / amount).toFixed(2); - - if ($("input[name='price-type']:checked").val() == "total-price") - { - price = price / jsonForm.amount; - } - } + var jsonData = {}; + jsonData.amount = jsonForm.amount * jsonForm.qu_factor_purchase_to_stock; if (!Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) { - price = 0; - } + jsonData.price = 0; + } else + { + // price is saved as 1 QU to stock + var price = parseFloat(jsonForm.price / jsonForm.qu_factor_purchase_to_stock).toFixed(Grocy.UserSettings.stock_decimal_places_prices); - var jsonData = {}; - jsonData.amount = amount; + if ($("input[name='price-type']:checked").val() == "total-price") + { + price = parseFloat(price / jsonForm.amount).toFixed(Grocy.UserSettings.stock_decimal_places_prices); + } + jsonData.price = price; + } if (Grocy.UserSettings.show_purchased_date_on_purchase) { @@ -48,7 +44,6 @@ { jsonData.shopping_location_id = Grocy.Components.ShoppingLocationPicker.GetValue(); } - jsonData.price = price; if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) { jsonData.location_id = Grocy.Components.LocationPicker.GetValue(); @@ -105,7 +100,7 @@ $("#amount").attr("min", "1"); $("#amount").attr("step", "1"); $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); - $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); + $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); $('#price').val(''); $('#amount_qu_unit').text(""); $("#tare-weight-handling-info").addClass("d-none"); @@ -237,7 +232,7 @@ if (Grocy.Components.ProductPicker !== undefined) $('#amount_qu_unit').attr("quantity-unit-stock-name-plural", productDetails.quantity_unit_stock.name_plural); $('#qu_factor_purchase_to_stock').val(qu_factor_purchase_to_stock); - $('#price').val(parseFloat(productDetails.last_price * qu_factor_purchase_to_stock).toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 })); + $('#price').val(parseFloat(productDetails.last_price * qu_factor_purchase_to_stock).toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices })); if (qu_factor_purchase_to_stock == 1) @@ -247,7 +242,7 @@ if (Grocy.Components.ProductPicker !== undefined) } else { - $('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name + " (" + __t("will be multiplied by a factor of %1$s to get %2$s", parseFloat(qu_factor_purchase_to_stock).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 2 }), __n(2, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural)) + ")"); + $('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name + " (" + __t("will be multiplied by a factor of %1$s to get %2$s", parseFloat(qu_factor_purchase_to_stock).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }), __n(2, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural)) + ")"); $('#group-qu_factor_purchase_to_stock').removeClass('d-none'); } @@ -259,9 +254,9 @@ if (Grocy.Components.ProductPicker !== undefined) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#amount").attr("min", "0.0001"); - $("#amount").attr("step", ".0001"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', 0.0001.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1")); } else { @@ -274,8 +269,8 @@ if (Grocy.Components.ProductPicker !== undefined) { var minAmount = parseFloat(productDetails.product.tare_weight) / qu_factor_purchase_to_stock + parseFloat(productDetails.stock_amount); $("#amount").attr("min", minAmount); - $("#amount").attr("step", ".0001"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', minAmount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', minAmount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); $("#tare-weight-handling-info").removeClass("d-none"); } else @@ -333,7 +328,7 @@ if (Grocy.Components.ProductPicker !== undefined) }); } -$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); +$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); Grocy.FrontendHelpers.ValidateForm('purchase-form'); if (Grocy.Components.ProductPicker) @@ -420,14 +415,14 @@ $('#qu_factor_purchase_to_stock').on('change', function(e) { var value = $(e.target).val(); $('#amount_qu_unit').attr("qu-factor-purchase-to-stock", value); - $('#amount_qu_unit').text(document.getElementById("amount_qu_unit").getAttribute("quantity-unit-purchase-name") + " (" + __t("will be multiplied by a factor of %1$s to get %2$s", parseFloat(value).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 2 }), __n(2, document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name-plural")) + ")")); + $('#amount_qu_unit').text(document.getElementById("amount_qu_unit").getAttribute("quantity-unit-purchase-name") + " (" + __t("will be multiplied by a factor of %1$s to get %2$s", parseFloat(value).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }), __n(2, document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name-plural")) + ")")); refreshPriceHint(); Grocy.FrontendHelpers.ValidateForm('purchase-form'); }); if (GetUriParam("flow") === "shoppinglistitemtostock") { - $('#amount').val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); + $('#amount').val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); } function refreshPriceHint() @@ -451,11 +446,11 @@ function refreshPriceHint() if (document.getElementById("amount_qu_unit").getAttribute("qu-factor-purchase-to-stock") > 1) { - $('#price-hint').text(__t('means %1$s per %2$s and %3$s per %4$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"), quprice.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-purchase-name"))); + $('#price-hint').text(__t('means %1$s per %2$s and %3$s per %4$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"), quprice.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-purchase-name"))); } else { - $('#price-hint').text(__t('means %1$s per %2$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"))); + $('#price-hint').text(__t('means %1$s per %2$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"))); } } else @@ -463,7 +458,7 @@ function refreshPriceHint() if (document.getElementById("amount_qu_unit").getAttribute("qu-factor-purchase-to-stock") > 1) { var price = $('#price').val() / document.getElementById("amount_qu_unit").getAttribute("qu-factor-purchase-to-stock"); - $('#price-hint').text(__t('means %1$s per %2$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: 2 }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"))); + $('#price-hint').text(__t('means %1$s per %2$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"))); } else { diff --git a/public/viewjs/recipeform.js b/public/viewjs/recipeform.js index 3c1db7bd..07b418ea 100644 --- a/public/viewjs/recipeform.js +++ b/public/viewjs/recipeform.js @@ -41,7 +41,6 @@ $('.save-recipe').on('click', function(e) if (Grocy.EditMode == 'create') { - console.log(jsonData); Grocy.Api.Post('objects/recipes', jsonData, (result) => saveRecipePicture(result, location, jsonData)); return; diff --git a/public/viewjs/recipeposform.js b/public/viewjs/recipeposform.js index 958b5b84..1754dc8b 100644 --- a/public/viewjs/recipeposform.js +++ b/public/viewjs/recipeposform.js @@ -64,9 +64,9 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#display_amount").attr("min", "0.0001"); - $("#display_amount").attr("step", ".0001"); - $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', 0.0001.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#display_amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#display_amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1")); } else { @@ -153,8 +153,8 @@ $("#only_check_single_unit_in_stock").on("click", function() { if (this.checked) { - $("#display_amount").attr("min", "0.0001"); - $("#display_amount").attr("step", ".0001"); + $("#display_amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#display_amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); $("#display_amount").parent().find(".invalid-feedback").text(__t("This cannot be negative")); Grocy.Components.ProductAmountPicker.AllowAnyQu(true); Grocy.FrontendHelpers.ValidateForm("recipe-pos-form"); diff --git a/public/viewjs/shoppinglistitemform.js b/public/viewjs/shoppinglistitemform.js index 5d8da8d0..f035108d 100644 --- a/public/viewjs/shoppinglistitemform.js +++ b/public/viewjs/shoppinglistitemform.js @@ -171,8 +171,8 @@ if (GetUriParam("list") !== undefined) if (GetUriParam("amount") !== undefined) { - $("#amount").val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); + $("#amount").val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); Grocy.FrontendHelpers.ValidateForm('shoppinglist-form'); } -$("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', 0.01.toLocaleString())); +$("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1")); diff --git a/public/viewjs/stockentryform.js b/public/viewjs/stockentryform.js index 3da1e12e..fd2a2792 100644 --- a/public/viewjs/stockentryform.js +++ b/public/viewjs/stockentryform.js @@ -7,7 +7,7 @@ if (!jsonForm.price.toString().isEmpty()) { - price = parseFloat(jsonForm.price).toFixed(2); + price = parseFloat(jsonForm.price).toFixed(Grocy.UserSettings.stock_decimal_places_prices); } var jsonData = {}; @@ -28,8 +28,6 @@ } jsonData.price = price; jsonData.qu_factor_purchase_to_stock = jsonForm.qu_factor_purchase_to_stock; - console.log(jsonForm); - console.log(jsonData); jsonData.open = $("#open").is(":checked"); @@ -102,9 +100,9 @@ Grocy.Api.Get('stock/products/' + Grocy.EditObjectProductId, if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#amount").attr("min", "0.0001"); - $("#amount").attr("step", ".0001"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s', 0.0001.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1")); } else { @@ -116,7 +114,7 @@ Grocy.Api.Get('stock/products/' + Grocy.EditObjectProductId, if (productDetails.product.enable_tare_weight_handling == 1) { $("#amount").attr("min", productDetails.product.tare_weight); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s', parseFloat(productDetails.product.tare_weight).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 2 }))); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %1$s', parseFloat(productDetails.product.tare_weight).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); $("#tare-weight-handling-info").removeClass("d-none"); } else diff --git a/public/viewjs/stocksettings.js b/public/viewjs/stocksettings.js index 003ed189..9d355bcf 100644 --- a/public/viewjs/stocksettings.js +++ b/public/viewjs/stocksettings.js @@ -4,6 +4,8 @@ $("#product_presets_qu_id").val(Grocy.UserSettings.product_presets_qu_id); $("#stock_expiring_soon_days").val(Grocy.UserSettings.stock_expiring_soon_days); $("#stock_default_purchase_amount").val(Grocy.UserSettings.stock_default_purchase_amount); $("#stock_default_consume_amount").val(Grocy.UserSettings.stock_default_consume_amount); +$("#stock_decimal_places_amounts").val(Grocy.UserSettings.stock_decimal_places_amounts); +$("#stock_decimal_places_prices").val(Grocy.UserSettings.stock_decimal_places_prices); if (BoolVal(Grocy.UserSettings.show_icon_on_stock_overview_page_when_product_is_on_shopping_list)) { diff --git a/public/viewjs/transfer.js b/public/viewjs/transfer.js index 3f90294e..346b8e50 100644 --- a/public/viewjs/transfer.js +++ b/public/viewjs/transfer.js @@ -92,7 +92,7 @@ $("#amount").attr("max", "999999"); $("#amount").attr("step", "1"); $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); - $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_transfer_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); + $('#amount').val(parseFloat(Grocy.UserSettings.stock_default_transfer_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); $('#amount_qu_unit').text(""); $("#tare-weight-handling-info").addClass("d-none"); Grocy.Components.ProductPicker.Clear(); @@ -187,9 +187,9 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#amount").attr("min", "0.0001"); - $("#amount").attr("step", ".0001"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', 0.0001.toLocaleString(), parseFloat(productDetails.stock_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 }))); + $("#amount").attr("min", "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").attr("step", "." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1"); + $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1")); } else { diff --git a/services/StockService.php b/services/StockService.php index 6093b93d..a87dc3ef 100644 --- a/services/StockService.php +++ b/services/StockService.php @@ -862,7 +862,8 @@ class StockService extends BaseService if ($productRow != null && !empty($productRow)) { $newAmount = $productRow->amount - $amount; - if ($newAmount < 0.01) + + if ($newAmount < floatval('0.' . str_repeat('0', intval($this->getUsersService()->GetUserSetting(GROCY_USER_ID, 'stock_decimal_places_amounts')) - 1) . '1')) { $productRow->delete(); } diff --git a/views/choreform.blade.php b/views/choreform.blade.php index eed848c2..652a5719 100644 --- a/views/choreform.blade.php +++ b/views/choreform.blade.php @@ -255,8 +255,8 @@ 'id' => 'product_amount', 'label' => 'Amount', 'hintId' => 'amount_qu_unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), 'isRequired' => false, 'value' => $value diff --git a/views/components/numberpicker.blade.php b/views/components/numberpicker.blade.php index ee647cae..b98968a8 100644 --- a/views/components/numberpicker.blade.php +++ b/views/components/numberpicker.blade.php @@ -36,7 +36,7 @@ value="{{ $value }}" min="{{ number_format($min, $decimals, '.', '') }}" max="{{ number_format($max, $decimals, '.', '') }}" - step="@if($decimals == 0){{1}}@else{{'.' . substr('0000000001', -$decimals)}}@endif" + step="@if($decimals == 0){{1}}@else{{'.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1'}}@endif" @if($isRequired) required @endif> diff --git a/views/components/productamountpicker.blade.php b/views/components/productamountpicker.blade.php index 1fa50c1d..6695c2bd 100644 --- a/views/components/productamountpicker.blade.php +++ b/views/components/productamountpicker.blade.php @@ -11,8 +11,8 @@ @include('components.numberpicker', array( 'id' => 'display_amount', 'label' => 'Amount', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('This cannot be negative and must be an integral number'), 'additionalGroupCssClasses' => 'col-4 mb-1', diff --git a/views/consume.blade.php b/views/consume.blade.php index fcde9ea8..296ec1a8 100644 --- a/views/consume.blade.php +++ b/views/consume.blade.php @@ -54,8 +54,8 @@ 'id' => 'amount', 'label' => 'Amount', 'hintId' => 'amount_qu_unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => 0, 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), 'additionalHtmlContextHelp' => '
'New amount', 'hintId' => 'new_amount_qu_unit', 'min' => 0, - 'decimals' => 4, + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => 1, 'invalidFeedback' => $__t('The amount cannot be lower than %s', '0'), 'additionalAttributes' => 'data-not-equal="-1"', @@ -65,7 +65,7 @@ 'id' => 'price', 'label' => 'Price', 'min' => 0, - 'decimals' => 2, + 'decimals' => $userSettings['stock_decimal_places_prices'], 'value' => '', 'hint' => $__t('in %s per purchase quantity unit', GROCY_CURRENCY), 'additionalHtmlContextHelp' => '
' . $__t('This will apply to added products') . '', diff --git a/views/mealplan.blade.php b/views/mealplan.blade.php index 2434b938..77047caf 100644 --- a/views/mealplan.blade.php +++ b/views/mealplan.blade.php @@ -61,8 +61,8 @@ @include('components.numberpicker', array( 'id' => 'recipe_servings', 'label' => 'Servings', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => '1', 'invalidFeedback' => $__t('This cannot be lower than %s', '1') )) diff --git a/views/productbarcodesform.blade.php b/views/productbarcodesform.blade.php index 5d4ea609..ea73c344 100644 --- a/views/productbarcodesform.blade.php +++ b/views/productbarcodesform.blade.php @@ -55,8 +55,8 @@ @include('components.numberpicker', array( 'id' => 'qu_factor_purchase_to_stock', 'label' => 'Factor purchase to stock quantity unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'isRequired' => true, 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), diff --git a/views/productform.blade.php b/views/productform.blade.php index 1f190b6d..3ef9e350 100644 --- a/views/productform.blade.php +++ b/views/productform.blade.php @@ -142,8 +142,8 @@ @include('components.numberpicker', array( 'id' => 'min_stock_amount', 'label' => 'Minimum stock amount', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('The amount cannot be lower than %s', '0'), 'additionalGroupCssClasses' => 'mb-1' @@ -245,8 +245,8 @@ @include('components.numberpicker', array( 'id' => 'qu_factor_purchase_to_stock', 'label' => 'Factor purchase to stock quantity unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), 'additionalCssClasses' => 'input-group-qu', @@ -287,8 +287,8 @@ @include('components.numberpicker', array( 'id' => 'tare_weight', 'label' => 'Tare weight', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('This cannot be lower than %s', '0'), 'additionalAttributes' => $additionalAttributes, @@ -316,8 +316,8 @@ @include('components.numberpicker', array( 'id' => 'calories', 'label' => 'Energy (kcal)', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('The amount cannot be lower than %s', '0'), 'hint' => $__t('Per stock quantity unit'), diff --git a/views/purchase.blade.php b/views/purchase.blade.php index 85926864..679840e0 100644 --- a/views/purchase.blade.php +++ b/views/purchase.blade.php @@ -47,8 +47,8 @@ 'id' => 'amount', 'label' => 'Amount', 'hintId' => 'amount_qu_unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), 'additionalHtmlContextHelp' => '
' . $__t('Tare weight handling enabled - please weigh the whole container, the amount to be posted will be automatically calculcated') . '
' @@ -85,7 +85,6 @@ 'shortcutLabel' => 'Never expires', 'earlierThanInfoLimit' => date('Y-m-d'), 'earlierThanInfoText' => $__t('The given date is earlier than today, are you sure?'), - 'additionalGroupCssClasses' => $additionalGroupCssClasses, 'activateNumberPad' => GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_FIELD_NUMBER_PAD )) @endif @@ -94,14 +93,15 @@ @include('components.numberpicker', array( 'id' => 'price', 'label' => 'Price', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_prices'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_prices'], 'value' => '', 'hintId' => 'price-hint', 'invalidFeedback' => $__t('The price cannot be lower than %s', '0'), 'isRequired' => false, 'additionalGroupCssClasses' => 'mb-1' )) +
'qu_factor_purchase_to_stock', 'label' => 'Factor purchase to stock quantity unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'additionalGroupCssClasses' => 'd-none', 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), 'additionalCssClasses' => 'input-group-qu', diff --git a/views/quantityunitconversionform.blade.php b/views/quantityunitconversionform.blade.php index 43e82193..98fb9157 100644 --- a/views/quantityunitconversionform.blade.php +++ b/views/quantityunitconversionform.blade.php @@ -81,8 +81,8 @@ @include('components.numberpicker', array( 'id' => 'factor', 'label' => 'Factor', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('This cannot be lower than %1$s and must be a valid number with max. %2$s decimal places', '0', '3'), 'additionalHtmlElements' => '

'amount', 'label' => 'Amount', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'isRequired' => false, 'value' => 1 )) diff --git a/views/recipeform.blade.php b/views/recipeform.blade.php index 9ca0ad36..19f1b0bc 100644 --- a/views/recipeform.blade.php +++ b/views/recipeform.blade.php @@ -91,8 +91,8 @@ @include('components.numberpicker', array( 'id' => 'base_servings', 'label' => 'Servings', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, 'invalidFeedback' => $__t('This cannot be lower than %s', '1'), 'hint' => $__t('The ingredients listed here result in this amount of servings') @@ -334,8 +334,8 @@ @include('components.numberpicker', array( 'id' => 'includes_servings', 'label' => 'Servings', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => '1', 'invalidFeedback' => $__t('This cannot be lower than %s', '1') )) diff --git a/views/recipeposform.blade.php b/views/recipeposform.blade.php index f42d129c..60ebd8ad 100644 --- a/views/recipeposform.blade.php +++ b/views/recipeposform.blade.php @@ -106,8 +106,8 @@ @include('components.numberpicker', array( 'id' => 'price_factor', 'label' => 'Price factor', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => '', 'hint' => $__t('The resulting price of this ingredient will be multiplied by this factor'), 'invalidFeedback' => $__t('This cannot be lower than %s', '0'), diff --git a/views/recipes.blade.php b/views/recipes.blade.php index 98cc4198..ee100253 100644 --- a/views/recipes.blade.php +++ b/views/recipes.blade.php @@ -297,8 +297,8 @@ @include('components.numberpicker', array( 'id' => 'servings-scale', 'label' => 'Desired servings', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $recipe->desired_servings, 'invalidFeedback' => $__t('This cannot be lower than %s', '1'), 'additionalAttributes' => 'data-recipe-id="' . $recipe->id . '"', diff --git a/views/shoppinglistitemform.blade.php b/views/shoppinglistitemform.blade.php index 16c44d24..3f3cb292 100644 --- a/views/shoppinglistitemform.blade.php +++ b/views/shoppinglistitemform.blade.php @@ -64,10 +64,10 @@ 'id' => 'amount', 'label' => 'Amount', 'hintId' => 'amount_qu_unit', - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'value' => $value, - 'invalidFeedback' => $__t('The amount cannot be lower than %s', '0.01') + 'invalidFeedback' => $__t('The amount cannot be lower than %s', '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1') ))

diff --git a/views/stockentryform.blade.php b/views/stockentryform.blade.php index aa5ba706..89397f8d 100644 --- a/views/stockentryform.blade.php +++ b/views/stockentryform.blade.php @@ -66,8 +66,8 @@ 'id' => 'qu_factor_purchase_to_stock', 'label' => 'Factor purchase to stock quantity unit', 'value' => $stockEntry->qu_factor_purchase_to_stock, - 'min' => 0.0001, - 'decimals' => 4, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_amounts'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), 'additionalCssClasses' => 'input-group-qu', 'additionalHtmlElements' => '

'price', 'value' => $price, 'label' => 'Price', - 'min' => 0.01, - 'decimals' => 2, + 'min' => '0.' . str_repeat('0', $userSettings['stock_decimal_places_prices'] - 1) . '1', + 'decimals' => $userSettings['stock_decimal_places_prices'], 'hint' => $__t('in %s per purchase quantity unit', GROCY_CURRENCY), 'invalidFeedback' => $__t('The price cannot be lower than %s', '0'), 'isRequired' => false diff --git a/views/stocksettings.blade.php b/views/stocksettings.blade.php index b330781a..608f1a5f 100644 --- a/views/stocksettings.blade.php +++ b/views/stocksettings.blade.php @@ -71,7 +71,7 @@ 'additionalAttributes' => 'data-setting-key="stock_default_purchase_amount"', 'label' => 'Default amount for purchase', 'min' => 0, - 'decimals' => 4, + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'invalidFeedback' => $__t('This cannot be lower than %s', '1'), 'additionalCssClasses' => 'user-setting-control' )) @@ -82,11 +82,33 @@ 'additionalAttributes' => 'data-setting-key="stock_default_consume_amount"', 'label' => 'Default amount for consume', 'min' => 0, - 'decimals' => 4, + 'decimals' => $userSettings['stock_decimal_places_amounts'], 'invalidFeedback' => $__t('This cannot be lower than %s', '1'), 'additionalCssClasses' => 'user-setting-control' )) +

{{ $__t('Common') }}

+ + @include('components.numberpicker', array( + 'id' => 'stock_price_decimal_amounts', + 'additionalAttributes' => 'data-setting-key="stock_price_decimal_amounts"', + 'label' => 'Decimal places allowed for amounts', + 'min' => 0, + 'decimals' => 0, + 'invalidFeedback' => $__t('This cannot be lower than %s', '0'), + 'additionalCssClasses' => 'user-setting-control' + )) + + @include('components.numberpicker', array( + 'id' => 'stock_price_decimal_places', + 'additionalAttributes' => 'data-setting-key="stock_price_decimal_places"', + 'label' => 'Decimal places allowed for prices', + 'min' => 0, + 'decimals' => 0, + 'invalidFeedback' => $__t('This cannot be lower than %s', '0'), + 'additionalCssClasses' => 'user-setting-control' + )) +