// Woodbury Operator — Users (super-admin onboarding & roles). Registers window.UsersScreen. (function () { const NS = window.WoodburyPropertiesDesignSystem_7290ca; const { Card, CardHeader, Button, Badge, Avatar, StatCard, Input, Modal, Select, Checkbox, Switch } = NS; const ROLE_OPTS = ["Super Administrator", "Site Administrator", "Site Operator", "Leasing Agent"]; function statusBadge(s) { if (s === "Active") return Active; if (s === "Invited") return Invited; return Suspended; } function UsersScreen() { const [users, setUsers] = React.useState(window.WB_DATA.users); const [q, setQ] = React.useState(""); const [modal, setModal] = React.useState(null); // 'invite' | user const [scopeAll, setScopeAll] = React.useState(false); const [manage2FA, setManage2FA] = React.useState(false); const close = () => setModal(null); const openManage = (u) => { setManage2FA(!!u.twoFA); setModal(u); }; React.useEffect(() => { const f = window.WBFocus; if (f && f.kind === "user") { const u = users.find((x) => x.name === f.key); if (u) openManage(u); window.WBFocus = null; } }, []); const save2FA = (on) => { setManage2FA(on); setUsers((list) => list.map((x) => x.email === modal.email ? { ...x, twoFA: on } : x)); window.WBToast(on ? "2FA required for " + modal.name : "2FA disabled for " + modal.name, on ? undefined : "danger"); }; return (
setModal("invite")}>Invite User} />
window.WBNavigate&&window.WBNavigate("Users")} label="Total Users" value={String(users.length)} icon="users" iconTone="brand" /> window.WBNavigate&&window.WBNavigate("Users")} label="Site Admins" value="1" icon="shield-check" iconTone="success" /> window.WBNavigate&&window.WBNavigate("Users")} label="Operators" value="2" icon="hard-hat" iconTone="accent" /> window.WBNavigate&&window.WBNavigate("Users")} label="Pending Invites" value="1" icon="mail" iconTone="sunken" />
{/* Role legend */}
{[ { r: "Super Administrator", d: "National scope. Manages users & all sites.", i: "globe" }, { r: "Site Administrator", d: "Runs one site: tenants, leases, screening.", i: "building-2" }, { r: "Site Operator", d: "Maintenance & vendors at one site.", i: "wrench" }, { r: "Leasing Agent", d: "Screening & leases across assigned sites.", i: "file-signature" }, ].map((x) => (
{x.r}
{x.d}
))}
setQ(e.target.value)} containerStyle={{ width: 260 }} />} />
{["Member", "Role", "Site Scope", "2FA", "Status", "Action"].map((h, i) => ( {h} ))}
{users.filter((u) => !q || (u.name + u.email + u.role + u.site).toLowerCase().includes(q.toLowerCase())).map((u, i) => (
{u.name}
{u.email}
{u.role} {u.site}
{u.twoFA ? On : Off}
{statusBadge(u.status)}
))} {users.filter((u) => !q || (u.name + u.email + u.role + u.site).toLowerCase().includes(q.toLowerCase())).length === 0 &&
No users match “{q}”.
}
{/* Invite user */} }>
}
Require two-factor authentication
{/* Manage user */} }> {modal && typeof modal === "object" && (
Two-Factor Authentication
Require a 6-digit code at sign-in for this user.
Current status{statusBadge(modal.status)}
)}
); } window.UsersScreen = UsersScreen; })();