import React, { useEffect, useState, useRef } from "react"; import { useFeatures } from "../../hooks/useMasterRole"; import { useForm } from 'react-hook-form'; import { set, z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { MasterRespository } from "../../repositories/MastersRepository"; import { cacheData, getCachedData } from "../../slices/apiDataManager"; import showToast from "../../services/toastService"; const schema = z.object({ role: z.string().min(1, { message: "Role is required" }), description: z.string().min(1, { message: "Description is required" }) .max(255, { message: "Description cannot exceed 255 characters" }), selectedPermissions: z .array(z.string()) .min(1, { message: "Please select at least one permission" }), }); const CreateRole = ({ modalType, onClose }) => { const [isLoading, setIsLoading] = useState(false) const popoverRefs = useRef([]); const { masterFeatures } = useFeatures() const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(schema), defaultValues: { role: "", description: "", selectedPermissions: [], }, }); const onSubmit = (values) => { setIsLoading(true) const result = { role: values.role, description: values.description, featuresPermission: values.selectedPermissions.map((id) => ({ id, isEnabled: true, })), }; MasterRespository.createRole(result).then((resp) => { setIsLoading(false) const cachedData = getCachedData("Application Role"); const updatedData = [...cachedData, resp.data]; cacheData("Application Role", updatedData); showToast("Application Role Added successfully.", "success"); onClose() }).catch((err) => { showToast(err?.response?.data?.message, "error"); setIsLoading(false) onClose() }) }; const [descriptionLength, setDescriptionLength] = useState(0); const maxDescriptionLength = 255; useEffect(() => { setDescriptionLength(0); }, []); useEffect(() => { popoverRefs.current.forEach((el) => { if (el) { new bootstrap.Popover(el, { trigger: "focus", placement: "right", html: true, content: el.getAttribute("data-bs-content"), // use inline content from attribute }); } }); }, [masterFeatures]); return (
{errors.role &&

{errors.role.message}

}
{maxDescriptionLength - descriptionLength} characters left
{errors.description && (

{errors.description.message}

)}
{masterFeatures.map((feature, featureIndex) => (
{feature.name}
{feature.featurePermissions.map((perm, permIndex) => { const refIndex = (featureIndex * 10) + permIndex; return (
(popoverRefs.current[refIndex] = el) } tabIndex="0" className="d-flex align-items-center avatar-group justify-content-center" data-bs-toggle="popover" refIndex data-bs-trigger="focus" data-bs-placement="right" data-bs-html="true" data-bs-content={`
${perm.description}
`} >  
) })}

))} {errors.selectedPermissions && (

{errors.selectedPermissions.message}

)} {!masterFeatures &&

Loading...

}
{ masterFeatures && (
) }
); }; export default CreateRole;