mirror of
https://github.com/grocy/grocy.git
synced 2025-08-20 04:12:59 +00:00
Add support for printing shoppinglist with thermal printer (#1273)
* Added escpos-php library * Added button to shoppinglist print menu * Added to translation * Added basic printing logic and API call * Working implementation for printing with the API * Added openapi json * Correctly parsing boolean parameter * Working button in UI * Change to grocy formatting * Add Date * Only show thermal print button when Feature Flag is set * Fixed API call and added error message parsing * Undo translation * Add flag to print quantities as well * Added printing notes * Added quantity conversion * Increse feed * Fixed that checkbox was undefined, as dialog was already closed * Added padding * Formatting * Added note about user permission * Fixed error when using notes instead of products * Review - Default FEATURE_FLAG_THERMAL_PRINTER to disabled - Added missing localization strings (and slightly adjusted one) * Fixed merge conflicts Co-authored-by: Bernd Bestel <bernd@berrnd.de>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
var shoppingListTable = $('#shoppinglist-table').DataTable({
|
||||
var shoppingListTable = $('#shoppinglist-table').DataTable({
|
||||
'order': [[1, 'asc']],
|
||||
"orderFixed": [[3, 'asc']],
|
||||
'columnDefs': [
|
||||
@@ -428,56 +428,106 @@ $(document).on("click", "#print-shopping-list-button", function(e)
|
||||
</label> \
|
||||
</div>';
|
||||
|
||||
var sizePrintDialog = 'medium';
|
||||
var printButtons = {
|
||||
cancel: {
|
||||
label: __t('Cancel'),
|
||||
className: 'btn-secondary',
|
||||
callback: function()
|
||||
{
|
||||
bootbox.hideAll();
|
||||
}
|
||||
},
|
||||
printtp: {
|
||||
label: __t('Thermal printer'),
|
||||
className: 'btn-secondary',
|
||||
callback: function()
|
||||
{
|
||||
bootbox.hideAll();
|
||||
var printHeader = $("#print-show-header").prop("checked");
|
||||
var thermalPrintDialog = bootbox.dialog({
|
||||
title: __t('Printing'),
|
||||
message: '<p><i class="fa fa-spin fa-spinner"></i> ' + __t('Connecting to printer...') + '</p>'
|
||||
});
|
||||
//Delaying for one second so that the alert can be closed
|
||||
setTimeout(function()
|
||||
{
|
||||
Grocy.Api.Get('print/shoppinglist/thermal?list=' + $("#selected-shopping-list").val() + '&printHeader=' + printHeader,
|
||||
function(result)
|
||||
{
|
||||
bootbox.hideAll();
|
||||
},
|
||||
function(xhr)
|
||||
{
|
||||
console.error(xhr);
|
||||
var validResponse = true;
|
||||
try
|
||||
{
|
||||
var jsonError = JSON.parse(xhr.responseText);
|
||||
} catch (e)
|
||||
{
|
||||
validResponse = false;
|
||||
}
|
||||
if (validResponse)
|
||||
{
|
||||
thermalPrintDialog.find('.bootbox-body').html(__t('Unable to print') + '<br><pre><code>' + jsonError.error_message + '</pre></code>');
|
||||
} else
|
||||
{
|
||||
thermalPrintDialog.find('.bootbox-body').html(__t('Unable to print') + '<br><pre><code>' + xhr.responseText + '</pre></code>');
|
||||
}
|
||||
}
|
||||
);
|
||||
}, 1000);
|
||||
}
|
||||
},
|
||||
ok: {
|
||||
label: __t('Print'),
|
||||
className: 'btn-primary responsive-button',
|
||||
callback: function()
|
||||
{
|
||||
bootbox.hideAll();
|
||||
$('.modal-backdrop').remove();
|
||||
$(".print-timestamp").text(moment().format("l LT"));
|
||||
|
||||
$("#description-for-print").html($("#description").val());
|
||||
if ($("#description").text().isEmpty())
|
||||
{
|
||||
$("#description-for-print").parent().addClass("d-print-none");
|
||||
}
|
||||
|
||||
if (!$("#print-show-header").prop("checked"))
|
||||
{
|
||||
$("#print-header").addClass("d-none");
|
||||
}
|
||||
|
||||
if (!$("#print-group-by-product-group").prop("checked"))
|
||||
{
|
||||
shoppingListPrintShadowTable.rowGroup().enable(false);
|
||||
shoppingListPrintShadowTable.order.fixed({});
|
||||
shoppingListPrintShadowTable.draw();
|
||||
}
|
||||
|
||||
$(".print-layout-container").addClass("d-none");
|
||||
$("." + $("input[name='print-layout-type']:checked").val()).removeClass("d-none");
|
||||
|
||||
window.print();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Grocy.FeatureFlags["GROCY_FEATURE_FLAG_THERMAL_PRINTER"])
|
||||
{
|
||||
delete printButtons['printtp'];
|
||||
sizePrintDialog = 'small';
|
||||
}
|
||||
|
||||
bootbox.dialog({
|
||||
message: dialogHtml,
|
||||
size: 'small',
|
||||
size: sizePrintDialog,
|
||||
backdrop: true,
|
||||
closeButton: false,
|
||||
className: "d-print-none",
|
||||
buttons: {
|
||||
cancel: {
|
||||
label: __t('Cancel'),
|
||||
className: 'btn-secondary',
|
||||
callback: function()
|
||||
{
|
||||
bootbox.hideAll();
|
||||
}
|
||||
},
|
||||
ok: {
|
||||
label: __t('Print'),
|
||||
className: 'btn-primary responsive-button',
|
||||
callback: function()
|
||||
{
|
||||
bootbox.hideAll();
|
||||
$('.modal-backdrop').remove();
|
||||
|
||||
$(".print-timestamp").text(moment().format("l LT"));
|
||||
|
||||
$("#description-for-print").html($("#description").val());
|
||||
if ($("#description").text().isEmpty())
|
||||
{
|
||||
$("#description-for-print").parent().addClass("d-print-none");
|
||||
}
|
||||
|
||||
if (!$("#print-show-header").prop("checked"))
|
||||
{
|
||||
$("#print-header").addClass("d-none");
|
||||
}
|
||||
|
||||
if (!$("#print-group-by-product-group").prop("checked"))
|
||||
{
|
||||
shoppingListPrintShadowTable.rowGroup().enable(false);
|
||||
shoppingListPrintShadowTable.order.fixed({});
|
||||
shoppingListPrintShadowTable.draw();
|
||||
}
|
||||
|
||||
$(".print-layout-container").addClass("d-none");
|
||||
$("." + $("input[name='print-layout-type']:checked").val()).removeClass("d-none");
|
||||
|
||||
window.print();
|
||||
}
|
||||
}
|
||||
}
|
||||
buttons: printButtons
|
||||
});
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user