'use client' import FormLayout, { FormField, FormLabelAndMessage, Input, Textarea, } from '@components/Objects/StyledElements/Form/Form' import * as Form from '@radix-ui/react-form' import { useOrg } from '@components/Contexts/OrgContext' import React from 'react' import { updateRole } from '@services/roles/roles' import { mutate } from 'swr' import { getAPIUrl } from '@services/config/config' import { useLHSession } from '@components/Contexts/LHSessionContext' import { useFormik } from 'formik' import toast from 'react-hot-toast' import { Shield, BookOpen, Users, UserCheck, FolderOpen, Building, FileText, Activity, Settings, Monitor, CheckSquare, Square } from 'lucide-react' type EditRoleProps = { role: { id: number, name: string, description: string, rights: any } setEditRoleModal: any } interface Rights { courses: { action_create: boolean; action_read: boolean; action_read_own: boolean; action_update: boolean; action_update_own: boolean; action_delete: boolean; action_delete_own: boolean; }; users: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; usergroups: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; collections: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; organizations: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; coursechapters: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; activities: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; roles: { action_create: boolean; action_read: boolean; action_update: boolean; action_delete: boolean; }; dashboard: { action_access: boolean; }; } const validate = (values: any) => { const errors: any = {} if (!values.name) { errors.name = 'Required' } else if (values.name.length < 2) { errors.name = 'Name must be at least 2 characters' } if (!values.description) { errors.description = 'Required' } else if (values.description.length < 10) { errors.description = 'Description must be at least 10 characters' } return errors } const predefinedRoles = { 'Admin': { name: 'Admin', description: 'Full platform control with all permissions', rights: { courses: { action_create: true, action_read: true, action_read_own: true, action_update: true, action_update_own: true, action_delete: true, action_delete_own: true }, users: { action_create: true, action_read: true, action_update: true, action_delete: true }, usergroups: { action_create: true, action_read: true, action_update: true, action_delete: true }, collections: { action_create: true, action_read: true, action_update: true, action_delete: true }, organizations: { action_create: true, action_read: true, action_update: true, action_delete: true }, coursechapters: { action_create: true, action_read: true, action_update: true, action_delete: true }, activities: { action_create: true, action_read: true, action_update: true, action_delete: true }, roles: { action_create: true, action_read: true, action_update: true, action_delete: true }, dashboard: { action_access: true } } }, 'Course Manager': { name: 'Course Manager', description: 'Can manage courses, chapters, and activities', rights: { courses: { action_create: true, action_read: true, action_read_own: true, action_update: true, action_update_own: true, action_delete: false, action_delete_own: true }, users: { action_create: false, action_read: true, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: true, action_update: false, action_delete: false }, collections: { action_create: true, action_read: true, action_update: true, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: true, action_read: true, action_update: true, action_delete: false }, activities: { action_create: true, action_read: true, action_update: true, action_delete: false }, roles: { action_create: false, action_read: false, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'Instructor': { name: 'Instructor', description: 'Can create and manage their own courses', rights: { courses: { action_create: true, action_read: true, action_read_own: true, action_update: false, action_update_own: true, action_delete: false, action_delete_own: true }, users: { action_create: false, action_read: false, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: false, action_update: false, action_delete: false }, collections: { action_create: false, action_read: true, action_update: false, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: true, action_read: true, action_update: false, action_delete: false }, activities: { action_create: true, action_read: true, action_update: false, action_delete: false }, roles: { action_create: false, action_read: false, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'Viewer': { name: 'Viewer', description: 'Read-only access to courses and content', rights: { courses: { action_create: false, action_read: true, action_read_own: true, action_update: false, action_update_own: false, action_delete: false, action_delete_own: false }, users: { action_create: false, action_read: false, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: false, action_update: false, action_delete: false }, collections: { action_create: false, action_read: true, action_update: false, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: false, action_read: true, action_update: false, action_delete: false }, activities: { action_create: false, action_read: true, action_update: false, action_delete: false }, roles: { action_create: false, action_read: false, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'Content Creator': { name: 'Content Creator', description: 'Can create and edit content but not manage users', rights: { courses: { action_create: true, action_read: true, action_read_own: true, action_update: true, action_update_own: true, action_delete: false, action_delete_own: false }, users: { action_create: false, action_read: false, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: false, action_update: false, action_delete: false }, collections: { action_create: true, action_read: true, action_update: true, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: true, action_read: true, action_update: true, action_delete: false }, activities: { action_create: true, action_read: true, action_update: true, action_delete: false }, roles: { action_create: false, action_read: false, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'User Manager': { name: 'User Manager', description: 'Can manage users and user groups', rights: { courses: { action_create: false, action_read: true, action_read_own: true, action_update: false, action_update_own: false, action_delete: false, action_delete_own: false }, users: { action_create: true, action_read: true, action_update: true, action_delete: true }, usergroups: { action_create: true, action_read: true, action_update: true, action_delete: true }, collections: { action_create: false, action_read: true, action_update: false, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: false, action_read: true, action_update: false, action_delete: false }, activities: { action_create: false, action_read: true, action_update: false, action_delete: false }, roles: { action_create: false, action_read: true, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'Moderator': { name: 'Moderator', description: 'Can moderate content and manage activities', rights: { courses: { action_create: false, action_read: true, action_read_own: true, action_update: false, action_update_own: false, action_delete: false, action_delete_own: false }, users: { action_create: false, action_read: true, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: true, action_update: false, action_delete: false }, collections: { action_create: false, action_read: true, action_update: true, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: false, action_read: true, action_update: true, action_delete: false }, activities: { action_create: false, action_read: true, action_update: true, action_delete: false }, roles: { action_create: false, action_read: false, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'Analyst': { name: 'Analyst', description: 'Read-only access with analytics capabilities', rights: { courses: { action_create: false, action_read: true, action_read_own: true, action_update: false, action_update_own: false, action_delete: false, action_delete_own: false }, users: { action_create: false, action_read: true, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: true, action_update: false, action_delete: false }, collections: { action_create: false, action_read: true, action_update: false, action_delete: false }, organizations: { action_create: false, action_read: true, action_update: false, action_delete: false }, coursechapters: { action_create: false, action_read: true, action_update: false, action_delete: false }, activities: { action_create: false, action_read: true, action_update: false, action_delete: false }, roles: { action_create: false, action_read: true, action_update: false, action_delete: false }, dashboard: { action_access: true } } }, 'Guest': { name: 'Guest', description: 'Limited access for external users', rights: { courses: { action_create: false, action_read: true, action_read_own: false, action_update: false, action_update_own: false, action_delete: false, action_delete_own: false }, users: { action_create: false, action_read: false, action_update: false, action_delete: false }, usergroups: { action_create: false, action_read: false, action_update: false, action_delete: false }, collections: { action_create: false, action_read: true, action_update: false, action_delete: false }, organizations: { action_create: false, action_read: false, action_update: false, action_delete: false }, coursechapters: { action_create: false, action_read: true, action_update: false, action_delete: false }, activities: { action_create: false, action_read: true, action_update: false, action_delete: false }, roles: { action_create: false, action_read: false, action_update: false, action_delete: false }, dashboard: { action_access: false } } } } function EditRole(props: EditRoleProps) { const org = useOrg() as any; const session = useLHSession() as any const access_token = session?.data?.tokens?.access_token; const [isSubmitting, setIsSubmitting] = React.useState(false) const [rights, setRights] = React.useState(props.role.rights || {}) const formik = useFormik({ initialValues: { name: props.role.name, description: props.role.description, org_id: org.id, rights: props.role.rights || {} }, validate, onSubmit: async (values) => { const toastID = toast.loading("Updating...") setIsSubmitting(true) // Ensure rights object is properly structured const formattedRights = { courses: { action_create: rights.courses?.action_create || false, action_read: rights.courses?.action_read || false, action_read_own: rights.courses?.action_read_own || false, action_update: rights.courses?.action_update || false, action_update_own: rights.courses?.action_update_own || false, action_delete: rights.courses?.action_delete || false, action_delete_own: rights.courses?.action_delete_own || false }, users: { action_create: rights.users?.action_create || false, action_read: rights.users?.action_read || false, action_update: rights.users?.action_update || false, action_delete: rights.users?.action_delete || false }, usergroups: { action_create: rights.usergroups?.action_create || false, action_read: rights.usergroups?.action_read || false, action_update: rights.usergroups?.action_update || false, action_delete: rights.usergroups?.action_delete || false }, collections: { action_create: rights.collections?.action_create || false, action_read: rights.collections?.action_read || false, action_update: rights.collections?.action_update || false, action_delete: rights.collections?.action_delete || false }, organizations: { action_create: rights.organizations?.action_create || false, action_read: rights.organizations?.action_read || false, action_update: rights.organizations?.action_update || false, action_delete: rights.organizations?.action_delete || false }, coursechapters: { action_create: rights.coursechapters?.action_create || false, action_read: rights.coursechapters?.action_read || false, action_update: rights.coursechapters?.action_update || false, action_delete: rights.coursechapters?.action_delete || false }, activities: { action_create: rights.activities?.action_create || false, action_read: rights.activities?.action_read || false, action_update: rights.activities?.action_update || false, action_delete: rights.activities?.action_delete || false }, roles: { action_create: rights.roles?.action_create || false, action_read: rights.roles?.action_read || false, action_update: rights.roles?.action_update || false, action_delete: rights.roles?.action_delete || false }, dashboard: { action_access: rights.dashboard?.action_access || false } } const res = await updateRole(props.role.id, { name: values.name, description: values.description, org_id: values.org_id, rights: formattedRights }, access_token) if (res.status === 200) { setIsSubmitting(false) mutate(`${getAPIUrl()}roles/org/${org.id}`) props.setEditRoleModal(false) toast.success("Updated role", {id:toastID}) } else { setIsSubmitting(false) toast.error("Couldn't update role", {id:toastID}) } }, }) const handleRightChange = (section: keyof Rights, action: string, value: boolean) => { setRights(prev => ({ ...prev, [section]: { ...prev[section], [action]: value } as any })) } const handleSelectAll = (section: keyof Rights, value: boolean) => { setRights(prev => ({ ...prev, [section]: Object.keys(prev[section]).reduce((acc, key) => ({ ...acc, [key]: value }), {} as any) })) } const handlePredefinedRole = (roleKey: string) => { const role = predefinedRoles[roleKey as keyof typeof predefinedRoles] if (role) { formik.setFieldValue('name', role.name) formik.setFieldValue('description', role.description) setRights(role.rights as Rights) } } const PermissionSection = ({ title, icon: Icon, section, permissions }: { title: string, icon: any, section: keyof Rights, permissions: string[] }) => { const sectionRights = rights[section] as any const allSelected = permissions.every(perm => sectionRights[perm]) const someSelected = permissions.some(perm => sectionRights[perm]) && !allSelected return (

{title}

{permissions.map((permission) => ( ))}
) } return (