diff --git a/assets/controllers/pages/barcode_scan_controller.js b/assets/controllers/pages/barcode_scan_controller.js index daf0abd4..c6f3fbe6 100644 --- a/assets/controllers/pages/barcode_scan_controller.js +++ b/assets/controllers/pages/barcode_scan_controller.js @@ -1,86 +1,51 @@ import {Controller} from "@hotwired/stimulus"; -import * as ZXing from "@zxing/library"; +//import * as ZXing from "@zxing/library"; + +import {Html5QrcodeScanner, Html5Qrcode} from "html5-qrcode"; /* stimulusFetch: 'lazy' */ export default class extends Controller { - static targets = [ "source" ] + //codeReader = null; + + _scanner = null; - codeReader = null; connect() { console.log('Init Scanner'); - this.codeReader = new ZXing.BrowserMultiFormatReader(); - this.initScanner(); + + //This function ensures, that the qrbox is 70% of the total viewport + let qrboxFunction = function(viewfinderWidth, viewfinderHeight) { + let minEdgePercentage = 0.7; // 70% + let minEdgeSize = Math.min(viewfinderWidth, viewfinderHeight); + let qrboxSize = Math.floor(minEdgeSize * minEdgePercentage); + return { + width: qrboxSize, + height: qrboxSize + }; + } + + //Try to get the number of cameras. If the number is 0, then the promise will fail, and we show the warning dialog + Html5Qrcode.getCameras().catch((devices) => { + document.getElementById('scanner-warning').classList.remove('d-none'); + }); + + this._scanner = new Html5QrcodeScanner(this.element.id, { + fps: 2, + qrbox: qrboxFunction, + experimentalFeatures: { + //This option improves reading quality on android chrome + useBarCodeDetectorIfSupported: true + } + }, false); + + this._scanner.render(this.onScanSuccess.bind(this)); } - codeScannedHandler(result, err) { - if (result) { - //@ts-ignore - document.getElementById('scan_dialog_input').value = result.text; - //Submit form - //@ts-ignore - document.getElementById('scan_dialog_form').submit(); - } - if (err && !(err instanceof ZXing.NotFoundException)) { - console.error(err); - //document.getElementById('result').textContent = err - } - } - - initScanner() { - let selectedDeviceId; - - this.codeReader.listVideoInputDevices() - .then((videoInputDevices) => { - if (videoInputDevices.length >= 1) { - const sourceSelect = document.getElementById('sourceSelect'); - - - videoInputDevices.forEach((element) => { - const sourceOption = document.createElement('option'); - sourceOption.text = element.label; - sourceOption.value = element.deviceId; - sourceSelect.appendChild(sourceOption); - }); - - //Try to retrieve last selected webcam... - let last_cam_id = localStorage.getItem('scanner_last_cam_id'); - if (!!last_cam_id) { - //selectedDeviceId = localStorage.getItem('scanner_last_cam_id'); - sourceSelect.value = last_cam_id; - } else { - selectedDeviceId = videoInputDevices[0].deviceId; - } - - sourceSelect.onchange = () => { - //@ts-ignore - selectedDeviceId = sourceSelect.value; - localStorage.setItem('scanner_last_cam_id', selectedDeviceId); - changeHandler(); - }; - - document.getElementById('sourceSelectPanel').classList.remove('d-none'); - document.getElementById('video').classList.remove('d-none'); - document.getElementById('scanner-warning').classList.add('d-none'); - } - - - let changeHandler = () => { - this.codeReader.reset(); - this.codeReader.decodeFromVideoDevice(selectedDeviceId, 'video', (result, err) => this.codeScannedHandler(result, err)); - console.log(`Started continous decode from camera with id ${selectedDeviceId}`) - }; - - //Register Change Src Button - //document.getElementById('changeSrcBtn').addEventListener('click', changeHandler); - - //Try to start logging automatically. - changeHandler(); - - }) - .catch((err) => { - console.error(err) - }) + onScanSuccess(decodedText, decodedResult) { + //Put our decoded Text into the input box + document.getElementById('scan_dialog_input').value = decodedText; + //Submit form + document.getElementById('scan_dialog_form').submit(); } } \ No newline at end of file diff --git a/package.json b/package.json index 59b65d71..225ae023 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "@ckeditor/ckeditor5-watchdog": "^35.0.0", "@ckeditor/ckeditor5-word-count": "^35.0.0", "@jbtronics/bs-treeview": "^1.0.1", - "@zxing/library": "^0.19.1", "bootbox": "^5.4.0", "bootstrap-select": "v1.14.0-beta3", "bootswatch": "^5.1.3", @@ -76,6 +75,7 @@ "dompurify": "^2.0.6", "emoji.json": "^13.1.0", "exports-loader": "^3.0.0", + "html5-qrcode": "^2.2.1", "jszip": "^3.2.0", "katex": "^0.16.0", "marked": "^4.0.3", diff --git a/templates/LabelSystem/Scanner/dialog.html.twig b/templates/LabelSystem/Scanner/dialog.html.twig index 1c9d6ff2..39f4e140 100644 --- a/templates/LabelSystem/Scanner/dialog.html.twig +++ b/templates/LabelSystem/Scanner/dialog.html.twig @@ -3,31 +3,24 @@ {% block card_title %} {% trans %}label_scanner.title{% endtrans %}{% endblock %} {% block card_content %} -