diff --git a/services/targo-hub/lib/roster.js b/services/targo-hub/lib/roster.js index f0a6a19..6a4aa21 100644 --- a/services/targo-hub/lib/roster.js +++ b/services/targo-hub/lib/roster.js @@ -946,6 +946,10 @@ h1{font-size:21px;margin:0 0 4px;letter-spacing:-.02em} .ok{background:#e7f9ef;color:#0d6b34;padding:18px;border-radius:12px;text-align:center;font-size:15px} .err{background:#fdecea;color:#b3261e;padding:13px;border-radius:10px;font-size:13.5px} .empty{color:#9aa5a0;font-size:12.5px;font-style:italic;padding:8px 0} +.ff-row{display:flex;align-items:center;gap:8px;margin:8px 0} +.ff-n{width:22px;height:22px;border-radius:50%;background:var(--g);color:#fff;font-weight:700;font-size:12px;display:grid;place-items:center;flex:none} +.ff-date,.ff-per{font:inherit;font-size:14px;padding:9px 10px;border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--ink)} +.ff-date{flex:1;min-width:0} .foot{text-align:center;color:var(--muted);font-size:12px;margin-top:4px} .foot b{color:var(--g-d)} @@ -975,7 +979,7 @@ function load(){api('/book/api/options?token='+encodeURIComponent(token)).then(f if(r.job&&r.job.scheduled){info.textContent='';c.innerHTML='
Votre rendez-vous est déjà confirmé :
'+dayLabel(r.job.scheduled)+'.
';return} dur=Number(r.job&&r.job.duration)||1;windows=r.windows||[]; info.textContent=(r.job&&r.job.service_type?r.job.service_type+' · ':'')+((r.job&&r.job.location)||''); - if(!windows.length){c.innerHTML='
Aucune disponibilité pour le moment — nous vous contacterons.
';return} + if(!windows.length){renderFreeform();return} c.innerHTML='
' +'
' +'
Réservé pour vous5:00
' @@ -984,6 +988,15 @@ function load(){api('/book/api/options?token='+encodeURIComponent(token)).then(f el('go').onclick=function(){mode==='pick'?confirmPick():submitPropose()}; setMode('pick') })} +function renderFreeform(){var c=el('content'); + var opt=''; + var row=function(n){return '
'+n+'
'}; + c.innerHTML='
Nous n\'avons pas de créneau en ligne pour l\'instant. Indiquez jusqu\'à 3 disponibilités qui vous conviennent — un répartiteur vous confirmera rapidement.
'+row(1)+row(2)+row(3)+'
'; + el('go').onclick=submitFreeform} +function submitFreeform(){var go=el('go');var prefs=[];[].forEach.call(document.querySelectorAll('.ff-date'),function(d){if(d.value){var per=document.querySelector('.ff-per[data-n="'+d.dataset.n+'"]');prefs.push({date:d.value,start:per?per.value:'09:00'})}}); + if(!prefs.length){el('hint').textContent='Choisissez au moins une date.';return} + go.disabled=true;go.textContent='Envoi…'; + api('/book/api/submit?token='+encodeURIComponent(token),{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({mode:'rank',prefs:prefs})}).then(done)} function setMode(m){mode=m;picks=[];sel=null;stopCd();el('hold').classList.remove('on'); Array.prototype.forEach.call(document.querySelectorAll('#seg button'),function(b){b.classList.toggle('on',b.dataset.m===m)}); el('modehint').textContent=m==='pick'?'Touchez un créneau — il est réservé pour vous pendant 5 minutes, le temps de confirmer.':'Touchez 1 à 3 créneaux en ordre de préférence. On confirme le 1er possible.';