diff --git a/src/components/Project/AssignEmployeeCard.jsx b/src/components/Project/AssignEmployeeCard.jsx
deleted file mode 100644
index e8cb9092..00000000
--- a/src/components/Project/AssignEmployeeCard.jsx
+++ /dev/null
@@ -1,60 +0,0 @@
-
-import React, { useState, useEffect } from 'react';
-import RoleBadge from './RoleBadge';
-import Avatar from '../common/Avatar';
-
-const AssignEmployeeCard = ({
- employee,
- jobRoles,
- isChecked,
- onRoleChange,
- onCheckboxChange,
-}) => {
- const [currentJobRole, setCurrentJobRole] = useState(employee.jobRoleId);
-
- useEffect(() => {
- setCurrentJobRole(employee.jobRoleId);
- }, [employee.jobRoleId]);
-
- const handleRoleChange = (newRoleId) => {
- setCurrentJobRole(newRoleId);
- onRoleChange(employee.id, newRoleId);
- };
-
- const handleCheckboxChange = () => {
- if (!employee.isActive) {
- onCheckboxChange(employee.id);
- }
- };
-
- return (
-
-
-
-
-
{employee.firstName} {employee.lastName}
-
-
-
-
-
-
-
-
- );
-};
-
-export default AssignEmployeeCard;
\ No newline at end of file
diff --git a/src/components/Project/AssignEmployeeTable.jsx b/src/components/Project/AssignEmployeeTable.jsx
new file mode 100644
index 00000000..d2f5dbb1
--- /dev/null
+++ b/src/components/Project/AssignEmployeeTable.jsx
@@ -0,0 +1,130 @@
+import React, { useState, useEffect } from "react";
+import Avatar from "../common/Avatar";
+import { useForm } from "react-hook-form";
+import { z } from "zod";
+import { zodResolver } from "@hookform/resolvers/zod";
+
+
+
+
+
+
+export const roleSchema = z.object({
+ jobRole: z.string().min(1, "Job Role is required"),
+ isChecked: z.literal(true, {
+ errorMap: () => ({ message: "You must check the box first" }),
+ }),
+} );
+
+
+const AssignEmployeeTable = ({
+ employee,
+ jobRoles,
+ isChecked,
+ onRoleChange,
+ onCheckboxChange,
+}) => {
+ const [currentJobRole, setCurrentJobRole] = useState(employee.jobRoleId?.toString() || "");
+ const {
+ register,
+ handleSubmit,
+ formState: { errors },
+ setValue,
+ trigger,
+ getValues,
+ } = useForm({
+ resolver: zodResolver(roleSchema),
+ defaultValues: {
+ jobRole: currentJobRole,
+ isChecked: isChecked || false,
+ },
+ });
+
+ useEffect(() => {
+ const jobRoleStr = employee.jobRoleId?.toString() || "";
+ setCurrentJobRole(jobRoleStr);
+ setValue("jobRole", jobRoleStr);
+ setValue("isChecked", isChecked);
+ }, [employee.jobRoleId, isChecked, setValue]);
+
+ const onSubmit = (data) => {
+ setCurrentJobRole(data.jobRole);
+ onRoleChange(employee.id, data.jobRole);
+ };
+
+ const handleRoleSelect = async (e) => {
+ const value = e.target.value;
+ setValue("jobRole", value);
+ const isValid = await trigger(); // Validate the form
+ if (isValid) {
+ const values = getValues();
+ onRoleChange(employee.id, values.jobRole);
+ }
+ };
+
+ const handleCheckboxChange = async () => {
+ if (!employee.isActive) {
+ setValue("isChecked", !isChecked);
+ const isValid = await trigger(); // Validate after setting value
+ if (isValid) {
+ const values = getValues();
+ onCheckboxChange(employee.id);
+ onRoleChange(employee.id, values.jobRole); // Update role if it changed
+ }
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ {employee.firstName} {employee.lastName}
+
+
+
+ |
+
+
+
+
+
+
+ {errors.jobRole && (
+ {errors.jobRole.message}
+ )}
+ {errors.isChecked && (
+
+ {errors.isChecked.message}
+
+ )}
+ |
+
+
+
+ |
+
+ );
+};
+
+export default AssignEmployeeTable;
+
diff --git a/src/components/Project/MapUsers.jsx b/src/components/Project/MapUsers.jsx
index 393d3e04..a8b63fa4 100644
--- a/src/components/Project/MapUsers.jsx
+++ b/src/components/Project/MapUsers.jsx
@@ -1,8 +1,9 @@
import React, { useState, useEffect } from "react";
import EmployeeRepository from "../../repositories/EmployeeRepository";
-import AssignEmployeeCard from "./AssignEmployeeCard";
-import {useAllEmployees} from "../../hooks/useEmployees";
+import { useAllEmployees } from "../../hooks/useEmployees";
import useSearch from "../../hooks/useSearch";
+import AssignEmployeeTable from "./AssignEmployeeTable";
+import showToast from "../../services/toastService";
const MapUsers = ({
projectId,
@@ -11,61 +12,59 @@ const MapUsers = ({
onSubmit,
allocation,
}) => {
- const {employeesList, loading, error} = useAllEmployees();
+ const { employeesList, loading, error } = useAllEmployees();
const [selectedEmployees, setSelectedEmployees] = useState([]);
const [searchText, setSearchText] = useState("");
- const handleAllocationData = Array.isArray( allocation ) ? allocation : [];
+ const handleAllocationData = Array.isArray(allocation) ? allocation : [];
const allocationEmployees = employeesList.map((employee) => {
- const allocationItem = handleAllocationData.find((alloc) => alloc.employeeId === employee.id);
+ const allocationItem = handleAllocationData.find(
+ (alloc) => alloc.employeeId === employee.id
+ );
return {
...employee,
isActive: allocationItem ? allocationItem.isActive : false,
jobRoleId: allocationItem ? allocationItem.jobRoleId : employee.jobRoleId,
};
- } );
+ });
+ function parseDate(dateStr) {
+ return new Date(dateStr.split(".")[0]);
+ }
-
-
-function parseDate(dateStr) {
- return new Date(dateStr.split('.')[0]);
-}
-
-
-const latestAllocations = handleAllocationData.reduce((acc, alloc) => {
+ const latestAllocations = handleAllocationData.reduce((acc, alloc) => {
const existingAlloc = acc[alloc.employeeId];
if (!existingAlloc) {
- acc[alloc.employeeId] = alloc;
+ acc[alloc.employeeId] = alloc;
} else {
-
- const existingDate = parseDate(existingAlloc.reAllocationDate || existingAlloc.allocationDate);
- const newDate = parseDate(alloc.reAllocationDate || alloc.allocationDate);
+ const existingDate = parseDate(
+ existingAlloc.reAllocationDate || existingAlloc.allocationDate
+ );
+ const newDate = parseDate(alloc.reAllocationDate || alloc.allocationDate);
-
- if (newDate > existingDate) {
- acc[alloc.employeeId] = alloc;
- }
+ if (newDate > existingDate) {
+ acc[alloc.employeeId] = alloc;
+ }
}
return acc;
-}, {});
+ }, {});
-
-const allocationEmployeesData = employeesList
+ const allocationEmployeesData = employeesList
.map((employee) => {
- const allocationItem = latestAllocations[employee.id];
- return {
- ...employee,
- isActive: allocationItem ? allocationItem.isActive : false,
- };
+ const allocationItem = latestAllocations[employee.id];
+ return {
+ ...employee,
+ isActive: allocationItem ? allocationItem.isActive : false,
+ };
})
- .filter( ( employee ) => employee.isActive === false );
-
-
-
- const { filteredData, setSearchQuery } = useSearch(allocationEmployeesData, searchText);
+ .filter((employee) => employee.isActive === false);
+
+ const { filteredData, setSearchQuery } = useSearch(
+ allocationEmployeesData,
+ searchText
+ );
const handleRoleChange = (employeeId, newRoleId) => {
setSelectedEmployees((prevSelectedEmployees) =>
@@ -78,7 +77,9 @@ const allocationEmployeesData = employeesList
const handleCheckboxChange = (employeeId) => {
setSelectedEmployees((prevSelectedEmployees) => {
const updatedEmployees = [...prevSelectedEmployees];
- const employeeIndex = updatedEmployees.findIndex((emp) => emp.id === employeeId);
+ const employeeIndex = updatedEmployees.findIndex(
+ (emp) => emp.id === employeeId
+ );
if (employeeIndex !== -1) {
const isSelected = !updatedEmployees[employeeIndex].isSelected;
@@ -93,14 +94,19 @@ const allocationEmployeesData = employeesList
});
};
-
const handleSubmit = () => {
const selected = selectedEmployees
.filter((emp) => emp.isSelected)
.map((emp) => ({ empID: emp.id, jobRoleId: emp.jobRoleId }));
- onSubmit(selected);
+ if (selected.length > 0) {
+ console.log(selected);
+ onSubmit(selected);
+ setSelectedEmployees([]);
+ } else {
+ showToast("Please select Employee", "error");
+ }
};
-
+console.log(allocationEmployeesData)
return (
<>
@@ -118,20 +124,39 @@ const allocationEmployeesData = employeesList
-
- {loading && !employeesList && Loading...
}
- {filteredData.map((emp) => (
-
- ) )}
- {filteredData.length == 0 && No Data Found
}
-
+
+
+
+ {loading && Loading...
}
+
+ {!loading &&
+ allocationEmployeesData.length === 0 &&
+ filteredData.length === 0 && No employees available.
}
+
+ {!loading &&
+ allocationEmployeesData.length > 0 &&
+ filteredData.length === 0 && (
+ No matching employees found.
+ )}
+
+ {filteredData.length > 0 &&
+ filteredData.map((emp) => (
+
+ ))}
+
+