From d6c0cda64c0c5e0731ad4af5ad1ec71a6b30561d Mon Sep 17 00:00:00 2001 From: siddheshmorewdi Date: Mon, 22 Jul 2024 14:50:31 +0530 Subject: [PATCH] updated --- src/Components/Banner/AddBanner.jsx | 3 - src/Components/Banner/BannerEdit.jsx | 7 - src/Components/Banner/BannerTable.jsx | 1 - src/Components/CreateIOld.jsx | 2 - src/Components/CutomBreadcrumb.jsx | 1 - src/Components/DataTable/DataTable.jsx | 18 +- src/Components/FormFieldMainReference.jsx | 1 - src/Components/FormInputMain.jsx | 5 +- src/Components/FormInputView.jsx | 2 - src/Components/NavBreadCrumbs.jsx | 1 - src/Components/ToastBox.jsx | 2 +- src/Contexts/GlobalStateProvider.jsx | 91 +-- src/Layout/DefaultLayout.jsx | 4 +- src/Pages/Admin/Contact.jsx | 2 - .../DepositViewHistory/ConfirmModal.jsx | 1 - .../DepositViewHistory/RejectModal.jsx | 1 - .../IO_Management/CreateIO/IODetails.jsx | 621 +++++++++--------- .../IO_Management/CreateIO/IONAVDetails.jsx | 3 - .../CreateIO/InvestmentDocument.jsx | 4 +- .../IO_Management/CreateIO/KeyMerits.jsx | 195 +++--- .../CreateIO/SetDisplayOrder.jsx | 143 ++++ src/Pages/IO_Management/EditIO/EditIO.jsx | 1 - .../IO_Management/EditIO/InvestmentEdit.jsx | 3 - src/Pages/IO_Management/EditViewIO.jsx | 1 - src/Pages/IO_Management/IOArtifactsAdd.jsx | 5 - src/Pages/IO_Management/InputComponents.jsx | 1 - .../IO_Management/InvestmentDocuments.jsx | 65 +- src/Pages/IO_Management/KeyMeritsAdd.jsx | 346 ++++++---- src/Pages/IO_Management/KeyMeritsEdit.jsx | 216 ++++++ .../IO_Management/ViewIO/InvestmentView.jsx | 2 - src/Pages/IO_Management/ViewIO/ViewIO.jsx | 3 +- .../IO_Management/ViewIO/ViewIOTable.jsx | 175 ++--- src/Pages/IO_Management/ViewIO/ViewIOdata.jsx | 2 +- .../IO_Management/ViewIO/ViewIOdataHeader.jsx | 19 +- .../IO_Management/ViewIO/ViewIOdetails.jsx | 353 +++++++--- .../InvestmentType/AddInvestmentType.jsx | 2 - .../InvestmentType/EditInvestmentType.jsx | 3 - .../Master/InvestmentType/InvestmentType.jsx | 13 +- src/Pages/Master/Sponser/AddSponser.jsx | 25 +- src/Pages/Master/Sponser/Sponsers.jsx | 21 +- src/Services/Key.merits.service.js | 25 + src/Services/investment.documents.service.js | 56 ++ src/Services/investment.type.service.js | 7 +- src/Services/io.service.js | 107 ++- src/Services/sponser.service.js | 14 +- src/Store/Store.js | 3 +- 46 files changed, 1651 insertions(+), 925 deletions(-) create mode 100644 src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx create mode 100644 src/Pages/IO_Management/KeyMeritsEdit.jsx create mode 100644 src/Services/Key.merits.service.js create mode 100644 src/Services/investment.documents.service.js diff --git a/src/Components/Banner/AddBanner.jsx b/src/Components/Banner/AddBanner.jsx index 68499cf..c8ec5fd 100644 --- a/src/Components/Banner/AddBanner.jsx +++ b/src/Components/Banner/AddBanner.jsx @@ -64,9 +64,6 @@ const AddBanner = ({ createApi, navigateLink, title, center }) => { // Trigger the mutation createApi(formData) .then((response) => { - // Handle the response here - // // console.log("Mutation response:", response?.data?.statusCode); - // // console.log("Mutation response:", response?.data?.message); if (response?.data?.statusCode === 200) { setIsLoading(false); diff --git a/src/Components/Banner/BannerEdit.jsx b/src/Components/Banner/BannerEdit.jsx index 54d9879..b885c58 100644 --- a/src/Components/Banner/BannerEdit.jsx +++ b/src/Components/Banner/BannerEdit.jsx @@ -109,15 +109,8 @@ const BannerEdit = ({isLoading, data, updateBanner, navigateTo, refetch, center} if (formData?.banner_image === data?.data?.banner_image) { form.delete("banner_image"); } - // Log the FormData entries - // for (const [key, value] of form.entries()) { - // // console.log(`${key}: ${value}`); - // } const mutationResult = await updateBanner({ id: id, data: form }) .then((response) => { - // Handle the response here - // // console.log("Mutation response:", response?.data?.statusCode); - // // console.log("Mutation response:", response?.data?.message); if (response?.data?.statusCode === 200) { setIsLoadingEdit(false); diff --git a/src/Components/Banner/BannerTable.jsx b/src/Components/Banner/BannerTable.jsx index 9b7c1b3..691c192 100644 --- a/src/Components/Banner/BannerTable.jsx +++ b/src/Components/Banner/BannerTable.jsx @@ -116,7 +116,6 @@ const BannerCommunity = ({ } }) .catch((error) => { - // // console.log(error); }); } catch (error) { // Handle errors diff --git a/src/Components/CreateIOld.jsx b/src/Components/CreateIOld.jsx index 9ab2723..4dde3a1 100644 --- a/src/Components/CreateIOld.jsx +++ b/src/Components/CreateIOld.jsx @@ -227,7 +227,6 @@ const CreateIO = () => { Action: , })); - console.log(extractedArray); const destributedAmount = Number(watch().destributedAmount) || 0; @@ -256,7 +255,6 @@ const CreateIO = () => { // setValue("banner_image", selectedBannerImageData); data.banner_image = selectedBannerImageData; const updatedData = { ...data, status: "Available" }; - console.log(selectedBannerImageData); setInvestment([...investment, updatedData]); navigate("/view-io"); reset(); diff --git a/src/Components/CutomBreadcrumb.jsx b/src/Components/CutomBreadcrumb.jsx index df06b62..52934b8 100644 --- a/src/Components/CutomBreadcrumb.jsx +++ b/src/Components/CutomBreadcrumb.jsx @@ -51,7 +51,6 @@ const CustomBreadcrumb = () => { }; const breadcrumbs = generateBreadcrumbs(pathParts); - console.log(breadcrumbs); return ( { const navigate = useNavigate(); const { slideFromRight } = useContext(GlobalStateContext); + if (isLoading) { + return ( + + {Array.from({ length: 10 }).map((_, index) => ( + + ))} + + ); + } + + const handleDragEnd = (result) => { if (!result.destination) return; - const reorderedItems = Array.from(data); const [removed] = reorderedItems.splice(result.source.index, 1); reorderedItems.splice(result.destination.index, 0, removed); - setData(reorderedItems) + console.log("New Order:", reorderedItems.map((item, index) => ({ index, item }))); }; return ( @@ -70,7 +82,7 @@ const DataTable = ({ {data?.map((item, index) => ( - item.id ? ( + item.id && isDraggable ? ( {(provided, snapshot) => ( { setSelectedOtherImageData(newSelectedImageData); }; -console.log(selectedBannerImageData); const formFields = [ { diff --git a/src/Components/FormInputMain.jsx b/src/Components/FormInputMain.jsx index 434139e..4fab24e 100644 --- a/src/Components/FormInputMain.jsx +++ b/src/Components/FormInputMain.jsx @@ -1,4 +1,4 @@ -import { Box, Button, Divider, Heading } from "@chakra-ui/react"; +import { Box, Button, Divider, Heading, Spinner } from "@chakra-ui/react"; import React from "react"; import FormField from "./FormField"; import { OPACITY_ON_LOAD } from "../Layout/animations"; @@ -15,6 +15,7 @@ const FormInputMain = ({ submitTitle, p, w, + btnLoading }) => { return ( @@ -99,9 +100,11 @@ const FormInputMain = ({ )} - + */} { - const { keyMerits, setKeyMerits,slideFromRight} = - useContext(GlobalStateContext); - const firstField = useRef(); - const [searchTerm, setSearchTerm] = useState(""); - const [isLoading, setIsLoading] = useState(true); - const [deleteAlert, setDeleteAlert] = useState(false); - const [actionId, setActionId] = useState(false); - const [mouseEntered, setMouseEntered] = useState(false); - const [mouseEnteredId, setMouseEnteredId] = useState(""); - const { isOpen, onOpen, onClose } = useDisclosure(); - +const KeyMerits = ({ enableNextTab, index }) => { + const toast = useToast() + const params = useParams(); - useEffect(() => { - // Simulate loading - const timer = setTimeout(() => { - setIsLoading(false); - }, 1500); - - // Cleanup the timer on component unmount - return () => clearTimeout(timer); - }, []); + // =====================[ variables ] + const id = params?.id; + const { data, isLoading, error } = useGetKeyMeritsQuery(id); + console.log(data?.data); - - const tableHeadRow = [ - "Sr.no", - "Title", - "Sub title", - "Icon", - "Action", - ]; + const { keyMerits, setKeyMerits, slideFromRight } = + useContext(GlobalStateContext); + const firstField = useRef(); + const [searchTerm, setSearchTerm] = useState(""); + const [deleteAlert, setDeleteAlert] = useState(false); + const [actionId, setActionId] = useState(false); + const [mouseEntered, setMouseEntered] = useState(false); + const [isBtnLoading, setIsBtnLoading] = useState(false); + const [mouseEnteredId, setMouseEnteredId] = useState(""); + const { isOpen, onOpen, onClose } = useDisclosure(); + const { isOpen: isEditOpen, onOpen: onEditOpen, onClose: onEditCloseOpen } = useDisclosure(); + const [ deleteKeyMerits ] = useDeleteKeyMeritsMutation() + + const tableHeadRow = ["Sr.no", "Title", "Sub title", "Icon", "Action"]; const handleUpdateStatus = debounce((id) => { setKeyMerits((prevKeyMerits) => prevKeyMerits.map((keyMerits) => - keyMerits.id === id ? { ...keyMerits, status: !keyMerits.status } : keyMerits + keyMerits.id === id + ? { ...keyMerits, status: !keyMerits.status } + : keyMerits ) ); toast({ @@ -53,27 +69,32 @@ const KeyMerits = ({enableNextTab, index}) => { }); }, 300); - const filteredData = keyMerits?.filter((item) => { + const filteredData = data?.data?.filter((item) => { // Filter by name (case insensitive) - const name = item.title; + const name = item.meritsHeader; const searchLower = searchTerm.toLowerCase(); const nameMatches = name.toLowerCase().includes(searchLower); return nameMatches; }); - const handleDelete = () => { - const updatedKeyMerits = keyMerits.filter((keyMerits) => keyMerits.id !== actionId); - - setTimeout(() => { - setSponser(updatedKeyMerits); - setDeleteAlert(false); - setIsLoading(false); - }, 100); - setIsLoading(true); + const handleDelete = async () => { + setIsBtnLoading(true) + try { + const res = await deleteKeyMerits(actionId) + if(res?.data?.statusCode === 200){ + toast({ + render: () => , + }); + setIsBtnLoading(false) + setDeleteAlert(false) + } + } catch (error) { + + } }; - const [ extractedArray, setExtractedArray ] = useState(filteredData?.map((item, index) => ({ + const extractedArray = filteredData?.map((item, index) => ({ id: item.id, "Sr.no": ( { {index + 1} ), - "Title": ( + Title: ( { fontWeight={"500"} className="d-flex align-items-center web-text-small" > - {item.title} + {item.meritsHeader} ), "Sub title": ( - {item.subTitle} + {item.meritsDescription} ), - "Icon": ( - - {item.icon} - + Icon: ( + + // https://admin.tanami.betadelivery.com/public/icons/linkedin.png ), Action: ( - - + {/* { rounded={"sm"} size={"xs"} > - + - + */} { // transition={"0.5s all"} color="blue.400" rounded={"sm"} + onClick={() => { + setActionId(item?.id); + onEditOpen(); + }} size={"xs"} > @@ -180,10 +202,11 @@ const KeyMerits = ({enableNextTab, index}) => { ), - }))); + })); - - return ( + return isLoading ? ( + + ) : ( { value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} /> + + + + + + + + + { setMouseEnteredId={setMouseEnteredId} setMouseEntered={setMouseEntered} /> - - - + + + setDeleteAlert(false)} isOpen={deleteAlert} - message={"Are you sure you want to delete sponers?"} + message={"Are you sure you want to delete key merit?"} alertHandler={handleDelete} - isLoading={isLoading} + isLoading={isBtnLoading} /> ); diff --git a/src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx b/src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx new file mode 100644 index 0000000..e6f87fe --- /dev/null +++ b/src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx @@ -0,0 +1,143 @@ +import React, { useState } from "react"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + useDisclosure, + Button, + Box, + Text, + Image, + HStack, +} from "@chakra-ui/react"; + +import { AddIcon, DragHandleIcon } from "@chakra-ui/icons"; +import DataTable from "../../../Components/DataTable/DataTable"; + +const SetDisplayOrder = ({data,}) => { + const { isOpen, onOpen, onClose } = useDisclosure(); + + const tableHeadRow = ["", "Title", "Icon", ]; + + console.log(data); + + + const [ extractedArray, setExtractedArray] = useState(data?.map((item, index) => ({ + id:item?.id, + "": ( + + + + ), + Title: ( + + + {item?.meritsHeader} + + ), + Icon: ( + + + // https://admin.tanami.betadelivery.com/public/icons/linkedin.png + ), + }))) + + console.log(extractedArray); + + + + + + + + + return ( + <> + + + + + + Set Display Order + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default SetDisplayOrder; diff --git a/src/Pages/IO_Management/EditIO/EditIO.jsx b/src/Pages/IO_Management/EditIO/EditIO.jsx index 8057e93..63ee253 100644 --- a/src/Pages/IO_Management/EditIO/EditIO.jsx +++ b/src/Pages/IO_Management/EditIO/EditIO.jsx @@ -236,7 +236,6 @@ const EditIO = ({ isOpen, onClose }) => { ]; const onSubmit = (data) => { - console.log(data); // Handle form submission onClose(); }; diff --git a/src/Pages/IO_Management/EditIO/InvestmentEdit.jsx b/src/Pages/IO_Management/EditIO/InvestmentEdit.jsx index 21106f0..d2f4351 100644 --- a/src/Pages/IO_Management/EditIO/InvestmentEdit.jsx +++ b/src/Pages/IO_Management/EditIO/InvestmentEdit.jsx @@ -22,7 +22,6 @@ import { const { create, setCreate } = useContext(GlobalStateContext); const [file, setFile] = useState(null); const filteredObject = create?.find((item) => item?.id === id) - console.log(filteredObject?.Type); const { control, watch, @@ -35,7 +34,6 @@ import { resolver: yupResolver(investmentDocSchema), }); - console.log(filteredObject); useEffect(() => { if (filteredObject) { @@ -51,7 +49,6 @@ import { const onSubmit = (data) => { // setValue('Type',data.Type[0]?.type) -console.log(data); const updatedCreate = create.map((item) => item.id === id ? { ...item, ...data } : item ); diff --git a/src/Pages/IO_Management/EditViewIO.jsx b/src/Pages/IO_Management/EditViewIO.jsx index a6eeafa..8559255 100644 --- a/src/Pages/IO_Management/EditViewIO.jsx +++ b/src/Pages/IO_Management/EditViewIO.jsx @@ -218,7 +218,6 @@ const EditViewIO = () => { // setValue("banner_image", selectedBannerImageData); data.banner_image = selectedBannerImageData; const updatedData = { ...data, status: "Available" }; - console.log(selectedBannerImageData); setInvestment([...investment, updatedData]); navigate("/view-io"); reset(); diff --git a/src/Pages/IO_Management/IOArtifactsAdd.jsx b/src/Pages/IO_Management/IOArtifactsAdd.jsx index a0367f9..1f32600 100644 --- a/src/Pages/IO_Management/IOArtifactsAdd.jsx +++ b/src/Pages/IO_Management/IOArtifactsAdd.jsx @@ -43,7 +43,6 @@ import { const onSubmit = (data) => { - console.log(data); setSponser([ { ...data, @@ -56,10 +55,6 @@ import { }; const handleSave = () => { - console.log({ - fileName: fileName, - file:file - }); setAlert(false) onClose() diff --git a/src/Pages/IO_Management/InputComponents.jsx b/src/Pages/IO_Management/InputComponents.jsx index 20f6fa4..17a8273 100644 --- a/src/Pages/IO_Management/InputComponents.jsx +++ b/src/Pages/IO_Management/InputComponents.jsx @@ -115,7 +115,6 @@ const InputComponents = () => { // setValue("banner_image", selectedBannerImageData); data.banner_image = selectedBannerImageData; const updatedData = { ...data, status: "Available" }; - console.log(selectedBannerImageData); setInvestment([...investment, updatedData]); navigate("/view-io"); reset(); diff --git a/src/Pages/IO_Management/InvestmentDocuments.jsx b/src/Pages/IO_Management/InvestmentDocuments.jsx index 9b36cd1..3f59f23 100644 --- a/src/Pages/IO_Management/InvestmentDocuments.jsx +++ b/src/Pages/IO_Management/InvestmentDocuments.jsx @@ -19,13 +19,14 @@ import { useForm } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; import CustomAlertDialog from "../../Components/CustomAlertDialog"; import { v4 as uuidv4 } from 'uuid'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import { GrDocumentPdf } from "react-icons/gr"; import { FaRegFileAlt } from "react-icons/fa"; import { TbFileTypeDocx } from "react-icons/tb"; import { AiOutlineFileGif } from "react-icons/ai"; import GlobalStateContext from "../../Contexts/GlobalStateContext"; import InvestmentDocument from "./CreateIO/InvestmentDocument"; +import { useCreateInvestmentDocumentsMutation } from "../../Services/investment.documents.service"; export const bytesToMB = (bytes) => { if (bytes === 0) return "0 MB"; @@ -54,10 +55,23 @@ export const investmentDocSchema = yup.object().shape({ fileName: yup.string().required("File name is required"), }); -const InvestmentDocuments = ({ id, isOpen, onClose, firstField, create, setCreate }) => { +const InvestmentDocuments = ({ isOpen, onClose, firstField, create, setCreate }) => { + const params = useParams() + const [file, setFile] = useState(null); const [alert, setAlert] = useState(false); + + + + + + // =====================[ variables ] + const id = params?.id + + // =====================[ RTK Api calls ] + const [ createInvestmentDocument ] = useCreateInvestmentDocumentsMutation() + const navigate = useNavigate(); const { @@ -68,27 +82,38 @@ const InvestmentDocuments = ({ id, isOpen, onClose, firstField, create, setCreat resolver: yupResolver(investmentDocSchema), }); - // const onSubmit = (data) => { - // console.log(data); - // setFile(data.document[0]); - // // Additional code for handling form submission - // }; + const onSubmit = async (data) => { + // console.log(data); + const formData = new FormData(); + formData.append('documentName', data.fileName); + formData.append('document', data?.document[0]); - const onSubmit = (data) => { - console.log(data); - setFile(data.document[0]); + // Log FormData entries + for (let [key, value] of formData.entries()) { + console.log(`${key}:`, value); + } + + try { + const res = await createInvestmentDocument({ data: formData, id }) + console.log(res); + + } catch (error) { + console.log(error); + } - const newDocument = { - ...data, - document: data.document[0].name, // Store the document name - status: true, - id: uuidv4(), - createdAt: new Date().toISOString(), - Type:getFileIcon(file.type) - }; - setCreate((prevCreate) => [...prevCreate, newDocument]); - onClose() + + // const newDocument = { + // ...data, + // document: data.document[0].name, // Store the document name + // status: true, + // id: uuidv4(), + // createdAt: new Date().toISOString(), + // Type:getFileIcon(file.type) + // }; + + // setCreate((prevCreate) => [...prevCreate, newDocument]); + // onClose() }; const handleFileChange = (event) => { diff --git a/src/Pages/IO_Management/KeyMeritsAdd.jsx b/src/Pages/IO_Management/KeyMeritsAdd.jsx index 2de28e9..32d0460 100644 --- a/src/Pages/IO_Management/KeyMeritsAdd.jsx +++ b/src/Pages/IO_Management/KeyMeritsAdd.jsx @@ -1,150 +1,204 @@ import { - Box, - Button, - Drawer, - DrawerBody, - DrawerCloseButton, - DrawerContent, - DrawerFooter, - DrawerHeader, - DrawerOverlay, - FormControl, - FormLabel, - Input, - InputGroup, - Stack, - } from "@chakra-ui/react"; - import * as yup from "yup"; - import React, { useContext, useEffect, useRef, useState } from "react"; - import FormInputMain from "../../Components/FormInputMain"; - import { useForm } from "react-hook-form"; - import { yupResolver } from "@hookform/resolvers/yup"; - import CustomAlertDialog from "../../Components/CustomAlertDialog"; - - export const investmentDoct = yup.object().shape({ - type: yup.string().required("Sponser name is required"), - document: yup.string().required("Sponser name is required"), - fileName: yup.string().required("Mobile no is required"), + Box, + Button, + Drawer, + DrawerBody, + DrawerCloseButton, + DrawerContent, + DrawerFooter, + DrawerHeader, + DrawerOverlay, + FormControl, + FormErrorMessage, + FormLabel, + Input, + Stack, + useToast, +} from "@chakra-ui/react"; +import React, { useRef, useState } from "react"; +import { useForm, Controller } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import CustomAlertDialog from "../../Components/CustomAlertDialog"; +import { useCreateKeyMeritsMutation } from "../../Services/io.service"; +import * as yup from "yup"; +import ToastBox from "../../Components/ToastBox"; + +const keyMeritsSchema = yup.object().shape({ + meritsHeader: yup.string().required("Title is required"), + meritsDescription: yup.string().required("Sub title is required"), + iconImage: yup.mixed().required("Icon is required"), // Adjust based on file or string +}); + +const KeyMeritsAdd = ({ isOpen, onClose, firstField, id }) => { + const toast = useToast() + const [alert, setAlert] = useState(false); + const [createKeyMerits] = useCreateKeyMeritsMutation(); + const [isLoading, setIsLoading] = useState(false); + + const { + control, + reset, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(keyMeritsSchema), + defaultValues: { + meritsHeader: "", + meritsDescription: "", + iconImage: null, + }, }); - - const KeyMeritsAdd = ({ id, isOpen, onClose, firstField }) => { - const [file, setFile] = useState(""); - const [fileName, setFileName] = useState(""); - const [alert, setAlert] = useState(false); - - const { - control, - handleSubmit, - formState: { errors }, - } = useForm({ - resolver: yupResolver(investmentDoct), - }); - - - - const onSubmit = (data) => { - console.log(data); - setSponser([ - { - ...data, - status: true, - id: uuidv4(), - createdAt: new Date().toISOString(), - }, - ...investmentDoct, - ]); - }; - - const handleSave = () => { - console.log({ - fileName: fileName, - file:file - }); - setAlert(false) - onClose() - + + const onSubmit = async (data) => { + setIsLoading(true); + try { + const formData = new FormData(); + formData.append("meritsHeader", data.meritsHeader); + formData.append("meritsDescription", data.meritsDescription); + if (data.iconImage && data.iconImage instanceof File) { + formData.append("iconImage", data.iconImage); + } + const res = await createKeyMerits({ data: formData, id }); + if (res?.data?.statusCode === 201) { + toast({ + render: () => , + }); + setAlert(false); + onClose(); + setIsLoading(false); + reset() + return + } + if(res?.error?.data?.code === 400){ + toast({ + render: () => , + }); + setAlert(false); + onClose(); + setIsLoading(false); + reset() + return + } + } catch (error) { + if (error) { + toast({ + render: () => , + }); + } + setIsLoading(false); + setAlert(false); + onClose(); + reset() } - - return ( - <> - - - - - Key Merits - - - - - Title - setFileName(e.target.value)} - fontSize={"sm"} - type="text" - size={"sm"} - /> - - - Sub Title - setFileName(e.target.value)} - fontSize={"sm"} - type="textarea" - size={"sm"} - /> - - - Icon - setFile(e.target.value)} - fontSize={"sm"} - type="file" - className="form-control" - size={"sm"} - /> - - - - - - - - - - - setAlert(false)} - alertHandler={handleSave} - message={"Are you sure you want to add this document?"} - /> - - ); + reset() }; - - export default KeyMeritsAdd; - \ No newline at end of file + + const handleSave = () => { + handleSubmit(onSubmit)(); + }; + + return ( + <> + + + + + Key Merits + + + + + Title + ( + + )} + /> + + {errors.meritsHeader?.message} + + + + Sub Title + ( + + )} + /> + + {errors.meritsDescription?.message} + + + + Icon + ( + { + onChange(e.target.files[0]); + }} + onBlur={onBlur} + fontSize={"sm"} + size={"sm"} + /> + )} + /> + + {errors.iconImage?.message} + + + + + + + + + + + + setAlert(false)} + alertHandler={handleSave} + message={"Are you sure you want to add this key merit?"} + isLoading={isLoading} + /> + + ); +}; + +export default KeyMeritsAdd; diff --git a/src/Pages/IO_Management/KeyMeritsEdit.jsx b/src/Pages/IO_Management/KeyMeritsEdit.jsx new file mode 100644 index 0000000..9b864ea --- /dev/null +++ b/src/Pages/IO_Management/KeyMeritsEdit.jsx @@ -0,0 +1,216 @@ +import { + Box, + Button, + Drawer, + DrawerBody, + DrawerCloseButton, + DrawerContent, + DrawerFooter, + DrawerHeader, + DrawerOverlay, + FormControl, + FormErrorMessage, + FormLabel, + Input, + Stack, + useToast, +} from "@chakra-ui/react"; +import React, { useEffect, useRef, useState } from "react"; +import { useForm, Controller } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import CustomAlertDialog from "../../Components/CustomAlertDialog"; +import * as yup from "yup"; +import ToastBox from "../../Components/ToastBox"; +import { useUpdateKeyMeritsMutation } from "../../Services/io.service"; + +const keyMeritsSchema = yup.object().shape({ + meritsHeader: yup.string().required("Title is required"), + meritsDescription: yup.string().required("Sub title is required"), + iconImage: yup.mixed().required("Icon is required"), // Adjust based on file or string +}); + +const KeyMeritsEdit = ({ isOpen, onClose, firstField, id, actionId, data }) => { + console.log(actionId); + const toast = useToast() + const [alert, setAlert] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [ editKeyMerits ] = useUpdateKeyMeritsMutation() + + const found = data?.find((item)=> item?.id === actionId) + console.log(found); + + const { + control, + reset, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(keyMeritsSchema), + }); + // useEffect to reset the form when `found` changes + useEffect(() => { + if (found) { + reset({ + meritsHeader: found?.meritsHeader, + meritsDescription: found?.meritsDescription, + iconImage: null, + }); + } + }, [found, reset]); + + const onSubmit = async (data) => { + setIsLoading(true); + try { + const formData = new FormData(); + formData.append("meritsHeader", data.meritsHeader); + formData.append("meritsDescription", data.meritsDescription); + if (data.iconImage && data.iconImage instanceof File) { + formData.append("iconImage", data.iconImage); + } + + const id = actionId + + const res = await editKeyMerits({ data: formData, id }); + if (res?.data?.statusCode === 201) { + toast({ + render: () => , + }); + setAlert(false); + onClose(); + setIsLoading(false); + reset() + return + } + if(res?.error?.data?.code === 400){ + toast({ + render: () => , + }); + setAlert(false); + onClose(); + setIsLoading(false); + reset() + return + } + } catch (error) { + if (error) { + toast({ + render: () => , + }); + } + setIsLoading(false); + setAlert(false); + onClose(); + reset() + } + reset() + }; + + const handleSave = () => { + handleSubmit(onSubmit)(); + }; + + return ( + <> + + + + + Edit Key Merits + + + + + Title + ( + + )} + /> + + {errors.meritsHeader?.message} + + + + Sub Title + ( + + )} + /> + + {errors.meritsDescription?.message} + + + + Icon + ( + { + onChange(e.target.files[0]); + }} + onBlur={onBlur} + fontSize={"sm"} + size={"sm"} + /> + )} + /> + + {errors.iconImage?.message} + + + + + + + + + + + + setAlert(false)} + alertHandler={handleSave} + message={"Are you sure you want to add this key merit?"} + isLoading={isLoading} + /> + + ); +}; + +export default KeyMeritsEdit; diff --git a/src/Pages/IO_Management/ViewIO/InvestmentView.jsx b/src/Pages/IO_Management/ViewIO/InvestmentView.jsx index 4adfb43..102426c 100644 --- a/src/Pages/IO_Management/ViewIO/InvestmentView.jsx +++ b/src/Pages/IO_Management/ViewIO/InvestmentView.jsx @@ -16,10 +16,8 @@ import React, { useContext } from "react"; import GlobalStateContext from "../../../Contexts/GlobalStateContext"; const InvestmentView = ({ isOpen, onClose, secondField, id }) => { - console.log(id); const { create, setCreate } = useContext(GlobalStateContext); const filteredObject = create?.find((item) => item?.id === id) - console.log(filteredObject); return ( { const [statusFilter, setStatusFilter] = useState("all"); - console.log(investment); useEffect(() => { // Simulate loading @@ -70,7 +69,7 @@ const ExchangeRate = () => { ); return ( - + {/* All */} diff --git a/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx b/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx index 6ca7394..1d5546e 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx @@ -35,6 +35,8 @@ import Pagination from "../../../Components/Pagination"; import GlobalStateContext from "../../../Contexts/GlobalStateContext"; import CustomAlertDialog from "../../../Components/CustomAlertDialog"; import ToastBox from "../../../Components/ToastBox"; +import { useGetIOsQuery } from "../../../Services/io.service"; +import { TABLE_PAGINATION } from "../../../Constants/Paginations"; // import { debounce } from "./AddIOCharges"; const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter @@ -42,130 +44,124 @@ const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date const ViewIOTable = () => { const navigate = useNavigate(); const toast = useToast(); - const { IODetails, setIODetails, slideFromRight } = useContext(GlobalStateContext); + const { IODetails, setIODetails, slideFromRight } = + useContext(GlobalStateContext); const [searchTerm, setSearchTerm] = useState(""); - const [isLoading, setIsLoading] = useState(true); + const [statusFilter, setStatusFilter] = useState("all"); + // const [isLoading, setIsLoading] = useState(true); const [deleteAlert, setDeleteAlert] = useState(false); const [actionId, setActionId] = useState(false); const [mouseEntered, setMouseEntered] = useState(false); const [mouseEnteredId, setMouseEnteredId] = useState(""); + // ===============================[ Paginations ] + const [pageSize, setPageSize] = useState(TABLE_PAGINATION?.size); + const [currentPage, setCurrentPage] = useState(1); - useEffect(() => { - // Simulate loading - const timer = setTimeout(() => { - setIsLoading(false); - }, 1500); + // ===============================[ RTK Api calls ] + const { + data, + isLoading, + error, + } = useGetIOsQuery({ page: currentPage, size: pageSize }); + console.log(data); - // Cleanup the timer on component unmount - return () => clearTimeout(timer); - }, []); - - // ====================================================[Table Setup]================================================================ + // ===============================[ Table Header ] const tableHeadRow = [ - // "Sr.no", - "Deal ID", + "IO ID", "IO Name", - "Sponsorer Name", - "IO status", + "Sponsorer", + "Investment Type", + "Goal Amount", + "Holding Period", + "IO Status", "Action", ]; - // const handleUpdateStatus = debounce((id) => { - // setInvestmentType((prevInvestmentType) => - // prevInvestmentType.map((investmentType) => - // investmentType.id === id - // ? { ...investmentType, status: !investmentType.status } - // : investmentType - // ) - // ); - // toast({ - // render: () => , - // }); - // }, 300); - - console.log(IODetails); // ====================================================[Table Filter]================================================================ - const filteredData = IODetails.filter((item) => { + const filteredData = data?.data?.rows?.filter((item) => { // Filter by name (case insensitive) - const name = item.ioName; + const name = item.investmentNameEnglish; const searchLower = searchTerm.toLowerCase(); const nameMatches = name.toLowerCase().includes(searchLower); // Filter by status - // const status = item.status; - // const statusLower = status ? "active" : "inactive"; + const status = item?.ioStatus?.statusAdmin; + const statusMatches = + statusFilter === "all" || + (status && status.toLowerCase() === statusFilter.toLowerCase()); - // const statusMatches = - // statusFilter === "all" || - // (statusFilter === "active" && status === true) || - // (statusFilter === "inactive" && status === false); - - return nameMatches; + return nameMatches && statusMatches; }); const extractedArray = filteredData?.map((item, index) => ({ - "Sr.no": ( - - {index + 1} - - ), - "Deal ID": ( - - {item.id} - + "IO ID": ( + + + {item.io_id ? item.io_id : "---"} + + ), "IO Name": ( - {item.ioName} + {item.investmentNameEnglish ? item.investmentNameEnglish : "---"} ), - "Sponsorer Name": ( + Sponsorer: ( - {item.sponserName} + {item.sponsor ? item.sponsor : "---"} ), - "IO status": ( + "Investment Type": ( + + + {item.investmentType ? item.investmentType : "---"} + + + ), + "Goal Amount": ( + + + {item.goalAmount ? item.goalAmount : "---"} + + + ), + "Holding Period": ( + + + {item.holdingPeriod ? item.holdingPeriod : "---"} + + + ), + "IO Status": ( - {item.ioStatus} + {item.ioStatus?.statusAdmin} ), @@ -194,8 +190,6 @@ const ViewIOTable = () => { - - { ), })); - const handleDelete = () => { - const upDatedIO = IODetails.filter((viewIO) => viewIO.id !== actionId); + const handleDelete = () => {}; - setTimeout(() => { - setIODetails(upDatedIO); - setDeleteAlert(false); - setIsLoading(false); - }, 100); - setIsLoading(true); - }; + // console.log(IOisLoading); return ( @@ -279,6 +266,26 @@ const ViewIOTable = () => { /> + {/* diff --git a/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx b/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx index 9552ee0..fd83acf 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx @@ -55,7 +55,7 @@ const ViewIOdata = () => { ]; return ( - + {/* navigate(-1)} diff --git a/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx b/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx index 5318087..7449244 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx @@ -46,9 +46,6 @@ const ViewIOdataHeader = () => { const { isOpen, onOpen, onClose } = useDisclosure(); const btnRef = useRef(); const { IODetails } = useContext(GlobalStateContext); - const foundObject = IODetails?.find( - (item) => item?.id.toString() === id?.toString() - ); const { isOpen: isInvestmentOpen, @@ -125,7 +122,7 @@ const ViewIOdataHeader = () => { position={"relative"} > - {/* {foundObject?.ioName}/ */} + {/* {IODetails?.ioName}/ */} @@ -144,7 +141,7 @@ const ViewIOdataHeader = () => { IO Name - {id ? foundObject?.ioName : "---"} + {IODetails?.investmentNameEnglish ? IODetails?.investmentNameEnglish : "---"} @@ -153,7 +150,7 @@ const ViewIOdataHeader = () => { Sponsorer Name - {id ? foundObject?.sponserName : "---"} + {IODetails?.sponsor ? IODetails?.sponsor : "---"} @@ -169,21 +166,21 @@ const ViewIOdataHeader = () => { pe={4} textTransform={"none"} color={ - foundObject?.ioStatus === "Open" + IODetails?.ioStatus?.statusAdmin === "Draft" ? "#00B69B" - : foundObject?.ioStatus === "Pending" + : IODetails?.ioStatus?.statusAdmin === "Pending" ? "#6226EF" : "#EF3826" } colorScheme={ - foundObject?.ioStatus === "Open" + IODetails?.ioStatus?.statusAdmin === "Draft" ? "green" - : foundObject?.ioStatus === "Pending" + : IODetails?.ioStatus?.statusAdmin === "Pending" ? "purple" : "red" } > - {id ? foundObject?.ioStatus : "---"} + {IODetails?.ioStatus?.statusAdmin ? IODetails?.ioStatus?.statusAdmin : "---"} diff --git a/src/Pages/IO_Management/ViewIO/ViewIOdetails.jsx b/src/Pages/IO_Management/ViewIO/ViewIOdetails.jsx index cd75a4d..a7455cf 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOdetails.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOdetails.jsx @@ -1,5 +1,5 @@ import { Box, Button } from "@chakra-ui/react"; -import React, { useContext } from "react"; +import React, { useContext, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useForm } from "react-hook-form"; @@ -7,106 +7,265 @@ import GlobalStateContext from "../../../Contexts/GlobalStateContext"; import DataTable from "../../../Components/DataTable/DataTable"; import FormInputView from "../../../Components/FormInputView"; import FullscreenLoaders from "../../../Components/Loaders/FullscreenLoaders"; +import { useGetIOByIdQuery } from "../../../Services/io.service"; +import * as yup from "yup"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { formatDate } from "../../Master/Sponser/Sponsers"; + + +const schema = yup.object().shape({ + investmentNameEnglish: yup + .string() + .required("IO name in English is required") + .min(3, "IO name in English must be at least 3 characters long") + .max(50, "IO name in English must be at most 50 characters long"), + + investmentNameArabic: yup + .string() + .required("IO name in Arabic is required") + .min(3, "IO name in Arabic must be at least 3 characters long") + .max(50, "IO name in Arabic must be at most 50 characters long"), + + descriptionEnglish: yup + .string() + .required("Description in English is required") + .min(10, "Description in English must be at least 10 characters long") + .max(500, "Description in English must be at most 500 characters long"), + + descriptionArabic: yup + .string() + .required("Description in Arabic is required") + .min(10, "Description in Arabic must be at least 10 characters long") + .max(500, "Description in Arabic must be at most 500 characters long"), + + goalAmount: yup + .number() + .required("Goal amount is required") + .positive("Goal amount must be a positive number") + .min(1, "Goal amount must be at least 1"), + + closingDate: yup + .date() + .required("Closing date is required") + .min(new Date(), "Closing date cannot be in the past"), + + holdingPeriod: yup + .number() + .required("Holding period is required") + .positive("Holding period must be a positive number") + .min(1, "Holding period must be at least 1 month"), + + // minInvestmentAmount: yup + // .number() + // .required("Minimum investment is required") + // .positive("Minimum investment must be a positive number") + // .min(1, "Minimum investment must be at least 1"), + + ISIN: yup.string(), + + InvestmentDetails: yup.string(), + + comment: yup.string(), + + expectedReturn: yup + .number() + .required("Expected return is required") + .positive("Expected return must be a positive number") + .min(0.01, "Expected return must be at least 0.01"), +}); const ViewIOdetails = () => { const navigate = useNavigate() const params = useParams(); - const { IODetails } = useContext(GlobalStateContext); - console.log(IODetails); - const { reset } = useForm(); // assuming react-hook-form + const id = params?.id + const { IODetails, setIODetails } = useContext(GlobalStateContext); - const id = params?.id; - console.log(id); - const foundObject = IODetails?.find( - (item) => item?.id.toString() === id.toString() - ); + const { + data: IObyID, + isLoading: IObyIDisLoading, + error: IObyIDerror, + } = useGetIOByIdQuery(id, { skip: !id }); - const formFields = [ - { - label: "IO Name", - value: foundObject?.ioName, - width: "49%", - section: "", - }, - { - label: "IO Name (Arabic)", - value: foundObject?.ioNameArabic, - width: "49%", - section: "", - }, - { - label: "Description", - value: foundObject?.discription, - width: "49%", - section: "", - }, - { - label: "Description (Arabic)", - value: foundObject?.discriptionArabic, - width: "49%", - section: "", - }, - { - label: "Investment Type", - value: foundObject?.typeName, - width: "32.3%", - section: "", - }, - // { - // label: "Investment Type (Arabic)", - // value: foundObject?.typeName, - // width: "49%", - // section: "", - // }, - { - label: "Sponsorer Name", - value: foundObject?.sponserName, - width: "32.3%", - section: "", - }, - { - label: "Goal Amount", - value: foundObject?.goalAmount, - width: "32.3%", - section: "", - }, - { - label: "Minimum Investment Amount", - value: foundObject?.minInvestment, - width: "32.3%", - section: "", - }, - { - label: "Maximum Investment Amount", - value: foundObject?.maxInvestment, - width: "32.3%", - section: "", - }, - { - label: "Holding Period", - value: foundObject?.holdingPeriod, - width: "32.3%", - section: "", - }, - { - label: "Expected Return Estimated", - value: foundObject?.expectedReturn, - width: "32.3%", - section: "", - }, - { - label: "Closing Date", - value: foundObject?.closingDate, - width: "32.3%", - section: "", - }, - // { - // label: "IO Status", - // value: foundObject?.ioStatus, - // width: "32.3%", - // section: "", - // }, - ]; + + + + + // ======================[ Validator filter ] + const { + control, + reset, + setValue, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: yupResolver(schema), + }); + useEffect(() => { + + setIODetails(IObyID?.data); + if (IObyID?.data) { + reset({ + investmentNameEnglish: IObyID?.data?.investmentNameEnglish, + investmentNameArabic: IObyID?.data?.investmentNameArabic, + descriptionEnglish: IObyID?.data?.descriptionEnglish, + descriptionArabic: IObyID?.data?.descriptionArabic, + goalAmount: IObyID?.data?.goalAmount, + closingDate: IObyID?.data?.closingDate, + holdingPeriod: IObyID?.data?.holdingPeriod, + ISIN: IObyID?.data?.ISIN, + comment: IObyID?.data?.comment, + expectedReturn: IObyID?.data?.expectedReturn, + investmentType_xid: IObyID?.data?.investmentType_xid, + investmentType_xid: IObyID?.data?.investmentType_xid, + InvestmentDetails: IObyID?.data?.InvestmentDetails, + minInvestmentAmount: IObyID?.data?.minInvestmentAmount, + }); + } + }, [id, IObyID]); + + + //=======================[ Editor ] + const formFields = [ + { + label: "IO Name", + value: IObyID?.data?.investmentNameEnglish ? IObyID?.data?.investmentNameEnglish : "---", + name: "investmentNameEnglish", + type: "text", + section: " ", + width: "49%", + isRequired: true, + }, + { + label: "IO Name (Arabic)", + name: "investmentNameArabic", + type: "text", + value: IObyID?.data?.investmentNameArabic ? IObyID?.data?.investmentNameArabic : "---", + isRequired: true, + arabic: true, + section: " ", + width: "49%", + }, + { + label: "Description", + name: "descriptionEnglish", + value: IObyID?.data?.descriptionEnglish ? IObyID?.data?.descriptionEnglish : "---", + type: "textarea", + isRequired: true, + section: " ", + width: "49%", + }, + { + label: "Description (Arabic)", + name: "descriptionArabic", + value: IObyID?.data?.descriptionArabic ? IObyID?.data?.descriptionArabic : "---", + type: "textarea", + isRequired: true, + arabic: true, + section: " ", + width: "49%", + }, + + { + label: "Goal Amount", + placeHolder: "$00.00", + value: IObyID?.data?.goalAmount ? IObyID?.data?.goalAmount : "---", + name: "goalAmount", + type: "number", + isRequired: true, + section: " ", + width: "32.3%", + }, + { + label: "Closing Date", + name: "closingDate", + type: "date", + isRequired: true, + value: IObyID?.data?.closingDate ? formatDate(IObyID?.data?.closingDate) : "---", + section: " ", + width: "32.3%", + }, + { + label: "Holding Period", + name: "holdingPeriod", + value: IObyID?.data?.holdingPeriod?IObyID?.data?.holdingPeriod:"---", + type: "number", + isRequired: true, + placeHolder: "1Y", + section: " ", + width: "32.3%", + }, + { + label: "Minimum Investment Amount", + placeHolder: "$00.00", + name: "minInvestmentAmount", + value: IObyID?.data?.minInvestmentAmount?IObyID?.data?.minInvestmentAmount:'---', + type: "number", + isRequired: true, + section: " ", + width: "32.3%", + }, + { + label: "ISIN", + placeHolder: "$00.00", + name: "ISIN", + value: IObyID?.data?.ISIN?IObyID?.data?.ISIN:"---", + type: "number", + section: " ", + width: "32.3%", + }, + { + label: "Investment Details", + placeHolder: "", + name: "InvestmentDetails", + value: IObyID?.data?.InvestmentDetails?IObyID?.data?.InvestmentDetails:"---", + type: "text", + section: " ", + width: "32.3%", + }, + { + label: "Expected Return Estimated", + placeHolder: "$00.00", + name: "expectedReturn", + type: "number", + isRequired: true, + value: IObyID?.data?.expectedReturn?IObyID?.data?.expectedReturn:'---', + section: " ", + width: "32.3%", + }, + + { + label: "Investment Type", + placeHolder: "Select option", + value: IObyID?.data?.investmentType_xid?IObyID?.data?.investmentType_xid:"---", + name: "investmentType_xid", + type: "select", + isRequired: true, + section: " ", + width: "32.3%", + }, + { + label: "Sponsorer Name", + placeHolder: "Select option", + name: "sponsor_xid", + type: "select", + // options: sponserNameOption, + value: IObyID?.data?.sponsor_xid?IObyID?.data?.sponsor_xid:"---", + section: " ", + isRequired: true, + width: "32.3%", + }, + + { + label: "Comment", + placeHolder: "Enter comment here", + name: "comment", + type: "textarea", + value: IObyID?.data?.comment?IObyID?.data?.comment:"---", + section: " ", + width: "100%", + }, + ]; + const groupedFields = formFields.reduce((groups, field) => { const { section } = field; @@ -117,11 +276,11 @@ const ViewIOdetails = () => { return groups; }, {}); - if (!foundObject) { + if (!IObyID?.data) { return ; } - return + return ; }; diff --git a/src/Pages/Master/InvestmentType/AddInvestmentType.jsx b/src/Pages/Master/InvestmentType/AddInvestmentType.jsx index dff87e7..e2777f9 100644 --- a/src/Pages/Master/InvestmentType/AddInvestmentType.jsx +++ b/src/Pages/Master/InvestmentType/AddInvestmentType.jsx @@ -96,7 +96,6 @@ const AddInvestmentType = () => { setSelectedOtherImageData(newSelectedImageData); }; - console.log(selectedBannerImageData); const formFields = [ { @@ -152,7 +151,6 @@ const AddInvestmentType = () => { ]); navigate("/investment-type"); - console.log(investmentType); }; return ( diff --git a/src/Pages/Master/InvestmentType/EditInvestmentType.jsx b/src/Pages/Master/InvestmentType/EditInvestmentType.jsx index 15f7970..fec77d0 100644 --- a/src/Pages/Master/InvestmentType/EditInvestmentType.jsx +++ b/src/Pages/Master/InvestmentType/EditInvestmentType.jsx @@ -27,13 +27,10 @@ const EditInvestmentType = () => { }); useEffect(() => { - console.log(investmentType); const id = params?.id; - console.log(id); // Ensure id is compared correctly const found = investmentType.find((item) => item?.id.toString() === id.toString()); - console.log(found?.swiftCode); setFoundObject(found); if (found) { diff --git a/src/Pages/Master/InvestmentType/InvestmentType.jsx b/src/Pages/Master/InvestmentType/InvestmentType.jsx index 1d123b3..85b19b7 100644 --- a/src/Pages/Master/InvestmentType/InvestmentType.jsx +++ b/src/Pages/Master/InvestmentType/InvestmentType.jsx @@ -37,6 +37,7 @@ import ToastBox from "../../../Components/ToastBox"; import { debounce } from "./AddInvestmentType"; import DataTable from "../../../Components/DataTable/DataTable"; import SwitchButton from "../../../Components/SwitchButton"; +import { useGetInvestmentTypesQuery } from "../../../Services/investment.type.service"; const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter @@ -53,6 +54,17 @@ const InvestmentType = () => { const [mouseEnteredId, setMouseEnteredId] = useState(""); const [isSwitchOn, setIsSwitchOn] = useState(false); + + const { + data: investmentTypes, + isLoading: investmentTypesLoading, + error, + } = useGetInvestmentTypesQuery({ page: 1, size: 10 }) + + console.log(investmentTypes); + + + useEffect(() => { // Simulate loading const timer = setTimeout(() => { @@ -68,7 +80,6 @@ const InvestmentType = () => { "Sr.no", "Investment Type", "Description", - "Status", "Action", ]; diff --git a/src/Pages/Master/Sponser/AddSponser.jsx b/src/Pages/Master/Sponser/AddSponser.jsx index f368813..df43814 100644 --- a/src/Pages/Master/Sponser/AddSponser.jsx +++ b/src/Pages/Master/Sponser/AddSponser.jsx @@ -40,6 +40,7 @@ export function debounce(func, delay) { const AddSponser = () => { const params = useParams(); + const id = params?.id const navigate = useNavigate(); const [bannerImageData, setBannerImageData] = useState(null); const [selectedBannerImageData, setSelectedBannerImageData] = useState(null); @@ -49,7 +50,9 @@ const AddSponser = () => { const { sponser, setSponser } = useContext(GlobalStateContext); const [createSponser] = useCreateSponserMutation(); const [updateSponser] = useUpdateSponserMutation(); - const { data, error, isLoading } = useGetSponserByIdQuery(params?.id); + + + const { data, error, isLoading } = useGetSponserByIdQuery(id, { skip: !id }); const { control, @@ -62,21 +65,20 @@ const AddSponser = () => { console.log(errors); - useEffect(() => { - if (data) { - reset({ - sponsorName: data?.data?.sponsorName, - mobileNo: data?.data?.mobileNo, - sponsorNameArabic: data?.data?.sponsorNameArabic, - }); - } - }, [data, reset]); + // useEffect(() => { + // if (data) { + // reset({ + // sponsorName: data?.data?.sponsorName, + // mobileNo: data?.data?.mobileNo, + // sponsorNameArabic: data?.data?.sponsorNameArabic, + // }); + // } + // }, [data, reset]); if (isLoading) { return ; } - // console.log(selectedBannerImageData); const formFields = [ { @@ -167,7 +169,6 @@ const AddSponser = () => { const id = params?.id try { await createSponser(data).then((response) => { - console.log(response); if (response?.data?.statusCode) { toast({ render: () => , diff --git a/src/Pages/Master/Sponser/Sponsers.jsx b/src/Pages/Master/Sponser/Sponsers.jsx index d17fd8f..cb5f6e8 100644 --- a/src/Pages/Master/Sponser/Sponsers.jsx +++ b/src/Pages/Master/Sponser/Sponsers.jsx @@ -36,7 +36,7 @@ import { useToggleStatusMutation, } from "../../../Services/sponser.service"; -const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter +export const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter const Sponser = () => { const navigate = useNavigate(); @@ -83,6 +83,7 @@ const Sponser = () => { // ====================================================[Table Setup]================================================================ const tableHeadRow = [ "Sponsor name", + "Sponsor name (Arabic)", "Mobile no", "Status", "Created At", @@ -155,6 +156,16 @@ const Sponser = () => { {item.sponsorName} ), + + "Sponsor name (Arabic)":( + {item.sponsorNameArabic} + ), "Mobile no": ( @@ -192,7 +203,7 @@ const Sponser = () => { ), Action: ( - { - + */} { emptyMessage={`We don't have any Sponers `} tableHeadRow={tableHeadRow} data={extractedArray} - isLoading={isLoading} + isLoading={isSponserLoading} viewActionId={actionId} setViewActionId={setActionId} // totalPages={10} diff --git a/src/Services/Key.merits.service.js b/src/Services/Key.merits.service.js new file mode 100644 index 0000000..982d726 --- /dev/null +++ b/src/Services/Key.merits.service.js @@ -0,0 +1,25 @@ +// io.service.js +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; +import { api } from "./api.service"; + +const baseUrl = api?.defaults.baseURL; + +export const keyMerits = createApi({ + reducerPath: "ioService", + baseQuery: fetchBaseQuery({ baseUrl }), + tagTypes: ["getKeyMerits"], + endpoints: (builder) => ({ + // =====[get] + getKeyMerits: builder.query({ + query: (id) => `/io/admin/key-merits/${id}`, + providesTags: ["getKeyMerits"], + }), + + }), +}); + +// Export hooks for usage in functional components +export const { + useGetKeyMeritsQuery, +} = +keyMerits; diff --git a/src/Services/investment.documents.service.js b/src/Services/investment.documents.service.js new file mode 100644 index 0000000..6e97e37 --- /dev/null +++ b/src/Services/investment.documents.service.js @@ -0,0 +1,56 @@ +// io.service.js +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; +import { api } from "./api.service"; + +const baseUrl = api?.defaults.baseURL; + +export const ioService = createApi({ + reducerPath: "ioService", + baseQuery: fetchBaseQuery({ baseUrl }), + tagTypes: ["getInvestmentDocuments"], + endpoints: (builder) => ({ + // =====[get] + getInvestmentDocuments: builder.query({ + query: ({ page, size }) => `/io/admin?page=${page}&size=${size}`, + providesTags: ["getInvestmentDocuments"], + }), + getInvestmentDocumentsById: builder.query({ + query: (id) => ({ url: `/io/admin/${id}` }), + providesTags: ["getInvestmentDocuments"], + }), + + // =====[create] + createInvestmentDocuments: builder.mutation({ + query: ({data, id}) => ({ + url: `/io/admin/document/${id}`, + method: "POST", + body: data, + }), + + invalidatesTags: ["getInvestmentDocuments"], + }), + + + + updateIO: builder.mutation({ + query: ({ data, id }) => ({ + url: `/io/admin/${id}`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getInvestmentDocuments"], + }), + + + + + + + }), +}); + +// Export hooks for usage in functional components +export const { + useCreateInvestmentDocumentsMutation, +} = + ioService; diff --git a/src/Services/investment.type.service.js b/src/Services/investment.type.service.js index 845960d..dcd3db9 100644 --- a/src/Services/investment.type.service.js +++ b/src/Services/investment.type.service.js @@ -1,7 +1,8 @@ // investmentType.service.js import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; +import { api } from "./api.service"; -const baseUrl = import.meta.env.VITE_API_BASE_URL + "/api"; +const baseUrl = api?.defaults.baseURL; // Define a service using a base URL and expected endpoints export const investmentType = createApi({ @@ -10,10 +11,10 @@ export const investmentType = createApi({ tagTypes: [], endpoints: (builder) => ({ getInvestmentTypes: builder.query({ - query: () => '/getInvestmentTypes', + query: ({ page, size }) => `/investmentType/admin?page=${page}&size=${size}`, }), getInvestmentTypeById: builder.query({ - query: (id) => `/getInvestmentType/${id}`, + query: (id) => `/investmentType/admin/${id}`, }), }), }); diff --git a/src/Services/io.service.js b/src/Services/io.service.js index 803eea7..74a6911 100644 --- a/src/Services/io.service.js +++ b/src/Services/io.service.js @@ -1,22 +1,117 @@ // io.service.js import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; +import { api } from "./api.service"; -const baseUrl = import.meta.env.VITE_API_BASE_URL + "/api"; - +const baseUrl = api?.defaults.baseURL; // Define a service using a base URL and expected endpoints export const ioService = createApi({ reducerPath: "ioService", baseQuery: fetchBaseQuery({ baseUrl }), - tagTypes: [], + tagTypes: ["getIO", "getKeyMerits", "getArtifacts"], endpoints: (builder) => ({ + // =====[get] getIOs: builder.query({ - query: () => '/getIOs', + query: ({ page, size }) => `/io/admin?page=${page}&size=${size}`, + providesTags: ["getIO"], }), getIOById: builder.query({ - query: (id) => `/getIO/${id}`, + query: (id) => ({ url: `/io/admin/${id}` }), + providesTags: ["getIO"], }), + + + + + // =====[create] + createIO: builder.mutation({ + query: (data) => ({ + url: `/io/admin`, + method: "POST", + body: data, + }), + invalidatesTags: ["getIO"], + }), + + + + updateIO: builder.mutation({ + query: ({ data, id }) => ({ + url: `/io/admin/${id}`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getIO"], + }), + + + + + + // =====[Key Merits] + getKeyMerits: builder.query({ + query: (id) => `/io/admin/key-merits/${id}`, + providesTags: ["getKeyMerits"], + }), + createKeyMerits: builder.mutation({ + query: ({ data, id }) => ({ + url: `/io/admin/key-merits/${id}`, + method: "POST", + body: data, + // No need to manually set 'Content-Type' + }), + invalidatesTags: ["getKeyMerits"], + }), + + deleteKeyMerits: builder.mutation({ + query: (id) => ({ + url: `/io/admin/key-merits/hard-delete/${id}`, + method: "DELETE", + }), + invalidatesTags: ["getKeyMerits"], + }), + + + + updateKeyMerits: builder.mutation({ + query: ({ data, id }) => ({ url: `/io/admin/key-merits/byId/${id}` , + method: "PATCH", + body: data, + }), + invalidatesTags: ["getKeyMerits"], + }), + + + + + + + // =====[Artifacts] + getArtifacts: builder.query({ + query: (id) => `/io/admin/artifact/${id}`, + providesTags: ["getArtifacts"], + }), + + + + }), }); // Export hooks for usage in functional components -export const { useGetIOsQuery, useGetIOByIdQuery } = ioService; +export const { + useGetIOsQuery, + useGetIOByIdQuery, + useCreateIOMutation , + useUpdateIOMutation, + + + + useGetKeyMeritsQuery, + useCreateKeyMeritsMutation, + useDeleteKeyMeritsMutation, + useUpdateKeyMeritsMutation, + + + useGetArtifactsQuery, +} = + ioService; diff --git a/src/Services/sponser.service.js b/src/Services/sponser.service.js index add100c..d1094b8 100644 --- a/src/Services/sponser.service.js +++ b/src/Services/sponser.service.js @@ -4,7 +4,6 @@ import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; import { api } from "./api.service"; const baseUrl = api?.defaults.baseURL; -console.log(baseUrl); // const baseUrl = `${import.meta.env.VITE_API_BASE_URL}/${import.meta.env.VITE_API_VERSION}` @@ -14,11 +13,21 @@ export const sponserMaster = createApi({ baseQuery: fetchBaseQuery({ baseUrl: baseUrl }), tagTypes: ["getSponser"], endpoints: (builder) => ({ + + getSponserMaster: builder.query({ query: ({ page, size }) => `/sponsor/admin?page=${page}&size=${size}`, providesTags: ["getSponser"], }), + getActiveSponserMaster: builder.query({ + query: () => `/sponsor/admin/active`, + providesTags: ["getSponser"], + }), + + + + getSponserMasterActive: builder.query({ query: () => "/sponsor/admin/active", }), @@ -72,5 +81,6 @@ export const { useCreateSponserMutation, useUpdateSponserMutation, useGetSponserByIdQuery, - useDeleteSponserMutation + useDeleteSponserMutation, + useGetActiveSponserMasterQuery } = sponserMaster; diff --git a/src/Store/Store.js b/src/Store/Store.js index 498bf60..a99ad3e 100644 --- a/src/Store/Store.js +++ b/src/Store/Store.js @@ -7,6 +7,7 @@ import { ioService } from "../Services/io.service"; import { investorDetails } from "../Services/investor.details.service"; import { investorTransaction } from "../Services/investor.transaction.service"; import { api } from "../Services/api.service"; +import { keyMerits } from "../Services/Key.merits.service"; export const store = configureStore({ reducer: { @@ -29,7 +30,7 @@ export const store = configureStore({ exchangeRate.middleware, ioService.middleware, investorDetails.middleware, - investorTransaction.middleware + investorTransaction.middleware, ), });