`);win.document.close();setTimeout(()=>win.print(),500);} return
{[["matrix","Compliance Matrix"],["log","Full Log"],["bulk","โšก Bulk Setup"],["add",editId?"Edit Record":"+ Add Record"]].map(([v,l])=>())}
{[{l:"Current",k:"current",c:B.green,bg:"#d1fae5"},{l:"Due โ‰ค60d",k:"due-soon",c:B.amber,bg:"#fef3c7"},{l:"Expired",k:"expired",c:B.red,bg:"#fee2e2"},{l:"No Record",k:"missing",c:"#6b7280",bg:"#f3f4f6"}].map(s=>(
{counts[s.k]}
{s.l}
))}
{view==="matrix"&&
Compliance Matrix โ€” Required Training
Click any cell to edit. Click + Add to create a new record.
{reqT.map(t=>)}{STAFF.map((s,si)=>({reqT.map(t=>{const rec=latest(s,t.id);const st=statusOf(rec);const meta=ST[st];return();})}))}
Staff{t.label}
{s}{rec?(
sEdit(rec)} style={{cursor:"pointer"}}>
{meta.l}
{fmtD(rec.completionDate)}
{rec.expiryDate&&
Exp:{fmtD(rec.expiryDate)}
}
):(
{setForm(p=>({...p,staffName:s,typeId:t.id}));setEditId(null);setView("add");}} style={{display:"inline-block",background:"#f3f4f6",color:"#6b7280",borderRadius:4,padding:"2px 6px",fontSize:10,cursor:"pointer",border:"1px dashed #d1d5db"}}>+ Add
)}
{Object.entries(ST).map(([k,v])=>
{v.l}
)}
} {view==="log"&&
Full Log โ€” {trainingRecords.length} records
{trainingRecords.filter(r=>filter==="all"||r.staffName===filter).length===0?
No records found.
:{["Staff","Training","Completed","Expiry","Status","Source",""].map(h=>)}{trainingRecords.filter(r=>filter==="all"||r.staffName===filter).sort((a,b)=>b.completionDate.localeCompare(a.completionDate)).map((rec,i)=>{const t2=TTYPES.find(t=>t.id===rec.typeId);const st=statusOf(rec);const meta=ST[st];return();})}
{h}
{rec.staffName}{t2?.label||rec.typeId}{fmtD(rec.completionDate)}{fmtD(rec.expiryDate)}{meta.l}{rec.provider||"โ€”"}
}
} {view==="bulk"&&
Bulk Setup โ€” Existing Staff Records
Enter completion dates for existing staff. Leave blank to skip.
{reqT.map(t=>)}{STAFF.map((s,si)=>({reqT.map(t=>{const k=`${s}|||${t.id}`;const ex=latest(s,t.id);return();})}))}
Staff Member{t.label}
{t.renew?`Renews ${t.renew}mo`:"No expiry"}
{s}{ex&&!bulkDates[k]?
โœ“ {fmtD(ex.completionDate)}
:setBulkDates(p=>({...p,[k]:e.target.value}))} style={{width:"100%",padding:"5px 7px",borderRadius:5,border:"1px solid #c8dae8",fontSize:11,color:B.grey}}/>}
{Object.values(bulkDates).filter(Boolean).length} date{Object.values(bulkDates).filter(Boolean).length!==1?"s":""} ready to save
} {view==="add"&&
{editId?"Edit Record":"Add Training Record"}
{[{l:"Staff Member *",k:"staffName",type:"select",opts:STAFF},{l:"Training Type *",k:"typeId",type:"select",opts:TTYPES.map(t=>({v:t.id,l:t.label}))},{l:"Completion Date *",k:"completionDate",type:"date"},{l:"Certificate Reference",k:"certificateRef",type:"text",p:"e.g. TCC-2026-00123"},{l:"Provider / Platform",k:"provider",type:"text",p:"e.g. TriConvey Compliance Centre"},{l:"Notes",k:"notes",type:"textarea",p:"Additional notes"}].map(f=>(
{f.type==="select"?:f.type==="textarea"?