added filter and sorted employee list - Team

This commit is contained in:
pramod.mahajan 2025-09-27 10:12:34 +05:30
parent 2ef1fcfd1d
commit 265c74f079

View File

@ -1,4 +1,4 @@
import React, { useState, useEffect, useCallback } from "react"; import React, { useState, useEffect, useCallback, useMemo } from "react";
import MapUsers from "../MapUsers"; import MapUsers from "../MapUsers";
import { Link, NavLink, useNavigate, useParams } from "react-router-dom"; import { Link, NavLink, useNavigate, useParams } from "react-router-dom";
@ -28,16 +28,15 @@ const Teams = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const [AssigTeam, setAssignTeam] = useState(false); const [AssigTeam, setAssignTeam] = useState(false);
const [employees, setEmployees] = useState([]); const [employees, setEmployees] = useState([]);
const [filteredEmployees, setFilteredEmployees] = useState([]);
const [selectedEmployee, setSelectedEmployee] = useState(null); const [selectedEmployee, setSelectedEmployee] = useState(null);
const [deleteEmployee, setDeleteEmplyee] = useState(null); const [deleteEmployee, setDeleteEmplyee] = useState(null);
const [searchTerm, setSearchTerm] = useState(""); // State for search term const [searchTerm, setSearchTerm] = useState(""); // State for search term
const [selectedService, setSelectedService] = useState(null); const [selectedService, setSelectedService] = useState(null);
const [activeEmployee,setActiveEmployee] = useState(false) const [activeEmployee, setActiveEmployee] = useState(false);
const { data: assignedServices, isLoading: servicesLoading } = const { data: assignedServices, isLoading: servicesLoading } =
useProjectAssignedServices(selectedProject); useProjectAssignedServices(selectedProject);
const {data:empJobRoles,loading} = useMaster() const { data: empJobRoles, loading } = useMaster();
const handleToggleActive = (e) => setActiveEmployee(e.target.checked); const handleToggleActive = (e) => setActiveEmployee(e.target.checked);
const handleServiceChange = (e) => { const handleServiceChange = (e) => {
@ -52,7 +51,12 @@ const Teams = () => {
projectEmployees, projectEmployees,
loading: employeeLodaing, loading: employeeLodaing,
refetch, refetch,
} = useEmployeesByProjectAllocated(selectedProject, selectedService,null,activeEmployee); } = useEmployeesByProjectAllocated(
selectedProject,
selectedService,
null,
activeEmployee
);
const { const {
mutate: submitAllocations, mutate: submitAllocations,
isPending, isPending,
@ -90,19 +94,36 @@ const Teams = () => {
const role = empJobRoles.find((b) => b.id == jobRoleId); const role = empJobRoles.find((b) => b.id == jobRoleId);
return role ? role.name : "Unassigned"; return role ? role.name : "Unassigned";
}; };
// const employeeHandler = useCallback(
// (msg) => {
// if (filteredEmployees.some((emp) => emp.employeeId == msg.employeeId)) {
// refetch();
// }
// },
// [filteredEmployees, refetch]
// );
// useEffect(() => { const filteredEmployees = useMemo(() => {
// eventBus.on("employee", employeeHandler); if (!projectEmployees || !searchTerm?.trim()) return projectEmployees;
// return () => eventBus.off("employee", employeeHandler);
// }, [employeeHandler]); const lower = searchTerm.toLowerCase();
return projectEmployees?.filter((emp) => {
const fullName = `${emp.firstName ?? ""} ${
emp.lastName ?? ""
}`.toLowerCase();
const joberole = getJobRole(emp?.jobRoleId)?.toLowerCase();
return fullName?.includes(lower) || joberole?.includes(lower);
});
}, [projectEmployees, searchTerm]);
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 ( return (
<> <>
@ -128,25 +149,30 @@ const Teams = () => {
<div className="card card-action mb-6"> <div className="card card-action mb-6">
<div className="card-body"> <div className="card-body">
<div className="row d-flex justify-content-between mb-4"> <div className="row align-items-center justify-content-between mb-4 g-3">
<div className="col-md-6 col-12 d-flex align-emps-center"> <div className="col-md-6 col-12 algin-items-center">
{/* <div className="dataTables_length text-start py-1 px-0 col-md-4 col-12"> <div className="d-flex flex-wrap align-items-center gap-3">
{!servicesLoading && <div>
assignedServices?.length > 0 && {!servicesLoading && (
(assignedServices.length > 1 ? ( <>
<label> {(!assignedServices || assignedServices.length === 0) && (
<span className="badge bg-label-secondary">
Not Service Assigned
</span>
)}
{assignedServices?.length === 1 && (
<span className="badge bg-label-secondary">
{assignedServices[0].name}
</span>
)}
{assignedServices?.length > 1 && (
<select <select
name="DataTables_Table_0_length"
aria-controls="DataTables_Table_0"
className="form-select form-select-sm" className="form-select form-select-sm"
aria-label="Select Service" aria-label="Select Service"
value={selectedService} value={selectedService}
onChange={handleServiceChange} onChange={handleServiceChange}
style={{
fontSize: "0.875rem",
height: "35px",
width: "190px",
}}
> >
<option value="">All Services</option> <option value="">All Services</option>
{assignedServices.map((service) => ( {assignedServices.map((service) => (
@ -155,52 +181,53 @@ const Teams = () => {
</option> </option>
))} ))}
</select> </select>
</label> )}
) : ( </>
<h5>{assignedServices[0].name}</h5> )}
))}
</div> */}
</div> </div>
<div className="col-md-6 col-12 d-flex justify-content-end align-emps-center">
<div className="form-check form-switch me-2 mt-2"> <div className="form-check form-switch d-flex align-items-center text-nowrap">
<input <input
type="checkbox" type="checkbox"
className="form-check-input" className="form-check-input"
id="activeEmployeeSwitch"
checked={activeEmployee} checked={activeEmployee}
onChange={handleToggleActive} onChange={handleToggleActive}
id="activeEmployeeSwitch"
/> />
<label <label
className="form-check-label ms-0 " className="form-check-label ms-2"
htmlFor="activeEmployeeSwitch" htmlFor="activeEmployeeSwitch"
> >
{activeEmployee ? "Active Employees" : "Inactive Employees"} {activeEmployee ? "Active Employees" : "Inactive Employees"}
</label> </label>
</div> </div>
<div className="dataTables_filter d-inline-flex align-emps-center ms-2"> </div>
</div>
<div className="col-md-6 col-12 d-flex justify-content-md-end align-items-center justify-content-start gap-3">
<input <input
type="search" type="search"
className="form-control form-control-sm me-4" className="form-control form-control-sm"
placeholder="Search by Name or Role" placeholder="Search by Name or Role"
aria-controls="DataTables_Table_0" aria-controls="DataTables_Table_0"
// value={searchTerm} style={{ maxWidth: "200px" }}
// onChange={handleSearch} value={searchTerm}
onChange={handleSearch}
/> />
</div>
{HasAssignUserPermission && ( {HasAssignUserPermission && (
<button <button
type="button" type="button"
className={`link-button btn-primary btn-sm `} className="btn btn-primary btn-sm text-nowrap"
// data-bs-toggle="modal"
// data-bs-target="#user-model"
onClick={() => setAssignTeam(true)} onClick={() => setAssignTeam(true)}
> >
<i className="bx bx-plus-circle me-2"></i> <i className="bx bx-plus-circle me-1"></i>
Assign Employee Assign Employee
</button> </button>
)} )}
</div> </div>
</div> </div>
<div className="table-responsive text-nowrap"> <div className="table-responsive text-nowrap">
{employeeLodaing && <p>Loading..</p>} {employeeLodaing && <p>Loading..</p>}
{projectEmployees && projectEmployees.length > 0 && ( {projectEmployees && projectEmployees.length > 0 && (
@ -213,14 +240,18 @@ const Teams = () => {
<th>Services</th> <th>Services</th>
<th>Organization</th> <th>Organization</th>
<th>Assigned Date</th> <th>Assigned Date</th>
<th>Release Date</th> {activeEmployee && <th>Release Date</th>}
<th>Project Role</th> <th>Project Role</th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
</thead> </thead>
<tbody className="table-border-bottom-0"> <tbody className="table-border-bottom-0">
{projectEmployees && {filteredEmployees &&
projectEmployees.map((emp) => ( filteredEmployees
.sort((a, b) =>
(a.firstName || "").localeCompare(b.firstName || "")
)
.map((emp) => (
<tr key={emp.id}> <tr key={emp.id}>
<td> <td>
<div className="d-flex justify-content-start align-items-center"> <div className="d-flex justify-content-start align-items-center">
@ -252,11 +283,15 @@ const Teams = () => {
<td> <td>
{moment(emp.allocationDate).format("DD-MMM-YYYY")} {moment(emp.allocationDate).format("DD-MMM-YYYY")}
</td> </td>
{activeEmployee && (
<td> <td>
{emp.reAllocationDate {emp.reAllocationDate
? moment(emp.reAllocationDate).format("DD-MMM-YYYY") ? moment(emp.reAllocationDate).format(
"DD-MMM-YYYY"
)
: "Present"} : "Present"}
</td> </td>
)}
<td> <td>
<span className="badge bg-label-primary me-1"> <span className="badge bg-label-primary me-1">
{getJobRole(emp.jobRoleId)} {getJobRole(emp.jobRoleId)}