further changes to the new Barcode system

This commit is contained in:
2026-06-06 23:41:37 +02:00
parent fc80857fbe
commit e7e24b3fae
+55 -108
View File
@@ -547,7 +547,7 @@
</div> </div>
</div> </div>
<script src="https://cdn.jsdelivr.net/npm/html5-qrcode/minified/html5-qrcode.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@ericblade/quagga2/dist/quagga.js"></script>
<script> <script>
// State // State
let libraryItems = []; let libraryItems = [];
@@ -847,10 +847,16 @@
document.getElementById('detailModal').style.display = 'none'; document.getElementById('detailModal').style.display = 'none';
} }
// Keep track of the scanner state globally/outer scope
let scannerRunning = false;
let lastScanValue = null;
let lastScanAt = 0;
let activeStudentCardId = ''; // Managed globally by your system
function borrowItem(itemId) { function borrowItem(itemId) {
const selectedItem = (libraryItems || []).find(item => item._id === itemId); const selectedItem = (libraryItems || []).find(item => item._id === itemId);
if (selectedItem && selectedItem.LibraryDisplayStatus === 'damaged') { if (selectedItem && selectedItem.LibraryDisplayStatus === 'damaged') {
alert('Dieses Medium ist als defekt/zerstört markiert und kann nicht ausgeliehen werden.'); alert('Dieses Medium ist als defekt/zerstör markiert und kann nicht ausgeliehen werden.');
return; return;
} }
@@ -997,130 +1003,71 @@
processQuickToggleScan(scannedCode); processQuickToggleScan(scannedCode);
} }
function handleScanError() { // Global Quagga reader hook
// Intentionally silent to avoid UI spam while camera searches codes. Quagga.onDetected(function(data) {
} if (data && data.codeResult && data.codeResult.code) {
handleScanSuccess(data.codeResult.code);
async function ensureScannerLibraryLoaded() {
if (typeof Html5QrcodeScanner !== 'undefined') {
return true;
} }
});
const sources = [
'https://cdn.jsdelivr.net/npm/html5-qrcode/minified/html5-qrcode.min.js'
];
for (const src of sources) {
try {
await new Promise((resolve, reject) => {
const existing = document.querySelector(`script[data-scanner-src="${src}"]`);
if (existing) {
const onLoad = () => resolve();
const onError = () => reject(new Error('Script load failed'));
existing.addEventListener('load', onLoad, { once: true });
existing.addEventListener('error', onError, { once: true });
setTimeout(() => {
existing.removeEventListener('load', onLoad);
existing.removeEventListener('error', onError);
if (typeof Html5QrcodeScanner !== 'undefined') {
resolve();
} else {
reject(new Error('Script not available'));
}
}, 1200);
return;
}
const script = document.createElement('script');
script.src = src;
script.async = true;
script.defer = true;
script.dataset.scannerSrc = src;
script.onload = () => resolve();
script.onerror = () => reject(new Error('Script load failed'));
document.head.appendChild(script);
});
if (typeof Html5QrcodeScanner !== 'undefined') {
return true;
}
} catch (err) {
console.warn('Scanner library load failed from', src, err);
}
}
return false;
}
async function startScanner() { async function startScanner() {
if (scannerRunning) return; if (scannerRunning) return;
const scannerLoaded = await ensureScannerLibraryLoaded();
if (!scannerLoaded) {
setScanStatus('Scanner-Bibliothek konnte nicht geladen werden.', 'error');
return;
}
const readerWrap = document.getElementById('scanReaderWrap'); const readerWrap = document.getElementById('scanReaderWrap');
const toggleBtn = document.getElementById('toggleScannerBtn'); const toggleBtn = document.getElementById('toggleScannerBtn');
readerWrap.style.display = 'block'; if (readerWrap) readerWrap.style.display = 'block';
try { setScanStatus('Initializing camera...', 'warn');
const formats = [];
if (typeof Html5QrcodeSupportedFormats !== 'undefined') { Quagga.init({
formats.push( inputStream: {
Html5QrcodeSupportedFormats.QR_CODE, name: "Live",
Html5QrcodeSupportedFormats.EAN_13, type: "LiveStream",
Html5QrcodeSupportedFormats.EAN_8, // Points to the interior viewport layout box
Html5QrcodeSupportedFormats.CODE_128, target: document.querySelector('#libraryQrReader'),
Html5QrcodeSupportedFormats.CODE_39, constraints: {
Html5QrcodeSupportedFormats.UPC_A, width: 640,
Html5QrcodeSupportedFormats.UPC_E, height: 480,
Html5QrcodeSupportedFormats.ITF, facingMode: "environment" // Force rear mobile lenses
Html5QrcodeSupportedFormats.CODABAR },
); },
decoder: {
// Limited down precisely to standard library/ID configurations
readers: [
"code_128_reader",
"ean_reader",
"code_39_reader",
"upc_reader",
"codabar_reader",
"i2of5_reader" // Matches original 'ITF' format mapping
]
}
}, function(err) {
if (err) {
console.error('Scanner start failed:', err);
if (readerWrap) readerWrap.style.display = 'none';
const detail = (err && (err.message || err.name)) ? ` (${err.message || err.name})` : '';
setScanStatus(`Scanner konnte nicht gestartet werden${detail}`, 'error');
return;
} }
const scannerConfig = { Quagga.start();
fps: 10,
rememberLastUsedCamera: true,
aspectRatio: 1.333334
};
if (formats.length > 0) {
scannerConfig.formatsToSupport = formats;
}
scannerInstance = scannerInstance || new Html5QrcodeScanner(
'libraryQrReader',
scannerConfig,
false
);
scannerInstance.render(handleScanSuccess, handleScanError);
scannerRunning = true; scannerRunning = true;
toggleBtn.textContent = 'Scanner stoppen'; if (toggleBtn) toggleBtn.textContent = 'Scanner stoppen';
setScanStatus('Scanner aktiv. Jetzt Code scannen.', 'warn'); setScanStatus('Scanner aktiv. Jetzt Code scannen.', 'warn');
} catch (err) { });
console.error('Scanner start failed:', err);
readerWrap.style.display = 'none';
const detail = (err && (err.message || err.name)) ? ` (${err.message || err.name})` : '';
setScanStatus(`Scanner konnte nicht gestartet werden${detail}`, 'error');
}
} }
async function stopScanner() { async function stopScanner() {
if (!scannerRunning || !scannerInstance) return; if (!scannerRunning) return;
const readerWrap = document.getElementById('scanReaderWrap'); const readerWrap = document.getElementById('scanReaderWrap');
const toggleBtn = document.getElementById('toggleScannerBtn'); const toggleBtn = document.getElementById('toggleScannerBtn');
try {
await scannerInstance.clear(); Quagga.stop();
} catch (err) {
console.error('Scanner stop failed:', err);
}
scannerRunning = false; scannerRunning = false;
scannerInstance = null; if (readerWrap) readerWrap.style.display = 'none';
readerWrap.style.display = 'none'; if (toggleBtn) toggleBtn.textContent = 'Scanner starten';
toggleBtn.textContent = 'Scanner starten';
setScanStatus('Scanner gestoppt.', 'warn'); setScanStatus('Scanner gestoppt.', 'warn');
} }