/* Bonyan ERP — Users & permissions (المدير يضيف مستخدمين بصلاحيات متعددة) */ function UsersScreen({ user, onSwitchUser }) { const I = window.BnyIcon; const D = window.BnyData; const { Card, Button, Badge, Input, Select, Avatar } = window.BonyanDesignSystem_ad3ca0; const isMobile = window.useBnyMobile(); const [users, setUsers] = React.useState(() => D.users.map((u) => ({ ...u, perms: [...u.perms] }))); React.useEffect(() => { window.BnyData.users = users.map((u) => ({ ...u, perms: [...u.perms] })); }, [users]); // أمان: الشاشة لمن يملك صلاحية إدارة المستخدمين فقط if (!window.BnyCan(user, "users_manage")) { return (

لا تملك صلاحية الوصول

إدارة المستخدمين والصلاحيات متاحة للمدير فقط.

); } const roleName = (id) => (D.roles.find((r) => r.id === id) || {}).name || id; const togglePerm = (id, key) => setUsers((us) => us.map((u) => u.id === id ? { ...u, role: "custom", perms: u.perms.includes(key) ? u.perms.filter((k) => k !== key) : [...u.perms, key] } : u)); const setRole = (id, role) => setUsers((us) => us.map((u) => u.id === id ? { ...u, role, perms: [...(D.roleDefaults[role] || [])] } : u)); const rename = (id, name) => setUsers((us) => us.map((u) => u.id === id ? { ...u, name } : u)); const setField = (id, key, val) => setUsers((us) => us.map((u) => u.id === id ? { ...u, [key]: val } : u)); const addUser = () => setUsers((us) => [...us, { id: Date.now(), name: "مستخدم جديد", role: "warehouse", username: "", password: "", perms: [...D.roleDefaults.warehouse] }]); const lbl = { fontSize: 12, fontWeight: 500, color: "var(--text-strong)", marginBottom: 5, display: "block" }; const live = !!window.BnyConfigured; const [busyId, setBusyId] = React.useState(null); const [msg, setMsg] = React.useState(null); // {id, kind, text} const flash = (id, kind, text) => { setMsg({ id, kind, text }); setTimeout(() => setMsg(null), 4500); }; // حفظ المستخدم في النظام (ينشئ/يحدّث حساب دخول فعليًا في الوضع المباشر) const saveUser = async (u) => { if (!u.username || String(u.username).trim().length < 3) return flash(u.id, "err", "أدخل اسم مستخدم (3 أحرف لاتينية فأكثر)"); if (!live) return flash(u.id, "ok", "تم الحفظ محليًا (وضع تجريبي)"); setBusyId(u.id); try { const res = await window.BnyDB.saveAppUser(u); flash(u.id, "ok", res === "created" ? "أُنشئ حساب الدخول — سلّم البيانات للموظف" : "تم تحديث الحساب" + (u.password ? " وكلمة المرور" : "")); if (window.BnyOps) window.BnyOps.log("user_save", (res === "created" ? "إنشاء مستخدم: " : "تحديث مستخدم: ") + (u.name || u.username) + " · دور: " + u.role); setField(u.id, "password", ""); // لا نُبقي كلمة المرور معروضة } catch (e) { flash(u.id, "err", String((e && e.message) || e)); } finally { setBusyId(null); } }; const removeUser = async (u) => { if (live && u.username) { if (!window.confirm("حذف المستخدم «" + (u.name || u.username) + "» نهائيًا؟ لن يستطيع الدخول بعدها.")) return; setBusyId(u.id); try { await window.BnyDB.deleteAppUser(u.username); if (window.BnyOps) window.BnyOps.log("user_delete", "حذف مستخدم: " + (u.name || u.username)); } catch (e) { setBusyId(null); return flash(u.id, "err", String((e && e.message) || e)); } setBusyId(null); } setUsers((us) => us.filter((x) => x.id !== u.id)); }; return (
} onClick={addUser}>إضافة مستخدم}>

أنشئ مستخدمين، وعيّن لكلٍّ اسم مستخدم وكلمة مرور يدخل بها بشكل مستقل، ثم امنحه دورًا جاهزًا (مدير / مسؤول مخازن / محاسب) كنقطة بداية وفعّل أو عطّل أي صلاحية على حدة. سلّم بيانات الدخول للموظف ليدخل بحسابه الخاص.

{users.map((u) => { const active = u.id === user.id; return (
rename(u.id, e.target.value)} placeholder="اسم المستخدم" />
الدور:
{active && الحساب النشط}
{active && أنت} {!active && }
{/* بيانات الدخول — يسلّمها المدير للموظف ليدخل بحسابه */}
setField(u.id, "username", e.target.value)} placeholder="اسم المستخدم" />
setField(u.id, "password", e.target.value)} placeholder={live ? "كلمة مرور جديدة (6+)" : "كلمة المرور"} />
{msg && msg.id === u.id && (
{msg.text}
)}
الصلاحيات ({u.perms.length} من {D.permissions.length}) — اضغط للتفعيل/التعطيل
{D.permissions.map((p) => { const on = u.perms.includes(p.key); return ( ); })}
); })}
); } window.UsersScreen = UsersScreen;