From 8bd157ca9db7efcf748aecfa3461b11d11a3df0b Mon Sep 17 00:00:00 2001 From: Bernd Bestel Date: Mon, 9 Nov 2020 19:25:46 +0100 Subject: [PATCH] Use producamountpicker "everywhere" (closes #1015) --- controllers/StockController.php | 12 ++- .../viewjs/components/productamountpicker.js | 7 ++ public/viewjs/consume.js | 83 ++++++++--------- public/viewjs/purchase.js | 89 +++++++------------ public/viewjs/transfer.js | 52 +++++------ views/components/datetimepicker.blade.php | 28 ++++-- views/components/datetimepicker2.blade.php | 6 +- .../components/productamountpicker.blade.php | 14 +-- views/components/recipepicker.blade.php | 10 ++- views/consume.blade.php | 87 +++++++++++------- views/purchase.blade.php | 28 ++---- views/transfer.blade.php | 48 +++++----- 12 files changed, 243 insertions(+), 221 deletions(-) diff --git a/controllers/StockController.php b/controllers/StockController.php index 2acb0f19..5cd0ebe4 100644 --- a/controllers/StockController.php +++ b/controllers/StockController.php @@ -15,7 +15,9 @@ class StockController extends BaseController 'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name'), 'barcodes' => $productBarcodes, 'recipes' => $this->getDatabase()->recipes()->where('type', RecipesService::RECIPE_TYPE_NORMAL)->orderBy('name'), - 'locations' => $this->getDatabase()->locations()->orderBy('name') + 'locations' => $this->getDatabase()->locations()->orderBy('name'), + 'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name'), + 'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved() ]); } @@ -209,7 +211,9 @@ class StockController extends BaseController 'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name'), 'barcodes' => $productBarcodes, 'shoppinglocations' => $this->getDatabase()->shopping_locations()->orderBy('name'), - 'locations' => $this->getDatabase()->locations()->orderBy('name') + 'locations' => $this->getDatabase()->locations()->orderBy('name'), + 'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name'), + 'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved() ]); } @@ -433,7 +437,9 @@ class StockController extends BaseController return $this->renderPage($response, 'transfer', [ 'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name'), 'barcodes' => $productBarcodes, - 'locations' => $this->getDatabase()->locations()->orderBy('name') + 'locations' => $this->getDatabase()->locations()->orderBy('name'), + 'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name'), + 'quantityUnitConversionsResolved' => $this->getDatabase()->quantity_unit_conversions_resolved() ]); } diff --git a/public/viewjs/components/productamountpicker.js b/public/viewjs/components/productamountpicker.js index b1b1af19..18a344aa 100644 --- a/public/viewjs/components/productamountpicker.js +++ b/public/viewjs/components/productamountpicker.js @@ -65,6 +65,13 @@ Grocy.Components.ProductAmountPicker.AllowAnyQu = function(keepInitialQu = false $(".input-group-productamountpicker").trigger("change"); } +Grocy.Components.ProductAmountPicker.Reset = function() +{ + $("#qu_id").find("option").remove(); + $("#qu-conversion-info").addClass("d-none"); + $("#qu-display_amount-info").val(""); +} + $(".input-group-productamountpicker").on("change", function() { var destinationQuName = $("#qu_id").attr("data-destination-qu-name"); diff --git a/public/viewjs/consume.js b/public/viewjs/consume.js index 264f203a..407d945d 100644 --- a/public/viewjs/consume.js +++ b/public/viewjs/consume.js @@ -9,7 +9,7 @@ var jsonData = {}; jsonData.amount = jsonForm.amount; - jsonData.exact_amount = (jsonForm.exact_amount == "on"); + jsonData.exact_amount = $('#consume-exact-amount').is(':checked'); jsonData.spoiled = $('#spoiled').is(':checked'); if ($("#use_specific_stock_entry").is(":checked")) @@ -91,12 +91,12 @@ Grocy.FrontendHelpers.EndUiBusy("consume-form"); toastr.success(successMessage); - $("#amount").attr("min", "1"); - $("#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: Grocy.UserSettings.stock_decimal_places_amounts })); - $('#amount_qu_unit').text(""); + Grocy.Components.ProductAmountPicker.Reset(); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("max", "999999"); + $("#display_amount").attr("step", "1"); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); + $('#display_amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); $("#tare-weight-handling-info").addClass("d-none"); Grocy.Components.ProductPicker.Clear(); if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_RECIPES) @@ -110,6 +110,7 @@ Grocy.Components.ProductPicker.GetInputElement().focus(); Grocy.Components.ProductCard.Refresh(jsonForm.product_id); Grocy.FrontendHelpers.ValidateForm('consume-form'); + $("#consume-exact-amount-group").addClass("d-none"); } }, function(xhr) @@ -159,7 +160,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: Grocy.UserSettings.stock_decimal_places_amounts })); + $('#display_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'); @@ -269,7 +270,8 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) Grocy.Api.Get('stock/products/' + productId, function(productDetails) { - $('#amount_qu_unit').text(productDetails.quantity_unit_stock.name); + Grocy.Components.ProductAmountPicker.Reload(productDetails.product.id, productDetails.quantity_unit_stock.id); + Grocy.Components.ProductAmountPicker.SetQuantityUnit(productDetails.quantity_unit_purchase.id); $("#location_id").find("option").remove().end().append(""); Grocy.Api.Get("stock/products/" + productId + '/locations', @@ -305,7 +307,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (BoolVal(Grocy.UserSettings.scan_mode_consume_enabled)) { - $("#amount").val(1); + $("#display_amount").val(1); Grocy.FrontendHelpers.ValidateForm("consume-form"); if (document.getElementById("consume-form").checkValidity() === true) { @@ -326,22 +328,22 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#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 }))); + $("#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 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: Grocy.UserSettings.stock_decimal_places_amounts }))); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("step", "1"); + $("#display_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) { - $("#amount").attr("min", productDetails.product.tare_weight); - $('#amount').attr('max', parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString(), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString())); + $("#display_amount").attr("min", productDetails.product.tare_weight); + $('#display_amount').attr('max', parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString(), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString())); $("#tare-weight-handling-info").removeClass("d-none"); } else @@ -351,6 +353,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if ((parseFloat(productDetails.stock_amount) || 0) === 0) { + Grocy.Components.ProductAmountPicker.Reset(); Grocy.Components.ProductPicker.Clear(); Grocy.FrontendHelpers.ValidateForm('consume-form'); Grocy.Components.ProductPicker.ShowCustomError(__t('This product is not in stock')); @@ -360,7 +363,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) { Grocy.Components.ProductPicker.HideCustomError(); Grocy.FrontendHelpers.ValidateForm('consume-form'); - $('#amount').focus(); + $('#display_amount').focus(); } if (productDetails.stock_amount == productDetails.stock_amount_opened) @@ -380,10 +383,10 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) } }); -$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_consume_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); +$('#display_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) +$('#display_amount').on('focus', function(e) { $(this).select(); }); @@ -436,14 +439,14 @@ $("#specific_stock_entry").on("change", function(e) sumValue = sumValue + parseFloat(stockEntry.amount); } }); - $("#amount").attr("max", sumValue); + $("#display_amount").attr("max", sumValue); if (sumValue == 0) { - $("#amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); + $("#display_amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); } else { - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue)); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue)); } }, function(xhr) @@ -454,8 +457,8 @@ $("#specific_stock_entry").on("change", function(e) } else { - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", $('option:selected', this).attr('amount'))); - $("#amount").attr("max", $('option:selected', this).attr('amount')); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", $('option:selected', this).attr('amount'))); + $("#display_amount").attr("max", $('option:selected', this).attr('amount')); } }); @@ -558,17 +561,17 @@ function RefreshForm() var productDetails = current_productDetails; if (productDetails.product.enable_tare_weight_handling == 1) { - $("#consume-exact-amount").parent().removeClass("d-none"); + $("#consume-exact-amount-group").removeClass("d-none"); } else { - $("#consume-exact-amount").parent().addClass("d-none"); + $("#consume-exact-amount-group").addClass("d-none"); } if (productDetails.product.enable_tare_weight_handling == 1 && !$('#consume-exact-amount').is(':checked')) { - $("#amount").attr("min", productDetails.product.tare_weight); - $('#amount').attr('max', sumValue + parseFloat(productDetails.product.tare_weight)); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString(), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString())); + $("#display_amount").attr("min", productDetails.product.tare_weight); + $('#display_amount').attr('max', sumValue + parseFloat(productDetails.product.tare_weight)); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', parseFloat(productDetails.product.tare_weight).toLocaleString(), (parseFloat(productDetails.stock_amount) + parseFloat(productDetails.product.tare_weight)).toLocaleString())); $("#tare-weight-handling-info").removeClass("d-none"); } else @@ -577,22 +580,22 @@ function RefreshForm() if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#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 }))); + $("#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 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: Grocy.UserSettings.stock_decimal_places_amounts }))); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("step", "1"); + $("#display_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); + $('#display_amount').attr('max', sumValue); if (sumValue == 0) { - $("#amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); + $("#display_amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); } } } diff --git a/public/viewjs/purchase.js b/public/viewjs/purchase.js index 1ac83612..bb682c96 100644 --- a/public/viewjs/purchase.js +++ b/public/viewjs/purchase.js @@ -3,13 +3,15 @@ e.preventDefault(); var jsonForm = $('#purchase-form').serializeJSON(); + jsonForm.qu_factor_purchase_to_stock = $("#qu_id option:selected").attr("data-qu-factor"); + Grocy.FrontendHelpers.BeginUiBusy("purchase-form"); Grocy.Api.Get('stock/products/' + jsonForm.product_id, function(productDetails) { var jsonData = {}; - jsonData.amount = jsonForm.amount * jsonForm.qu_factor_purchase_to_stock; + jsonData.amount = jsonForm.amount; if (!Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_PRICE_TRACKING) { @@ -97,12 +99,12 @@ Grocy.FrontendHelpers.EndUiBusy("purchase-form"); toastr.success(successMessage); - $("#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: Grocy.UserSettings.stock_decimal_places_amounts })); + Grocy.Components.ProductAmountPicker.Reset(); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("step", "1"); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); + $('#display_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"); if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_LOCATION_TRACKING) { @@ -183,7 +185,8 @@ if (Grocy.Components.ProductPicker !== undefined) Grocy.Api.Get('stock/products/' + productId, function(productDetails) { - + Grocy.Components.ProductAmountPicker.Reload(productDetails.product.id, productDetails.quantity_unit_stock.id); + Grocy.Components.ProductAmountPicker.SetQuantityUnit(productDetails.quantity_unit_purchase.id); var qu_factor_purchase_to_stock = null; var barcode_shopping_location_id = null; @@ -226,26 +229,8 @@ if (Grocy.Components.ProductPicker !== undefined) Grocy.Components.LocationPicker.SetId(productDetails.location.id); } - $('#amount_qu_unit').attr("qu-factor-purchase-to-stock", qu_factor_purchase_to_stock); - $('#amount_qu_unit').attr("quantity-unit-purchase-name", productDetails.quantity_unit_purchase.name); - $('#amount_qu_unit').attr("quantity-unit-stock-name", productDetails.quantity_unit_stock.name); - $('#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: Grocy.UserSettings.stock_decimal_places_prices })); - - if (qu_factor_purchase_to_stock == 1) - { - $('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name); - $('#group-qu_factor_purchase_to_stock').addClass('d-none'); - } - 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: 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'); - } - var priceTypeUnitPrice = $("#price-type-unit-price"); var priceTypeUnitPriceLabel = $("[for=" + priceTypeUnitPrice.attr("id") + "]"); priceTypeUnitPriceLabel.text(productDetails.quantity_unit_purchase.name + " price"); @@ -254,23 +239,23 @@ if (Grocy.Components.ProductPicker !== undefined) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#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")); + $("#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 { - $("#amount").attr("min", "1"); - $("#amount").attr("step", "1"); - $("#amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("step", "1"); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); } if (productDetails.product.enable_tare_weight_handling == 1) { var minAmount = parseFloat(productDetails.product.tare_weight) / qu_factor_purchase_to_stock + parseFloat(productDetails.stock_amount); - $("#amount").attr("min", minAmount); - $("#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 }))); + $("#display_amount").attr("min", minAmount); + $("#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', minAmount.toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts }))); $("#tare-weight-handling-info").removeClass("d-none"); } else @@ -296,7 +281,7 @@ if (Grocy.Components.ProductPicker !== undefined) } } - $("#amount").focus(); + $("#display_amount").focus(); Grocy.FrontendHelpers.ValidateForm('purchase-form'); if (GetUriParam("flow") === "shoppinglistitemtostock" && BoolVal(Grocy.UserSettings.shopping_list_to_stock_workflow_auto_submit_when_prefilled) && document.getElementById("purchase-form").checkValidity() === true) @@ -306,7 +291,7 @@ if (Grocy.Components.ProductPicker !== undefined) if (BoolVal(Grocy.UserSettings.scan_mode_purchase_enabled)) { - $("#amount").val(1); + $("#display_amount").val(1); Grocy.FrontendHelpers.ValidateForm("purchase-form"); if (document.getElementById("purchase-form").checkValidity() === true) { @@ -328,7 +313,7 @@ if (Grocy.Components.ProductPicker !== undefined) }); } -$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_purchase_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); +$('#display_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) @@ -343,7 +328,7 @@ if (Grocy.Components.ProductPicker) } } -$('#amount').on('focus', function(e) +$('#display_amount').on('focus', function(e) { if (Grocy.Components.ProductPicker.GetValue().length === 0) { @@ -410,29 +395,19 @@ $('#price-type-total-price').on('change', function(e) refreshPriceHint(); }); -$('#amount').on('change', function(e) +$('#display_amount').on('change', function(e) { refreshPriceHint(); Grocy.FrontendHelpers.ValidateForm('purchase-form'); }); -$('#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: 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: Grocy.UserSettings.stock_decimal_places_amounts })); + $('#display_amount').val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); } function refreshPriceHint() { - if ($('#amount').val() == 0) { $('#price-hint').text(""); @@ -446,24 +421,24 @@ function refreshPriceHint() if ($("input[name='price-type']:checked").val() == "total-price") { - var price = $('#price').val() / document.getElementById("amount_qu_unit").getAttribute("qu-factor-purchase-to-stock") / $('#amount').val(); + var price = $('#price').val() / $("#qu_id option:selected").attr("data-qu-factor") / $('#amount').val(); var quprice = $('#price').val() / $('#amount').val(); - if (document.getElementById("amount_qu_unit").getAttribute("qu-factor-purchase-to-stock") > 1) + if ($("#qu_id option:selected").attr("data-qu-factor") > 1) { - $('#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"))); + $('#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 }), $("#qu_id").attr("data-destination-qu-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: Grocy.UserSettings.stock_decimal_places_prices }), 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 }), $("#qu_id").attr("data-destination-qu-name"))); } } else { - if (document.getElementById("amount_qu_unit").getAttribute("qu-factor-purchase-to-stock") > 1) + if ($("#qu_id option:selected").attr("data-qu-factor") > 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: Grocy.UserSettings.stock_decimal_places_prices }), document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name"))); + var price = $('#price').val() / $("#qu_id option:selected").attr("data-qu-factor"); + $('#price-hint').text(__t('means %1$s per %2$s', price.toLocaleString({ minimumFractionDigits: 2, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_prices }), $("#qu_id").attr("data-destination-qu-name"))); } else { diff --git a/public/viewjs/transfer.js b/public/viewjs/transfer.js index 346b8e50..2885ff0b 100644 --- a/public/viewjs/transfer.js +++ b/public/viewjs/transfer.js @@ -87,13 +87,13 @@ $("#use_specific_stock_entry").click(); } + Grocy.Components.ProductAmountPicker.Reset(); $("#location_id_from").find("option").remove().end().append(""); - $("#amount").attr("min", "1"); - $("#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: Grocy.UserSettings.stock_decimal_places_amounts })); - $('#amount_qu_unit').text(""); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("max", "999999"); + $("#display_amount").attr("step", "1"); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount cannot be lower than %s', '1')); + $('#display_amount').val(parseFloat(Grocy.UserSettings.stock_default_transfer_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: Grocy.UserSettings.stock_decimal_places_amounts })); $("#tare-weight-handling-info").addClass("d-none"); Grocy.Components.ProductPicker.Clear(); $("#location_id_to").val(""); @@ -137,13 +137,15 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) Grocy.Api.Get('stock/products/' + productId, function(productDetails) { + Grocy.Components.ProductAmountPicker.Reload(productDetails.product.id, productDetails.quantity_unit_stock.id); + Grocy.Components.ProductAmountPicker.SetQuantityUnit(productDetails.quantity_unit_purchase.id); + if (productDetails.product.enable_tare_weight_handling == 1) { Grocy.Components.ProductPicker.GetPicker().parent().find(".invalid-feedback").text(__t('Products with Tare weight enabled are currently not supported for Transfer. Please select another product.')); Grocy.Components.ProductPicker.Clear(); return; } - $('#amount_qu_unit').text(productDetails.quantity_unit_stock.name); $("#location_id_from").find("option").remove().end().append(""); Grocy.Api.Get("stock/products/" + productId + '/locations', @@ -187,20 +189,20 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) if (productDetails.product.allow_partial_units_in_stock == 1) { - $("#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")); + $("#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 must be between %1$s and %2$s', "0." + "0".repeat(parseInt(Grocy.UserSettings.stock_decimal_places_amounts) - 1) + "1")); } 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 }))); + $("#display_amount").attr("min", "1"); + $("#display_amount").attr("step", "1"); + $("#display_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 }))); } if (productDetails.product.enable_tare_weight_handling == 1) { - $("#amount").attr("min", productDetails.product.tare_weight); + $("#display_amount").attr("min", productDetails.product.tare_weight); $("#tare-weight-handling-info").removeClass("d-none"); } else @@ -219,7 +221,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) { Grocy.Components.ProductPicker.HideCustomError(); Grocy.FrontendHelpers.ValidateForm('transfer-form'); - $('#amount').focus(); + $('#display_amount').focus(); } }, function(xhr) @@ -230,7 +232,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e) } }); -$('#amount').val(parseFloat(Grocy.UserSettings.stock_default_transfer_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); +$('#display_amount').val(parseFloat(Grocy.UserSettings.stock_default_transfer_amount).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); Grocy.FrontendHelpers.ValidateForm('transfer-form'); $("#location_id_from").on('change', function(e) @@ -282,14 +284,14 @@ $("#location_id_from").on('change', function(e) sumValue = sumValue + parseFloat(stockEntry.amount); } }); - $("#amount").attr("max", sumValue); + $("#display_amount").attr("max", sumValue); if (sumValue == 0) { - $("#amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); + $("#display_amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); } else { - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue)); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue)); } }, function(xhr) @@ -311,7 +313,7 @@ $("#location_id_to").on('change', function(e) } }); -$('#amount').on('focus', function(e) +$('#display_amount').on('focus', function(e) { $(this).select(); }); @@ -358,14 +360,14 @@ $("#specific_stock_entry").on("change", function(e) sumValue = sumValue + parseFloat(stockEntry.amount); } }); - $("#amount").attr("max", sumValue); + $("#display_amount").attr("max", sumValue); if (sumValue == 0) { - $("#amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); + $("#display_amount").parent().find(".invalid-feedback").text(__t('There are no units available at this location')); } else { - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue)); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", sumValue)); } }, function(xhr) @@ -376,8 +378,8 @@ $("#specific_stock_entry").on("change", function(e) } else { - $("#amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", $('option:selected', this).attr('amount'))); - $("#amount").attr("max", $('option:selected', this).attr('amount')); + $("#display_amount").parent().find(".invalid-feedback").text(__t('The amount must be between %1$s and %2$s', "1", $('option:selected', this).attr('amount'))); + $("#display_amount").attr("max", $('option:selected', this).attr('amount')); } }); diff --git a/views/components/datetimepicker.blade.php b/views/components/datetimepicker.blade.php index d704ab8b..d483f89f 100644 --- a/views/components/datetimepicker.blade.php +++ b/views/components/datetimepicker.blade.php @@ -19,8 +19,12 @@