@@ -215,15 +223,20 @@ header('Cache-Control: no-store, max-age=0');
var form=document.getElementById('qr-upload-form');
var fileInput=document.getElementById('qr-files');
var yearInput=document.getElementById('upload-year');
+ var yearNote=document.getElementById('year-limit-note');
var list=document.getElementById('file-list');
var submit=document.getElementById('submit-button');
var endpoint=;
+ var limits=;
var timers=new WeakMap();
+ function yearLimit(){return Number(limits[String(yearInput.value)]||limits[yearInput.value]||0);}
+
function canonical(value){
value=String(value||'').trim();
- if(!/^\d{1,32}$/.test(value))return '';
+ if(!/^\d+$/.test(value))return '';
value=value.replace(/^0+(?=\d)/,'');
+ if(value==='0')return '';
return value;
}
@@ -262,7 +275,9 @@ header('Cache-Control: no-store, max-age=0');
function checkRow(row){
var input=row.querySelector('input[name="qr_numbers[]"]');
var value=canonical(input.value);
- if(!value){setStatus(row,'Bitte eine Nummer aus 1 bis 32 Ziffern eingeben.','bad');return;}
+ var limit=yearLimit();
+ if(!value){setStatus(row,'Bitte eine QR-Code-Nummer ab 1 eingeben.','bad');return;}
+ if(!limit||Number(value)>limit){setStatus(row,'Für '+yearInput.value+' sind nur die Nummern 1 bis '+limit+' vorgesehen.','bad');return;}
var grouped=markBatchDuplicates();
if(grouped[value]&&grouped[value].length>1)return;
@@ -286,12 +301,16 @@ header('Cache-Control: no-store, max-age=0');
function scheduleAll(){rows().forEach(function(row){scheduleCheck(row);});}
+ function updateYearNote(){
+ yearNote.textContent='Für '+yearInput.value+' sind QR-Code-Nummern 1 bis '+yearLimit()+' vorgesehen.';
+ }
+
function rebuild(){
list.textContent='';
Array.prototype.slice.call(fileInput.files||[]).forEach(function(file,index){
var row=document.createElement('div');row.className='file-row';row.dataset.valid='0';
var name=document.createElement('div');name.className='file-name';name.textContent=file.name;
- var input=document.createElement('input');input.type='text';input.name='qr_numbers[]';input.inputMode='numeric';input.autocomplete='off';input.placeholder='QR-Nummer';input.setAttribute('aria-label','QR-Code-Nummer für '+file.name);input.maxLength=32;input.required=true;
+ var input=document.createElement('input');input.type='text';input.name='qr_numbers[]';input.inputMode='numeric';input.autocomplete='off';input.placeholder='QR-Nummer';input.setAttribute('aria-label','QR-Code-Nummer für '+file.name);input.maxLength=3;input.required=true;
var status=document.createElement('div');status.className='status';status.textContent='Nummer fehlt.';
row.appendChild(name);row.appendChild(input);row.appendChild(status);list.appendChild(row);
input.addEventListener('input',scheduleAll);
@@ -301,7 +320,7 @@ header('Cache-Control: no-store, max-age=0');
}
fileInput.addEventListener('change',rebuild);
- yearInput.addEventListener('change',scheduleAll);
+ yearInput.addEventListener('change',function(){updateYearNote();scheduleAll();});
form.addEventListener('submit',function(event){
var invalid=rows().some(function(row){return row.dataset.valid!=='1';});
if(invalid){event.preventDefault();scheduleAll();}
@@ -310,4 +329,4 @@ header('Cache-Control: no-store, max-age=0');
})();