import { useCallback, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { ShieldCheck, Warehouse as WarehouseIcon } from "lucide-react"; import { toast } from "sonner"; import { Header, PageLayout } from "../../components/layout/Header"; import { EmptyState } from "../../components/EmptyState"; import { useAuthStore } from "../../store/auth"; import { AppSwitcherMenu } from "../../components/AppSwitcherMenu"; import { inventorySubheader } from "../Inventory/panelMenu"; import { apiV26, type UserRow } from "../../lib/api"; import { refreshProcurementStore } from "../../hooks"; import { faNum } from "../../lib/formatters"; const ROLE_LABELS: Record = { pm: "مدیر پروژه", procurement_manager: "مدیر تدارکات", admin: "ادمین", supervisor: "سرپرست پروژه", }; // پنل مدیریت ادمین (فقط ادمین) — همگام‌سازی کاربران از Casdoor و // اعطا/لغو نقش «مدیر تدارکات». تخصیص پروژه در این پنل نیست // (مدیریت پروژه‌ها در «سازمان‌دهی» توسط مدیر تدارکات انجام می‌شود). export function AdminPanel() { const navigate = useNavigate(); const user = useAuthStore((s) => s.user); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [syncing, setSyncing] = useState(false); const [busyId, setBusyId] = useState(null); const isAdmin = user?.role === "admin"; const load = useCallback(async () => { try { setUsers(await apiV26.users.list()); } catch (err) { toast.error(err instanceof Error ? err.message : "خطا در دریافت کاربران"); } finally { setLoading(false); } }, []); useEffect(() => { if (isAdmin) void load(); }, [isAdmin, load]); const sync = async () => { setSyncing(true); try { const { users: synced, created } = await apiV26.users.sync(); setUsers(synced); toast.success( created > 0 ? `همگام‌سازی انجام شد — ${faNum(created)} کاربر جدید از Casdoor اضافه شد ✓` : "همگام‌سازی انجام شد — کاربر جدیدی یافت نشد", ); refreshProcurementStore(); } catch (err) { toast.error(err instanceof Error ? err.message : "خطا در همگام‌سازی با Casdoor"); } finally { setSyncing(false); } }; const toggleProcurementManager = async (u: UserRow) => { setBusyId(u.id); const target = u.role === "procurement_manager" ? null : "procurement_manager"; try { await apiV26.users.updateRole(u.id, target as "procurement_manager" | null); toast.success( target === "procurement_manager" ? `«${u.first_name} ${u.last_name}» مدیر تدارکات شد ✓` : `نقش مدیر تدارکات از «${u.first_name} ${u.last_name}» گرفته شد`, ); await load(); refreshProcurementStore(); } catch (err) { toast.error(err instanceof Error ? err.message : "خطا در تغییر نقش"); } finally { setBusyId(null); } }; // اعطا/لغو نقش «سرپرست پروژه» — کاربر فقطِ پنل مدیریت پروژه (PM) const toggleSupervisor = async (u: UserRow) => { setBusyId(u.id); const target = u.role === "supervisor" ? null : "supervisor"; try { await apiV26.users.updateRole(u.id, target as "supervisor" | null); toast.success( target === "supervisor" ? `«${u.first_name} ${u.last_name}» سرپرست پروژه شد ✓` : `نقش سرپرست پروژه از «${u.first_name} ${u.last_name}» گرفته شد`, ); await load(); refreshProcurementStore(); } catch (err) { toast.error(err instanceof Error ? err.message : "خطا در تغییر نقش"); } finally { setBusyId(null); } }; if (!isAdmin) { return (
); } return (
} menu={} actions={ } />
🛡️ وظیفه‌ی اصلی ادمین، مدیریت مدیران تدارکات است: با دکمه‌ی هر کاربر می‌توانید نقش «مدیر تدارکات» را اعطا یا لغو کنید. تخصیص پروژه به مدیران پروژه در بخش «سازمان‌دهی» انجام می‌شود (این پنل فقط نقش‌ها را مدیریت می‌کند).
{loading ? (
در حال بارگذاری کاربران…
) : !users.length ? ( ) : (
{users.map((u) => { const isPMgr = u.role === "procurement_manager"; const isSup = u.role === "supervisor"; return ( ); })}
نام کامل شناسه Casdoor نقش فعلی مدیریت نقش‌ها
{u.first_name} {u.last_name} {u.casdoor_id} {u.role ? ROLE_LABELS[u.role] : "بدون نقش"}
{faNum(users.length)} کاربر — نقش‌ها فقط توسط ادمین قابل تغییرند (RBAC).
)}
); }