/* ALFRED_GLASS_LOGS_V2 — aucun HTML de journal injecte, seulement textContent. */ (() => { 'use strict'; const $=id=>document.getElementById(id); let all=[];let authenticated=false;let pending=false; const when=new Intl.DateTimeFormat('fr-FR',{dateStyle:'short',timeStyle:'medium',timeZone:'Europe/Paris'}); const el=(tag,cls,text)=>{const e=document.createElement(tag);if(cls)e.className=cls;if(text!=null)e.textContent=String(text);return e;}; async function identity(){try{const r=await fetch('/api/state',{cache:'no-store'});if(!r.ok)return;const d=await r.json();const n=String(d.assistant_name||d.title||'').trim();if(!n)return;$('lgName').textContent=n;$('lgLetter').textContent=Array.from(n)[0].toLocaleUpperCase('fr-FR');document.title='Journaux · '+n;}catch(_){}} identity(); function render(){ const needle=$('lgSearch').value.trim().toLocaleLowerCase('fr-FR'); const component=$('lgComponent').value,level=$('lgLevel').value; const filtered=all.filter(x=>(!component||x.component===component)&&(!level||x.level===level)&&(!needle||(x.message||'').toLocaleLowerCase('fr-FR').includes(needle))); const root=$('lgEvents');root.replaceChildren(); $('lgCount').textContent=`${filtered.length} / ${all.length} événement(s)`; if(!filtered.length){root.append(el('div','lg-empty',authenticated?'Aucun événement correspondant aux filtres.':'Connecte-toi via la page Configuration pour consulter les journaux.'));return;} for(const x of filtered.slice().reverse()){ const line=el('div','lg-event');line.dataset.level=x.level; let date='—';try{date=when.format(new Date(x.at));}catch(_){} const time=el('time','',date);time.dateTime=x.at; line.append(time,el('span','lg-component',x.component),el('span','lg-level',x.level),el('span','lg-message',x.message)); root.append(line); } } async function refresh(){ if(pending)return;pending=true;$('lgStatus').textContent='Actualisation…'; try{const r=await fetch('/api/alfred/logs?limit='+encodeURIComponent($('lgLimit').value),{cache:'no-store'});const d=await r.json(); if(r.status===401){authenticated=false;all=[];$('lgStatus').textContent='Accès administrateur requis · Connexion depuis /config';render();return;} if(!r.ok||!d.ok)throw Error(d.error||`HTTP ${r.status}`); authenticated=true;all=Array.isArray(d.items)?d.items:[]; $('lgStatus').textContent='Dernière lecture : '+new Date().toLocaleTimeString('fr-FR',{timeZone:'Europe/Paris'}); render(); }catch(e){$('lgStatus').textContent='Journal indisponible : '+e.message;}finally{pending=false;} } for(const id of ['lgSearch','lgComponent','lgLevel'])$(id).addEventListener('input',render); $('lgLimit').addEventListener('change',refresh); $('lgRefresh').addEventListener('click',refresh); $('lgExport').addEventListener('click',()=>{ if(!authenticated||!all.length)return; const file=new Blob([JSON.stringify({source:'alfred.service',exported_at:new Date().toISOString(),events:all},null,2)],{type:'application/json'}); const url=URL.createObjectURL(file);const a=document.createElement('a');a.href=url;a.download='alfred-journaux-'+new Date().toISOString().slice(0,10)+'.json';a.click();URL.revokeObjectURL(url); }); setInterval(()=>{if($('lgAuto').checked&&!document.hidden)refresh();},10000); window.addEventListener('focus',refresh);refresh(); })();