further changes to the new Barcode system
This commit is contained in:
@@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user