import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Switch } from "@/components/ui/switch"; import { extractServices } from "@/pages/dashboard/project/[projectId]"; import { api } from "@/utils/api"; import { AlertBlock } from "@/components/shared/alert-block"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { z } from "zod"; import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; const addPermissions = z.object({ accesedProjects: z.array(z.string()).optional(), accesedServices: z.array(z.string()).optional(), canCreateProjects: z.boolean().optional().default(false), canCreateServices: z.boolean().optional().default(false), canDeleteProjects: z.boolean().optional().default(false), canDeleteServices: z.boolean().optional().default(false), canAccessToTraefikFiles: z.boolean().optional().default(false), canAccessToDocker: z.boolean().optional().default(false), canAccessToAPI: z.boolean().optional().default(false), }); type AddPermissions = z.infer; interface Props { userId: string; } export const AddUserPermissions = ({ userId }: Props) => { const { data: projects } = api.project.all.useQuery(); const { data, refetch } = api.user.byUserId.useQuery( { userId, }, { enabled: !!userId, }, ); const { mutateAsync, isError, error, isLoading } = api.admin.assignPermissions.useMutation(); const form = useForm({ defaultValues: { accesedProjects: [], accesedServices: [], }, resolver: zodResolver(addPermissions), }); useEffect(() => { if (data) { form.reset({ accesedProjects: data.accesedProjects || [], accesedServices: data.accesedServices || [], canCreateProjects: data.canCreateProjects, canCreateServices: data.canCreateServices, canDeleteProjects: data.canDeleteProjects, canDeleteServices: data.canDeleteServices, canAccessToTraefikFiles: data.canAccessToTraefikFiles, canAccessToDocker: data.canAccessToDocker, canAccessToAPI: data.canAccessToAPI, }); } }, [form, form.formState.isSubmitSuccessful, form.reset, data]); const onSubmit = async (data: AddPermissions) => { await mutateAsync({ userId, canCreateServices: data.canCreateServices, canCreateProjects: data.canCreateProjects, canDeleteServices: data.canDeleteServices, canDeleteProjects: data.canDeleteProjects, canAccessToTraefikFiles: data.canAccessToTraefikFiles, accesedProjects: data.accesedProjects || [], accesedServices: data.accesedServices || [], canAccessToDocker: data.canAccessToDocker, canAccessToAPI: data.canAccessToAPI, }) .then(async () => { toast.success("Permissions updated"); refetch(); }) .catch(() => { toast.error("Error to update the permissions"); }); }; return ( e.preventDefault()} > Add Permissions Permissions Add or remove permissions {isError && {error?.message}}
(
Create Projects Allow the user to create projects
)} /> (
Delete Projects Allow the user to delete projects
)} /> (
Create Services Allow the user to create services
)} /> (
Delete Services Allow the user to delete services
)} /> (
Access to Traefik Files Allow the user to access to the Traefik Tab Files
)} /> (
Access to Docker Allow the user to access to the Docker Tab
)} /> (
Access to API/CLI Allow the user to access to the API/CLI
)} /> (
Projects Select the Projects that the user can access
{projects?.length === 0 && (

No projects found

)}
{projects?.map((item, index) => { const applications = extractServices(item); return ( { return (
{ return checked ? field.onChange([ ...(field.value || []), item.projectId, ]) : field.onChange( field.value?.filter( (value) => value !== item.projectId, ), ); }} /> {item.name}
{applications.length === 0 && (

No services found

)} {applications?.map((item, index) => ( { return ( { return checked ? field.onChange([ ...(field.value || []), item.id, ]) : field.onChange( field.value?.filter( (value) => value !== item.id, ), ); }} /> {item.name} ); }} /> ))}
); }} /> ); })}
)} />
); };