); } function Beheer({clients,setClients,projects,setProjects,addEntry,entries}){ const [client,setClient]=useState({id:"",name:""}); const saveClient=()=>{ if(!client.name.trim()) return; if(client.id){ setClients(clients.map(c=> c.id===client.id? client:c)); }else{ setClients([{id:uid(),name:client.name,email:client.email,address:client.address,kvk:client.kvk}, ...clients]); } setClient({id:"",name:""}); }; const [proj,setProj]=useState({id:"",name:"",rate:95,active:true,budgetHours:0,clientId:"",description:""}); const saveProj=()=>{ if(!proj.name.trim()) return; if(proj.id){ setProjects(projects.map(p=> p.id===proj.id? proj:p)); }else{ setProjects([{id:uid(),...proj}, ...projects]); } setProj({id:"",name:"",rate:95,active:true,budgetHours:0,clientId:"",description:""}); }; const [q,setQ]=useState({}); const getQ=(pid)=> q[pid]||{date:todayISO(),hrs:"1.00",desc:""}; const patchQ=(pid,patch)=> setQ(Object.assign({},q,{[pid]:Object.assign({},getQ(pid),patch)})); const quickAdd=(pid)=>{ const v=getQ(pid); const minutes=parseHoursToMinutes(v.hrs); if(minutes>0){ addEntry({id:uid(),date:v.date,projectId:pid,description:v.desc,minutes,invoiced:false}); patchQ(pid,{hrs:"1.00",desc:""}); } }; const used=(pid)=> entries.filter(e=>e.projectId===pid).reduce((s,e)=>s+e.minutes/60,0); return (
Klantnaam
setClient(Object.assign({},client,{name:e.target.value}))} placeholder="Klant BV"/>
{client.id? setClient({id:"",name:""})}>Annuleren:null}
{clients.map(c=>(
{c.name}
setClient(c)}>BewerksetClients(clients.filter(x=>x.id!==c.id))}>Verwijder
))}
Projectnaam
setProj(Object.assign({},proj,{name:e.target.value}))} placeholder="Project X"/>
Uurtarief (€)
setProj(Object.assign({},proj,{rate:Number(e.target.value)}))}/>
Klant
Budget (uren)
setProj(Object.assign({},proj,{budgetHours:Number(e.target.value)}))} placeholder="0 = geen budget"/>
Omschrijving
{p.budgetHours?
{over?'Over budget! ':''}Resterend na boeking: {left.toFixed(2)} uur
: null}
); })}
); } try{ const root = ReactDOM.createRoot(document.getElementById('root')); root.render(); }catch(err){ const pre=document.getElementById('errtxt'); const box=document.getElementById('err'); pre.textContent=String(err&&err.stack||err); box.style.display='flex'; }