import { zodResolver } from '@hookform/resolvers/zod' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, Input, SidePanel, Switch, } from 'ui' import z from 'zod' import { ROLE_PERMISSIONS } from './Roles.constants' import { FormActions } from '@/components/ui/Forms/FormActions' import { useDatabaseRoleCreateMutation } from '@/data/database-roles/database-role-create-mutation' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface CreateRolePanelProps { visible: boolean onClose: () => void } const FormSchema = z.object({ name: z.string().trim().min(1, 'You must provide a name').default(''), isSuperuser: z.boolean().default(false), canLogin: z.boolean().default(false), canCreateRole: z.boolean().default(false), canCreateDb: z.boolean().default(false), isReplicationRole: z.boolean().default(false), canBypassRls: z.boolean().default(false), }) const initialValues = { name: '', isSuperuser: false, canLogin: false, canCreateRole: false, canCreateDb: false, isReplicationRole: false, canBypassRls: false, } export const CreateRolePanel = ({ visible, onClose }: CreateRolePanelProps) => { const formId = 'create-new-role' const { data: project } = useSelectedProjectQuery() const form = useForm>({ resolver: zodResolver(FormSchema as any), }) const { mutate: createDatabaseRole, isPending: isCreating } = useDatabaseRoleCreateMutation({ onSuccess: (_, vars) => { toast.success(`Successfully created new role: ${vars.payload.name}`) handleClose() }, }) const onSubmit: SubmitHandler> = async (values) => { if (!project) return console.error('Project is required') createDatabaseRole({ projectRef: project.ref, connectionString: project.connectionString, payload: values, }) } const handleClose = () => { onClose() form.reset(initialValues) } return ( } >
( Name )} />
Role privileges
{(Object.keys(ROLE_PERMISSIONS) as (keyof typeof ROLE_PERMISSIONS)[]) .filter((permissionKey) => ROLE_PERMISSIONS[permissionKey].grant_by_dashboard) .map((permissionKey) => { const permission = ROLE_PERMISSIONS[permissionKey] return ( (
{permission.description}
)} /> ) })}

These privileges cannot be granted via the Dashboard:

{(Object.keys(ROLE_PERMISSIONS) as (keyof typeof ROLE_PERMISSIONS)[]) .filter((permissionKey) => !ROLE_PERMISSIONS[permissionKey].grant_by_dashboard) .map((permissionKey) => { const permission = ROLE_PERMISSIONS[permissionKey] return ( (
{permission.description}
)} /> ) })}
) }