From 005fdb3490df5af1e81c0e9e83be4d8e31ba1893 Mon Sep 17 00:00:00 2001 From: pramod mahajan Date: Fri, 19 Sep 2025 23:46:06 +0530 Subject: [PATCH] added assigned org to project --- src/ModalProvider.jsx | 11 +- src/components/Organization/AssignOrg.jsx | 211 +++++++++++++++++- src/components/Organization/ManagOrg.jsx | 142 ++++++++++++ .../Organization/ManageOrganization.jsx | 118 +--------- src/components/Organization/OrgPicker.jsx | 110 +++++++++ src/components/Organization/OrgPicker2.jsx | 145 ++++++++++++ .../Organization/OrganizationModal.jsx | 130 +++++++++++ .../Organization/OrganizationSchema.js | 25 +++ .../Organization/OrganizationSkeleton.jsx | 39 ++++ .../Project/ProjectOrganizations.jsx | 4 +- src/hooks/masterHook/useMaster.js | 14 +- src/hooks/useOrganization.js | 66 +++++- src/pages/Organization/OrganizationPage.jsx | 5 +- src/repositories/MastersRepository.jsx | 5 +- src/repositories/OrganizationRespository.jsx | 2 +- src/slices/localVariablesSlice.jsx | 33 ++- 16 files changed, 910 insertions(+), 150 deletions(-) create mode 100644 src/components/Organization/ManagOrg.jsx create mode 100644 src/components/Organization/OrgPicker.jsx create mode 100644 src/components/Organization/OrgPicker2.jsx create mode 100644 src/components/Organization/OrganizationModal.jsx create mode 100644 src/components/Organization/OrganizationSkeleton.jsx diff --git a/src/ModalProvider.jsx b/src/ModalProvider.jsx index a68465f7..d0d72a6e 100644 --- a/src/ModalProvider.jsx +++ b/src/ModalProvider.jsx @@ -1,11 +1,12 @@ -import React from 'react' -import ManageOrganization from './components/Organization/ManageOrganization' +import React, { useEffect } from 'react' +// import ManageOrganization from './components/Organization/ManageOrganization' import { useOrganizationModal } from './hooks/useOrganization'; +import OrganizationModal from './components/Organization/OrganizationModal'; const ModalProvider = () => { - const { isOpen } = useOrganizationModal(); - - return <>{isOpen && }; + const { isOpen,onClose } = useOrganizationModal(); + + return <>{isOpen && }; }; diff --git a/src/components/Organization/AssignOrg.jsx b/src/components/Organization/AssignOrg.jsx index 0fde3168..c773bc88 100644 --- a/src/components/Organization/AssignOrg.jsx +++ b/src/components/Organization/AssignOrg.jsx @@ -1,9 +1,208 @@ -import React from 'react' +import React, { useMemo, useState } from "react"; +import { useProjectAssignedServices } from "../../hooks/useProjects"; +import { useSelectedProject } from "../../slices/apiDataManager"; +import { + useOrganizationType, + useServices, +} from "../../hooks/masterHook/useMaster"; +import Label from "../common/Label"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { assignedOrgToProject } from "./OrganizationSchema"; +import { + useAssignOrgToProject, + useOrganizationModal, +} from "../../hooks/useOrganization"; -const AssignOrg = () => { +const AssignOrg = ({ setStep }) => { + const { isOpen, orgData, startStep, onOpen, onClose, prevStep } = + useOrganizationModal(); + const selectedProject = useSelectedProject(); + const { data: masterService, isLoading: isMasterserviceLoading } = + useServices(); + const { data: projectServices, isLoading } = + useProjectAssignedServices(selectedProject); + const { data: orgType, isLoading: orgLoading } = useOrganizationType(); + + const { mutate: AssignToProject, isPending } = useAssignOrgToProject( + () => {} + ); + + const mergedServices = useMemo(() => { + if (!masterService || !projectServices) return []; + + const combined = [...masterService?.data, ...projectServices]; + + const unique = combined.filter( + (item, index, self) => index === self.findIndex((s) => s.id === item.id) + ); + + return unique; + }, [masterService, projectServices]); + + const { + register, + setValue, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(assignedOrgToProject), + }); + + const onSubmit = (formData) => { + const payload = { + ...formData, + projectId: selectedProject, + organizationId: orgData.id, + parentOrganizationId: null, + }; + AssignToProject(payload); + }; + const handleEdit = () => { + onOpen({ startStep: 4 , orgData:orgData}); + }; + if (isMasterserviceLoading || isLoading) + return
Loading....
; return ( -
AssignOrg
- ) -} +
+
+
+
{orgData.name}
+
+ +
+
+
-export default AssignOrg \ No newline at end of file +
+
+ +
{orgData.name}
+
+
+
+
+ +
{orgData.contactNumber}
+
+
+
+
+ +
{orgData.email}
+
+
+
+
+ +
{orgData.sprid}
+
+
+ +
+
+ +
{orgData.address}
+
+
+ +
+
+
+ + + {errors.organizationTypeId && ( + + {errors.organizationTypeId.message} + + )} +
+ +
+ + {mergedServices?.map((service) => ( +
+ + +
+ ))} + {errors.serviceIds && ( +
+ {errors.serviceIds.message} +
+ )} +
+ + {/* Buttons */} +
+ + +
+
+
+
+ ); +}; + +export default AssignOrg; diff --git a/src/components/Organization/ManagOrg.jsx b/src/components/Organization/ManagOrg.jsx new file mode 100644 index 00000000..a4da2b48 --- /dev/null +++ b/src/components/Organization/ManagOrg.jsx @@ -0,0 +1,142 @@ +import React, { useEffect } from "react"; +import { FormProvider, useForm } from "react-hook-form"; +import { + useCreateOrganization, + useOrganizationModal, + useUpdateOrganization, +} from "../../hooks/useOrganization"; +import { + defaultOrganizationValues, + organizationSchema, +} from "./OrganizationSchema"; +import Label from "../common/Label"; +import { useGlobalServices } from "../../hooks/masterHook/useMaster"; +import { zodResolver } from "@hookform/resolvers/zod"; +import SelectMultiple from "../common/SelectMultiple"; + +const ManagOrg = () => { + const { data: service, isLoading } = useGlobalServices(); + const { isOpen, orgData, startStep, onOpen, onClose, prevStep } = + useOrganizationModal(); + + const method = useForm({ + resolver: zodResolver(organizationSchema), + defaultValues: defaultOrganizationValues, + }); + + const { + handleSubmit, + register, + reset, + formState: { errors }, + } = method; + + // Create & Update mutations + const { mutate: createOrganization, isPending: isCreating } = useCreateOrganization(() => { + reset(defaultOrganizationValues); + onOpen({ startStep: 1 }); + onClose(); + }); + + const { mutate: updateOrganization, isPending: isUpdating } = useUpdateOrganization(() => { + reset(defaultOrganizationValues); + onOpen({ startStep: 1 }); + onClose(); + }); + + // Prefill form if editing + useEffect(() => { + if (orgData) { + console.log(orgData) + reset({ + name: orgData.name || "", + contactPerson: orgData.contactPerson || "", + contactNumber: orgData.contactNumber || "", + email: orgData.email || "", + serviceIds: orgData.services?.map(s => s.id) || [], + address: orgData.address || "", + }); + } + }, [orgData, reset]); + + const onSubmit = (payload) => { + if (orgData?.id) { + updateOrganization({ id: orgData.id, ...payload }); + } else { + createOrganization(payload); + } + }; + + return ( + +
+
+ + + {errors.name && {errors.name.message}} +
+ +
+ + + {errors.contactPerson && {errors.contactPerson.message}} +
+ +
+ + + {errors.contactNumber && {errors.contactNumber.message}} +
+ +
+ + + {errors.email && {errors.email.message}} +
+ +
+ + {errors.serviceIds && {errors.serviceIds.message}} +
+ +
+ +