// 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.status === "Verified" ?
Verified :
Pending}
))}
{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) => (
))}
);
}
// ---------------- 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={}>
window.WBNavigate&&window.WBNavigate("Screening")} label="In Review" value="3" icon="search-check" iconTone="brand" />
window.WBNavigate&&window.WBNavigate("Screening")} label="Verified" value="3" icon="shield-check" iconTone="success" emphasis="success" />
window.WBNavigate&&window.WBNavigate("Screening")} label="Tours This Week" value="4" icon="calendar-days" iconTone="accent" />
window.WBNavigate&&window.WBNavigate("Leases")} label="Leases Expiring" value="2" icon="calendar-clock" iconTone="danger" emphasis="danger" />
e.preventDefault()} style={{ fontSize: 12, fontWeight: 700, letterSpacing: "0.1em", textTransform: "uppercase", color: "var(--terracotta-600)" }}>View all} />
{D.applicants.map((a, i) => (
{a.status === "Verified" ?
Verified :
Pending}
))}
Upcoming Renewals
);
}
window.SiteDashboard = SiteDashboard;
window.OperatorDashboard = OperatorDashboard;
window.AgentDashboard = AgentDashboard;
})();