From ba447f7a3070eb32b5bcc5d4383500f4d21bed01 Mon Sep 17 00:00:00 2001 From: Greg Soucy Date: Tue, 26 May 2026 23:40:15 -0400 Subject: [PATCH] Fix admin claims load handling for restored dashboard --- public/admin/claims.html | 60 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/public/admin/claims.html b/public/admin/claims.html index 5721298..6905a1e 100644 --- a/public/admin/claims.html +++ b/public/admin/claims.html @@ -57,8 +57,64 @@

CommandLayer Claims Admin

Internal operator dashboard f const badge=(status)=>`${status}`; const copyBtn=(txt)=>``; function renderClaims(){const b=document.getElementById('claimsBody');b.innerHTML='';document.getElementById('claimsCount').textContent=`(${s.claims.length} loaded)`;for(const c of s.claims){const row=document.createElement('button');row.type='button';row.className=`claim-item ${s.selected===c.claimId?'selected':''}`;row.innerHTML=`

${short(c.claimId,14)}${badge(c.status)}
${c.tenant||'-'}${c.packId||'-'} · ${c.agentCount||0} agents
${dt(c.createdAt)}
`;row.onclick=()=>loadDetail(c.claimId);b.appendChild(row);}} -async function loadClaims(){status('Loading claims...');const r=await fetch('/api/admin/claims',{headers:{Authorization:headers().Authorization}});const d=await r.json();if(!r.ok||!d.ok){status(`${r.status} ${d.status}`);return;}s.claims=d.claims||[];renderClaims();status(`Loaded ${s.claims.length} claims.`);} -async function loadDetail(id){s.selected=id;renderClaims();const r=await fetch(`/api/admin/claim?claimId=${encodeURIComponent(id)}`,{headers:{Authorization:headers().Authorization}});const d=await r.json();if(!r.ok||!d.ok)return; s.detail=d; renderDetail();} +async function loadClaims(){ + const endpoint='/api/admin/claims'; + status('Loading claims...'); + try{ + const r=await fetch(endpoint,{headers:{Authorization:headers().Authorization}}); + const raw=await r.text(); + let d={}; + try{d=raw?JSON.parse(raw):{};}catch{d={error:raw||'Invalid JSON response'};} + console.debug('[claims-admin] loadClaims',{endpoint,httpStatus:r.status,responseStatus:d?.status,responseError:d?.error}); + if(!r.ok||d?.ok===false){ + const detail=d?.error||raw||'Request failed'; + status(`Load failed: ${r.status} — ${detail}`); + s.claims=[]; + s.selected=''; + s.detail=null; + renderClaims(); + renderDetail(); + return; + } + const claims=Array.isArray(d)?d:Array.isArray(d?.claims)?d.claims:[]; + s.claims=claims; + renderClaims(); + status(`Loaded ${s.claims.length} claims.`); + }catch(e){ + console.debug('[claims-admin] loadClaims:error',{endpoint,error:e?.message}); + s.claims=[]; + s.selected=''; + s.detail=null; + renderClaims(); + renderDetail(); + status(`Load failed: 0 — ${e?.message||'Request failed'}`); + } +} +async function loadDetail(id){ + const endpoint=`/api/admin/claim?claimId=${encodeURIComponent(id)}`; + s.selected=id; + renderClaims(); + try{ + const r=await fetch(endpoint,{headers:{Authorization:headers().Authorization}}); + const raw=await r.text(); + let d={}; + try{d=raw?JSON.parse(raw):{};}catch{d={error:raw||'Invalid JSON response'};} + console.debug('[claims-admin] loadDetail',{endpoint,httpStatus:r.status,responseStatus:d?.status,responseError:d?.error}); + if(!r.ok||d?.ok===false){ + s.error=`Load failed: ${r.status} — ${d?.error||raw||'Request failed'}`; + s.detail=null; + renderDetail(); + return; + } + s.error=null; + s.detail=d; + renderDetail(); + }catch(e){ + s.error=`Load failed: 0 — ${e?.message||'Request failed'}`; + s.detail=null; + renderDetail(); + } +} async function action(action,p={}){const r=await fetch('/api/admin/claim-action',{method:'POST',headers:headers(),body:JSON.stringify({claimId:s.selected,action,actor:'admin',...p})});const d=await r.json();if(!r.ok||!d.ok){s.error=`${d.status}: ${d.error}`;renderDetail();return;}s.error=null;await loadClaims();await loadDetail(s.selected);} async function publish(){const r=await fetch('/api/admin/publish-agent-cards',{method:'POST',headers:headers(),body:JSON.stringify({claimId:s.selected})});const d=await r.json();if(!r.ok||!d.ok){s.error=`${d.status}: ${d.error}`;renderDetail();return;}s.error=null;await loadClaims();await loadDetail(s.selected);} async function createCheckoutSession(claimId,forceNew=false){if(!claimId){s.error='400 — claimId is required';renderDetail();return;}s.error=null;s.checkoutUrl=null;s.checkoutLoading=true;renderDetail();try{const r=await fetch('/api/admin/create-checkout-session',{method:'POST',headers:headers(),body:JSON.stringify({claimId,forceNew})});const d=await r.json().catch(()=>({}));if(!r.ok||!d.ok){const detail=d?.debug?.message?`\nDetails: ${d.debug.message}`:'';s.error=`Checkout failed:\n${d.status||r.status} — ${d.error||'Request failed'}${detail}`;return;}s.checkoutUrl=d.checkoutUrl||d.url||null;await loadClaims();await loadDetail(claimId);}catch(e){s.error=`500 — ${e?.message||'Request failed'}`;}finally{s.checkoutLoading=false;renderDetail();}}