1import{d as P,j as e}from"./vendor-react-DI1Sy88J.js";import{e as N,f as ce,c as le}from"./vendor-router-DW82M7iN.js";import{ar as de,f as g,g as j,e as k,I as oe,j as he,k as me,B as l,ae as xe}from"./app-marketing-ByOgiMj4.js";import{ac as ue,T as ge,y as je,z,x as C,v as fe,w as I,E as f}from"./app-public-tools-BQrJS2St.js";import{A as pe,c as be,f as Ne,g as ve,d as we,e as ye,b as ke,a as Ce}from"./alert-dialog-l1HZdRd4.js";import{u as Ie}from"./useHouseScope-D1O6K3z7.js";import{b1 as M,O as Te,E as De,P as He,cH as Le,aM as B,bj as E,X as K,a3 as Re,ck as $e,a7 as Ae,bS as Se}from"./vendor-misc-B1nzCziw.js";import{f as qe}from"./vendor-date-DPo7-IdA.js";import"./vendor-radix-ocehe2sJ.js";function W(T,D){const p=new Date(T+"T12:00:00");return p.setDate(p.getDate()+D),qe(p,"yyyy-MM-dd")}function Ue(){const{onboardingData:T}=ue(),D=T?.timezone,{data:p}=N({queryKey:["curfewNightToday"],queryFn:f.curfewCheckIns.today,refetchInterval:6e4}),b=p?.date??null,[Q,v]=P.useState(null),r=Q??b,d=r===b,{toast:$}=de(),U=ce(),[w,H]=P.useState(null),L=le({mutationFn:s=>f.curfewCheckIns.reset(s),onSuccess:()=>{U.invalidateQueries({queryKey:["curfewCheckIns",r]}),H(null),$({title:"Check-In Reset",description:"Check-in cleared. The resident can check in again."})},onError:s=>{$({title:"Error",description:s.message||"Failed to reset check-in.",variant:"destructive"})}}),{data:V=[]}=N({queryKey:["residents"],queryFn:f.residents.list}),{scopeResidents:X}=Ie(),_=X(V),{data:G=[]}=N({queryKey:["houses"],queryFn:f.houses.list}),{data:o=[]}=N({queryKey:["curfewCheckIns",r],queryFn:()=>f.curfewCheckIns.list(r),refetchInterval:d?5e3:!1,enabled:r!==null}),{data:Y=[]}=N({queryKey:["activeOvernightPasses",r],queryFn:()=>f.overnightRequests.active(r),refetchInterval:d?6e4:!1,enabled:r!==null});if(!r||!b)return e.jsx("div",{className:"p-6",children:e.jsx(g,{children:e.jsxs(j,{className:"py-12 text-center text-muted-foreground",children:[e.jsx(M,{className:"mx-auto mb-3 h-6 w-6 animate-spin"}),"Loading tonight's check-in statusâ¦"]})})});const J=new Set(Y.map(s=>s.residentId)),h=_.filter(s=>s.status==="Active"),m=new Set(o.map(s=>s.residentId)),A=h.filter(s=>m.has(s.id)).length,Z=h.length-A,ee=s=>G.find(n=>n.id===s)?.name||"Unassigned",S=s=>{const a=o.find(n=>n.residentId===s);return a?xe(a.checkInTime,D):null},se=s=>o.find(n=>n.residentId===s)?.checkInType||"at_home",te=s=>o.find(n=>n.residentId===s)?.id,q=s=>{const a=o.find(n=>n.residentId===s);return{wasLate:!!a?.wasLate,minutesLate:Number(a?.minutesLate||0)}},R=s=>{if(s<=0)return"0m";if(s<60)return`${s}m late`;const a=Math.floor(s/60),n=s%60;return n===0?`${a}h late`:`${a}h ${n}m late`};h.filter(s=>q(s.id).wasLate).length;const ae=h.reduce((s,a)=>{const n=ee(a.houseId);return s[n]||(s[n]=[]),s[n].push(a),s},{});return e.jsxs("div",{className:"p-6 space-y-6",children:[e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-3xl font-bold",children:d?"Who's Home Tonight":"Who Was Home"}),e.jsxs("p",{className:"text-muted-foreground",children:[new Date(r+"T12:00:00").toLocaleDateString("en-US",{weekday:"long",month:"long",day:"numeric",year:"numeric"}),!d&&e.jsx("span",{className:"ml-2 text-xs uppercase tracking-wide text-amber-600",children:"Historical"})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(k,{variant:"outline",size:"sm",onClick:()=>v(W(r,-1)),"data-testid":"button-prev-night",children:[e.jsx(Te,{className:"w-4 h-4 mr-1"})," Previous night"]}),e.jsxs("div",{className:"flex items-center gap-1.5 border rounded-md px-2 py-1 bg-background",children:[e.jsx(De,{className:"w-4 h-4 text-muted-foreground"}),e.jsx(oe,{type:"date",value:r,max:b,onChange:s=>s.target.value&&v(s.target.value),className:"h-7 border-0 p-0 w-[130px] focus-visible:ring-0","data-testid":"input-night-date"})]}),e.jsxs(k,{variant:"outline",size:"sm",onClick:()=>v(W(r,1)),disabled:d,"data-testid":"button-next-night",children:["Next night ",e.jsx(He,{className:"w-4 h-4 ml-1"})]}),!d&&e.jsx(k,{variant:"ghost",size:"sm",onClick:()=>v(b),"data-testid":"button-tonight",children:"Tonight"})]})]}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:[e.jsx(g,{className:"border-l-4 border-l-blue-500",children:e.jsx(j,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Total Active Occupants"}),e.jsx("p",{className:"text-3xl font-bold",children:h.length}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Physical bed occupancy, including house managers"})]}),e.jsx(Le,{className:"w-10 h-10 text-blue-500"})]})})}),e.jsx(g,{className:"border-l-4 border-l-green-500",children:e.jsx(j,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Checked In"}),e.jsx("p",{className:"text-3xl font-bold text-green-600",children:A})]}),e.jsx(B,{className:"w-10 h-10 text-green-500"})]})})}),e.jsx(g,{className:"border-l-4 border-l-orange-500",children:e.jsx(j,{className:"pt-6",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Not Yet In"}),e.jsx("p",{className:"text-3xl font-bold text-orange-600",children:Z})]}),e.jsx(E,{className:"w-10 h-10 text-orange-500"})]})})})]}),Object.entries(ae).sort().map(([s,a])=>{const n=a.filter(y=>m.has(y.id)).length;return e.jsxs(g,{children:[e.jsx(he,{className:"pb-3",children:e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs(me,{className:"flex items-center gap-2",children:[e.jsx(B,{className:"w-5 h-5"})," ",s]}),e.jsxs(l,{variant:n===a.length?"default":"secondary",className:n===a.length?"bg-green-600":"",children:[n," / ",a.length," Home"]})]})}),e.jsx(j,{children:(()=>{const y=[...a].sort((t,i)=>{const c=m.has(t.id),x=m.has(i.id);return c===x?t.lastName.localeCompare(i.lastName):c?-1:1}),F=t=>
1{const i=m.has(t.id),c=se(t.id),x=q(t.id),ne=J.has(t.id);return e.jsxs("div",{className:"flex flex-wrap items-center gap-1.5",children:[i?c==="overnight"?e.jsxs(l,{className:"bg-purple-100 text-purple-800 border border-purple-300 gap-1",children:[e.jsx(E,{className:"w-3 h-3"})," Overnight"]}):c==="at_work"?e.jsxs(l,{className:"bg-blue-100 text-blue-800 gap-1",children:[e.jsx(K,{className:"w-3 h-3"})," At Work"]}):e.jsxs(l,{className:"bg-green-100 text-green-800 gap-1",children:[e.jsx(K,{className:"w-3 h-3"})," Home"]}):e.jsxs(l,{variant:"outline",className:"text-orange-600 border-orange-300 gap-1",children:[e.jsx(Re,{className:"w-3 h-3"})," Not In"]}),ne&&e.jsxs(l,{className:"bg-indigo-100 text-indigo-800 border border-indigo-300 gap-1","data-testid":`badge-overnight-pass-${t.id}`,title:"Has an approved overnight pass covering tonight",children:[e.jsx($e,{className:"w-3 h-3"})," Overnight pass"]}),t.worksThirdShift&&e.jsx(l,{className:"bg-amber-100 text-amber-800 border border-amber-300 gap-1","data-testid":`badge-third-shift-${t.id}`,title:"Works 3rd shift â late arrivals are expected",children:"3rd Shift"}),i&&x.wasLate&&(()=>{const u=o.find(ie=>ie.residentId===t.id)?.lateReason,re=u?`Checked in ${R(x.minutesLate)} after curfew end 2Reason: ${u}`:`Checked in ${R(x.minutesLate)} after curfew end (no reason given)`;return e.jsxs(l,{className:"bg-amber-100 text-amber-800 border border-amber-300 gap-1","data-testid":`badge-late-${t.id}`,title:re,children:[e.jsx(Ae,{className:"w-3 h-3"})," ",R(x.minutesLate),u?e.jsxs("span",{className:"ml-1 text-amber-700",children:["· ",u.length>30?u.slice(0,30)+"â¦":u]}):null]})})()]})},O=t=>{const i=m.has(t.id),c=te(t.id);return e.jsx("div",{className:"flex items-center gap-1 justify-end",children:i&&c&&e.jsxs(k,{variant:"ghost",size:"sm",onClick:()=>H({id:c,name:`${t.firstName} ${t.lastName}`}),"data-testid":`button-reset-checkin-${t.id}`,children:[e.jsx(Se,{className:"w-3.5 h-3.5 mr-1"})," Reset"]})})};return e.jsxs(e.Fragment,{children:[e.jsx("ul",{className:"sm:hidden divide-y divide-border","data-testid":`list-residents-mobile-${s}`,children:y.map(t=>{const i=S(t.id);return e.jsxs("li",{className:"py-3 first:pt-0 last:pb-0 space-y-2","data-testid":`row-resident-mobile-${t.id}`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsxs("p",{className:"font-medium leading-tight",children:[t.firstName," ",t.lastName]}),e.jsx("span",{className:"text-xs text-muted-foreground whitespace-nowrap pt-0.5",children:i||"â"})]}),F(t),e.jsx("div",{className:"flex justify-end",children:O(t)})]},t.id)})}),e.jsx("div",{className:"hidden sm:block -mx-2 overflow-x-auto",children:e.jsx("div",{className:"min-w-full px-2",children:e.jsxs(ge,{children:[e.jsx(je,{children:e.jsxs(z,{children:[e.jsx(C,{children:"Resident"}),e.jsx(C,{children:"Status"}),e.jsx(C,{children:"Time"}),e.jsx(C,{className:"text-right",children:"Actions"})]})}),e.jsx(fe,{children:y.map(t=>{const i=S(t.id);return e.jsxs(z,{"data-testid":`row-resident-${t.id}`,children:[e.jsxs(I,{className:"font-medium",children:[t.firstName," ",t.lastName]}),e.jsx(I,{children:F(t)}),e.jsx(I,{className:"text-muted-foreground",children:i||"â"}),e.jsx(I,{className:"text-right",children:O(t)})]},t.id)})})]})})})]})})()})]},s)}),h.length===0&&e.jsx(g,{children:e.jsx(j,{className:"py-12 text-center text-muted-foreground",children:"No active residents found."})}),e.jsx(pe,{open:!!w,onOpenChange:s=>!s&&H(null),children:e.jsxs(be,{children:[e.jsxs(Ne,{children:[e.jsx(ve,{children:"Reset Check-In?"}),e.jsxs(we,{children:["This will clear the curfew check-in for ",e.jsx("strong",{children:w?.name})," on ",new Date(r+"T12:00:00").toLocaleDateString(),". They will be able to check in again. This action is recorded in the resident's activity log."]})]}),e.jsxs(ye,{children:[e.jsx(ke,{"data-testid":"button-cancel-reset",children:"Cancel"}),e.jsx(Ce,{onClick:()=>w&&L.mutate(w.id),disabled:L.isPending,"data-testid":"button-confirm-reset",children:L.isPending?e.jsxs(e.Fragment,{children:[e.jsx(M,{className:"w-4 h-4 mr-1 animate-spin"})," Resetting..."]}):"Reset Check-In"})]})]})})]})}export{Ue as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.