@ -10,6 +10,14 @@
@@ -10,6 +10,14 @@
< / div >
< div class = "card-body" >
< div id = "reader" style = "width:100%; max-width:400px; margin:auto;" > < / div >
< div class = "mt-4 position-relative" style = "max-width:400px; margin:auto;" >
< label id = "manualCoureurLabel" > Saisie manuelle :< / label >
< div class = "input-group align-items-center" >
< input type = "text" id = "manualCoureurInput" class = "form-control" placeholder = "Nom ou dossard..." autocomplete = "off" aria-label = "Saisir un coureur" aria-describedby = "manualCoureurLabel" >
<!-- plus de bouton OK, déclenchement direct sur sélection -->
< / div >
< div id = "manualCoureurSuggestions" class = "list-group position-absolute w-100" style = "z-index:1000;" > < / div >
< / div >
< div id = "scanResult" class = "mt-3" > < / div >
{% if error %}
< div class = "alert alert-danger mt-3" > {{ error }}< / div >
@ -56,6 +64,47 @@
@@ -56,6 +64,47 @@
{% block extra_js %}
< script src = "{% static 'html5-qrcode/html5-qrcode.min.js' %}" > < / script >
< script >
document.addEventListener('DOMContentLoaded', function() {
let selectedCoureurId = null;
const input = document.getElementById('manualCoureurInput');
const suggestions = document.getElementById('manualCoureurSuggestions');
if (input) {
input.addEventListener('input', function() {
const val = this.value.trim();
selectedCoureurId = null;
suggestions.innerHTML = '';
if (val.length < 2 ) return ;
fetch('/ajax/coureur_autocomplete/?q=' + encodeURIComponent(val))
.then(r => r.json())
.then(data => {
suggestions.innerHTML = '';
data.forEach(c => {
const item = document.createElement('a');
item.className = 'list-group-item list-group-item-action';
item.textContent = c.label;
item.style.cursor = 'pointer';
item.onclick = function() {
input.value = c.label;
selectedCoureurId = c.id;
suggestions.innerHTML = '';
onScanSuccess(selectedCoureurId, "");
setTimeout(() => { input.value = ''; }, 100);
};
suggestions.appendChild(item);
});
});
});
// Cacher suggestions si clic ailleurs
document.addEventListener('click', function(e) {
if (!input.contains(e.target) & & !suggestions.contains(e.target)) {
suggestions.innerHTML = '';
}
});
}
// plus de bouton OK, plus de gestion de clic
});
function beep() {
const ctx = new(window.AudioContext || window.webkitAudioContext)();
const oscillator = ctx.createOscillator();