import React, { useState, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { changeMaster } from "../../slices/localVariablesSlice"; import useMaster from "../../hooks/masterHook/useMaster"; import { employee } from "../../data/masters"; import { useForm, Controller } from "react-hook-form"; import { z } from "zod"; import { getCachedData } from "../../slices/apiDataManager"; import { useModal } from "../../ModalContext"; import { useProjects } from "../../hooks/useProjects"; import { useEmployeesAllOrByProjectId } from "../../hooks/useEmployees"; import { TasksRepository } from "../../repositories/ProjectRepository"; import showToast from "../../services/toastService"; const schema = z.object({ selectedEmployees: z .array(z.number()) .min(1, { message: "At least one employee must be selected" }), description: z.string().min(1, { message: "description required" }), }); const AssignRoleModel = ({ assignData, onClose }) => { const [plannedTask, setPlannedTask] = useState(); const { openModal, closeModal } = useModal(); const selectedProject = useSelector( (store) => store.localVariables.projectId ); const { employees } = useEmployeesAllOrByProjectId(selectedProject); const dispatch = useDispatch(); const { data, loading } = useMaster(); const jobRoleData = getCachedData("Job Role"); const [selectedRole, setSelectedRole] = useState("all"); const [selectedEmployees, setSelectedEmployees] = useState([]); const { handleSubmit, control, setValue, watch, formState: { errors },reset } = useForm({ defaultValues: { selectedEmployees: [], description:"" }, resolver: (data) => { const validation = schema.safeParse(data); if (validation.success) return { values: data, errors: {} }; return { values: {}, errors: validation.error.formErrors.fieldErrors }; }, }); const handleRoleChange = (event) => { setSelectedRole(event.plannedTask.value); }; const filteredEmployees = selectedRole === "all" ? employees : employees.filter((emp) => emp.JobRoleId.toString() === selectedRole); // not need currently for this fun const handleEmployeeSelection = (employeeId, field) => { setSelectedEmployees((prevSelected) => { let updatedSelection; if (!prevSelected.includes(employeeId)) { updatedSelection = [...prevSelected, employeeId]; } else { updatedSelection = prevSelected.filter((id) => id !== employeeId); } field.onChange(updatedSelection); return updatedSelection; }); }; const removeEmployee = (employeeId) => { setSelectedEmployees((prevSelected) => { const updatedSelection = prevSelected.filter((id) => id !== employeeId); setValue("selectedEmployees", updatedSelection); // Ensure form state is updated return updatedSelection; }); }; const onSubmit = async(data) => { const formattedData = { taskTeam: data.selectedEmployees, plannedTask: parseInt( plannedTask, 10 ), description: data.description, assignmentDate: new Date().toISOString(), workItemId:assignData?.workItem?.workItem.id }; try { let response = await TasksRepository.assignTask( formattedData ); showToast( "Task Successfully Assigend", "success" ) reset() onClose() } catch ( error ) { showToast("something wrong","error") } }; useEffect(()=>{ dispatch(changeMaster("Job Role")) return ()=> setSelectedRole("all") },[dispatch]) return ( <>