From b39effe4b012f26473d1de2b1af1b8a8c97594da Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Mon, 12 May 2025 13:11:29 +0530 Subject: [PATCH 1/6] Added a Work Category dropdown in task create/update forms and a new column to display the category in Project Infrastructure and Daily Task Planning views. --- .../Infrastructure/EditActivityModal.jsx | 86 +++++++++--- .../Project/Infrastructure/TaskModel.jsx | 125 +++++++++++++----- .../Project/Infrastructure/WorkArea.jsx | 3 + .../Project/Infrastructure/WorkItem.jsx | 9 ++ src/hooks/masterHook/useMaster.js | 35 ++++- 5 files changed, 210 insertions(+), 48 deletions(-) diff --git a/src/components/Project/Infrastructure/EditActivityModal.jsx b/src/components/Project/Infrastructure/EditActivityModal.jsx index e8927ae3..43724307 100644 --- a/src/components/Project/Infrastructure/EditActivityModal.jsx +++ b/src/components/Project/Infrastructure/EditActivityModal.jsx @@ -3,7 +3,7 @@ import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; -import { useActivitiesMaster } from "../../../hooks/masterHook/useMaster"; +import { useActivitiesMaster, useWorkCategoriesMaster } from "../../../hooks/masterHook/useMaster"; import { useProjectDetails } from "../../../hooks/useProjects"; import { useDispatch, useSelector } from "react-redux"; import ProjectRepository from "../../../repositories/ProjectRepository"; @@ -18,6 +18,7 @@ import showToast from "../../../services/toastService"; const taskSchema = z .object({ activityID: z.string().min(1, "Activity is required"), + workCategoryId: z.string().min(1, "Work Category is required"), plannedWork: z.number().min(1, "Planned Work must be greater than 0"), completedWork: z.number().min(0, "Completed Work must be greater than 0"), }) @@ -43,17 +44,21 @@ const EditActivityModal = ({ ); const defaultModel = { activityID: 0, + workCategoryId: 0, plannedWork: 0, completedWork: 0, }; - const {projects_Details, refetch} = useProjectDetails( selectedProject ); - const [ActivityUnit,setActivityUnit]= useState("") + const { projects_Details, refetch } = useProjectDetails(selectedProject); + const [ActivityUnit, setActivityUnit] = useState(""); const { activities, loading, error } = useActivitiesMaster(); + const { categories, categoryLoading, categoryError } = + useWorkCategoriesMaster(); const [formData, setFormData] = useState(defaultModel); const [selectedActivity, setSelectedActivity] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [activityData, setActivityData] = useState([]); + const [categoryData, setCategoryData] = useState([]); const dispatch = useDispatch(); const { @@ -70,12 +75,19 @@ const EditActivityModal = ({ }); const handleActivityChange = (e) => { - const selectedId = Number(e.target.value); + const selectedId = String(e.target.value); const selected = activityData.find((a) => a.id === selectedId); setSelectedActivity(selected || null); setValue("activityID", selectedId); }; + const handleCategoryChange = (e) => { + const selectedId = String(e.target.value); + const category = categoryData.find((b) => b.id === selectedId); + setSelectedCategory(category || null); + setValue("workCategoryId", selectedId); + }; + const onSubmitForm = async (data) => { const updatedProject = { ...projects_Details }; const finalData = { @@ -141,14 +153,14 @@ const EditActivityModal = ({ data: newProject, }); resetForm(); - dispatch( refreshData( true ) ); - showToast("Activity Updated Successfully","success") + dispatch(refreshData(true)); + showToast("Activity Updated Successfully", "success"); onClose(); } }) .catch((error) => { - showToast(error.message, "error"); + showToast(error?.response?.data?.message || error.message, "error"); }); }; @@ -161,6 +173,8 @@ const EditActivityModal = ({ useEffect(() => { reset({ activityID: workItem?.workItem?.activityId || workItem?.activityId || 0, + workCategoryId: + workItem?.workItem?.workCategoryId || workItem?.workCategoryId || 0, plannedWork: workItem?.workItem?.plannedWork || workItem?.plannedWork || 0, completedWork: @@ -171,14 +185,13 @@ const EditActivityModal = ({ const ISselectedActivity = watch("activityID"); useEffect(() => { - if( ISselectedActivity ){ + if (ISselectedActivity) { const selected = activities.find((a) => a.id === ISselectedActivity); - setSelectedActivity( selected || null ); - setActivityUnit(selected?.unitOfMeasurement) - } - }, [ ISselectedActivity,activities] ); - - + setSelectedActivity(selected || null); + setActivityUnit(selected?.unitOfMeasurement); + } + }, [ISselectedActivity, activities]); + return (
@@ -273,6 +286,45 @@ const EditActivityModal = ({ )}
+ {/* Select Category */} +
+ + + + {errors.workCategoryId && ( +

{errors.workCategoryId.message}

+ )} +
+ {/* Planned Work */} {/* {ISselectedActivity && ( */}
@@ -327,7 +379,11 @@ const EditActivityModal = ({ {/* )} */}
- -

- {`${commentsData?.workItem?.workArea?.floor?.building?.name}`}{" "} - {" "} - {`${commentsData?.workItem?.workArea?.floor?.floorName} `}{" "} - - {`${commentsData?.workItem?.workArea?.areaName}`} - - {` ${commentsData?.workItem?.activityMaster?.activityName}`} +

Activity Summary

+

+ {comments && comments[0]?.comment} +

+

+ Assigned By : + + {commentsData?.assignedBy.firstName + + " " + + commentsData?.assignedBy.lastName} + {" "}

-
    - {comments && - comments?.map((data) => { - const fullName = `${data?.employee?.firstName} ${data?.employee?.lastName}`; - const bgClass = getBgClassFromHash(fullName); - return ( -
  • -
    -
    - - {`${data?.employee?.firstName?.slice( - 0, - 1 - )} ${data?.employee?.lastName?.slice(0, 1)}`} - -
    +

    + Loaction : + + {`${commentsData?.workItem?.workArea?.floor?.building?.name}`}{" "} + {" "} + {`${commentsData?.workItem?.workArea?.floor?.floorName} `}{" "} + + {`${commentsData?.workItem?.workArea?.areaName}`} + + {` ${commentsData?.workItem?.activityMaster?.activityName}`} + +

    +

    + Planned Work: {commentsData?.plannedTask} +

    +

    + {" "} + Completed Work : {commentsData?.completedTask} +

    +
    +

    Team:

    +
    + {commentsData?.teamMembers?.map((member, idx) => ( + + + {member?.firstName + " " + member?.lastName} + + ))} +
    +
    -
    -

    {fullName}

    -

    - {moment.utc(data?.commentDate).local().fromNow()} -

    -
    -
    -

    - {data?.comment} -

    -
  • - ); - })} -
-
+ +