/* ============================================================ SHARED LIST + PARTNER SCREENS ============================================================ */ (function(){ const {Icon,Btn,StatusBadge,PriorityBadge,Avatar,Field,Input,Textarea,Select,Banner,EmptyState}=window; const {useState}=React; /* ---------------- reusable request table ---------------- */ function RequestTable({requests, columns, emptyTitle='No requests', emptyDesc, emptyAction}){ const {go,sel,helpers}=window.useStore(); const [sort,setSort]=useState({k:'updatedAt',dir:-1}); if(!requests.length) return
; const sorted=[...requests].sort((a,b)=>{ let va,vb; if(sort.k==='updatedAt'){va=a.updatedAt;vb=b.updatedAt;} else if(sort.k==='id'){va=a.id;vb=b.id;} else if(sort.k==='prio'){const o={urgent:0,normal:1,low:2};va=o[a.urgency];vb=o[b.urgency];} else {va=a[sort.k];vb=b[sort.k];} return (va>vb?1:va setSort(s=>({k,dir:s.k===k?-s.dir:1})):undefined}> {label}{sortable&&sort.k===k?(sort.dir===1?' ▲':' ▼'):''}; return
{columns.includes('id')&&th('id','Request',true)} {columns.includes('ref')&&} {columns.includes('hospital')&&} {columns.includes('type')&&} {columns.includes('prio')&&th('prio','Priority',true)} {columns.includes('status')&&} {columns.includes('reviewer')&&} {columns.includes('updated')&&th('updatedAt','Updated',true)} {sorted.map(r=>go('detail',r.id)}> {columns.includes('id')&&} {columns.includes('ref')&&} {columns.includes('hospital')&&} {columns.includes('type')&&} {columns.includes('prio')&&} {columns.includes('status')&&} {columns.includes('reviewer')&&} {columns.includes('updated')&&} )}
Patient refHospitalTypeStatusReviewer
{r.id}{r.patient.ref}{sel.hospitalName(r.hospitalId)}{r.request.type}{r.reviewerId?sel.userName(r.reviewerId):Unassigned}{helpers.timeAgo(r.updatedAt)}
; } window.RequestTable=RequestTable; /* activity feed item from history */ function activityFeed(requests, sel){ const items=[]; requests.forEach(r=> r.history.forEach(h=> items.push({reqId:r.id, ...h}))); return items.sort((a,b)=>b.at-a.at).slice(0,6); } /* ---------------- Partner Dashboard ---------------- */ function PartnerDashboard(){ const {me,state,go,sel,helpers}=window.useStore(); const mine=sel.visibleRequests(); const c={total:mine.length, review:mine.filter(r=>r.status==='under_review').length, needs:mine.filter(r=>r.status==='needs_info').length, approved:mine.filter(r=>r.status==='approved').length}; const hosp=sel.hospital(me.hospitalId); if(!mine.length) return
go('submit')}>Submit New Patient}/>
; const stat=(n,label,dot,onClick,emph)=> ; return
WELCOME BACK
{me.name}
{hosp.name} · {hosp.city}
go('submit')} style={{boxShadow:'0 8px 24px rgba(0,0,0,.2)'}}>Submit New Patient
{c.needs>0 &&
1?'s':'')+' need your information'}> Add the requested details so our reviewers can continue. {e.preventDefault();go('requests',{status:'needs_info'});}}>View {c.needs>1?'them':'it'} →
}
{stat(c.total,'Total',null,()=>go('requests',{status:'all'}))} {stat(c.review,'Under Review','var(--st-review-dot)',()=>go('requests',{status:'under_review'}))} {stat(c.needs,'Needs Info','var(--st-needs-dot)',()=>go('requests',{status:'needs_info'}),c.needs>0)} {stat(c.approved,'Approved','var(--st-approved-dot)',()=>go('requests',{status:'approved'}))}

My Requests

Recent updates

{activityFeed(mine,sel).map((it,i)=>
{it.reqId} {it.to==='submitted'?'submitted':'→ '+window.GOV.STATUS[it.to].label}
{helpers.timeAgo(it.at)}
)}
; } /* ---------------- Submit New Patient ---------------- */ const TYPES=['Reconstructive surgery','Scar revision','Consultation','Imaging / diagnostics','Other']; const Section=({n,title,children})=>
{n}

{title}

{children}
; function SubmitPatient(){ const {dispatch,go,toast}=window.useStore(); const [f,setF]=useState({ref:'',initials:'',age:'',gender:'',diagnosis:'',condition:'', type:'',urgency:'normal',reason:'',contact:'',partnerNote:''}); const [files,setFiles]=useState([]); const [confirm,setConfirm]=useState(false); const [touched,setTouched]=useState({}); const [submitting,setSubmitting]=useState(false); const set=(k,v)=>setF(s=>({...s,[k]:v})); const blur=(k)=>setTouched(t=>({...t,[k]:true})); const errs={}; if(!f.ref.trim()) errs.ref='Reference code is required'; if(!f.diagnosis.trim()) errs.diagnosis='Diagnosis summary is required'; if(!f.type) errs.type='Select a request type'; if(!f.reason.trim()) errs.reason='A reason for the request is required'; const valid=Object.keys(errs).length===0 && confirm; const fileTypes=['Medical report','Lab report','Imaging','Referral letter','Other']; function addFile(){ const t=fileTypes[files.length%fileTypes.length]; const nm=t.toLowerCase().replace(/[^a-z]/g,'-')+'-'+(files.length+1)+(t==='Imaging'?'.jpg':'.pdf'); setFiles(x=>[...x,{name:nm,type:t}]); } function submit(){ setTouched({ref:1,diagnosis:1,type:1,reason:1}); if(!valid) return; setSubmitting(true); setTimeout(()=>{ dispatch({type:'SUBMIT',data:{ urgency:f.urgency, patient:{ref:f.ref,initials:f.initials,age:f.age,gender:f.gender,diagnosis:f.diagnosis,condition:f.condition}, request:{type:f.type,reason:f.reason,contact:f.contact,partnerNote:f.partnerNote}, files}}); toast({kind:'success',title:'Request submitted',desc:'Our team has been notified.'}); go('success'); },650); } return

Submit New Patient

Provide the case details below. Fields marked * are required.

go('requests',{status:'all'})}>Cancel
set('ref',e.target.value)} onBlur={()=>blur('ref')} error={touched.ref&&errs.ref} placeholder="e.g. PT-2240"/> set('initials',e.target.value)} placeholder="e.g. S.K." maxLength={6}/> set('age',e.target.value.replace(/\D/g,''))} placeholder="years" maxLength={3}/>