From 51c02c7156df12dd5907c3a1bcc72abe017fdc0a Mon Sep 17 00:00:00 2001 From: Pramod Mahajan Date: Sat, 7 Jun 2025 00:08:25 +0530 Subject: [PATCH] created component for assign and unassign projects for employee --- src/pages/employee/AssignToProject.jsx | 165 +++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 src/pages/employee/AssignToProject.jsx diff --git a/src/pages/employee/AssignToProject.jsx b/src/pages/employee/AssignToProject.jsx new file mode 100644 index 00000000..04d5f7a3 --- /dev/null +++ b/src/pages/employee/AssignToProject.jsx @@ -0,0 +1,165 @@ +import React, { useState, useEffect } from "react"; +import { useProjects, useProjectsByEmployee } from "../../hooks/useProjects"; +import EmployeeList from "./EmployeeList"; +import showToast from "../../services/toastService"; +import ProjectRepository from "../../repositories/ProjectRepository"; + +const AssignToProject = ({ employee, onClose }) => { + const { projects, loading } = useProjects(); + const { projectList } = useProjectsByEmployee(employee?.id); + + const [searchTerm, setSearchTerm] = useState(""); + const [checkedProjects, setCheckedProjects] = useState({}); + const [selectedEmployees, setSelectedEmployees] = useState([]); + + useEffect(() => { + if (projectList && projectList.length > 0) { + const initialChecked = {}; + const initialSelected = []; + + projectList.forEach((project) => { + initialChecked[project.id] = true; + initialSelected.push({ + empID: employee.id, + jobRoleId: employee.jobRoleId, + projectId: project.id, + status: true, + }); + }); + + setCheckedProjects(initialChecked); + setSelectedEmployees(initialSelected); + } else { + setCheckedProjects({}); + setSelectedEmployees([]); + } + }, [projectList, employee?.id]); + + const handleSearchChange = (e) => { + setSearchTerm(e.target.value.toLowerCase()); + }; + + const handleCheckboxChange = (projectId) => { + const isChecked = !checkedProjects[projectId]; + + setCheckedProjects((prev) => ({ + ...prev, + [projectId]: isChecked, + })); + + setSelectedEmployees((prev) => { + const index = prev.findIndex((emp) => emp.projectId === projectId && emp.empID === employee.id); + const newEntry = { + empID: employee.id, + jobRoleId: employee.jobRoleId, + projectId, + status: isChecked, + }; + + if (index === -1) { + return [...prev, newEntry]; + } else { + const updated = [...prev]; + updated[index].status = isChecked; + return updated; + } + }); + }; + + const handleSubmit = async () => + { + console.log(selectedEmployees) + try + { + const resp = await ProjectRepository.updatesAssignProject( employee.id, selectedEmployees ) + console.group(resp.data) + + }catch(error) + { + const msg = error.response.data.message || error.message || "Error occured during API calling."; + showToast( msg, "error" ); +} }; + + const handleClosedModal = () => { + onClose(); + }; + + const filteredProjects = projects.filter((project) => + project.name.toLowerCase().includes(searchTerm) + ); + + return ( +
+

Assign to Project

+ +
+
+ +
+
+ + {loading ? ( +
+
+

Loading projects...

+
+ ) : ( + <> + + + + + + + + {filteredProjects.length > 0 ? ( + filteredProjects.map((project) => ( + + + + )) + ) : ( + + + + )} + +
Select Project
+
+ handleCheckboxChange(project.id)} + /> + +
+
No projects found.
+ +
+ + +
+ + )} +
+ ); +}; + +export default AssignToProject;