Show to amount of "Label per unit" stock entry labels (closes #2241)

This commit is contained in:
Bernd Bestel 2023-05-22 21:23:19 +02:00
parent 55adc140b2
commit 02fe3f2119
No known key found for this signature in database
GPG Key ID: 71BD34C0D4891300
8 changed files with 54 additions and 7 deletions

View File

@ -37,6 +37,7 @@
- When clicking a product name on the products list (master data) or on the stock journal page, the product card will now be displayed (like on the stock overview page) - When clicking a product name on the products list (master data) or on the stock journal page, the product card will now be displayed (like on the stock overview page)
- When using/scanning a product barcode and the purchase or inventory page, the barcode's note will now also be prefilled (if any) - When using/scanning a product barcode and the purchase or inventory page, the barcode's note will now also be prefilled (if any)
- Each row on the stock journal now also has a context-/more menu for quick access to product related actions (the same as on the stock overview page) - Each row on the stock journal now also has a context-/more menu for quick access to product related actions (the same as on the stock overview page)
- The amount of "Label per unit" stock entry labels (on purchase and inventory) is now displayed, to help prevent printing a lot of labels where this maybe is not intended
- Fixed that hiding the "Purchased date" column (table options) on the stock entries page didn't work - Fixed that hiding the "Purchased date" column (table options) on the stock entries page didn't work
- Fixed that sorting by the "Value" and "Min. stock amount" columns on the stock overview page didn't work - Fixed that sorting by the "Value" and "Min. stock amount" columns on the stock overview page didn't work
- Fixed that the consumed amount was wrong, when consuming multiple substituted subproducts at once and when multiple/different conversion factors were involved - Fixed that the consumed amount was wrong, when consuming multiple substituted subproducts at once and when multiple/different conversion factors were involved

View File

@ -2421,3 +2421,8 @@ msgstr ""
msgid "When displaying prices for this product, they will be related to this quantity unit" msgid "When displaying prices for this product, they will be related to this quantity unit"
msgstr "" msgstr ""
msgid "This means 1 label will be printed"
msgid_plural "This means %1$s labels will be printed"
msgstr[0] ""
msgstr[1] ""

View File

@ -283,11 +283,11 @@ __n = function(number, singularForm, pluralForm, isQu = false)
if (isQu) if (isQu)
{ {
return sprintf(Grocy.TranslatorQu.n__(singularForm, pluralForm, number, number), number.toString()); return sprintf(Grocy.TranslatorQu.n__(singularForm, pluralForm, number, number), number.toLocaleString());
} }
else else
{ {
return sprintf(Grocy.Translator.n__(singularForm, pluralForm, number, number), number.toString()); return sprintf(Grocy.Translator.n__(singularForm, pluralForm, number, number), number.toLocaleString());
} }
} }

View File

