From 1bf7ccbaadd05566c69aadb7b21af6472014f679 Mon Sep 17 00:00:00 2001 From: Kartik Sharma Date: Wed, 20 Aug 2025 16:28:15 +0530 Subject: [PATCH] Missing Employee Search Box in Assign Task Popup --- src/components/Project/AssignTask.jsx | 434 +++++++++++++++----------- 1 file changed, 248 insertions(+), 186 deletions(-) diff --git a/src/components/Project/AssignTask.jsx b/src/components/Project/AssignTask.jsx index 67194ac6..3d0da58d 100644 --- a/src/components/Project/AssignTask.jsx +++ b/src/components/Project/AssignTask.jsx @@ -49,6 +49,9 @@ const AssignTask = ({ assignData, onClose, setAssigned }) => { const infoRef = useRef(null); const infoRef1 = useRef(null); + // State for search term + const [searchTerm, setSearchTerm] = useState(""); + useEffect(() => { if (typeof bootstrap !== "undefined") { if (infoRef.current) { @@ -81,9 +84,11 @@ const AssignTask = ({ assignData, onClose, setAssigned }) => { recallEmployeeData, } = useEmployeesAllOrByProjectId(false, selectedProject, false); const dispatch = useDispatch(); - const { data: jobRoleData, loading } = useMaster(); + const { loading } = useMaster(); + const { data: jobRoleData } = useMaster(); - const [selectedRole, setSelectedRole] = useState("all"); + // Changed to an array to hold multiple selected roles + const [selectedRoles, setSelectedRoles] = useState(["all"]); const [displayedSelection, setDisplayedSelection] = useState(""); const { handleSubmit, @@ -121,20 +126,79 @@ const AssignTask = ({ assignData, onClose, setAssigned }) => { useEffect(() => { dispatch(changeMaster("Job Role")); - - return () => setSelectedRole("all"); + // Initial state should reflect "All Roles" selected + setSelectedRoles(["all"]); }, [dispatch]); - const handleRoleChange = (event) => { - setSelectedRole(event.target.value); + // Modified handleRoleChange to handle multiple selections + const handleRoleChange = (event, roleId) => { + // If 'all' is selected, clear other selections + if (roleId === "all") { + setSelectedRoles(["all"]); + } else { + setSelectedRoles((prevSelectedRoles) => { + // If "all" was previously selected, remove it + const newRoles = prevSelectedRoles.filter((role) => role !== "all"); + if (newRoles.includes(roleId)) { + // If role is already selected, unselect it + return newRoles.filter((id) => id !== roleId); + } else { + // If role is not selected, add it + return [...newRoles, roleId]; + } + }); + } }; - const filteredEmployees = - selectedRole === "all" - ? employees - : employees?.filter( - (emp) => String(emp.jobRoleId || "") === selectedRole - ); + useEffect(() => { + // Update displayedSelection based on selectedRoles + if (selectedRoles.includes("all")) { + setDisplayedSelection("All Roles"); + } else if (selectedRoles.length > 0) { + const selectedRoleNames = selectedRoles.map(roleId => { + const role = jobRoleData?.find(r => String(r.id) === roleId); + return role ? role.name : ''; + }).filter(Boolean); // Filter out empty strings for roles not found + setDisplayedSelection(selectedRoleNames.join(', ')); + } else { + setDisplayedSelection("Select Roles"); + } + }, [selectedRoles, jobRoleData]); + + + const handleSearchChange = (event) => { + setSearchTerm(event.target.value); + }; + + // Filter employees first by role, then by search term AND job role name + const filteredEmployees = employees?.filter((emp) => { + const matchesRole = + selectedRoles.includes("all") || selectedRoles.includes(String(emp.jobRoleId)); + // Convert both first and last names and job role name to lowercase for case-insensitive matching + const fullName = `${emp.firstName} ${emp.lastName}`.toLowerCase(); + + const jobRoleName = jobRoleData?.find((role) => role.id === emp.jobRoleId)?.name?.toLowerCase() || ""; + + const searchLower = searchTerm.toLowerCase(); + // Check if the full name OR job role name includes the search term + const matchesSearch = fullName.includes(searchLower) || jobRoleName.includes(searchLower); + return matchesRole && matchesSearch; + }); + + // Determine unique job role IDs from the filtered employees (for dropdown options) + const uniqueJobRoleIdsInFilteredEmployees = new Set( + employees?.map(emp => emp.jobRoleId).filter(Boolean) + ); + + // Filter jobRoleData to only include roles present in the uniqueJobRoleIdsInFilteredEmployees + const jobRolesForDropdown = jobRoleData?.filter(role => + uniqueJobRoleIdsInFilteredEmployees.has(role.id) + ); + + // Calculate the count of selected roles for display + const selectedRolesCount = selectedRoles.includes("all") + ? 0 // "All Roles" doesn't contribute to a specific count + : selectedRoles.length; const onSubmit = (data) => { const selectedEmployeeIds = data.selectedEmployees; @@ -192,118 +256,183 @@ const AssignTask = ({ assignData, onClose, setAssigned }) => {
Select Team -
{displayedSelection}
- -
    -
  • - -
  • - {jobRoleData?.map((user) => ( -
  • - + {selectedRolesCount} + + )} + + {/* Dropdown Menu with Scroll */} +
      + {/* All Roles */} +
    • +
      + + handleRoleChange(e, e.target.value) + } + /> + +
    • - ))} -
    + + {/* Dynamic Roles */} + {jobRolesForDropdown?.map((role) => ( +
  • +
    + + handleRoleChange(e, e.target.value) + } + /> + +
    +
  • + ))} +
+
+ + {/* Search Box */} +
-
-
- {selectedRole !== "" && ( -
- {employeeLoading ? ( -
-

Loading employees...

-
- ) : filteredEmployees?.length > 0 ? ( - filteredEmployees.map((emp) => { - const jobRole = jobRoleData?.find( - (role) => role?.id === emp?.jobRoleId - ); + {/* Employees list */} +
+ {selectedRoles?.length > 0 && ( +
+ {employeeLoading ? ( +
+

Loading employees...

+
+ ) : filteredEmployees?.length > 0 ? ( + filteredEmployees.map((emp) => { + const jobRole = jobRoleData?.find( + (role) => role?.id === emp?.jobRoleId + ); - return ( -
-
- ( - { - handleCheckboxChange(e, emp); - }} - /> + return ( +
+
+ ( + { + handleCheckboxChange(e, emp); + }} + /> + )} + /> +
+

+ {emp.firstName} {emp.lastName} +

+ + {loading ? ( + + + + ) : ( + jobRole?.name || "Unknown Role" )} - /> -
-

- {emp.firstName} {emp.lastName} -

- - {loading ? ( - - - - ) : ( - jobRole?.name || "Unknown Role" - )} - -
+
- ); - }) - ) : ( -
-

+

+ ); + }) + ) : ( +
+

No employees found for the selected role. -

-
- )} -
- )} -
+

+
+ )} +
+ )}
{
-
@@ -397,10 +501,7 @@ const AssignTask = ({ assignData, onClose, setAssigned }) => { {/* Target for Today input and validation */}
-
)} />
{errors.plannedTask && ( -
- {errors.plannedTask.message} -
- )} - - {isHelpVisible && ( -
- {/* Add your help content here */} -

- Enter the target value for today's task. -

-
+
{errors.plannedTask.message}
)}
@@ -476,12 +543,7 @@ const AssignTask = ({ assignData, onClose, setAssigned }) => { name="description" control={control} render={({ field }) => ( -