Files
SGF/public/request-history.mjs
2026-11-04 09:37:20 +02:00

12 lines
2.0 KiB
JavaScript

/** Bounded, own-stage history. Cursor tokens belong to the current server-authorised context. */
export function mountRequestHistory({id,records,navigation,container,api,active,message}){
const node=(tag,text)=>{const element=document.createElement(tag);if(text!==undefined)element.textContent=text;return element;};let serial=0,size=navigation.per_page;
async function load(cursor=null){const request=++serial;const query=new URLSearchParams({per_page:String(size)});if(cursor)query.set('cursor',cursor);try{const data=await api('/'+id+'/history?'+query);if(!active()||request!==serial)return;render(data.data,data.navigation);message('');}catch(error){if(active()&&request===serial)message(error.message+' Use Actualizar para iniciar nova consulta.');}}
function render(data,nav){
container.replaceChildren(node('h2','Histórico detalhado da requisição'));const label=node('label','Eventos por consulta'),select=node('select');select.name='history_size';for(const value of [25,100])select.append(new Option(String(value),String(value)));select.value=String(size);select.onchange=()=>{size=Number(select.value);load();};label.append(select);const refresh=node('button','Actualizar histórico');refresh.type='button';refresh.onclick=()=>load();container.append(label,refresh,node('p','Ordenação por sequência, dos mais recentes para os antigos. Novas entradas são consultadas ao actualizar; não há contagem global.'));
for(const entry of data){const row=node('details');row.append(node('summary',entry.created_at+' · '+entry.action+' · autor #'+entry.user_id),node('pre',JSON.stringify({anterior:entry.before,posterior:entry.after},null,2)));container.append(row);}if(!data.length)container.append(node('p','Sem eventos nesta consulta.'));
for(const [cursor,text]of [[nav.previous,'Mais recentes'],[nav.next,'Mais antigos']])if(cursor){const button=node('button',text);button.type='button';button.onclick=()=>load(cursor);container.append(button);}
}
render(records,navigation);
}