import React, { useState, useEffect, useCallback } from "react"; import MapUsers from "./MapUsers"; 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"; const Teams = () => { const projectId = useSelectedProject(); const dispatch = useDispatch(); const { data, loading } = useMaster(); const [isModalOpen, setIsModelOpen] = useState(false); const [error, setError] = useState(""); const [empJobRoles, setEmpJobRoles] = useState(null); const [employees, setEmployees] = useState([]); const [filteredEmployees, setFilteredEmployees] = useState([]); const [removingEmployeeId, setRemovingEmployeeId] = useState(null); const [assignedLoading, setAssignedLoading] = useState(false); const [activeEmployee, setActiveEmployee] = useState(true); const [deleteEmployee, setDeleteEmplyee] = useState(null); const [searchTerm, setSearchTerm] = useState(""); // State for search term const [selectedService, setSelectedService] = useState(null); const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(projectId); 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(projectId,selectedService); const { mutate: submitAllocations, isPending, isSuccess, isError, } = useManageProjectAllocation({ onSuccessCallback: () => { setRemovingEmployeeId(null); setAssignedLoading(false); setDeleteEmplyee(null); closeDeleteModal(); }, onErrorCallback: () => { closeDeleteModal(); }, }); const removeAllocation = (item) => { setRemovingEmployeeId(item.id); submitAllocations({ items: [ { empID: item.employeeId, jobRoleId: item.jobRoleId, projectId: projectId, status: false, }, ], added: false, }); }; const handleEmpAlicationFormSubmit = (allocaionObj) => { let items = allocaionObj.map((item) => { return { empID: item.empID, jobRoleId: item.jobRoleId, projectId: projectId, status: true, }; }); submitAllocations({ items, added: true }); setActiveEmployee(true); setFilteredEmployees(employees.filter((emp) => emp.isActive)); const dropdown = document.querySelector( 'select[name="DataTables_Table_0_length"]' ); if (dropdown) dropdown.value = "true"; }; const getRole = (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 openModel = () => { setIsModelOpen(true); }; const onModelClose = () => { setIsModelOpen(false); const modalElement = document.getElementById("user-model"); if (modalElement) { modalElement.classList.remove("show"); modalElement.style.display = "none"; document.body.classList.remove("modal-open"); document.querySelector(".modal-backdrop").remove(); } const modalBackdropElement = document.querySelector(".modal-backdrop"); if (modalBackdropElement) { modalBackdropElement.remove(); } document.body.style.overflow = "auto"; }; useEffect(() => { dispatch(changeMaster("Job Role")); }, [dispatch]); useEffect(() => { if (projectEmployees) { setEmployees(projectEmployees); const filtered = projectEmployees.filter((emp) => emp.isActive); setFilteredEmployees(filtered); } }, [projectEmployees, employeeLodaing]); useEffect(() => { if (data) { setEmpJobRoles(data); } }, [data]); const filterAndSearchEmployees = useCallback(() => { const statusFiltered = employees.filter((emp) => activeEmployee ? emp.isActive : !emp.isActive ); if (searchTerm === "") { setFilteredEmployees(statusFiltered); return; } const lowercasedSearchTerm = searchTerm.toLowerCase(); const searchedAndFiltered = statusFiltered.filter((item) => { const fullName = `${item.firstName} ${item.middleName} ${item.lastName}`.toLowerCase(); const roleName = getRole(item.jobRoleId).toLowerCase(); const orgName = (item.organizationName || "").toLowerCase(); const serviceName = (item.serviceName || "").toLowerCase(); return ( fullName.includes(lowercasedSearchTerm) || roleName.includes(lowercasedSearchTerm) || orgName.includes(lowercasedSearchTerm) || serviceName.includes(lowercasedSearchTerm) ); }); setFilteredEmployees(searchedAndFiltered); }, [employees, activeEmployee, searchTerm, getRole]); useEffect(() => { filterAndSearchEmployees(); }, [employees, activeEmployee, searchTerm, filterAndSearchEmployees]); const handleFilterEmployee = (e) => { const filterValue = e.target.value; setActiveEmployee(filterValue === "true"); setSearchTerm(""); }; const handleSearch = (e) => { setSearchTerm(e.target.value); }; const deleteModalOpen = (item) => { setDeleteEmplyee(item); setIsDeleteModal(true); }; const closeDeleteModal = () => setIsDeleteModal(false); const handler = useCallback( (msg) => { if (msg.projectIds.some((item) => item === projectId)) { refetch(); } }, [projectId, refetch] ); useEffect(() => { eventBus.on("assign_project_all", handler); return () => eventBus.off("assign_project_all", handler); }, [handler]); const employeeHandler = useCallback( (msg) => { if (filteredEmployees.some((item) => item.employeeId == msg.employeeId)) { refetch(); } }, [filteredEmployees, refetch] ); useEffect(() => { eventBus.on("employee", employeeHandler); return () => eventBus.off("employee", employeeHandler); }, [employeeHandler]); return ( <>
{IsDeleteModal && (Loading..
} {!employeeLodaing && filteredEmployees && filteredEmployees.length > 0 && (
Name
|
Services | Organization | Assigned Date | {!activeEmployee &&Release Date | }Project Role | Actions |
---|---|---|---|---|---|---|
{item.serviceName || "N/A"} | {item.organizationName || "N/A"} | {moment(item.allocationDate).format("DD-MMM-YYYY")} | {!activeEmployee && ({item.reAllocationDate ? moment(item.reAllocationDate).format("DD-MMM-YYYY") : "Present"} | )}{getRole(item.jobRoleId)} | {item.isActive ? ( ) : ( Not in project )} |