import { useState } from "react"; import { Controller, useForm, useFormContext } from "react-hook-form"; import { faCheck, faSearch, faXmark, faXmarkCircle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Button, EmptyState, IconButton, Input, Modal, ModalClose, ModalContent, Table, TableContainer, TBody, Td, Tooltip, Tr } from "@app/components/v2"; import { ProjectPermissionSub } from "@app/context"; import { useGetProjectTypeFromRoute } from "@app/hooks"; import { ProjectType } from "@app/hooks/api/workspace/types"; import { isConditionalSubjects, PROJECT_PERMISSION_OBJECT, ProjectTypePermissionSubjects, TFormSchema } from "./ProjectRoleModifySection.utils"; type Props = { isOpen: boolean; onOpenChange: (isOpen: boolean) => void; }; type ContentProps = { onClose: () => void; }; type TForm = { permissions: Record }; const Content = ({ onClose }: ContentProps) => { const rootForm = useFormContext(); const [search, setSearch] = useState(""); const { control, handleSubmit, formState: { isDirty }, setValue, reset } = useForm({ defaultValues: { permissions: Object.fromEntries( Object.values(ProjectPermissionSub).map((subject) => [subject, false]) ) } }); const projectType = useGetProjectTypeFromRoute(); const filteredPolicies = Object.entries(PROJECT_PERMISSION_OBJECT) .filter( ([subject, { title }]) => ProjectTypePermissionSubjects[projectType ?? ProjectType.SecretManager][ subject as ProjectPermissionSub ] && (search ? title.toLowerCase().includes(search.toLowerCase()) : true) ) .sort((a, b) => a[1].title.localeCompare(b[1].title)) .map(([subject]) => subject); const onSubmit = () => handleSubmit((form) => { Object.entries(form.permissions).forEach(([subject, add]) => { if (!add) return; const type = subject as ProjectPermissionSub; const rootPolicyValue = rootForm.getValues("permissions")?.[type]; if (rootPolicyValue && isConditionalSubjects(subject as ProjectPermissionSub)) { rootForm.setValue( `permissions.${type}`, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore-error akhilmhdh: this is because of ts collision with both [...rootPolicyValue, {}], { shouldDirty: true, shouldTouch: true } ); } else if (!rootPolicyValue?.length) { rootForm.setValue( `permissions.${type}`, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore-error akhilmhdh: this is because of ts collision with both [{}], { shouldDirty: true, shouldTouch: true } ); } }); onClose(); })(); return ( <> setSearch(e.target.value)} leftIcon={} rightIcon={ search ? ( setSearch("")}> ) : null } />
Resource
reset()} variant="plain" size="xs" className={`text-mineshaft-400 ${!isDirty ? "pointer-events-none opacity-50" : ""} hover:text-red`} isDisabled={!isDirty} >
{filteredPolicies.map((subject) => ( ( onChange(!value)} > )} name={`permissions.${subject as ProjectPermissionSub}`} /> ))}
{PROJECT_PERMISSION_OBJECT[subject as ProjectPermissionSub].title} {value ? : null}
{!filteredPolicies.length && ( )}
); }; export const PolicySelectionModal = ({ isOpen, onOpenChange }: Props) => { return ( onOpenChange(false)} /> ); };