From 1bba9ab68a7420cab7029983ebf0669347257fb0 Mon Sep 17 00:00:00 2001 From: "pramod.mahajan" Date: Wed, 12 Nov 2025 18:12:37 +0530 Subject: [PATCH] added created, fetch and edit operration --- src/components/Project/ProjectCard.jsx | 44 +++++--- .../ServiceProject/ManageServiceProject.jsx | 106 +++++++++++++++--- .../ServiceProject/ServiceProjectSchema.jsx | 27 +---- src/hooks/useServiceProject.jsx | 90 ++++++++++++--- .../ServiceProject/ServiceProjectDisplay.jsx | 58 +++++++++- src/pages/authentication/MainLogin.css | 2 +- src/pages/project/ProjectPage.jsx | 50 ++++++--- src/pages/project/ProjectsDisplay.jsx | 14 --- src/repositories/ServiceProject.jsx | 2 +- 9 files changed, 285 insertions(+), 108 deletions(-) diff --git a/src/components/Project/ProjectCard.jsx b/src/components/Project/ProjectCard.jsx index 3bd818c4..1d40c909 100644 --- a/src/components/Project/ProjectCard.jsx +++ b/src/components/Project/ProjectCard.jsx @@ -1,6 +1,10 @@ import React, { useEffect, useState } from "react"; import moment from "moment"; -import { formatNumber, getDateDifferenceInDays } from "../../utils/dateUtils"; +import { + formatNumber, + formatUTCToLocalTime, + getDateDifferenceInDays, +} from "../../utils/dateUtils"; import { useNavigate } from "react-router-dom"; import { useProjectDetails, useUpdateProject } from "../../hooks/useProjects"; import ManageProjectInfo from "./ManageProjectInfo"; @@ -22,7 +26,7 @@ const ProjectCard = ({ project, isCore = true }) => { const dispatch = useDispatch(); const navigate = useNavigate(); const ManageProject = useHasUserPermission(MANAGE_PROJECT); - const { setMangeProject } = useProjectContext(); + const { setMangeProject, setManageServiceProject } = useProjectContext(); const getProgress = (planned, completed) => { return (completed * 100) / planned + "%"; @@ -54,7 +58,7 @@ const ProjectCard = ({ project, isCore = true }) => { } else { setManageServiceProject({ isOpen: true, - Project: project.id, + project: project.id, }); } }; @@ -138,21 +142,29 @@ const ProjectCard = ({ project, isCore = true }) => { Contact Person:{" "} - {project?.contactPerson ? project.contactPerson : "NA"} + {isCore + ? project?.contactPerson + ? project.contactPerson + : "NA" + : project.contactName}

- Start Date: - {project.startDate - ? moment(project?.startDate).format("DD-MMM-YYYY") - : "NA"} + + {isCore ? "Start Date:" : "Assigned Date"}{" "} + + {formatUTCToLocalTime( + isCore ? project?.startDate : project.assignedDate + )}

-

- Deadline: + {isCore && ( +

+ Deadline: - {project?.endDate - ? moment(project?.endDate).format("DD-MMM-YYYY") - : "NA"} -

+ {project?.endDate + ? moment(project?.endDate).format("DD-MMM-YYYY") + : "NA"} +

+ )}

{project?.projectAddress}

@@ -169,7 +181,7 @@ const ProjectCard = ({ project, isCore = true }) => { {getProjectStatusName(project?.projectStatusId)}

{" "} - {getDateDifferenceInDays(project?.endDate,new Date() ) >= 0 && ( + {getDateDifferenceInDays(project?.endDate, new Date()) >= 0 && ( {project?.endDate && getDateDifferenceInDays(project?.endDate, new Date())}{" "} @@ -179,7 +191,7 @@ const ProjectCard = ({ project, isCore = true }) => { {getDateDifferenceInDays(project?.endDate, new Date()) < 0 && ( {project?.endDate && - getDateDifferenceInDays(project?.endDate, new Date())}{" "} + getDateDifferenceInDays(project?.endDate, new Date())}{" "} Days overdue )} diff --git a/src/components/ServiceProject/ManageServiceProject.jsx b/src/components/ServiceProject/ManageServiceProject.jsx index 9e3c98ce..25db449b 100644 --- a/src/components/ServiceProject/ManageServiceProject.jsx +++ b/src/components/ServiceProject/ManageServiceProject.jsx @@ -1,9 +1,12 @@ import { zodResolver } from "@hookform/resolvers/zod"; -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { defaultProjectValues } from "./ServiceProjectSchema"; import Label from "../common/Label"; import { FormProvider, useForm } from "react-hook-form"; -import { useGlobalServices } from "../../hooks/masterHook/useMaster"; +import { + useGlobalServices, + useServices, +} from "../../hooks/masterHook/useMaster"; import { ITEMS_PER_PAGE, PROJECT_STATUS } from "../../utils/constants"; import DatePicker from "../common/DatePicker"; @@ -14,10 +17,18 @@ import { useOrganizationsList, } from "../../hooks/useOrganization"; import { error } from "pdf-lib"; -import { useCreateServiceProject } from "../../hooks/useServiceProject"; +import { + useCreateServiceProject, + useServiceProject, + useUpdateServiceProject, +} from "../../hooks/useServiceProject"; -const ManageServiceProject = ({ servieceProjectId }) => { - console.log(servieceProjectId) +const ManageServiceProject = ({ serviceProjectId, onClose }) => { + const { + data: projectdata, + isLoading: isProjectLoading, + isProjectError, + } = useServiceProject(serviceProjectId); const [searchText, setSearchText] = useState(""); const methods = useForm({ resolver: zodResolver(projectSchema), @@ -27,22 +38,79 @@ const ManageServiceProject = ({ servieceProjectId }) => { register, handleSubmit, control, + reset, formState: { errors }, } = methods; - const { data, isError, isLoading } = useGlobalServices(); + const { data, isError, isLoading } = useServices(); const { data: organization, isLoading: isLoadingOrganization } = useOrganizationsList(ITEMS_PER_PAGE, 1, true); - const { mutate: CreateServiceProject, isPending } = useCreateServiceProject(); + const { mutate: CreateServiceProject, isPending } = useCreateServiceProject( + () => { + reset(); + onClose(); + } + ); + const { mutate: UpdateServiceProject, isPending: isUpdating } = + useUpdateServiceProject(() => { + reset(); + onClose(); + }); const onSubmit = (formData) => { - formData.services = formData.services.filter((s) => s.serviceId); - CreateServiceProject(formData); + + if (serviceProjectId) { + let existingServiceIds = projectdata?.services?.map((s) => s.id) || []; + + const oldServices = projectdata.services.map((service) => ({ + serviceId: service.id, + isActive: formData.services.includes(service.id), + })); + + const newServices = formData.services + .filter((s) => !existingServiceIds.includes(s)) + .map((service) => ({ serviceId: service, isActive: true })); + + formData.services = [...oldServices, ...newServices]; + } else { + formData.services = formData.services.map((service) => ({ + serviceId: service, + isActive: true, + })); + } + + if (serviceProjectId) { + let payload = { ...formData, id: serviceProjectId }; + + UpdateServiceProject({ id: serviceProjectId, payload }); + } else { + CreateServiceProject(formData); + } }; + + useEffect(() => { + if (projectdata) { + const activeServiceIds = (projectdata.services || []) + .map((s) => s.serviceId || s.id) + .filter(Boolean); + reset({ + name: projectdata.name, + shortName: projectdata.shortName, + clientId: projectdata.client.id, + assignedDate: projectdata.assignedDate, + address: projectdata.address, + statusId: projectdata.status.id, + contactEmail: projectdata.contactEmail, + contactPhone: projectdata.contactPhone, + contactName: projectdata.contactName, + services: activeServiceIds, + }); + } + }, [projectdata]); return (
-
Create Project
+
{serviceProjectId ? "Update Project":"Create Project"}
@@ -105,10 +173,13 @@ const ManageServiceProject = ({ servieceProjectId }) => { options={data?.data} isLoading={isLoading} name="services" - valueKey="id" labelKey="name" - label="Select Cient" + valueKey="id" + label="Select Service" /> + {errors?.services && ( + {errors.services.message} + )}