diff --git a/src/pages/admin/AdminRoles.js b/src/pages/admin/AdminRoles.js index 4f5f328..921a060 100644 --- a/src/pages/admin/AdminRoles.js +++ b/src/pages/admin/AdminRoles.js @@ -39,6 +39,7 @@ const AdminRoles = () => { const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [showPermissionsModal, setShowPermissionsModal] = useState(false); const [expandedModules, setExpandedModules] = useState({}); + const [savingPermissions, setSavingPermissions] = useState(false); const [formData, setFormData] = useState({ code: '', name: '', @@ -46,6 +47,15 @@ const AdminRoles = () => { permissions: [] }); + const formatRoleSlug = (value) => ( + value + .toLowerCase() + .trim() + .replace(/[^a-z0-9]+/g, '-') + .replace(/_+/g, '-') + .replace(/^_+|_+$/g, '') + ); + useEffect(() => { fetchRoles(); fetchPermissions(); @@ -133,6 +143,7 @@ const AdminRoles = () => { }; const handleSavePermissions = async () => { + setSavingPermissions(true); try { await api.put(`/admin/roles/${selectedRole.id}/permissions`, { permission_codes: selectedPermissions @@ -142,6 +153,8 @@ const AdminRoles = () => { fetchRoles(); } catch (error) { toast.error('Failed to update permissions'); + } finally { + setSavingPermissions(false); } }; @@ -155,6 +168,14 @@ const AdminRoles = () => { }); }; + const addPermissions = (permissionCodes) => { + setSelectedPermissions(prev => [...new Set([...prev, ...permissionCodes])]); + }; + + const removePermissions = (permissionCodes) => { + setSelectedPermissions(prev => prev.filter(code => !permissionCodes.includes(code))); + }; + const toggleModule = (module) => { setExpandedModules(prev => ({ ...prev, @@ -282,8 +303,28 @@ const AdminRoles = () => {
+
- + + { + const nextName = e.target.value; + setFormData(prev => { + const prevAuto = formatRoleSlug(prev.name); + const isAuto = !prev.code || prev.code === prevAuto; + return { + ...prev, + name: nextName, + code: isAuto ? formatRoleSlug(nextName) : prev.code + }; + }); + }} + /> +
+
+ {

-
- - setFormData({ ...formData, name: e.target.value })} - /> -
-