import React, { useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import Label from "../common/Label"; import PmsEmployeeInputTag from "../common/PmsEmployeeInputTag"; import { useManageEmployeeHierarchy, useOrganizationHierarchy } from "../../hooks/useEmployees"; import { ManageReportingSchema, defaultManageReporting } from "./EmployeeSchema"; const ManageReporting = ({ onClosed, employee, employeeId }) => { const { handleSubmit, control, reset, formState: { errors }, watch, } = useForm({ resolver: zodResolver(ManageReportingSchema), defaultValues: defaultManageReporting, }); const { data, isLoading } = useOrganizationHierarchy(employeeId); // mutation hook const { mutate: manageHierarchy, isPending } = useManageEmployeeHierarchy( employeeId, onClosed ); const primaryValue = watch("primaryNotifyTo"); const secondaryValue = watch("secondaryNotifyTo"); // Prefill hierarchy data useEffect(() => { if (data && Array.isArray(data)) { const primary = data.find((r) => r.isPrimary); const secondary = data.filter((r) => !r.isPrimary); reset({ primaryNotifyTo: primary ? [primary.reportTo.id] : [], secondaryNotifyTo: secondary.map((r) => r.reportTo.id), }); } }, [data, reset]); const handleClose = () => { reset(defaultManageReporting); onClosed(); }; const onSubmit = (formData) => { // Build set of currently selected IDs const selectedIds = new Set([ ...(formData.primaryNotifyTo || []), ...(formData.secondaryNotifyTo || []), ]); // Build payload including previous assignments, setting isActive true/false accordingly const payload = (data || []).map((item) => ({ reportToId: item.reportTo.id, isPrimary: item.isPrimary, isActive: selectedIds.has(item.reportTo.id), })); // Add any new IDs that were not previously assigned if (formData.primaryNotifyTo?.length) { const primaryId = formData.primaryNotifyTo[0]; if (!data?.some((d) => d.reportTo.id === primaryId)) { payload.push({ reportToId: primaryId, isPrimary: true, isActive: true, }); } } if (formData.secondaryNotifyTo?.length) { formData.secondaryNotifyTo.forEach((id) => { if (!data?.some((d) => d.reportTo.id === id)) { payload.push({ reportToId: id, isPrimary: false, isActive: true, }); } }); } manageHierarchy(payload); }; return (
Update Reporting Manager ( {`${employee.firstName || ""} ${employee.middleName || ""} ${employee.lastName || ""}`.trim()} )
{/* Primary */}
0 ? "" : "Select primary report-to"} forAll={true} disabled={primaryValue?.length > 0} /> {errors.primaryNotifyTo && (
{errors.primaryNotifyTo.message}
)}
{/* Secondary */}
); }; export default ManageReporting;