@ -13,6 +13,11 @@ Grocy.Components.ProductAmountPicker.Reload = function(productId, destinationQuI
conversionsForProduct.forEach(conversion => conversionsForProduct.forEach(conversion =>
{ {
if (conversion.to_qu_id == destinationQuId)
{
conversion.factor = 1;
}
// Only conversions related to the destination QU are needed // Only conversions related to the destination QU are needed
// + only add one conversion per to_qu_id (multiple ones can be a result of contradictory definitions = user input bullshit) // + only add one conversion per to_qu_id (multiple ones can be a result of contradictory definitions = user input bullshit)
if ((conversion.from_qu_id == destinationQuId || conversion.to_qu_id == destinationQuId) && !$('#qu_id option[value="' + conversion.to_qu_id + '"]').length) if ((conversion.from_qu_id == destinationQuId || conversion.to_qu_id == destinationQuId) && !$('#qu_id option[value="' + conversion.to_qu_id + '"]').length)
@ -108,7 +113,7 @@ $(".input-group-productamountpicker").on("change", function()
n = 1; n = 1;
} }
$("#amount").val(destinationAmount.toFixed(n).replace(/0*$/g, '')); $("#amount").val(destinationAmount.toFixed(n).replace(/0*$/g, '')).trigger("change");
}); });
$("#display_amount").on("keyup", function() $("#display_amount").on("keyup", function()

View File

@ -77,7 +77,7 @@ $('#save-inventory-button').on('click', function(e)
); );
} }
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER && Number.parseFloat($("#display_amount").attr("data-estimated-booking-amount")) > 0) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER && Number.parseFloat($("#amount").attr("data-estimated-booking-amount")) > 0)
{ {
if (Grocy.Webhooks.labelprinter !== undefined) if (Grocy.Webhooks.labelprinter !== undefined)
{ {
@ -265,6 +265,7 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER)
{ {
$("#stock_label_type").val(productDetails.product.default_stock_label_type); $("#stock_label_type").val(productDetails.product.default_stock_label_type);
$("#stock_label_type").trigger("change");
} }
if (document.getElementById("product_id").getAttribute("barcode") != "null") if (document.getElementById("product_id").getAttribute("barcode") != "null")
@ -440,7 +441,7 @@ $('#display_amount').on('keyup', function(e)
} }
var estimatedBookingAmount = (newAmount - productStockAmount - containerWeight).toFixed(Grocy.UserSettings.stock_decimal_places_amounts); var estimatedBookingAmount = (newAmount - productStockAmount - containerWeight).toFixed(Grocy.UserSettings.stock_decimal_places_amounts);
$("#display_amount").attr("data-estimated-booking-amount", estimatedBookingAmount); $("#amount").attr("data-estimated-booking-amount", estimatedBookingAmount).trigger("change");
estimatedBookingAmount = Math.abs(estimatedBookingAmount); estimatedBookingAmount = Math.abs(estimatedBookingAmount);
$('#inventory-change-info').removeClass('d-none'); $('#inventory-change-info').removeClass('d-none');
@ -521,3 +522,23 @@ function UndoStockTransaction(transactionId)
}; };
$("#display_amount").attr("min", "0"); $("#display_amount").attr("min", "0");
$("#stock_label_type, #amount").on("change", function(e)
{
if ($("#stock_label_type").val() == 2)
{
var estimatedBookingAmount = Number.parseFloat($("#amount").attr("data-estimated-booking-amount"));
if (estimatedBookingAmount > 0)
{
$("#stock-entry-label-info").text(__n(estimatedBookingAmount, "This means 1 label will be printed", "This means %1$s labels will be printed"));
}
else
{
$("#stock-entry-label-info").text("");
}
}
else
{
$("#stock-entry-label-info").text("");
}
});

View File

@ -340,6 +340,7 @@ if (Grocy.Components.ProductPicker !== undefined)
if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER) if (Grocy.FeatureFlags.GROCY_FEATURE_FLAG_LABEL_PRINTER)
{ {
$("#stock_label_type").val(productDetails.product.default_stock_label_type); $("#stock_label_type").val(productDetails.product.default_stock_label_type);
$("#stock_label_type").trigger("change");
} }
$("#display_amount").focus(); $("#display_amount").focus();
@ -719,3 +720,15 @@ function ScanModeSubmit(singleUnit = true)
} }
} }
} }
$("#stock_label_type, #amount").on("change", function(e)
{
if ($("#stock_label_type").val() == 2)
{
$("#stock-entry-label-info").text(__n(Number.parseFloat($("#amount").val()), "This means 1 label will be printed", "This means %1$s labels will be printed"));
}
else
{
$("#stock-entry-label-info").text("");
}
});

View File

@ -123,7 +123,8 @@
<option value="1">{{ $__t('Single label') }}</option> <option value="1">{{ $__t('Single label') }}</option>
<option value="2">{{ $__t('Label per unit') }}</option> <option value="2">{{ $__t('Label per unit') }}</option>
</select> </select>
<div class="invalid-feedback">{{ $__t('A quantity unit is required') }}</div> <div id="stock-entry-label-info"
class="form-text text-info"></div>
</div> </div>
@endif @endif

View File

@ -158,7 +158,8 @@
<option value="1">{{ $__t('Single label') }}</option> <option value="1">{{ $__t('Single label') }}</option>
<option value="2">{{ $__t('Label per unit') }}</option> <option value="2">{{ $__t('Label per unit') }}</option>
</select> </select>
<div class="invalid-feedback">{{ $__t('A quantity unit is required') }}</div> <div id="stock-entry-label-info"
class="form-text text-info"></div>
</div> </div>
@endif @endif