Add Search Bar in Assigned Employee Popup under Project > Teams #324
@ -14,13 +14,13 @@ import { useHasUserPermission } from "../../hooks/useHasUserPermission";
|
|||||||
import { ASSIGN_TO_PROJECT } from "../../utils/constants";
|
import { ASSIGN_TO_PROJECT } from "../../utils/constants";
|
||||||
import ConfirmModal from "../common/ConfirmModal";
|
import ConfirmModal from "../common/ConfirmModal";
|
||||||
import eventBus from "../../services/eventBus";
|
import eventBus from "../../services/eventBus";
|
||||||
import {useEmployeesByProjectAllocated, useManageProjectAllocation} from "../../hooks/useProjects";
|
import {
|
||||||
|
useEmployeesByProjectAllocated,
|
||||||
|
useManageProjectAllocation,
|
||||||
|
} from "../../hooks/useProjects";
|
||||||
import { useSelectedproject } from "../../slices/apiDataManager";
|
import { useSelectedproject } from "../../slices/apiDataManager";
|
||||||
|
|
||||||
const Teams = () =>
|
const Teams = () => {
|
||||||
{
|
|
||||||
// const {projectId} = useParams()
|
|
||||||
// const projectId = useSelector((store)=>store.localVariables.projectId)
|
|
||||||
const projectId = useSelectedproject();
|
const projectId = useSelectedproject();
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
|
|
||||||
@ -32,8 +32,9 @@ const Teams = () =>
|
|||||||
const [filteredEmployees, setFilteredEmployees] = useState([]);
|
const [filteredEmployees, setFilteredEmployees] = useState([]);
|
||||||
const [removingEmployeeId, setRemovingEmployeeId] = useState(null);
|
const [removingEmployeeId, setRemovingEmployeeId] = useState(null);
|
||||||
const [assignedLoading, setAssignedLoading] = useState(false);
|
const [assignedLoading, setAssignedLoading] = useState(false);
|
||||||
const [ activeEmployee, setActiveEmployee ] = useState( true )
|
const [activeEmployee, setActiveEmployee] = useState(true);
|
||||||
const [deleteEmployee,setDeleteEmplyee] = useState(null)
|
const [deleteEmployee, setDeleteEmplyee] = useState(null);
|
||||||
|
const [searchTerm, setSearchTerm] = useState(""); // State for search term
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
@ -129,10 +130,10 @@ const {
|
|||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if ( projectEmployees )
|
if (projectEmployees) {
|
||||||
{
|
|
||||||
setEmployees(projectEmployees);
|
setEmployees(projectEmployees);
|
||||||
setFilteredEmployees( projectEmployees?.filter( ( emp ) => emp.isActive ) );
|
const filtered = projectEmployees.filter((emp) => emp.isActive);
|
||||||
|
setFilteredEmployees(filtered);
|
||||||
}
|
}
|
||||||
}, [projectEmployees, employeeLodaing]);
|
}, [projectEmployees, employeeLodaing]);
|
||||||
|
|
||||||
@ -142,20 +143,46 @@ const {
|
|||||||
}
|
}
|
||||||
}, [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();
|
||||||
|
|
||||||
|
return (
|
||||||
|
fullName.includes(lowercasedSearchTerm) ||
|
||||||
|
roleName.includes(lowercasedSearchTerm)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
setFilteredEmployees(searchedAndFiltered);
|
||||||
|
}, [employees, activeEmployee, searchTerm, getRole]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
filterAndSearchEmployees();
|
||||||
|
}, [employees, activeEmployee, searchTerm, filterAndSearchEmployees]);
|
||||||
|
|
||||||
const handleFilterEmployee = (e) => {
|
const handleFilterEmployee = (e) => {
|
||||||
const filterValue = e.target.value;
|
const filterValue = e.target.value;
|
||||||
if ( filterValue === "true" )
|
setActiveEmployee(filterValue === "true");
|
||||||
{
|
setSearchTerm("");
|
||||||
setActiveEmployee(true)
|
|
||||||
setFilteredEmployees(employees.filter((emp) => emp.isActive));
|
|
||||||
} else {
|
|
||||||
setFilteredEmployees( employees.filter( ( emp ) => !emp.isActive ) );
|
|
||||||
setActiveEmployee(false)
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteModalOpen = (item) =>
|
const handleSearch = (e) => {
|
||||||
{
|
setSearchTerm(e.target.value);
|
||||||
|
};
|
||||||
|
|
||||||
|
const deleteModalOpen = (item) => {
|
||||||
setDeleteEmplyee(item)
|
setDeleteEmplyee(item)
|
||||||
setIsDeleteModal(true)
|
setIsDeleteModal(true)
|
||||||
}
|
}
|
||||||
@ -235,8 +262,8 @@ const {
|
|||||||
|
|
||||||
<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">
|
<div className="row d-flex justify-content-between mb-4">
|
||||||
<div className="col-12 d-flex justify-content-between mb-1">
|
<div className="col-md-6 col-12 d-flex align-items-center">
|
||||||
<div
|
<div
|
||||||
className="dataTables_length text-start py-2 px-2"
|
className="dataTables_length text-start py-2 px-2"
|
||||||
id="DataTables_Table_0_length"
|
id="DataTables_Table_0_length"
|
||||||
@ -256,10 +283,23 @@ const {
|
|||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div className="col-md-6 col-12 d-flex justify-content-end align-items-center">
|
||||||
|
<div className="dataTables_filter d-inline-flex align-items-center">
|
||||||
|
<input
|
||||||
|
type="search"
|
||||||
|
className="form-control form-control-sm me-4"
|
||||||
|
placeholder="Name or Role"
|
||||||
|
aria-controls="DataTables_Table_0"
|
||||||
|
value={searchTerm}
|
||||||
|
onChange={handleSearch}
|
||||||
|
/>
|
||||||
|
|
||||||
|
</div>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className={`link-button btn-sm m-1 ${
|
className={`link-button btn-sm m-1 ${HasAssignUserPermission ? "" : "d-none"
|
||||||
HasAssignUserPermission ? "" : "d-none"
|
|
||||||
}`}
|
}`}
|
||||||
data-bs-toggle="modal"
|
data-bs-toggle="modal"
|
||||||
data-bs-target="#user-model"
|
data-bs-target="#user-model"
|
||||||
@ -271,7 +311,7 @@ const {
|
|||||||
</div>
|
</div>
|
||||||
<div className="table-responsive text-nowrap">
|
<div className="table-responsive text-nowrap">
|
||||||
{employeeLodaing && <p>Loading..</p>}
|
{employeeLodaing && <p>Loading..</p>}
|
||||||
{!employeeLodaing && employees && employees.length > 0 && (
|
{!employeeLodaing && filteredEmployees && filteredEmployees.length > 0 && (
|
||||||
<table className="table ">
|
<table className="table ">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -283,8 +323,7 @@ const {
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody className="table-border-bottom-0">
|
<tbody className="table-border-bottom-0">
|
||||||
{filteredEmployees &&
|
{filteredEmployees.map((item) => (
|
||||||
filteredEmployees.map((item) => (
|
|
||||||
<tr key={item.id}>
|
<tr key={item.id}>
|
||||||
<td>
|
<td>
|
||||||
<div className="d-flex justify-content-start align-items-center">
|
<div className="d-flex justify-content-start align-items-center">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user