diff --git a/src/components/Project/AssignEmployeeTable.jsx b/src/components/Project/AssignEmployeeTable.jsx new file mode 100644 index 00000000..d2f5dbb1 --- /dev/null +++ b/src/components/Project/AssignEmployeeTable.jsx @@ -0,0 +1,130 @@ +import React, { useState, useEffect } from "react"; +import Avatar from "../common/Avatar"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; + + + + + + +export const roleSchema = z.object({ + jobRole: z.string().min(1, "Job Role is required"), + isChecked: z.literal(true, { + errorMap: () => ({ message: "You must check the box first" }), + }), +} ); + + +const AssignEmployeeTable = ({ + employee, + jobRoles, + isChecked, + onRoleChange, + onCheckboxChange, +}) => { + const [currentJobRole, setCurrentJobRole] = useState(employee.jobRoleId?.toString() || ""); + const { + register, + handleSubmit, + formState: { errors }, + setValue, + trigger, + getValues, + } = useForm({ + resolver: zodResolver(roleSchema), + defaultValues: { + jobRole: currentJobRole, + isChecked: isChecked || false, + }, + }); + + useEffect(() => { + const jobRoleStr = employee.jobRoleId?.toString() || ""; + setCurrentJobRole(jobRoleStr); + setValue("jobRole", jobRoleStr); + setValue("isChecked", isChecked); + }, [employee.jobRoleId, isChecked, setValue]); + + const onSubmit = (data) => { + setCurrentJobRole(data.jobRole); + onRoleChange(employee.id, data.jobRole); + }; + + const handleRoleSelect = async (e) => { + const value = e.target.value; + setValue("jobRole", value); + const isValid = await trigger(); // Validate the form + if (isValid) { + const values = getValues(); + onRoleChange(employee.id, values.jobRole); + } + }; + + const handleCheckboxChange = async () => { + if (!employee.isActive) { + setValue("isChecked", !isChecked); + const isValid = await trigger(); // Validate after setting value + if (isValid) { + const values = getValues(); + onCheckboxChange(employee.id); + onRoleChange(employee.id, values.jobRole); // Update role if it changed + } + } + }; + + return ( +