diff --git a/public/viewjs/components/productcard.js b/public/viewjs/components/productcard.js index 951207d1..9b6c3ba4 100644 --- a/public/viewjs/components/productcard.js +++ b/public/viewjs/components/productcard.js @@ -80,7 +80,7 @@ Grocy.Components.ProductCard.Refresh = function(productId) if (productDetails.last_price !== null) { - $('#productcard-product-last-price').text(Number.parseFloat(productDetails.last_price).toLocaleString() + ' ' + Grocy.Currency); + $('#productcard-product-last-price').text(Number.parseFloat(productDetails.last_price).toLocaleString() + ' ' + Grocy.Currency + ' per ' + productDetails.quantity_unit_purchase.name); } else { diff --git a/public/viewjs/purchase.js b/public/viewjs/purchase.js index 3501e03a..ea2245aa 100644 --- a/public/viewjs/purchase.js +++ b/public/viewjs/purchase.js @@ -161,6 +161,8 @@ if (Grocy.Components.ProductPicker !== undefined) Grocy.Components.LocationPicker.SetId(productDetails.location.id); } + $('#amount_qu_unit').attr("qu-factor-purchase-to-stock", productDetails.product.qu_factor_purchase_to_stock); + $('#amount_qu_unit').attr("quantity-unit-stock-name", productDetails.quantity_unit_stock.name); if (productDetails.product.qu_id_purchase === productDetails.product.qu_id_stock) { $('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name); @@ -170,6 +172,12 @@ if (Grocy.Components.ProductPicker !== undefined) $('#amount_qu_unit').text(productDetails.quantity_unit_purchase.name + " (" + __t("will be multiplied by a factor of %1$s to get %2$s", parseFloat(productDetails.product.qu_factor_purchase_to_stock).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 2 }), __n(2, productDetails.quantity_unit_stock.name, productDetails.quantity_unit_stock.name_plural)) + ")"); } + var priceTypeUnitPrice = $("#price-type-unit-price"); + var priceTypeUnitPriceLabel = $("[for=" + priceTypeUnitPrice.attr("id") + "]"); + priceTypeUnitPriceLabel.text(productDetails.quantity_unit_purchase.name + " price"); + + refreshPriceHint(); + if (productDetails.product.allow_partial_units_in_stock == 1) { $("#amount").attr("min", "0.01"); @@ -198,7 +206,7 @@ if (Grocy.Components.ProductPicker !== undefined) if (!Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) { - Grocy.Components.DateTimePicker.SetValue(moment().format('YYYY-MM-DD')); + Grocy.Components.DateTimePicker.SetValue('2999-12-31'); } if (productDetails.product.default_best_before_days.toString() !== '0') @@ -214,20 +222,10 @@ if (Grocy.Components.ProductPicker !== undefined) { Grocy.Components.DateTimePicker.SetValue(moment().add(productDetails.product.default_best_before_days, 'days').format('YYYY-MM-DD')); } - $('#amount').focus(); - } - else - { - if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_STOCK_BEST_BEFORE_DATE_TRACKING) - { - Grocy.Components.DateTimePicker.GetInputElement().focus(); - } - else - { - $('#amount').focus(); - } } + $("#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) { @@ -320,8 +318,24 @@ if (Grocy.Components.DateTimePicker) }); } +$('#price').on('change', function(e) +{ + refreshPriceHint(); +}); + +$('#price-type-unit-price').on('change', function(e) +{ + refreshPriceHint(); +}); + +$('#price-type-total-price').on('change', function(e) +{ + refreshPriceHint(); +}); + $('#amount').on('change', function(e) { + refreshPriceHint(); Grocy.FrontendHelpers.ValidateForm('purchase-form'); }); @@ -330,6 +344,42 @@ if (GetUriParam("flow") === "shoppinglistitemtostock") $('#amount').val(parseFloat(GetUriParam("amount")).toLocaleString({ minimumFractionDigits: 0, maximumFractionDigits: 4 })); } +function refreshPriceHint() +{ + + if ($('#amount').val() == 0) + { + $('#price-hint').text(""); + return; + } + if ($('#price').val() == 0) + { + $('#price-hint').text(""); + return; + } + + if ($("input[name='price-type']:checked").val() == "total-price") + { + var priceTypeUnitPrice = $("#price-type-unit-price"); + var priceTypeUnitPriceLabel = $("[for=" + priceTypeUnitPrice.attr("id") + "]"); + var price = $('#price').val() / $('#amount').val(); + + $('#price-hint').text('(will result with ' + priceTypeUnitPriceLabel.text() + ' cost of ' + price.toFixed(2) + ')'); + } + else + { + 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('(will result with ' + document.getElementById("amount_qu_unit").getAttribute("quantity-unit-stock-name") + ' cost of ' + price.toFixed(2) + ')'); + } + else + { + $('#price-hint').text(""); + } + } +}; + function UndoStockBooking(bookingId) { Grocy.Api.Post('stock/bookings/' + bookingId.toString() + '/undo', { }, diff --git a/views/purchase.blade.php b/views/purchase.blade.php index 10d72bff..d9068c07 100644 --- a/views/purchase.blade.php +++ b/views/purchase.blade.php @@ -30,9 +30,17 @@ @include('components.productpicker', array( 'products' => $products, - 'nextInputSelector' => '#best_before_date .datetimepicker-input' + 'nextInputSelector' => '#amount' )) + @include('components.numberpicker', array( + 'id' => 'amount', + 'label' => 'Amount', + 'hintId' => 'amount_qu_unit', + 'min' => 1, + 'invalidFeedback' => $__t('The amount cannot be lower than %s', '1'), + 'additionalHtmlContextHelp' => '