diff --git a/frontend/src/app/admin/permission-groups/page.tsx b/frontend/src/app/admin/permission-groups/page.tsx new file mode 100644 index 0000000..33de75b --- /dev/null +++ b/frontend/src/app/admin/permission-groups/page.tsx @@ -0,0 +1,259 @@ +'use client' + +import { useEffect, useMemo, useState } from 'react' +import { Plus, Edit, Trash2, Users2 } from 'lucide-react' +import Modal from '@/components/Modal' + +type PermissionGroup = { + id: string + name: string + nameAr?: string + modules: string[] + createdAt: string +} + +const MODULES = [ + { id: 'contacts', name: 'إدارة جهات الاتصال' }, + { id: 'crm', name: 'إدارة علاقات العملاء' }, + { id: 'inventory', name: 'المخزون والأصول' }, + { id: 'projects', name: 'المهام والمشاريع' }, + { id: 'hr', name: 'الموارد البشرية' }, + { id: 'marketing', name: 'التسويق' }, + { id: 'admin', name: 'لوحة الإدارة' }, +] + +const STORAGE_KEY = 'permissionGroups' + +export default function PermissionGroupsPage() { + const [groups, setGroups] = useState([]) + const [showModal, setShowModal] = useState(false) + const [editing, setEditing] = useState(null) + + const [name, setName] = useState('') + const [nameAr, setNameAr] = useState('') + const [selectedModules, setSelectedModules] = useState>({}) + + useEffect(() => { + try { + const raw = localStorage.getItem(STORAGE_KEY) + if (raw) setGroups(JSON.parse(raw)) + } catch { + // ignore + } + }, []) + + useEffect(() => { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(groups)) + } catch { + // ignore + } + }, [groups]) + + const baseModulesMap = useMemo(() => { + const m: Record = {} + MODULES.forEach(x => (m[x.id] = false)) + return m + }, []) + + const openCreate = () => { + setEditing(null) + setName('') + setNameAr('') + setSelectedModules({ ...baseModulesMap }) + setShowModal(true) + } + + const openEdit = (g: PermissionGroup) => { + setEditing(g) + setName(g.name || '') + setNameAr(g.nameAr || '') + const m = { ...baseModulesMap } + g.modules.forEach(id => (m[id] = true)) + setSelectedModules(m) + setShowModal(true) + } + + const toggleModule = (id: string) => { + setSelectedModules(prev => ({ ...prev, [id]: !prev[id] })) + } + + const save = () => { + const finalName = name.trim() || nameAr.trim() + if (!finalName) { + alert('الرجاء إدخال اسم المجموعة') + return + } + + const mods = Object.keys(selectedModules).filter(k => selectedModules[k]) + const now = new Date().toISOString() + + if (editing) { + setGroups(prev => + prev.map(g => + g.id === editing.id + ? { ...g, name: finalName, nameAr: nameAr.trim() || undefined, modules: mods } + : g + ) + ) + } else { + const id = crypto?.randomUUID ? crypto.randomUUID() : `${Date.now()}-${Math.random()}` + setGroups(prev => [ + { id, name: finalName, nameAr: nameAr.trim() || undefined, modules: mods, createdAt: now }, + ...prev, + ]) + } + + setShowModal(false) + } + + const remove = (g: PermissionGroup) => { + const ok = confirm(`هل أنت متأكد بحذف مجموعة الصلاحيات؟: ${g.nameAr || g.name} ؟`) + if (!ok) return + setGroups(prev => prev.filter(x => x.id !== g.id)) + } + + return ( +
+
+
+

مجموعات الصلاحيات

+

إدارة مجموعات لتجميع الوحدات بشكل أسرع

+
+ + +
+ + {groups.length === 0 ? ( +
+ +

لا توجد مجموعات

+

قم بإضافة مجموعة صلاحيات لتسهيل إدارة الأدوار.

+
+ ) : ( +
+ {groups.map(g => ( +
+
+
+

{g.nameAr || g.name}

+

{g.name}

+

+ الوحدات: {g.modules.length} +

+
+ +
+ + +
+
+ +
+ {g.modules.map(id => { + const m = MODULES.find(x => x.id === id) + return ( + + {m?.name || id} + + ) + })} +
+
+ ))} +
+ )} + + setShowModal(false)} + title={editing ? 'تعديل مجموعة الصلاحيات' : 'إضافة مجموعة صلاحيات'} + size="lg" + > +
+
+
+ + setName(e.target.value)} + className="w-full border border-gray-300 rounded-lg px-3 py-2" + placeholder="e.g. Sales Group" + /> +
+ +
+ + setNameAr(e.target.value)} + className="w-full border border-gray-300 rounded-lg px-3 py-2" + placeholder="مثال: مجموعة المبيعات" + /> +
+
+ +
+ +
+ {MODULES.map(m => ( + + ))} +
+
+ +
+ + +
+
+
+
+ ) +} \ No newline at end of file