import React, { useState, useEffect, useCallback, useMemo } from "react"; import { Link, NavLink, useNavigate, useParams } from "react-router-dom"; import showToast from "../../../services/toastService"; import Avatar from "../../common/Avatar"; import moment from "moment"; import ProjectRepository from "../../../repositories/ProjectRepository"; import { useDispatch, useSelector } from "react-redux"; import { changeMaster } from "../../../slices/localVariablesSlice"; import useMaster from "../../../hooks/masterHook/useMaster"; import { useHasUserPermission } from "../../../hooks/useHasUserPermission"; import { ASSIGN_TO_PROJECT } from "../../../utils/constants"; import ConfirmModal from "../../common/ConfirmModal"; import eventBus from "../../../services/eventBus"; import { useEmployeesByProjectAllocated, useManageProjectAllocation, useProjectAssignedServices, } from "../../../hooks/useProjects"; import { useSelectedProject } from "../../../slices/apiDataManager"; import GlobalModel from "../../common/GlobalModel"; import TeamAssignToProject from "./TeamAssignToProject"; const Teams = () => { const selectedProject = useSelectedProject(); const dispatch = useDispatch(); const [AssigTeam, setAssignTeam] = useState(false); const [employees, setEmployees] = useState([]); const [selectedEmployee, setSelectedEmployee] = useState(null); const [deleteEmployee, setDeleteEmplyee] = useState(null); const [searchTerm, setSearchTerm] = useState(""); // State for search term const [selectedService, setSelectedService] = useState(null); const [activeEmployee, setActiveEmployee] = useState(false); const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(selectedProject); const { data: empJobRoles, loading } = useMaster(); const handleToggleActive = (e) => setActiveEmployee(e.target.checked); const handleServiceChange = (e) => { setSelectedService(e.target.value); }; const navigate = useNavigate(); const HasAssignUserPermission = useHasUserPermission(ASSIGN_TO_PROJECT); const [IsDeleteModal, setIsDeleteModal] = useState(false); const { projectEmployees, loading: employeeLodaing, refetch, } = useEmployeesByProjectAllocated( selectedProject, selectedService, null, activeEmployee ); const { mutate: submitAllocations, isPending, isSuccess, isError, } = useManageProjectAllocation({ onSuccessCallback: () => { setSelectedEmployee(null); }, onErrorCallback: () => { setSelectedEmployee(null); }, }); const handleDelete = (employee) => { let payload = [ { employeeId: employee?.employeeId, jobRoleId: employee?.jobRoleId, projectId: selectedProject, serviceId: employee?.serviceId, status: false, }, ]; submitAllocations({ payload: payload, actionType: "remove" }); }; const getJobRole = (jobRoleId) => { if (loading) return "Loading..."; if (!Array.isArray(empJobRoles)) return "Unassigned"; if (!jobRoleId) return "Unassigned"; const role = empJobRoles.find((b) => b.id == jobRoleId); return role ? role.name : "Unassigned"; }; const filteredEmployees = useMemo(() => { if (!projectEmployees) return []; let filtered = projectEmployees; if (activeEmployee) { filtered = projectEmployees.filter((emp) => !emp.isActive); } // Apply search filter if present if (searchTerm?.trim()) { const lower = searchTerm.toLowerCase(); filtered = filtered.filter((emp) => { const fullName = `${emp.firstName ?? ""} ${emp.lastName ?? ""}`.toLowerCase(); const jobRole = getJobRole(emp?.jobRoleId)?.toLowerCase(); return fullName.includes(lower) || jobRole.includes(lower); }); } return filtered; }, [projectEmployees, searchTerm, activeEmployee]); const handleSearch = (e) => setSearchTerm(e.target.value); const employeeHandler = useCallback( (msg) => { if (filteredEmployees.some((emp) => emp.employeeId == msg.employeeId)) { refetch(); } }, [filteredEmployees, refetch] ); useEffect(() => { eventBus.on("employee", employeeHandler); return () => eventBus.off("employee", employeeHandler); }, [employeeHandler]); return ( <> {AssigTeam && ( setAssignTeam(false)} > setAssignTeam(false)} /> )} handleDelete(selectedEmployee)} onClose={() => setSelectedEmployee(null)} />
{!servicesLoading && ( <> {(!assignedServices || assignedServices.length === 0) && ( Not Service Assigned )} {assignedServices?.length === 1 && ( {assignedServices[0].name} )} {assignedServices?.length > 1 && ( )} )}
{HasAssignUserPermission && ( )}
{employeeLodaing &&

Loading..

} {projectEmployees && projectEmployees.length > 0 && ( {activeEmployee && } {filteredEmployees && filteredEmployees .sort((a, b) => (a.firstName || "").localeCompare(b.firstName || "") ) .map((emp) => ( {activeEmployee && ( )} ))}
Name
Services Organization Assigned DateRelease DateProject Role Actions
{emp.serviceName || "N/A"} {emp.organizationName || "N/A"} {moment(emp.allocationDate).format("DD-MMM-YYYY")} {emp.reAllocationDate ? moment(emp.reAllocationDate).format( "DD-MMM-YYYY" ) : "Present"} {getJobRole(emp.jobRoleId)} {emp.isActive ? ( ) : ( Not in project )}
)} {!employeeLodaing && filteredEmployees.length === 0 && (

{activeEmployee ? "No active employees assigned to the project" : "No inactive employees assigned to the project"}

)}
); }; export default Teams;