From 2f6983aa414329ed1aad062aaf57f171229358b1 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 11 Oct 2025 16:57:48 +0000 Subject: [PATCH] Implement roles and permissions --- src/components/roles/RoleManagement.tsx | 228 +++++++++++++++++++++++ src/hooks/useRolesPermissions.ts | 172 +++++++++++++++++ src/pages/dashboard/RolesPermissions.tsx | 61 ++++++ src/types/roles.ts | 63 +++++++ 4 files changed, 524 insertions(+) create mode 100644 src/components/roles/RoleManagement.tsx create mode 100644 src/hooks/useRolesPermissions.ts create mode 100644 src/pages/dashboard/RolesPermissions.tsx create mode 100644 src/types/roles.ts diff --git a/src/components/roles/RoleManagement.tsx b/src/components/roles/RoleManagement.tsx new file mode 100644 index 0000000..043179d --- /dev/null +++ b/src/components/roles/RoleManagement.tsx @@ -0,0 +1,228 @@ +import React, { useState } from 'react'; +import { Card } from '@/components/ui/card'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { Input } from '@/components/ui/input'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog'; +import { Checkbox } from '@/components/ui/checkbox'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { Plus, Edit, Trash2, Users, Shield } from 'lucide-react'; +import { EntityType, Role, PERMISSIONS } from '@/types/roles'; +import { useRolesPermissions } from '@/hooks/useRolesPermissions'; + +interface RoleManagementProps { + entityType: EntityType; +} + +const RoleManagement: React.FC = ({ entityType }) => { + const { roles, getRolesByEntity, createRole, updateRole, deleteRole } = useRolesPermissions(); + const [isCreateOpen, setIsCreateOpen] = useState(false); + const [editingRole, setEditingRole] = useState(null); + const [formData, setFormData] = useState({ + name: '', + description: '', + permissions: [] as string[], + }); + + const entityRoles = getRolesByEntity(entityType); + const availablePermissions = PERMISSIONS[entityType] || []; + + const getEntityTitle = () => { + const titles: Record = { + admin: 'Admin System', + hotel: 'Hotel Management', + restaurant: 'Restaurant Management', + commerce: 'Commerce Management', + }; + return titles[entityType]; + }; + + const handleSubmit = () => { + if (editingRole) { + updateRole(editingRole.id, formData); + setEditingRole(null); + } else { + createRole({ + ...formData, + entityType, + }); + } + setIsCreateOpen(false); + setFormData({ name: '', description: '', permissions: [] }); + }; + + const handleEdit = (role: Role) => { + setEditingRole(role); + setFormData({ + name: role.name, + description: role.description, + permissions: role.permissions, + }); + setIsCreateOpen(true); + }; + + const handleDelete = (roleId: string) => { + if (confirm('Are you sure you want to delete this role?')) { + deleteRole(roleId); + } + }; + + const togglePermission = (permissionId: string) => { + setFormData(prev => ({ + ...prev, + permissions: prev.permissions.includes(permissionId) + ? prev.permissions.filter(p => p !== permissionId) + : [...prev.permissions, permissionId], + })); + }; + + return ( +
+
+
+ +
+

{getEntityTitle()}

+

Manage roles and permissions

+
+
+ + + + + + + {editingRole ? 'Edit Role' : 'Create New Role'} + + Define role name, description, and permissions + + +
+
+ + setFormData({ ...formData, name: e.target.value })} + placeholder="e.g., Manager, Operator" + /> +
+
+ +