(() => { 'use strict'; const id=Number(location.pathname.match(/^\/sag\/(\d+)(?:\/|$)/)?.[1]),host=document.getElementById('planner'); if(!id||!host)return; const card=document.createElement('section');card.className='card p-3 mb-3'; card.innerHTML=`
Samlet planlægningRedigér sagsplan
Henter overblik…
`; host.prepend(card); const status=card.querySelector('[role=status]'),scope=card.querySelector('select'); const minutes=n=>n==null?'—':`${(Number(n)/60).toLocaleString('da-DK',{maximumFractionDigits:1})} t`; const date=v=>v?new Intl.DateTimeFormat('da-DK',{dateStyle:'short',timeStyle:'short',timeZone:'Europe/Copenhagen'}).format(new Date(v)):'—'; let loading=false; async function load(){ if(loading)return;loading=true; try{const response=await fetch(`/api/v1/planner/cases/${id}/summary?scope=${scope.value}`);const value=await response.json();if(!response.ok)throw new Error(typeof value.detail==='string'?value.detail:'Overblikket kunne ikke indlæses');status.textContent=`Estimat: ${minutes(value.estimated_minutes)} · Planlagt (persontid): ${minutes(value.planned_person_minutes)} · Registreret: ${minutes(value.actual_minutes)} · Rest af estimat: ${minutes(value.remaining_minutes)} · Næste aktivitet: ${date(value.next_activity)} · Seneste deadline: ${date(value.latest_deadline)}${value.unestimated_cases?' · '+value.unestimated_cases+' sager uden estimat':''}`;}catch(e){status.textContent=e.message;}finally{loading=false;} } scope.onchange=load;new MutationObserver(()=>{if(host.classList.contains('active'))load();}).observe(host,{attributes:true,attributeFilter:['class']}); document.getElementById('planner-tab')?.addEventListener('click',load); setInterval(()=>{if(!document.hidden&&host.offsetParent!==null)load();},30000); if(host.classList.contains('active'))load(); })();