// utils.js — общие хелперы: _esc, busy lock, validateJson, лог-панель function _esc(s){ /* HTML-экранирование: " → " & → & < → < */ return String(s||'').replace(/&/g,'&').replace(/"/g,'"').replace(/{ const el=document.getElementById('log-panel'); if(!el||el.style.display==='none') return; try{ const r=await fetch('/api/log'); const lines=await r.json(); el.innerHTML=lines.map(l=>`
${_esc(l)}
`).join(''); el.scrollTop=el.scrollHeight; }catch(e){} },2000); } function toggleLog(){ const el=document.getElementById('log-panel'); if(!el) return; if(el.style.display==='none'){ el.style.display='block'; startLogPoll(); } else el.style.display='none'; } function relativeTime(iso) { if (!iso) return '-'; const d = new Date(iso); if (isNaN(d.getTime())) return '-'; const sec = Math.floor((Date.now() - d.getTime()) / 1000); if (sec < 0) return 'только что'; if (sec < 60) return sec + 'с'; const min = Math.floor(sec / 60); if (min < 60) return min + 'м'; const hr = Math.floor(min / 60); if (hr < 24) return hr + 'ч ' + (min % 60) + 'м'; const days = Math.floor(hr / 24); return days + 'д ' + (hr % 24) + 'ч'; }