diff --git a/src/components/Project/Infrastructure/EditActivityModal.jsx b/src/components/Project/Infrastructure/EditActivityModal.jsx new file mode 100644 index 00000000..7ca005a1 --- /dev/null +++ b/src/components/Project/Infrastructure/EditActivityModal.jsx @@ -0,0 +1,342 @@ +import React, { useState, useEffect } from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; + +import { useActivitiesMaster } from "../../../hooks/masterHook/useMaster"; +import { useProjectDetails } from "../../../hooks/useProjects"; +import useSelect from "../../common/useSelect"; +import { useDispatch, useSelector } from "react-redux"; +import ProjectRepository from "../../../repositories/ProjectRepository"; +import { + cacheData, + clearCacheKey, + getCachedData, +} from "../../../slices/apiDataManager"; +import { refreshData } from "../../../slices/localVariablesSlice"; +import showToast from "../../../services/toastService"; + +const taskSchema = z + .object({ + activityID: z.string().min(1, "Activity is required"), + plannedWork: z.number().min(1, "Planned Work must be greater than 0"), + completedWork: z.number().optional(), + }) + .refine( + (data) => + data.completedWork === undefined || + data.completedWork <= data.plannedWork, + { + message: "Completed Work cannot be greater than Planned Work", + path: ["completedWork"], // error will show next to this field + } + ); + +const EditActivityModal = ({ + workItem, + workArea, + building, + floor, + onClose, +}) => { + const selectedProject = useSelector( + (store) => store.localVariables.projectId + ); + const defaultModel = { + activityID: 0, + plannedWork: 0, + completedWork: 0, + }; + + const { projects_Details, refetch } = useProjectDetails(selectedProject); + const { activities, loading, error } = useActivitiesMaster(); + const [formData, setFormData] = useState(defaultModel); + const [selectedActivity, setSelectedActivity] = useState(null); + const [isSubmitting, setIsSubmitting] = useState(false); + const [activityData, setActivityData] = useState([]); + const dispatch = useDispatch(); + + const { + register, + handleSubmit, + formState: { errors }, + reset, + setValue, + getValues, + watch, + } = useForm({ + resolver: zodResolver(taskSchema), + defaultValues: defaultModel, + }); + + const handleActivityChange = (e) => { + const selectedId = Number(e.target.value); + const selected = activityData.find((a) => a.id === selectedId); + setSelectedActivity(selected || null); + setValue("activityID", selectedId); + }; + + const onSubmitForm = async (data) => { + const updatedProject = { ...projects_Details }; + const finalData = { + ...data, + id: workItem?.workItem?.id ?? workItem?.id, + buildingID: building?.id, + floorId: floor?.id, + workAreaId: workArea?.id, + }; + console.log(finalData) + + ProjectRepository.manageProjectTasks([finalData]) + .then((response) => { + if (response?.data[0]) { + const { workItemId, workItem } = response.data[0]; + + let finalUpdatedWorkItem = null; + const newProject = { + ...updatedProject, + buildings: updatedProject.buildings.map((building) => + building.id === finalData.buildingID + ? { + ...building, + floors: building.floors.map((floor) => + floor.id === finalData.floorId + ? { + ...floor, + workAreas: floor.workAreas.map((workArea) => + workArea.id === workItem?.workAreaId + ? { + ...workArea, + workItems: (() => { + const exists = workArea.workItems.some( + (item) => + String( + item?.workItem?.id ?? item?.id + ) === String(finalData.id) + ); + + finalUpdatedWorkItem = workItem; + + return exists + ? workArea.workItems.map((item) => + String( + item?.workItem?.id ?? item?.id + ) === String(finalData.id) + ? workItem + : item + ) + : [...workArea.workItems, workItem]; + })(), + } + : workArea + ), + } + : floor + ), + } + : building + ), + }; + cacheData("projectInfo", { + projectId: newProject.id, + data: newProject, + } ); + resetForm(); + dispatch(refreshData(true)); + onClose(); + } + }) + .catch((error) => { + showToast(error.message, "error"); + }); + }; + + const resetForm = () => { + setFormData(defaultModel); + setSelectedActivity(null); + reset(defaultModel); + }; + + useEffect(() => { + reset({ + activityID: workItem?.workItem?.activityId || workItem?.activityId || 0, + plannedWork: + workItem?.workItem?.plannedWork || workItem?.plannedWork || 0, + completedWork: + workItem?.workItem?.completedWork || workItem?.completedWork || 0, + }); + return () => reset(); + }, [activities, workItem]); + + const ISselectedActivity = watch("activityID"); + useEffect(() => { + const selected = activities.find((a) => a.id === ISselectedActivity); + setSelectedActivity(selected || null); + }, [ISselectedActivity]); + return ( +