import React, { useEffect, useState, useRef } from "react"; import { useForm, Controller } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { useFeatures } from "../../hooks/useMasterRole"; import { MasterRespository } from "../../repositories/MastersRepository"; import { cacheData, getCachedData } from "../../slices/apiDataManager"; import showToast from "../../services/toastService"; import { useUpdateApplicationRole } from "../../hooks/masterHook/useMaster"; const updateSchema = 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" }), permissions: z.record(z.boolean()).refine((permission) => Object.values(permission).includes(true), { message: "At least one permission must be selected", }), }); const EditMaster = ({ master, onClose }) => { const maxDescriptionLength = 255; const popoverRefs = useRef([]); const { masterFeatures } = useFeatures(); const { mutate: updateApplicationRole, isPending: isLoading } = useUpdateApplicationRole(() => onClose?.()); const buildDefaultPermissions = () => { const defaults = {}; masterFeatures.forEach((feature) => { feature.featurePermissions.forEach((perm) => { const existing = master?.item?.featurePermission?.find(p => p.id === perm.id); defaults[perm.id] = existing?.isEnabled || false; }); }); return defaults; }; const initialPermissions = buildDefaultPermissions(); const { register, handleSubmit, formState: { errors, dirtyFields }, setError, reset, } = useForm({ resolver: zodResolver(updateSchema), defaultValues: { role: master?.item?.role || "", description: master?.item?.description || "", permissions: initialPermissions, }, }); const [descriptionLength, setDescriptionLength] = useState(master?.item?.description?.length || 0); const onSubmit = (data) => { const existingIds = new Set(master?.item?.featurePermission?.map(p => p.id)); const updatedPermissions = Object.entries(data.permissions) .filter(([id, value]) => { return existingIds.has(id) || value === true || (dirtyFields.permissions?.[id]); }) .map(([id, value]) => ({ id, isEnabled: value })); if (updatedPermissions.length === 0) { setError("permissions", { type: "manual", message: "At least one permission must be selected.", }); return; } const payload = { id: master?.item?.id, role: data.role, description: data.description, featuresPermission: updatedPermissions, }; updateApplicationRole({ id: payload.id, payload }); }; // const onSubmit = (data) => { // setIsLoading(true) // const existingIds = new Set( // master?.item?.featurePermission?.map((p) => p.id) // ); // const updatedPermissions = Object.entries(data.permissions) // .filter(([id, value]) => { // if (existingIds.has(id)) return true; // return ( // value === true || // (dirtyFields.permissions && dirtyFields.permissions[id]) // ); // }) // .map(([id, value]) => ({ id, isEnabled: value })); // if (updatedPermissions.length === 0) { // setError("permissions", { // type: "manual", // message: "At least one permission must be selected.", // }); // return; // } // const updatedRole = { // id: master?.item?.id, // role: data.role, // description: data.description, // featuresPermission: updatedPermissions, // }; // MasterRespository.updateRoles(master?.item?.id, updatedRole).then((resp) => { // setIsLoading(false) // const cachedData = getCachedData("Application Role"); // if (cachedData) { // const updatedData = cachedData.map((role) => // role.id === resp.data?.id ? { ...role, ...resp.data } : role // ); // cacheData("Application Role", updatedData); // } // showToast("Application Role Updated successfully.", "success"); // setIsLoading(false) // onClose() // }).catch((Err) => { // showToast(Err.message, "error"); // setIsLoading(false) // }) // }; useEffect(() => { reset({ role: master?.item?.role || "", description: master?.item?.description || "", permissions: buildDefaultPermissions(), }); setDescriptionLength(master?.item?.description?.length || 0); }, [master, reset]); useEffect(() => { popoverRefs.current.forEach((el) => { if (el) { new bootstrap.Popover(el, { trigger: "focus", placement: "right", html: true, content: el.getAttribute("data-bs-content"), }); } }); }, [masterFeatures]); return (
{errors.role &&

{errors.role.message}

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

{errors.description.message}

)}
{/* Scrollable Container with Border */}
{masterFeatures.map((feature, featureIndex) => (
{/* Feature Group Title */}
{feature.name}
{/* Permissions Grid */}
{feature.featurePermissions.map((perm, permIndex) => { const refIndex = featureIndex * 10 + permIndex; return (
{/* Info Icon */}
(popoverRefs.current[refIndex] = el)} tabIndex="0" className="d-flex align-items-center justify-content-center" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-placement="right" data-bs-html="true" data-bs-content={`
${perm.description}
`} >  
); })}

))}
{/* Error Display */} {errors.permissions && (

{errors.permissions.message}

)}
); } export default EditMaster;