💬 Fil du ticket
@@ -104,10 +114,13 @@ async function load(){
$('jobs').innerHTML='
Lien invalide ou expiré.';
}
function renderList(){
- if(!JOBS.length){$('jobs').innerHTML='Aucune intervention.';return}
- $('jobs').innerHTML='';
- JOBS.forEach((j,i)=>{const d=document.createElement('div');d.className='card job';d.onclick=()=>openDetail(i);
- d.innerHTML='
'+esc(dec(j.subject)||'Job')+'
'+(j.start?j.start+' · ':'')+esc(dec(j.address))+'
'+badge(j);
+ if(!JOBS.length){$('jobs').innerHTML='
Aucune intervention aujourd\'hui.
';$('bestroute').style.display='none';return}
+ const done=JOBS.filter(j=>j.ended).length; const nextIdx=JOBS.findIndex(j=>!j.ended); // 1er arrêt non terminé = « prochain »
+ $('jobs').innerHTML='
'+done+' de '+JOBS.length+' terminé(s)
';
+ JOBS.forEach((j,i)=>{const d=document.createElement('div');
+ d.className='card job'+(i===nextIdx?' job-next':'')+(j.ended?' job-done':'');
+ d.onclick=()=>openDetail(i);
+ d.innerHTML='
'+(i===nextIdx?'
PROCHAIN
':'')+'
'+esc(dec(j.subject)||'Job')+'
'+(j.start?j.start+' · ':'')+esc(dec(j.address))+'
'+badge(j);
$('jobs').appendChild(d)});
// Bouton « meilleur trajet » dès qu'il reste ≥2 arrêts géolocalisés non terminés (sinon 1 seul → « Itinéraire » du détail suffit).
const stops=JOBS.filter(j=>!j.ended&&j.lat&&Math.abs(+j.lat)>0.01);
@@ -144,9 +157,10 @@ function openDetail(i){
$('dsv').href=hasLL?('https://www.google.com/maps/@?api=1&map_action=pano&viewpoint='+CUR.lat+','+CUR.lon):'#';
setChrono();initMap(hasLL);startWatch(hasLL);
}
-function setChrono(){const b=$('chrono');if(CUR.ended){b.className='big doneb';b.textContent='✅ Terminé'+(CUR.minutes!=null?' · '+CUR.minutes+' min':'');b.disabled=true}
- else if(CUR.started){b.className='big stop';b.textContent='⏹ J\'ai terminé';b.disabled=false}
- else{b.className='big start';b.textContent='📍 Je suis arrivé';b.disabled=false}}
+function setChrono(){const b=$('chrono');const h=$('chronohint');
+ if(CUR.ended){b.className='big doneb';b.textContent='✅ Terminé'+(CUR.minutes!=null?' · '+CUR.minutes+' min':'');b.disabled=true;if(h)h.textContent='Intervention terminée.'}
+ else if(CUR.started){b.className='big stop';b.textContent='⏹ J\'ai terminé';b.disabled=false;if(h)h.textContent='Appuyez quand le travail est terminé.'}
+ else{b.className='big start';b.textContent='📍 Je suis arrivé';b.disabled=false;if(h)h.textContent='Appuyez en arrivant (détecté aussi automatiquement).'}}
async function toggleChrono(){
let pos=null;try{pos=await getPos()}catch(e){}
const type=CUR.started?'geo_exit':'geo_enter';