diff --git a/InvenTree/plugin/builtin/barcodes/inventree_barcode.py b/InvenTree/plugin/builtin/barcodes/inventree_barcode.py index 1b7594870e..4fbe20ca27 100644 --- a/InvenTree/plugin/builtin/barcodes/inventree_barcode.py +++ b/InvenTree/plugin/builtin/barcodes/inventree_barcode.py @@ -34,19 +34,29 @@ class InvenTreeBarcodePlugin(BarcodeMixin, InvenTreePlugin): def format_matched_response(self, label, model, instance): """Format a response for the scanned data""" - response = { + data = { 'pk': instance.pk } # Add in the API URL if available if hasattr(model, 'get_api_url'): - response['api_url'] = f"{model.get_api_url()}{instance.pk}/" + data['api_url'] = f"{model.get_api_url()}{instance.pk}/" # Add in the web URL if available if hasattr(instance, 'get_absolute_url'): - response['web_url'] = instance.get_absolute_url() + url = instance.get_absolute_url() + data['web_url'] = url + else: + url = None - return {label: response} + response = { + label: data + } + + if url is not None: + response['url'] = url + + return response class InvenTreeInternalBarcodePlugin(InvenTreeBarcodePlugin): diff --git a/InvenTree/templates/js/translated/barcode.js b/InvenTree/templates/js/translated/barcode.js index 818be0106b..de0105798d 100644 --- a/InvenTree/templates/js/translated/barcode.js +++ b/InvenTree/templates/js/translated/barcode.js @@ -129,9 +129,25 @@ function postBarcodeData(barcode_data, options={}) { data, { method: 'POST', - error: function() { + error: function(xhr) { + enableBarcodeInput(modal, true); - showBarcodeMessage(modal, '{% trans "Server error" %}'); + + switch (xhr.status || 0) { + case 400: + // No match for barcode, most likely + console.log(xhr); + + data = xhr.responseJSON || {}; + showBarcodeMessage(modal, data.error || '{% trans "Server error" %}'); + + break; + default: + // Any other error code means something went wrong + $(modal).modal('hide'); + + showApiError(xhr, url); + } }, success: function(response, status) { modalEnable(modal, false); @@ -166,6 +182,9 @@ function postBarcodeData(barcode_data, options={}) { } +/* + * Display a message within the barcode scanning dialog + */ function showBarcodeMessage(modal, message, style='danger') { var html = `
`; @@ -179,7 +198,10 @@ function showBarcodeMessage(modal, message, style='danger') { function showInvalidResponseError(modal, response, status) { - showBarcodeMessage(modal, `{% trans "Invalid server response" %}
{% trans "Status" %}: '${status}'`); + showBarcodeMessage( + modal, + `{% trans "Invalid server response" %}
{% trans "Status" %}: '${status}'` + ); } @@ -320,12 +342,11 @@ function barcodeDialog(title, options={}) { $(modal).modal('show'); } - +/* +* Perform a barcode scan, +* and (potentially) redirect the browser +*/ function barcodeScanDialog() { - /* - * Perform a barcode scan, - * and (potentially) redirect the browser - */ var modal = '#modal-form'; @@ -333,11 +354,12 @@ function barcodeScanDialog() { '{% trans "Scan Barcode" %}', { onScan: function(response) { - if ('url' in response) { - $(modal).modal('hide'); - // Redirect to the URL! - window.location.href = response.url; + var url = response.url; + + if (url) { + $(modal).modal('hide'); + window.location.href = url; } else { showBarcodeMessage( modal,