From a81a8775a5aa8e208ad0210d9e4bbb518c9fe86d Mon Sep 17 00:00:00 2001 From: AIIrondev Date: Thu, 11 Jun 2026 22:08:53 +0200 Subject: [PATCH] correction oif a tabulation error --- Web/templates/upload_admin.html | 332 ++++++++++++++++---------------- 1 file changed, 166 insertions(+), 166 deletions(-) diff --git a/Web/templates/upload_admin.html b/Web/templates/upload_admin.html index c88500c..4f7791c 100755 --- a/Web/templates/upload_admin.html +++ b/Web/templates/upload_admin.html @@ -1113,184 +1113,184 @@ }); // Globale Variablen für den Scanner-Status (falls nicht schon woanders definiert) -let code4LastScanned = ''; -let code4LastScannedAt = 0; - -/** - * Schaltet das UI basierend auf dem ausgewählten Modus um - */ -function toggleScanMode() { - const mode = document.getElementById('scan_mode').value; - const rangeGroup = document.getElementById('range_generator_group'); - const scanButton = document.getElementById('scan-code4-btn'); - const scannerBox = document.getElementById('code4-scanner'); + let code4LastScanned = ''; + let code4LastScannedAt = 0; - // Scanner stoppen, falls der Modus gewechselt wird und er noch läuft - if (scannerBox && scannerBox.style.display !== 'none') { - if (typeof killScannerHardware === 'function') killScannerHardware(); - scannerBox.style.display = 'none'; - if (scanButton) scanButton.textContent = 'Barcode scannen'; - } - - if (mode === 'range') { - rangeGroup.style.display = 'block'; - if(scanButton) scanButton.style.display = 'none'; // Verstecke Scanner im Range-Modus - } else { - rangeGroup.style.display = 'none'; - if(scanButton) scanButton.style.display = 'inline-block'; - } -} - -/** - * Generiert eine Liste von Codes basierend auf den Eingaben - */ -function generateCodeRange() { - const prefix = document.getElementById('range_prefix').value.trim(); - const startStr = document.getElementById('range_start').value.trim(); - const endStr = document.getElementById('range_end').value.trim(); - - const start = parseInt(startStr, 10); - const end = parseInt(endStr, 10); - - // Die Länge des End-Wertes bestimmt das Padding (die führenden Nullen) - // Beispiel: Ende = "050" -> Länge 3 -> "001", "002", etc. - const paddingLength = endStr.length; - - if (isNaN(start) || isNaN(end) || start > end) { - alert("Bitte gültige Zahlen für Start und Ende eingeben. Der Startwert darf nicht größer als der Endwert sein."); - return; - } - - let generatedCodes = []; - for (let i = start; i <= end; i++) { - // Nullen auffüllen - let numStr = i.toString().padStart(paddingLength, '0'); - generatedCodes.push(`${prefix}${numStr}`); - } - - const codeField = document.getElementById('code_4'); - const individualCodesArea = document.getElementById('individual_codes'); - - if (generatedCodes.length > 0) { - // 1. Basis-Code setzen (falls leer oder wenn wir komplett neu generieren) - if (!codeField.value || confirm("Soll der aktuelle Basis-Code überschrieben werden?")) { - codeField.value = generatedCodes[0]; - if (typeof validateCodeField === 'function') validateCodeField(codeField); - generatedCodes.shift(); // Den ersten aus dem Array entfernen, da er im Basis-Feld steht - } + /** + * Schaltet das UI basierend auf dem ausgewählten Modus um + */ + function toggleScanMode() { + const mode = document.getElementById('scan_mode').value; + const rangeGroup = document.getElementById('range_generator_group'); + const scanButton = document.getElementById('scan-code4-btn'); + const scannerBox = document.getElementById('code4-scanner'); - // 2. Den Rest in die Textarea einfügen + // Scanner stoppen, falls der Modus gewechselt wird und er noch läuft + if (scannerBox && scannerBox.style.display !== 'none') { + if (typeof killScannerHardware === 'function') killScannerHardware(); + scannerBox.style.display = 'none'; + if (scanButton) scanButton.textContent = 'Barcode scannen'; + } + + if (mode === 'range') { + rangeGroup.style.display = 'block'; + if(scanButton) scanButton.style.display = 'none'; // Verstecke Scanner im Range-Modus + } else { + rangeGroup.style.display = 'none'; + if(scanButton) scanButton.style.display = 'inline-block'; + } + } + + /** + * Generiert eine Liste von Codes basierend auf den Eingaben + */ + function generateCodeRange() { + const prefix = document.getElementById('range_prefix').value.trim(); + const startStr = document.getElementById('range_start').value.trim(); + const endStr = document.getElementById('range_end').value.trim(); + + const start = parseInt(startStr, 10); + const end = parseInt(endStr, 10); + + // Die Länge des End-Wertes bestimmt das Padding (die führenden Nullen) + // Beispiel: Ende = "050" -> Länge 3 -> "001", "002", etc. + const paddingLength = endStr.length; + + if (isNaN(start) || isNaN(end) || start > end) { + alert("Bitte gültige Zahlen für Start und Ende eingeben. Der Startwert darf nicht größer als der Endwert sein."); + return; + } + + let generatedCodes = []; + for (let i = start; i <= end; i++) { + // Nullen auffüllen + let numStr = i.toString().padStart(paddingLength, '0'); + generatedCodes.push(`${prefix}${numStr}`); + } + + const codeField = document.getElementById('code_4'); + const individualCodesArea = document.getElementById('individual_codes'); + if (generatedCodes.length > 0) { - let existing = individualCodesArea.value.trim(); - // Wenn schon was drin steht, machen wir einen Zeilenumbruch, sonst nicht - individualCodesArea.value = existing ? existing + '\n' + generatedCodes.join('\n') : generatedCodes.join('\n'); + // 1. Basis-Code setzen (falls leer oder wenn wir komplett neu generieren) + if (!codeField.value || confirm("Soll der aktuelle Basis-Code überschrieben werden?")) { + codeField.value = generatedCodes[0]; + if (typeof validateCodeField === 'function') validateCodeField(codeField); + generatedCodes.shift(); // Den ersten aus dem Array entfernen, da er im Basis-Feld steht + } + + // 2. Den Rest in die Textarea einfügen + if (generatedCodes.length > 0) { + let existing = individualCodesArea.value.trim(); + // Wenn schon was drin steht, machen wir einen Zeilenumbruch, sonst nicht + individualCodesArea.value = existing ? existing + '\n' + generatedCodes.join('\n') : generatedCodes.join('\n'); + } + + // Visuelles Feedback + alert(`Bereich erfolgreich generiert! (${end - start + 1} Codes)`); } - - // Visuelles Feedback - alert(`Bereich erfolgreich generiert! (${end - start + 1} Codes)`); } -} - -/** - * Scanner-Funktion (Single & Continuous Modus) - */ -function startCode4Scanner() { - const scannerBox = document.getElementById('code4-scanner'); - const scanButton = document.getElementById('scan-code4-btn'); - const codeField = document.getElementById('code_4'); - const individualCodesArea = document.getElementById('individual_codes'); - const scanMode = document.getElementById('scan_mode').value; - - if (!scannerBox || !scanButton || !codeField) return; - - // Beende evtl. laufenden ISBN Scanner - const isbnScannerBox = document.getElementById('isbn-scanner'); - if (isbnScannerBox && isbnScannerBox.style.display !== 'none') { - if (typeof killScannerHardware === 'function') killScannerHardware(); - isbnScannerBox.style.display = 'none'; - const isbnScanButton = document.getElementById('scan-isbn-btn'); - if (isbnScanButton) isbnScanButton.textContent = 'ISBN scannen'; - if (typeof setIsbnScanStatus === 'function') setIsbnScanStatus('Scanner gestoppt.'); - } - - // Scanner ausschalten, wenn er bereits läuft - if (scannerBox.style.display !== 'none') { - if (typeof killScannerHardware === 'function') killScannerHardware(); - scannerBox.style.display = 'none'; - scanButton.textContent = 'Barcode scannen'; - if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus('Scanner gestoppt.'); - return; - } - - // Scanner starten - scannerBox.style.display = 'block'; - scanButton.textContent = scanMode === 'continuous' ? 'Fortlaufenden Scan stoppen' : 'Scanner stoppen'; - if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus('Scanner initialisiert. Richte die Kamera auf den Barcode...'); - - if (typeof runEngineInitialization === 'function') { - runEngineInitialization( - '#code4-scanner', - function(decodedText) { - const now = Date.now(); - // Verhindere Doppel-Scans desselben Codes innerhalb von 1.5 Sekunden - if (decodedText === code4LastScanned && (now - code4LastScannedAt) < 1500) { - return; - } - code4LastScanned = decodedText; - code4LastScannedAt = now; - - if (scanMode === 'single') { - // VERHALTEN: Einzel-Scan - if (typeof killScannerHardware === 'function') killScannerHardware(); - scannerBox.style.display = 'none'; - scanButton.textContent = 'Barcode scannen'; - - codeField.value = decodedText; - if (typeof validateCodeField === 'function') validateCodeField(codeField); - if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Code gesetzt: ${decodedText}`); + + /** + * Scanner-Funktion (Single & Continuous Modus) + */ + function startCode4Scanner() { + const scannerBox = document.getElementById('code4-scanner'); + const scanButton = document.getElementById('scan-code4-btn'); + const codeField = document.getElementById('code_4'); + const individualCodesArea = document.getElementById('individual_codes'); + const scanMode = document.getElementById('scan_mode').value; + + if (!scannerBox || !scanButton || !codeField) return; + + // Beende evtl. laufenden ISBN Scanner + const isbnScannerBox = document.getElementById('isbn-scanner'); + if (isbnScannerBox && isbnScannerBox.style.display !== 'none') { + if (typeof killScannerHardware === 'function') killScannerHardware(); + isbnScannerBox.style.display = 'none'; + const isbnScanButton = document.getElementById('scan-isbn-btn'); + if (isbnScanButton) isbnScanButton.textContent = 'ISBN scannen'; + if (typeof setIsbnScanStatus === 'function') setIsbnScanStatus('Scanner gestoppt.'); + } + + // Scanner ausschalten, wenn er bereits läuft + if (scannerBox.style.display !== 'none') { + if (typeof killScannerHardware === 'function') killScannerHardware(); + scannerBox.style.display = 'none'; + scanButton.textContent = 'Barcode scannen'; + if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus('Scanner gestoppt.'); + return; + } + + // Scanner starten + scannerBox.style.display = 'block'; + scanButton.textContent = scanMode === 'continuous' ? 'Fortlaufenden Scan stoppen' : 'Scanner stoppen'; + if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus('Scanner initialisiert. Richte die Kamera auf den Barcode...'); + + if (typeof runEngineInitialization === 'function') { + runEngineInitialization( + '#code4-scanner', + function(decodedText) { + const now = Date.now(); + // Verhindere Doppel-Scans desselben Codes innerhalb von 1.5 Sekunden + if (decodedText === code4LastScanned && (now - code4LastScannedAt) < 1500) { + return; + } + code4LastScanned = decodedText; + code4LastScannedAt = now; + + if (scanMode === 'single') { + // VERHALTEN: Einzel-Scan + if (typeof killScannerHardware === 'function') killScannerHardware(); + scannerBox.style.display = 'none'; + scanButton.textContent = 'Barcode scannen'; - } else if (scanMode === 'continuous') { - // VERHALTEN: Fortlaufender Scan - let currentAreaCodes = individualCodesArea.value.split('\n').map(c => c.trim()).filter(c => c !== ''); - - if (!codeField.value) { - // Basis-Code setzen, falls noch leer codeField.value = decodedText; if (typeof validateCodeField === 'function') validateCodeField(codeField); - if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Basis-Code gesetzt: ${decodedText}`); - } else if (!currentAreaCodes.includes(decodedText) && codeField.value !== decodedText) { - // In Textarea anhängen, falls Code noch nicht existiert - individualCodesArea.value += (individualCodesArea.value ? '\n' : '') + decodedText; - if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Zusatz-Code erfasst: ${decodedText}`); + if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Code gesetzt: ${decodedText}`); - // Audio-Feedback für kontinuierliches Scannen (optional, aber sehr hilfreich) - try { - const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); - const oscillator = audioCtx.createOscillator(); - const gainNode = audioCtx.createGain(); - oscillator.connect(gainNode); - gainNode.connect(audioCtx.destination); - oscillator.type = 'sine'; - oscillator.frequency.value = 800; // Hoher Beep - gainNode.gain.setValueAtTime(0.1, audioCtx.currentTime); - oscillator.start(); - oscillator.stop(audioCtx.currentTime + 0.1); - } catch (e) { - console.log("Audio feedback not supported"); + } else if (scanMode === 'continuous') { + // VERHALTEN: Fortlaufender Scan + let currentAreaCodes = individualCodesArea.value.split('\n').map(c => c.trim()).filter(c => c !== ''); + + if (!codeField.value) { + // Basis-Code setzen, falls noch leer + codeField.value = decodedText; + if (typeof validateCodeField === 'function') validateCodeField(codeField); + if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Basis-Code gesetzt: ${decodedText}`); + } else if (!currentAreaCodes.includes(decodedText) && codeField.value !== decodedText) { + // In Textarea anhängen, falls Code noch nicht existiert + individualCodesArea.value += (individualCodesArea.value ? '\n' : '') + decodedText; + if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Zusatz-Code erfasst: ${decodedText}`); + + // Audio-Feedback für kontinuierliches Scannen (optional, aber sehr hilfreich) + try { + const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); + const oscillator = audioCtx.createOscillator(); + const gainNode = audioCtx.createGain(); + oscillator.connect(gainNode); + gainNode.connect(audioCtx.destination); + oscillator.type = 'sine'; + oscillator.frequency.value = 800; // Hoher Beep + gainNode.gain.setValueAtTime(0.1, audioCtx.currentTime); + oscillator.start(); + oscillator.stop(audioCtx.currentTime + 0.1); + } catch (e) { + console.log("Audio feedback not supported"); + } + } else { + if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Code ${decodedText} wurde bereits gescannt.`); } - } else { - if (typeof setCode4ScanStatus === 'function') setCode4ScanStatus(`Code ${decodedText} wurde bereits gescannt.`); } - } - }, - 'Scanner läuft. Richte die Kamera auf den Barcode.', - setCode4ScanStatus - ); - } else { - console.error("runEngineInitialization is not defined. Ensure your scanner script is loaded."); + }, + 'Scanner läuft. Richte die Kamera auf den Barcode.', + setCode4ScanStatus + ); + } else { + console.error("runEngineInitialization is not defined. Ensure your scanner script is loaded."); + } } -} - + function startIsbnScanner() { if (!libraryModuleEnabled) { setIsbnScanStatus('Bibliotheks-Modul ist deaktiviert.', true);