// Woodbury Operator — role-specific dashboards. Registers SiteDashboard, // OperatorDashboard, AgentDashboard (Super Admin keeps PortfolioScreen). (function () { const NS = window.WoodburyPropertiesDesignSystem_7290ca; const { StatCard, Card, CardHeader, Button, Badge, Avatar, ProgressBar, IconTile, Eyebrow, Modal, Select, Input } = NS; function TicketRow({ t, i, action }) { return (
{t.unit}{t.badge && {t.badge}}
{t.meta}
{action}
); } function ExpiringLease({ name, avatar, unit, ends, left }) { return (
{name} — {unit}
Lease ends {ends}
{left} days left365 total
); } // ---------------- Site Administrator ---------------- function SiteDashboard({ site = "Lashibi Townhouses" }) { const D = window.WB_DATA; const [notify, setNotify] = React.useState(false); const tickets = [ { unit: "House 1 — AC Leak", meta: 'Reported by Efua Asante · HVAC notified', icon: "wind", tone: "danger", badge: "Urgent", badgeTone: "danger" }, { unit: "Villa 12 — Gate Remote Sync", meta: "Low priority · Backlog", icon: "door-closed", tone: "sunken", badge: "Backlog", badgeTone: "neutral" }, ]; const siteApplicants = D.applicants.filter((a) => a.asset.startsWith("Cantonments")).slice(0, 3); return (
} /> setNotify(false)} title={"Notify " + site} defaultSite={site} lockSite={true} />
window.WBNavigate&&window.WBNavigate("Properties")} label="Site Units" value="24" icon="home" iconTone="brand" /> window.WBNavigate&&window.WBNavigate("Properties")} label="Occupancy" value="92%" icon="building-2" iconTone="success" emphasis="success" /> window.WBNavigate&&window.WBNavigate("Maintenance")} label="Open Tickets" value="2" icon="wrench" iconTone="danger" emphasis="danger" /> window.WBNavigate&&window.WBNavigate("Screening")} label="Applicants" value="2" icon="user-check" iconTone="accent" />
e.preventDefault()} style={{ fontSize: 12, fontWeight: 700, letterSpacing: "0.1em", textTransform: "uppercase", color: "var(--terracotta-600)" }}>View all} /> {tickets.map((t, i) => { window.WBFocus = { kind: "ticket", key: t.unit }; window.WBNavigate && window.WBNavigate("Maintenance"); }}>View} />)}
Recent Applicants — {site}
{siteApplicants.map((a) => (
{a.name}
{a.email}
{a.status === "Verified" ? Verified : Pending}
))}
{site}

{site}

24 units · 22 occupied

Expiring Lease

); } // ---------------- Site Operator ---------------- function OperatorDashboard({ site = "Lashibi Townhouses" }) { const tickets = [ { unit: "House 1 — AC Leak", meta: "Urgent · awaiting your dispatch", icon: "wind", tone: "danger", badge: "Urgent", badgeTone: "danger", vendor: "Unassigned" }, { unit: "Flat 2B — Geyser Fault", meta: "Parts ordered · ETA 3 days", icon: "flame", tone: "sunken", badge: "In Progress", badgeTone: "success", vendor: "Mensah Plumbing Co." }, { unit: "Villa 12 — Gate Remote Sync", meta: "Low priority · Backlog", icon: "door-closed", tone: "sunken", badge: "Backlog", badgeTone: "neutral", vendor: "Unassigned" }, ]; const vendors = window.WB_DATA.vendors.slice(0, 3); return (
{ window.WBFocus = { kind: "new-ticket" }; window.WBNavigate && window.WBNavigate("Maintenance"); }}>New Ticket} />
window.WBNavigate&&window.WBNavigate("Maintenance")} label="My Open Tickets" value="5" icon="wrench" iconTone="brand" /> window.WBNavigate&&window.WBNavigate("Maintenance")} label="Urgent" value="1" icon="triangle-alert" iconTone="danger" emphasis="danger" /> window.WBNavigate&&window.WBNavigate("Vendors")} label="Awaiting Vendor" value="2" icon="hard-hat" iconTone="accent" /> window.WBNavigate&&window.WBNavigate("Maintenance")} label="Resolved This Week" value="7" icon="check-check" iconTone="success" emphasis="success" />
Filter} /> {tickets.map((t, i) => { window.WBFocus = { kind: "ticket", key: t.unit }; window.WBNavigate && window.WBNavigate("Maintenance"); }}>Assign : } />)} {vendors.map((v, i) => (
{v.name}
{v.trade}
))}
); } // ---------------- Leasing Agent ---------------- function AgentDashboard() { const D = window.WB_DATA; const [tour, setTour] = React.useState(false); return (
} /> setTour(false)} icon="calendar" title="Schedule Tour" subtitle="Book a property viewing for an applicant." footer={}>