From 323d09f88d5199b0b80eb7928b11b0f55827706b Mon Sep 17 00:00:00 2001 From: "Siddhesh.More" Date: Thu, 22 Aug 2024 12:10:07 +0530 Subject: [PATCH] [ Displlay order updated ] --- src/Components/CurrencyInput.jsx | 1 - src/Pages/IO_Management/CreateIO/CreateIO.jsx | 3 +- .../IO_Management/CreateIO/Destribution.jsx | 220 +++++++++- .../IO_Management/CreateIO/IOArtifacts.jsx | 30 +- .../IO_Management/CreateIO/IODetails.jsx | 5 + .../IO_Management/CreateIO/IONAVDetails.jsx | 2 - .../CreateIO/InvestmentDocument.jsx | 11 +- .../IO_Management/CreateIO/Investors.jsx | 28 +- .../IO_Management/CreateIO/KeyMerits.jsx | 8 +- .../SetDisplayOrderIOArtifactsImages.jsx | 189 +++++++++ .../SetDisplayOrderIOArtifactsVideo.jsx | 174 ++++++++ .../CreateIO/SetDisplayOrderIODocuments.jsx | 165 ++++++++ ...Order.jsx => SetDisplayOrderKeyMerits.jsx} | 10 +- .../ViewIO/HeaderModal/AmountInvested.jsx | 1 + .../HeaderModal/DistributionInvestor.jsx | 76 +++- .../IO_Management/ViewIO/ViewIOTable.jsx | 2 +- src/Pages/IO_Management/ViewIO/ViewIOdata.jsx | 5 +- .../IO_Management/ViewIO/ViewIOdataHeader.jsx | 376 ++++++++++-------- .../InvestorDetails/InvestorDetails.jsx | 23 +- .../Master/ExchangeRate/EditExchangeRate.jsx | 4 +- src/Services/Key.merits.service.js | 16 + src/Services/io.service.js | 119 ++++-- 22 files changed, 1209 insertions(+), 259 deletions(-) create mode 100644 src/Pages/IO_Management/CreateIO/SetDisplayOrderIOArtifactsImages.jsx create mode 100644 src/Pages/IO_Management/CreateIO/SetDisplayOrderIOArtifactsVideo.jsx create mode 100644 src/Pages/IO_Management/CreateIO/SetDisplayOrderIODocuments.jsx rename src/Pages/IO_Management/CreateIO/{SetDisplayOrder.jsx => SetDisplayOrderKeyMerits.jsx} (95%) diff --git a/src/Components/CurrencyInput.jsx b/src/Components/CurrencyInput.jsx index b5d646b..c972aee 100644 --- a/src/Components/CurrencyInput.jsx +++ b/src/Components/CurrencyInput.jsx @@ -38,7 +38,6 @@ const CurrencyInput = forwardRef(({ value, onChange, ...props }, ref) => { {...props} ref={ref} // Forward ref here type="text" - colorScheme='forestGreen' value={formatCurrency(value)} onChange={handleChange} /> diff --git a/src/Pages/IO_Management/CreateIO/CreateIO.jsx b/src/Pages/IO_Management/CreateIO/CreateIO.jsx index 942c9ec..25247c0 100644 --- a/src/Pages/IO_Management/CreateIO/CreateIO.jsx +++ b/src/Pages/IO_Management/CreateIO/CreateIO.jsx @@ -16,6 +16,7 @@ import { useParams } from "react-router-dom"; import FullscreenLoaders from "../../../Components/Loaders/FullscreenLoaders"; import { useGetIOprepopulateDataQuery } from "../../../Services/io.service"; import UnderConstruction from "../../UnderConstruction"; +import Destribution from "./Destribution"; const CreateIO = () => { const id = useParams()?.id; @@ -74,7 +75,7 @@ const CreateIO = () => { }, { label: "Distribution to Investors", - Content: IONAVDetails, + Content: Destribution, isDisabled: id ? false : true, }, ]; diff --git a/src/Pages/IO_Management/CreateIO/Destribution.jsx b/src/Pages/IO_Management/CreateIO/Destribution.jsx index 532b099..1079660 100644 --- a/src/Pages/IO_Management/CreateIO/Destribution.jsx +++ b/src/Pages/IO_Management/CreateIO/Destribution.jsx @@ -1,9 +1,219 @@ -import React from 'react' +import React, { useContext, useEffect, useRef, useState } from 'react' +import GlobalStateContext from '../../../Contexts/GlobalStateContext'; +import { Box, HStack, Input,Text, Table, Tbody, Th, Tr, Avatar, useDisclosure,Button } from '@chakra-ui/react'; +import { OPACITY_ON_LOAD } from '../../../Layout/animations'; +import Pagination from '../../../Components/Pagination'; +import NormalTable from '../../../Components/DataTable/NormalTable'; +import CustomAlertDialog from '../../../Components/CustomAlertDialog'; +import { formatDatee } from '../../../Components/FormField'; +import { AddIcon } from '@chakra-ui/icons'; +import AddIONav from './AddIONav'; -const Distribution = () => { - return ( -
Distribution
+const Destribution = () => { + const { navDetails, setNavDetails, IODetails } = + useContext(GlobalStateContext); + const firstField = useRef(); + const { isOpen, onOpen, onClose } = useDisclosure(); + 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(""); + + + console.log(IODetails?.ioNAVHistory); + + + + useEffect(() => { + // Simulate loading + const timer = setTimeout(() => { + setIsLoading(false); + }, 1500); + + // Cleanup the timer on component unmount + return () => clearTimeout(timer); + }, []); + + // Table setup + const tableHeadRow = [ + // "Sr.No", + "Date", + "Amount", + "% of Investment" + ]; + + // Table filter + const filteredData = IODetails?.distributionToInvestor?.filter((item) => { + const name = item?.transactionAmount; + const searchLower = searchTerm.toLowerCase(); + const nameMatches = name.toLowerCase().includes(searchLower); + return nameMatches; + }).sort((b, a) => new Date(a.transactionDate) - new Date(b.transactionDate)); + + const extractedArray=filteredData?.map((item, index) => ({ + id: item?.id, + "Sr.No": {item?.id}, + "Date": ( + + {formatDatee(item.transactionDate)} + + ), + "Amount": ( + + {/* {`${item.transactionAmount}`} */} + + {`$${parseFloat(item.transactionAmount||0).toLocaleString()}`} + + ), + "% of Investment": ( + + --- + + ), + })); + + + + const handleDelete = () => { + const updatedNav = navDetails.filter( + (sponsor) => sponsor.id !== actionId + ); + + setTimeout(() => { + setNavDetails(updatedNav); + setDeleteAlert(false); + setIsLoading(false); + }, 100); + setIsLoading(true); + }; + + + const Total = () => { + return ( + + + + + + + + +
+ Total + + {IODetails?.total_distributeToInvestor_amt?.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} + + {" "} +
+ ); + }; + + + + + return ( + + + setSearchTerm(e.target.value)} + /> + + + + + } + setMouseEnteredId={setMouseEnteredId} + setMouseEntered={setMouseEntered} + /> + + setDeleteAlert(false)} + isOpen={deleteAlert} + message={"Are you sure you want to delete sponers?"} + alertHandler={handleDelete} + isLoading={isLoading} + /> + + + + + + + ) } -export default Distribution \ No newline at end of file +export default Destribution \ No newline at end of file diff --git a/src/Pages/IO_Management/CreateIO/IOArtifacts.jsx b/src/Pages/IO_Management/CreateIO/IOArtifacts.jsx index 1ff34d8..870c4b2 100644 --- a/src/Pages/IO_Management/CreateIO/IOArtifacts.jsx +++ b/src/Pages/IO_Management/CreateIO/IOArtifacts.jsx @@ -22,7 +22,7 @@ import { } from "@chakra-ui/icons"; import IOArtifactsAdd from "../IOArtifactsAdd"; import IOArtifactsVideo from "./IOArtifactsVideo"; -import SetDisplayOrder from "./SetDisplayOrder"; +import SetDisplayOrder from "./SetDisplayOrderKeyMerits"; import { useParams } from "react-router-dom"; import { useDeleteImageArtifactsMutation, @@ -32,6 +32,8 @@ import { import { getFileNameFromPath } from "../../../Constants/Constants"; import ImageViewer from "../../../Components/ImageViewer"; import ToastBox from "../../../Components/ToastBox"; +import SetDisplayOrderIOArtifactsImages from "./SetDisplayOrderIOArtifactsImages"; +import SetDisplayOrderIOArtifactsVideo from "./SetDisplayOrderIOArtifactsVideo"; const IOArtifacts = ({ enableNextTab, index, data }) => { const toast = useToast() @@ -143,7 +145,14 @@ const IOArtifacts = ({ enableNextTab, index, data }) => { const tableHeadRow = ["Sr.no", "File Name", "View image", "Action"]; - const extractedArray = IObyID?.data?.artifactsImage?.map((item, index) => ({ +console.log(IObyID?.data?.artifactsImage); + // console.log(filteredData); + const sortedDataImage = [...(IObyID?.data?.artifactsImage || [])]?.sort( + (a, b) => a?.displayOrder - b?.displayOrder + ); + + + const extractedArray = sortedDataImage?.map((item, index) => ({ "Sr.no": ( { ), })); + + console.log(IObyID?.data?.artifactsVideo); +// console.log(filteredData); +const sortedDataVideo = [...(IObyID?.data?.artifactsVideo || [])]?.sort( + (a, b) => a?.displayOrder - b?.displayOrder +); + + + + + const tableHeadRowTwo = [ "Sr.no", "File Name", @@ -253,7 +273,7 @@ const IOArtifacts = ({ enableNextTab, index, data }) => { "Action", ]; - const extractedArrayTwo = IObyID?.data?.artifactsVideo?.map( + const extractedArrayTwo = sortedDataVideo?.map( (item, index) => ({ "Sr.no": ( { - {IObyID?.data?.artifactsImage?.length !== 0 &&} + {IObyID?.data?.artifactsImage?.length !== 0 &&} :null} - diff --git a/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx b/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx index acaa829..fe617b0 100644 --- a/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx +++ b/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx @@ -33,7 +33,8 @@ import { import ToastBox from "../../../Components/ToastBox"; import { getFileNameFromPath } from "../../../Constants/Constants"; import { TbFileTypeDocx } from "react-icons/tb"; -import SetDisplayOrder from "./SetDisplayOrder"; +import SetDisplayOrder from "./SetDisplayOrderKeyMerits"; +import SetDisplayOrderIODocuments from "./SetDisplayOrderIODocuments"; const downloadFile = (filePath, fileName) => { @@ -134,6 +135,10 @@ const InvestmentDocument = ({ control, errors, enableNextTab, index, }) => { item?.documentName?.toLowerCase().includes(searchTerm.toLowerCase()) ); + const sortedData = filteredData?.sort( + (a, b) => a.displayOrder - b.displayOrder + ); + const handleView = (id) => { setActionId(id); onViewOpen(); @@ -168,7 +173,7 @@ const InvestmentDocument = ({ control, errors, enableNextTab, index, }) => { } }; - const extractedArray = filteredData?.map((item, index) => ({ + const extractedArray = sortedData?.map((item, index) => ({ "Sr.no": ( { - {filteredData?.length !== 0 &&} + {filteredData?.length !== 0 &&} + + + + + Set Display Order + + + + + + + + + + + + + ); +}; + +export default SetDisplayOrderIOArtifactsImages; diff --git a/src/Pages/IO_Management/CreateIO/SetDisplayOrderIOArtifactsVideo.jsx b/src/Pages/IO_Management/CreateIO/SetDisplayOrderIOArtifactsVideo.jsx new file mode 100644 index 0000000..72a1fcb --- /dev/null +++ b/src/Pages/IO_Management/CreateIO/SetDisplayOrderIOArtifactsVideo.jsx @@ -0,0 +1,174 @@ +import React, { useState, useEffect } from "react"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + useDisclosure, + Button, + Box, + Text, + Image, + HStack, + useToast, + Badge, + Link, +} from "@chakra-ui/react"; + +import { AddIcon, DragHandleIcon, ExternalLinkIcon } from "@chakra-ui/icons"; +import DataTable from "../../../Components/DataTable/DataTable"; +import { useSetDisplayOrderIOArtifactsVideoMutation } from "../../../Services/io.service"; +import ToastBox from "../../../Components/ToastBox"; + +const SetDisplayOrderIOArtifactsVideo = ({ data, }) => { + const toast = useToast(); + const { isOpen, onOpen, onClose } = useDisclosure(); + const [isLoading, setIsLoading] = useState(false); + + const tableHeadRow = ["", "File Name", "Video streaming URL"]; + + const [extractedArray, setExtractedArray] = useState([]); + const [displayOrder, setDisplayOrder] = useState(null); + const [resetDisplayOrder] = useSetDisplayOrderIOArtifactsVideoMutation(); + + // Update state when `data` prop changes + useEffect(() => { + if (data) { + const formattedData = data.map((item, index) => ({ + id: item?.id, + displayOrder: index + 1, // Add displayOrder property + "": ( + + + + ), + "File Name": ( + + + {item.artifactName} + + + ), + "Video streaming URL": ( + + + + View + + + + ), + })); + setExtractedArray(formattedData); + } + }, [data]); + + // Log the updated order in the desired format whenever `extractedArray` changes + useEffect(() => { + const displayOrderArray = extractedArray.map((item, index) => ({ + id: item.id, + displayOrder: index + 1, + })); + setDisplayOrder(displayOrderArray); + }, [extractedArray]); + + const handleSetOrder = async () => { + setIsLoading(true); + const data = { + displayOrder: displayOrder, + }; + + try { + const res = await resetDisplayOrder({ data }); + console.log(res?.data?.statusCode); + if (res?.data?.statusCode === 200) { + toast({ + render: () => , + }); + onClose(); + } + + setIsLoading(false); + } catch (error) { + console.log(res); + setIsLoading(false); + } + }; + + return ( + <> + + + + + + Set Display Order + + + + + + + + + + + + + ); +}; + +export default SetDisplayOrderIOArtifactsVideo; diff --git a/src/Pages/IO_Management/CreateIO/SetDisplayOrderIODocuments.jsx b/src/Pages/IO_Management/CreateIO/SetDisplayOrderIODocuments.jsx new file mode 100644 index 0000000..5ff1248 --- /dev/null +++ b/src/Pages/IO_Management/CreateIO/SetDisplayOrderIODocuments.jsx @@ -0,0 +1,165 @@ +import React, { useState, useEffect } from "react"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalFooter, + ModalBody, + ModalCloseButton, + useDisclosure, + Button, + Box, + Text, + Image, + HStack, + useToast, +} from "@chakra-ui/react"; + +import { AddIcon, DragHandleIcon } from "@chakra-ui/icons"; +import DataTable from "../../../Components/DataTable/DataTable"; +import { useSetDisplayOrderIODocumentsMutation } from "../../../Services/io.service"; +import ToastBox from "../../../Components/ToastBox"; +import { GrDocumentPdf } from "react-icons/gr"; +import { TbFileTypeDocx } from "react-icons/tb"; + +const SetDisplayOrderIODocuments = ({ data, }) => { + const toast = useToast(); + const { isOpen, onOpen, onClose } = useDisclosure(); + const [isLoading, setIsLoading] = useState(false); + + const tableHeadRow = ["", "Type", "File name"]; + + const [extractedArray, setExtractedArray] = useState([]); + const [displayOrder, setDisplayOrder] = useState(null); + const [resetDisplayOrder] = useSetDisplayOrderIODocumentsMutation(); + + // Update state when `data` prop changes + useEffect(() => { + if (data) { + const formattedData = data.map((item, index) => ({ + id: item?.id, + displayOrder: index + 1, // Add displayOrder property + "": ( + + + + ), + Type: ( + + {item.documentType === "application/pdf" ? ( + + ) : ( + + )} + + ), + "File name": ( + + {item.documentName} + + ), + })); + setExtractedArray(formattedData); + } + }, [data]); + + // Log the updated order in the desired format whenever `extractedArray` changes + useEffect(() => { + const displayOrderArray = extractedArray.map((item, index) => ({ + id: item.id, + displayOrder: index + 1, + })); + setDisplayOrder(displayOrderArray); + }, [extractedArray]); + + const handleSetOrder = async () => { + setIsLoading(true); + const data = { + displayOrder: displayOrder, + }; + + try { + const res = await resetDisplayOrder({ data }); + console.log(res?.data?.statusCode); + if (res?.data?.statusCode === 200) { + toast({ + render: () => , + }); + onClose(); + } + + setIsLoading(false); + } catch (error) { + console.log(res); + setIsLoading(false); + } + }; + + return ( + <> + + + + + + Set Display Order + + + + + + + + + + + + + ); +}; + +export default SetDisplayOrderIODocuments; diff --git a/src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx b/src/Pages/IO_Management/CreateIO/SetDisplayOrderKeyMerits.jsx similarity index 95% rename from src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx rename to src/Pages/IO_Management/CreateIO/SetDisplayOrderKeyMerits.jsx index ebc8049..acd8cb0 100644 --- a/src/Pages/IO_Management/CreateIO/SetDisplayOrder.jsx +++ b/src/Pages/IO_Management/CreateIO/SetDisplayOrderKeyMerits.jsx @@ -21,7 +21,7 @@ import DataTable from "../../../Components/DataTable/DataTable"; import { useSetDisplayOrderMutation } from "../../../Services/io.service"; import ToastBox from "../../../Components/ToastBox"; -const SetDisplayOrder = ({ data }) => { +const SetDisplayOrderKeyMerits = ({ data, }) => { const toast = useToast(); const { isOpen, onOpen, onClose } = useDisclosure(); const [isLoading, setIsLoading] = useState(false); @@ -57,6 +57,10 @@ const SetDisplayOrder = ({ data }) => { ), Icon: item?.icon?.iconFilePath && ( + { src={import.meta.env.VITE_IMAGE_URL + item?.icon?.iconFilePath} w={8} h={8} - /> + /> ), })); setExtractedArray(formattedData); @@ -164,4 +168,4 @@ const SetDisplayOrder = ({ data }) => { ); }; -export default SetDisplayOrder; +export default SetDisplayOrderKeyMerits; diff --git a/src/Pages/IO_Management/ViewIO/HeaderModal/AmountInvested.jsx b/src/Pages/IO_Management/ViewIO/HeaderModal/AmountInvested.jsx index 0f0b093..01e6cbc 100644 --- a/src/Pages/IO_Management/ViewIO/HeaderModal/AmountInvested.jsx +++ b/src/Pages/IO_Management/ViewIO/HeaderModal/AmountInvested.jsx @@ -50,6 +50,7 @@ const AmountInvested = ({ isOpen, onClose }) => { const [isLoading, setIsLoading] = useState(false); const { IODetails } = useContext(GlobalStateContext); const [amountInvested] = useAmountIvestmentMutation(); + useEffect(() => { if (IODetails?.totalAmtInvestmentInUSD) { diff --git a/src/Pages/IO_Management/ViewIO/HeaderModal/DistributionInvestor.jsx b/src/Pages/IO_Management/ViewIO/HeaderModal/DistributionInvestor.jsx index 47d58f5..d4b87a1 100644 --- a/src/Pages/IO_Management/ViewIO/HeaderModal/DistributionInvestor.jsx +++ b/src/Pages/IO_Management/ViewIO/HeaderModal/DistributionInvestor.jsx @@ -27,7 +27,7 @@ import { import NormalData from "../../../../Components/DataTable/NormalTable"; import { useState } from "react"; import { AddIcon } from "@chakra-ui/icons"; -import { useGetDistributionInvestorMutation } from "../../../../Services/io.service"; +import { useGetDistributedToInvestorMutation, useGetDistributionInvestorMutation, useUpdateExitToInvestorMutation } from "../../../../Services/io.service"; import { useParams } from "react-router-dom"; import { useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; @@ -36,17 +36,20 @@ import { yupResolver } from "@hookform/resolvers/yup"; import ToastBox from "../../../../Components/ToastBox"; import CurrencyInput from "../../../../Components/CurrencyInput"; import { IoCalculator } from "react-icons/io5"; +import { debounce } from "../../../Master/Sponser/AddSponser"; export const investor = yup.object().shape({ amount: yup.string().required("Amount is required"), }); -const DistributionInvestor = ({ isOpen, onClose }) => { +const DistributionInvestor = ({ isOpen, onClose, exit }) => { const params = useParams(); const toast = useToast(); const id = params?.id; const [ isCalculateLoading, setIsCalculateLoading ] = useState(false) + const [ isFinalCalculateLoading, setIsFinalCalculateLoading ] = useState(false) const [ calcualtedData, setCalculatedDate ] = useState(null) + const [ isCalcualtedData, setIsCalcualtedData ] = useState(false) // const { // data:IObyID, @@ -55,6 +58,8 @@ const DistributionInvestor = ({ isOpen, onClose }) => { // } = useGetDistributionInvestorMutation(id); const [getDistributionInvestment] = useGetDistributionInvestorMutation(); + const [getFinalDistributionInvestment] = useGetDistributedToInvestorMutation(); + const [ updateExitToInvestor ] = useUpdateExitToInvestorMutation() const { control, @@ -64,6 +69,7 @@ const DistributionInvestor = ({ isOpen, onClose }) => { } = useForm({ resolver: yupResolver(investor), }); + // useEffect(()=>{ // try { @@ -128,7 +134,7 @@ const DistributionInvestor = ({ isOpen, onClose }) => { Amount: ( - {item?.amount} + {item?.amount?.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} ), @@ -212,7 +218,7 @@ const DistributionInvestor = ({ isOpen, onClose }) => { wordBreak="normal" overflowWrap="normal" > - {calcualtedData?.totalInvestedAmt?.toFixed(2)?.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} + {calcualtedData?.totalInvestedAmt?.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} { wordBreak="normal" overflowWrap="normal" > - {calcualtedData?.distributed_amt?.toFixed(2)?.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} + {calcualtedData?.distributed_amt?.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -243,7 +249,6 @@ const DistributionInvestor = ({ isOpen, onClose }) => { }; const onSubmit = async (data) => { - console.log(data); setIsCalculateLoading(true) try { @@ -257,6 +262,7 @@ const DistributionInvestor = ({ isOpen, onClose }) => { ), }) setIsCalculateLoading(false) + setIsCalcualtedData(false) } else if(res?.data?.statusCode === 200){ setCalculatedDate(res?.data?.data) toast({ @@ -265,6 +271,7 @@ const DistributionInvestor = ({ isOpen, onClose }) => { ), }) setIsCalculateLoading(false) + setIsCalcualtedData(true) } @@ -273,10 +280,56 @@ const DistributionInvestor = ({ isOpen, onClose }) => { } }; - console.log(errors); + + const onFinalSubmit = async (data) => { + setIsFinalCalculateLoading(true) + if (!isCalcualtedData) { + + setIsFinalCalculateLoading(false) + return toast({ + render: () => ( + + ), + }) + } + + const finalData = { + transactionAmount: data?.amount, + }; + + try { + const res = await exit ? updateExitToInvestor({id,data: finalData }) :getFinalDistributionInvestment({id,data: finalData }); + console.log(finalData); + + if (res?.error?.status === 401) { + toast({ + render: () => ( + + ), + }); + } else if (res?.data?.statusCode === 200) { + toast({ + render: () => , + }); + handleClose() + } + } catch (error) { + console.error("An error occurred:", error); + } finally { + handleClose() + } + }; + + + const handleClose = () => { + onClose() + setIsFinalCalculateLoading(false) + reset() + } + return ( - + @@ -291,13 +344,12 @@ const DistributionInvestor = ({ isOpen, onClose }) => { {/* */} Amount to Distribute - + ( { Calculate - + {errors.amount?.message} @@ -346,6 +398,8 @@ const DistributionInvestor = ({ isOpen, onClose }) => { }} size={"sm"} rounded={"sm"} + onClick={handleSubmit(onFinalSubmit)} + isLoading={isFinalCalculateLoading} > Save diff --git a/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx b/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx index 69eea95..9bd62ab 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOTable.jsx @@ -81,7 +81,7 @@ const ViewIOTable = () => { "Goal Amount", "Holding Period", "IO Status", - "Preview", + // "Preview", "Action", ]; diff --git a/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx b/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx index 1b6ef6e..3471146 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOdata.jsx @@ -36,6 +36,7 @@ import IOCashDetails from "../CreateIO/IOCashDetails"; import IONAVDetails from "../CreateIO/IONAVDetails"; import { useGetIOprepopulateDataQuery } from "../../../Services/io.service"; import UnderConstruction from "../../UnderConstruction"; +import Destribution from "../CreateIO/Destribution"; const ViewIOdata = () => { @@ -59,8 +60,8 @@ const ViewIOdata = () => { // { label: "Investors", content: }, { label: "IO Cash Details", content: }, { label: "IO NAV Details", content: }, - // { label: "Distribution to Investors", content: }, - { label: "Distribution to Investors", content: }, + { label: "Distribution to Investors", content: }, + // { label: "Distribution to Investors", content: }, ]; return ( diff --git a/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx b/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx index 75f6597..75d5096 100644 --- a/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx +++ b/src/Pages/IO_Management/ViewIO/ViewIOdataHeader.jsx @@ -44,14 +44,13 @@ import Loader01 from "../../../Components/Loaders/Loader01"; // import { formatCurrency } from "../../../Components/CurrencyInput"; // import { removeTrailingZeros } from "../../../Constants/Constants"; -const ViewIOdataHeader = ({data, isLoading}) => { +const ViewIOdataHeader = ({ data, isLoading }) => { const params = useParams(); const id = params?.id; const { isOpen, onOpen, onClose } = useDisclosure(); const btnRef = useRef(); const { IODetails, isIOloading } = useContext(GlobalStateContext); - - + const { isOpen: isInvestmentOpen, onOpen: onInvestmentOpen, @@ -104,17 +103,16 @@ const ViewIOdataHeader = ({data, isLoading}) => { fontWeight: "400", }; - - console.log(import.meta.env.VITE_IMAGE_URL + - IODetails?.artifactsImage?.[0]?.artifactPathName); - - + console.log( + import.meta.env.VITE_IMAGE_URL + + IODetails?.artifactsImage?.[0]?.artifactPathName + ); const menu = [ { - id:1, - title:"Amount Invested", - onClickFunction: onInvestmentOpen + id: 1, + title: "Amount Invested", + onClickFunction: onInvestmentOpen, }, // { // id:2, @@ -127,47 +125,44 @@ const ViewIOdataHeader = ({data, isLoading}) => { // onClickFunction:onDistSponsorOpen // }, { - id:6, - title:"Distribution To Investors", - onClickFunction:onDistInvestorOpen + id: 6, + title: "Distribution To Investors", + onClickFunction: onDistInvestorOpen, }, { - id:5, - title:"Update IO NAV", - onClickFunction:onUpdateNavOpen + id: 5, + title: "Update IO NAV", + onClickFunction: onUpdateNavOpen, }, { - id:8, - title:"Exit", - onClickFunction:onExitOpen + id: 8, + title: "Exit", + onClickFunction: onExitOpen, }, { - id:9, - title:"Cancel", - onClickFunction:onCancleOpen + id: 9, + title: "Cancel", + onClickFunction: onCancleOpen, }, { - id:10, - title:"Update IO Status", - onClickFunction:onUpdateStatusOpen + id: 10, + title: "Update IO Status", + onClickFunction: onUpdateStatusOpen, }, - ] + ]; // console.log(IODetails?.mainTranscation); + // Extract titles from apiTransaction + const apiTransactionTitles = IODetails?.mainTranscation?.map( + (transaction) => transaction.id + ); + // Filter menu items + const filteredMenu = menu?.filter((item) => + apiTransactionTitles?.includes(item.id) + ); -// Extract titles from apiTransaction -const apiTransactionTitles = IODetails?.mainTranscation?.map(transaction => transaction.id); -// Filter menu items -const filteredMenu = menu?.filter(item => apiTransactionTitles?.includes(item.id)); - - - - - - - return ( - IODetails?.investmentNameEnglish ? + return IODetails?.investmentNameEnglish ? ( apiTransactionTitles?.includes(item.id : IODetails?.ioStatus?.statusAdmin === "Closed" ? "#C6F6D5" : IODetails?.ioStatus?.statusAdmin === "Exited" - ? "red.500" + ? "#FED7D7" : IODetails?.ioStatus?.statusAdmin === "Canclled" ? "orange.500" : IODetails?.ioStatus?.statusAdmin === "DeActivate" @@ -200,130 +195,163 @@ const filteredMenu = menu?.filter(item => apiTransactionTitles?.includes(item.id boxShadow={"md"} position={"relative"} > - - - - - {/* {IODetails?.ioName}/ */} - {IODetails?.artifactsImage?.[0]?.artifactPathName ? ( - {IODetails?.ioName} - ) : ( - - - - )} - - - - - IO Name - - - {IODetails?.investmentNameEnglish - ? IODetails?.investmentNameEnglish - : "---"} - - + + {/* {IODetails?.ioName}/ */} + {IODetails?.artifactsImage?.[0]?.artifactPathName ? ( + {IODetails?.ioName} + ) : ( + + + + )} + - - - Sponsor Name - - - {IODetails?.sponsor?.sponsorName - ? IODetails?.sponsor?.sponsorName - : "---"} - - + + + IO Name + + + {IODetails?.investmentNameEnglish + ? IODetails?.investmentNameEnglish + : "---"} + + + + + + Sponsor Name + + + {IODetails?.sponsor?.sponsorName + ? IODetails?.sponsor?.sponsorName + : "---"} + + - + + + IO Status + + + {IODetails?.ioStatus?.statusAdmin + ? IODetails?.ioStatus?.statusAdmin + : "---"} + + - - - IO Status - - - {IODetails?.ioStatus?.statusAdmin - ? IODetails?.ioStatus?.statusAdmin - : "---"} - - + + + IO MV + + + {/* {IODetails?.ioNAV ? formatCurrency(removeTrailingZeros(IODetails?.ioNAV)) : "00.00"} */} + {parseFloat(IODetails?.ioNAV || 0).toLocaleString(undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + + - - - IO MV - - - {/* {IODetails?.ioNAV ? formatCurrency(removeTrailingZeros(IODetails?.ioNAV)) : "00.00"} */} - {parseFloat(IODetails?.ioNAV||0).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} - - - - - - IO cash - - - {/* {IODetails?.ioCash ? formatCurrency(removeTrailingZeros(IODetails?.ioCash)) : "00.00"} */} - {parseFloat(IODetails?.ioCash||0).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} - - - - - - IO NAV - - - {/* {IODetails?.ioMVNAV ? formatCurrency(removeTrailingZeros(IODetails?.ioMVNAV)) : "00.00"} */} - {parseFloat(IODetails?.ioMVNAV||0).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} - - + + + IO cash + + + {/* {IODetails?.ioCash ? formatCurrency(removeTrailingZeros(IODetails?.ioCash)) : "00.00"} */} + {parseFloat(IODetails?.ioCash || 0).toLocaleString(undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + + + + + IO NAV + + + {/* {IODetails?.ioMVNAV ? formatCurrency(removeTrailingZeros(IODetails?.ioMVNAV)) : "00.00"} */} + {parseFloat(IODetails?.ioMVNAV || 0).toLocaleString(undefined, { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + })} + + apiTransactionTitles?.includes(item.id Tansaction - {filteredMenu?.map(({id, title, onClickFunction})=> - {title} - )} - - + {filteredMenu?.map(({ id, title, onClickFunction }) => ( + + {title} + + ))} - - {/* Modals */} - + {/* */} + + + apiTransactionTitles?.includes(item.id onClose={onUpdateStatusClose} /> - - : - + + ) : ( apiTransactionTitles?.includes(item.id // bgGradient='linear(to-r, #ffd54f, #caf5d8)' // bgGradient='linear(to-r, #caf5d8, #a8e6cf)' boxShadow={"md"} - > + > + {" "} + + ); }; diff --git a/src/Pages/Investor_Management/InvestorDetails/InvestorDetails.jsx b/src/Pages/Investor_Management/InvestorDetails/InvestorDetails.jsx index e785d4e..0dfd678 100644 --- a/src/Pages/Investor_Management/InvestorDetails/InvestorDetails.jsx +++ b/src/Pages/Investor_Management/InvestorDetails/InvestorDetails.jsx @@ -181,8 +181,8 @@ const InvestorDetails = () => { ), "Investor Type": ( - - + + {item?.investor_type?.investorTypeName} @@ -191,29 +191,30 @@ const InvestorDetails = () => { Status: ( {item.ioStatus ? "Ban" : "Unban"} ), "KYC Status": ( - - + {item.KYCStatus ? "Completed" : "Not complete"} - + ), Action: ( diff --git a/src/Pages/Master/ExchangeRate/EditExchangeRate.jsx b/src/Pages/Master/ExchangeRate/EditExchangeRate.jsx index 6b22beb..bb4082a 100644 --- a/src/Pages/Master/ExchangeRate/EditExchangeRate.jsx +++ b/src/Pages/Master/ExchangeRate/EditExchangeRate.jsx @@ -158,12 +158,12 @@ const EditExchangeRate = ({ id, setIsLoading }) => { - + {/* Last effective date {formatDate(foundObject?.effectiveFrom)} - + */} Effective from diff --git a/src/Services/Key.merits.service.js b/src/Services/Key.merits.service.js index eab78ae..c90ff10 100644 --- a/src/Services/Key.merits.service.js +++ b/src/Services/Key.merits.service.js @@ -16,11 +16,27 @@ export const keyMerits = createApi({ providesTags: ["getKeyMerits"], }), + + + + + + setDisplayOrder: builder.mutation({ + query: ({ data }) => ({ + url: `/io/admin/key-merits/resetDisplayOrder`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + }), }); // Export hooks for usage in functional components export const { useGetKeyMeritsQuery, + useSetDisplayOrderMutation } = keyMerits; diff --git a/src/Services/io.service.js b/src/Services/io.service.js index 0c6521c..f3b6a66 100644 --- a/src/Services/io.service.js +++ b/src/Services/io.service.js @@ -50,7 +50,7 @@ export const ioService = createApi({ method: "PATCH", body: data, }), - invalidatesTags: ["getIOById", "getIO","prePopulate"], + invalidatesTags: ["getIOById", "getIO", "prePopulate"], }), // =====[Key Merits] @@ -125,9 +125,6 @@ export const ioService = createApi({ providesTags: ["getArtifactsVideo"], }), - - - // =====[createImageArtifacts] createImageArtifacts: builder.mutation({ query: ({ data, id }) => ({ @@ -139,9 +136,6 @@ export const ioService = createApi({ invalidatesTags: ["getIOById"], }), - - - updateImageArtifacts: builder.mutation({ query: ({ data, id }) => ({ url: `/io/admin/artifact/image/byId/${id}`, @@ -151,9 +145,6 @@ export const ioService = createApi({ invalidatesTags: ["getIOById"], }), - - - // =====[createVideoArtifacts] createVideoArtifacts: builder.mutation({ query: ({ data, id }) => ({ @@ -190,14 +181,6 @@ export const ioService = createApi({ invalidatesTags: ["getIOById"], }), - setDisplayOrder: builder.mutation({ - query: ({ data }) => ({ - url: `/io/artifact/artifactImage/resetDisplayOrder/`, - method: "PATCH", - body: data, - }), - invalidatesTags: ["getIOById"], - }), updateStatusIo: builder.mutation({ query: ({ data, id }) => ({ @@ -205,7 +188,7 @@ export const ioService = createApi({ method: "POST", body: data, }), - invalidatesTags: ["getIOById", 'getIO'], + invalidatesTags: ["getIOById", "getIO"], }), createIoCash: builder.mutation({ @@ -218,7 +201,6 @@ export const ioService = createApi({ invalidatesTags: ["getIOById"], }), - createIoNav: builder.mutation({ query: ({ data, id }) => ({ url: `/io/admin/transaction/${id}/io-nav/`, @@ -229,30 +211,95 @@ export const ioService = createApi({ invalidatesTags: ["getIOById"], }), - - // =====[ Amount Investment ] ====== - amountIvestment : builder.mutation({ + amountIvestment: builder.mutation({ query: ({ data, id }) => ({ - url: `/io/admin/amount-invested/${id}`, + url: `/io/admin/transaction/${id}/amount-invested`, + method: "POST", body: data, }), invalidatesTags: ["getIOById"], }), - // ======== [ Distribution Transaction ] ======== - - getDistributionInvestor : builder.mutation({ - query: ({id,data}) => ({ + getDistributionInvestor: builder.mutation({ + query: ({ id, data }) => ({ url: `/io/admin/transaction/${id}/calculate-distribution-amt`, method: "POST", body: data, }), invalidatesTags: ["getIOById"], }), + + getDistributedToInvestor: builder.mutation({ + query: ({ id, data }) => ({ + url: `/io/admin/transaction/${id}/distributed-to-investor`, + method: "POST", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + + + updateExitToInvestor: builder.mutation({ + query: ({ id, data }) => ({ + url: `/io/admin/transaction/${id}/exit`, + method: "POST", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + + +// ==============[ Displaye Orders ]=============== + + setDisplayOrder: builder.mutation({ + query: ({ data }) => ({ + url: `/io/admin/key-merits/resetDisplayOrder`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + setDisplayOrderIODocuments: builder.mutation({ + query: ({ data }) => ({ + url: `/io/admin/document/resetDisplayOrder`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + + setDisplayOrderIOArtifactsImage: builder.mutation({ + query: ({ data }) => ({ + url: `/io/admin/artifact/image/resetDisplayOrder`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + + + setDisplayOrderIOArtifactsVideo: builder.mutation({ + query: ({ data }) => ({ + url: `/io/admin/artifact/video/resetDisplayOrder`, + method: "PATCH", + body: data, + }), + invalidatesTags: ["getIOById"], + }), + + + + + }), }); @@ -283,19 +330,25 @@ export const { useCreateVideoArtifactsMutation, useDeleteVideoArtifactsMutation, useDeleteImageArtifactsMutation, - useSetDisplayOrderMutation, + useSetDisplayOrderMutation, + useSetDisplayOrderIODocumentsMutation, + useSetDisplayOrderIOArtifactsImageMutation, + useSetDisplayOrderIOArtifactsVideoMutation, + useCreateIoCashMutation, useCreateIoNavMutation, - - useUpdateStatusIoMutation, - useAmountIvestmentMutation, - useGetDistributionInvestorMutation, + + + + useGetDistributedToInvestorMutation, + useUpdateExitToInvestorMutation, + } = ioService;