// static/js/admin.SuperAdmin.jsx /* ======================================================================================== СУПЕР-АДМИН: Полное управление организациями и их сотрудниками ======================================================================================== */ function AdminOrganizationsSuper({ token }) { const [orgs, setOrgs] = useState([]); const [loadingOrgs, setLoadingOrgs] = useState(true); const [errorOrgs, setErrorOrgs] = useState(""); const [selectedOrgId, setSelectedOrgId] = useState(null); const [users, setUsers] = useState([]); const [loadingUsers, setLoadingUsers] = useState(false); const [errorUsers, setErrorUsers] = useState(""); // модалка организации const [modalOpen, setModalOpen] = useState(false); const [formOrg, setFormOrg] = useState(null); /* --------------------------------------------- ЗАГРУЗКА ОРГАНИЗАЦИЙ --------------------------------------------- */ useEffect(() => { async function load() { try { setLoadingOrgs(true); setErrorOrgs(""); const data = await API.superadminGetOrganizations(token); setOrgs(Array.isArray(data) ? data : []); if (data.length > 0) setSelectedOrgId(data[0].id); } catch (e) { setErrorOrgs(e.message || "Не удалось загрузить список организаций"); } finally { setLoadingOrgs(false); } } if (token) { load(); } }, [token]); /* --------------------------------------------- ЗАГРУЗКА СОТРУДНИКОВ ОРГАНИЗАЦИИ --------------------------------------------- */ useEffect(() => { if (!selectedOrgId) return; async function load() { try { setLoadingUsers(true); setErrorUsers(""); const data = await API.superadminGetOrgUsers(token, selectedOrgId); setUsers(Array.isArray(data) ? data : []); } catch (e) { setErrorUsers(e.message || "Не удалось загрузить сотрудников организации"); } finally { setLoadingUsers(false); } } load(); }, [token, selectedOrgId]); const selectedOrg = orgs.find((o) => o.id === selectedOrgId) || null; /* --------------------------------------------- УДАЛИТЬ ОРГАНИЗАЦИЮ --------------------------------------------- */ const deleteOrg = async (org) => { if ( !window.confirm( `Удалить организацию "${org.name}" вместе со всеми сотрудниками и тестами?` ) ) return; try { await API.superadminDeleteOrganization(token, org.id); setOrgs((prev) => prev.filter((o) => o.id !== org.id)); if (selectedOrgId === org.id) { setSelectedOrgId(null); setUsers([]); } } catch (e) { alert(e.message || "Ошибка удаления организации"); } }; /* --------------------------------------------- МОДАЛКА РЕДАКТИРОВАНИЯ ОРГАНИЗАЦИИ --------------------------------------------- */ const openModal = (org) => { setFormOrg({ ...org }); setModalOpen(true); }; const saveOrg = async () => { try { const updated = await API.superadminUpdateOrganization( token, formOrg.id, { name: formOrg.name, description: formOrg.description, contact_email: formOrg.contact_email, contact_phone: formOrg.contact_phone, website: formOrg.website, logo_url: formOrg.logo_url, } ); setOrgs((prev) => prev.map((o) => (o.id === updated.id ? updated : o)) ); setModalOpen(false); } catch (e) { alert(e.message || "Ошибка сохранения организации"); } }; /* --------------------------------------------- СОТРУДНИКИ: создание, редактирование, удаление --------------------------------------------- */ const [newUser, setNewUser] = useState({ email: "", first_name: "", last_name: "", role: "specialist", password: "", }); const createUser = async () => { if (!selectedOrgId) return; try { const payload = { ...newUser, department_id: null }; const created = await API.superadminCreateUser( token, selectedOrgId, payload ); setUsers((prev) => [...prev, created]); setNewUser({ email: "", first_name: "", last_name: "", role: "specialist", password: "", }); } catch (e) { alert(e.message || "Ошибка создания сотрудника"); } }; const deleteUser = async (id) => { if (!window.confirm("Удалить сотрудника?")) return; try { await API.superadminDeleteUser(token, id); setUsers((prev) => prev.filter((u) => u.id !== id)); } catch (e) { alert(e.message || "Ошибка удаления сотрудника"); } }; const [editUserId, setEditUserId] = useState(null); const [editUser, setEditUser] = useState({}); const saveUser = async () => { try { const payload = { ...editUser }; if (!payload.password) { delete payload.password; } const updated = await API.superadminUpdateUser(token, editUserId, payload); setUsers((prev) => prev.map((u) => (u.id === updated.id ? updated : u))); setEditUserId(null); } catch (e) { alert(e.message || "Ошибка сохранения сотрудника"); } }; /* --------------------------------------------- РЕНДЕР --------------------------------------------- */ return (
| ID | ФИО | Роль | Действия | |
|---|---|---|---|---|
| {u.id} | setEditUser((x) => ({ ...x, first_name: e.target.value, })) } /> setEditUser((x) => ({ ...x, last_name: e.target.value, })) } /> | setEditUser((x) => ({ ...x, email: e.target.value, })) } /> |
|
|
| {u.id} | {u.first_name} {u.last_name} | {u.email} | {u.role} |
|
Как супер-админ вы можете создавать, редактировать и удалять сотрудников любой организации, а также менять их роли.