// 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) => (
))}
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.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 */}
}>
{/* 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;
})();