From 7deb66f26b6d11a5a3fa01a67816ad95b3ee2c02 Mon Sep 17 00:00:00 2001 From: YasinShaikh123 <123150391+YasinShaikh123@users.noreply.github.com> Date: Mon, 8 Jul 2024 20:39:43 +0530 Subject: [PATCH] invest add --- package-lock.json | 114 ++++++- src/Contexts/GlobalStateProvider.jsx | 81 ++--- .../IO_Management/CreateIO/IOCashDetails.jsx | 297 +++++++++++++++++- .../CreateIO/InvestmentDocument.jsx | 255 +++++++++------ .../IO_Management/CreateIO/Investors.jsx | 11 +- .../IO_Management/CreateIO/KeyMerits.jsx | 1 + .../IO_Management/InvestmentDocuments.jsx | 231 +++++++++----- src/Pages/Master/Sponser/AddSponser.jsx | 2 +- src/Pages/Master/Sponser/Sponsers.jsx | 11 +- 9 files changed, 753 insertions(+), 250 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b3e017..a7dc44f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "framer-motion": "^11.1.5", "js-cookie": "^3.0.5", "react": "^18.2.0", + "react-beautiful-dnd": "^13.1.1", "react-dom": "^18.2.0", "react-hook-form": "^7.51.3", "react-icons": "^5.1.0", @@ -27,7 +28,7 @@ "react-router-dom": "^6.22.3", "redux-persist": "^6.0.0", "redux-persist-transform-encrypt": "^5.1.1", - "uuid": "^9.0.1", + "uuid": "^10.0.0", "xlsx": "^0.18.5", "yup": "^1.4.0" }, @@ -2464,6 +2465,15 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/lodash": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", @@ -2485,8 +2495,7 @@ "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "devOptional": true + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/quill": { "version": "1.3.10", @@ -2500,7 +2509,6 @@ "version": "18.2.79", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", - "devOptional": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -2515,6 +2523,25 @@ "@types/react": "*" } }, + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, + "node_modules/@types/react-redux/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", @@ -4626,6 +4653,11 @@ "loose-envify": "cli.js" } }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5042,6 +5074,11 @@ "node": ">=0.10" } }, + "node_modules/raf-schd": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -5053,6 +5090,61 @@ "node": ">=0.10.0" } }, + "node_modules/react-beautiful-dnd": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", + "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "dependencies": { + "@babel/runtime": "^7.9.2", + "css-box-model": "^1.2.0", + "memoize-one": "^5.1.1", + "raf-schd": "^4.0.2", + "react-redux": "^7.2.0", + "redux": "^4.0.4", + "use-memo-one": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-beautiful-dnd/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-beautiful-dnd/node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-beautiful-dnd/node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, "node_modules/react-clientside-effect": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", @@ -5913,6 +6005,14 @@ } } }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", + "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/use-sidecar": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", @@ -5943,9 +6043,9 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" diff --git a/src/Contexts/GlobalStateProvider.jsx b/src/Contexts/GlobalStateProvider.jsx index c260bf5..79090a1 100644 --- a/src/Contexts/GlobalStateProvider.jsx +++ b/src/Contexts/GlobalStateProvider.jsx @@ -411,58 +411,65 @@ const GlobalStateProvider = ({ children }) => { totalReturnOnInvestment: "73.0%", }, ]); - - const [create, setCreate] = useState([ + + const [caseDetails, setCaseDetails] = useState([ { id: 1, - Type: "PDF", - fileName: "Investment Private Company", - document: "Investment.pdf", - status: true, + date: "02-Jan-24", + particulars: "Cash Reserve- Initated", + amount: "50,000.00", + comments: " ", + updateBy: "Faisal", + updateOn: "02-Jan-24", }, { id: 2, - Type: "PDF", - fileName: "Investment Private", - document: "Investment.pdf", - status: true, + date: "12-Feb-24", + particulars: "Fees & Expense", + amount: "22,000.00", + comments: "Fees = $20,000 Expense = $2,000 ", + updateBy: "Faisal", + updateOn: "13-Feb-24", }, { id: 3, - Type: "PDF", - fileName: "Investment Private", - document: "Investment.pdf", - status: true, + date: "23-Mar-24", + particulars: "Distribution Received From Sponsor", + amount: "50,000.00", + comments: " ", + updateBy: "Nawab", + updateOn: "24-Mar-24", }, { id: 4, - Type: "PDF", - fileName: "Investment Private", - document: "Investment.pdf", - status: true, + date: "28-Mar-24", + particulars: "Distribution Paid To Investors", + amount: "40,000.00", + comments: " ", + updateBy: "Faisal", + updateOn: "28-Mar-24", }, { id: 5, - Type: "PDF", - fileName: "Investment Private", - document: "Investment.pdf", - status: true, + date: "26-Jun-24", + particulars: "Distribution Received From Sponsor", + amount: "70,000.00", + comments: " ", + updateBy: "Faisal", + updateOn: "27-Jun-24", }, { id: 6, - Type: "PDF", - fileName: "Investment Private", - document: "Investment.pdf", - status: true, - }, - { - id: 7, - Type: "PDF", - fileName: "Investment Private", - document: "Investment.pdf", - status: true, + date: "02-Jan-24", + particulars: "Distribution Paid To Investors", + amount: "60,000.00", + comments: " ", + updateBy: "Nawab", + updateOn: "28-Jun-24", }, ]); + + const [keyMerits, setKeyMerits] = useState([ { id: 1, @@ -1500,14 +1507,16 @@ const GlobalStateProvider = ({ children }) => { setDeleteRequest, viewIO, setViewIO, - create, - setCreate, + // create, + // setCreate, keyMerits, setKeyMerits, iOArtifacts, setIOArtifacts, investors, - setInvestors + setInvestors, + caseDetails, + setCaseDetails, }} > {children} diff --git a/src/Pages/IO_Management/CreateIO/IOCashDetails.jsx b/src/Pages/IO_Management/CreateIO/IOCashDetails.jsx index 5420978..2beb2fe 100644 --- a/src/Pages/IO_Management/CreateIO/IOCashDetails.jsx +++ b/src/Pages/IO_Management/CreateIO/IOCashDetails.jsx @@ -1,9 +1,294 @@ -import React from 'react' +import { + Box, + Button, + HStack, + Input, + Table, + Tag, + Tbody, + Text, + Th, + Tr, + useToast, +} from "@chakra-ui/react"; +import React, { useContext, useEffect, useState } from "react"; +import { OPACITY_ON_LOAD } from "../../../Layout/animations"; +import DataTable from "../../../Components/DataTable/DataTable"; +import Pagination from "../../../Components/Pagination"; +import GlobalStateContext from "../../../Contexts/GlobalStateContext"; +import CustomAlertDialog from "../../../Components/CustomAlertDialog"; +import ToastBox from "../../../Components/ToastBox"; +import { debounce } from "../../Master/Sponser/AddSponser"; + +const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter const IOCashDetails = () => { - return ( -
IOCashDetails
- ) -} + const toast = useToast(); + const { caseDetails, setCaseDetails, slideFromRight } = + useContext(GlobalStateContext); + 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(""); -export default IOCashDetails \ No newline at end of file + useEffect(() => { + // Simulate loading + const timer = setTimeout(() => { + setIsLoading(false); + }, 1500); + + // Cleanup the timer on component unmount + return () => clearTimeout(timer); + }, []); + + // Calculate totals + const totalAmount = caseDetails.reduce( + (acc, caseDetail) => acc + caseDetail.amount, + 0 + ); + + // Table setup + const tableHeadRow = [ + "Date", + "Particulars", + "Amount", + "Comments", + "Update by ", + "Update On", + ]; + + const handleUpdateStatus = debounce((id) => { + setCaseDetails((prevSponser) => + prevSponser.map((sponsor) => + sponsor.id === id ? { ...sponsor, status: !sponsor.status } : sponsor + ) + ); + toast({ + render: () => , + }); + }, 300); + + // Table filter + const filteredData = caseDetails.filter((item) => { + const name = item.date; + const searchLower = searchTerm.toLowerCase(); + const nameMatches = name.toLowerCase().includes(searchLower); + return nameMatches; + }); + + + const [ extractedArray, setExtractedArray ] = useState(filteredData?.map((item, index) => ({ + id: item?.id, + "Date": ( + + {item.date} + + ), + "Particulars": ( + + {item.particulars} + + ), + "Amount": ( + + {item.amount} + + ), + "Comments": ( + + {item.comments} + + ), + "Update by ": ( + + {item.updateBy} + + ), + "Update On": ( + + {item.updateOn} + + ), + }))); + + const handleDelete = () => { + const updatedSponsors = sponser.filter( + (sponsor) => sponsor.id !== actionId + ); + + setTimeout(() => { + setCaseDetails(updatedSponsors); + setDeleteAlert(false); + setIsLoading(false); + }, 100); + setIsLoading(true); + }; + + const Total = () => { + return ( + + + + + + + + + + + +
+ Total + + {" "} + + {/* {totalAmount} */} + {"5000"} + + {" "} + + {" "} + + {" "} +
+ ); + }; + + 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 IOCashDetails; diff --git a/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx b/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx index 9101030..47d3561 100644 --- a/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx +++ b/src/Pages/IO_Management/CreateIO/InvestmentDocument.jsx @@ -1,44 +1,104 @@ -import { Box, Button, HStack, Input, Text, Tooltip, useDisclosure, VStack } from "@chakra-ui/react"; +import { + Box, + Button, + HStack, + Input, + Text, + Tooltip, + useDisclosure, + VStack, + useToast, +} from "@chakra-ui/react"; import React, { useContext, useEffect, useRef, useState } from "react"; +import { useNavigate } from "react-router-dom"; import InvestmentDocuments from "../InvestmentDocuments"; import DataTable from "../../../Components/DataTable/DataTable"; import CustomAlertDialog from "../../../Components/CustomAlertDialog"; import GlobalStateContext from "../../../Contexts/GlobalStateContext"; import { debounce } from "../../Master/Sponser/AddSponser"; -import { formatDate } from "../../../Components/Functions/UTCConvertor"; -import { AddIcon, DeleteIcon, DownloadIcon, EditIcon, ViewIcon } from "@chakra-ui/icons"; +import { + AddIcon, + DeleteIcon, + DownloadIcon, + EditIcon, + ViewIcon, +} from "@chakra-ui/icons"; const InvestmentDocument = ({ control, errors, enableNextTab, index }) => { - const { create, setCreate, sponser, setSponser,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 { slideFromRight } = + useContext(GlobalStateContext); + const firstField = useRef(); + const [searchTerm, setSearchTerm] = useState(""); + const [isLoading, setIsLoading] = useState(true); + const [deleteAlert, setDeleteAlert] = useState(false); + const [actionId, setActionId] = useState(null); + const [mouseEntered, setMouseEntered] = useState(false); + const [mouseEnteredId, setMouseEnteredId] = useState(""); + const { isOpen, onOpen, onClose } = useDisclosure(); + const navigate = useNavigate(); + const toast = useToast(); - useEffect(() => { - // Simulate loading - const timer = setTimeout(() => { - setIsLoading(false); - }, 1500); - - // Cleanup the timer on component unmount - return () => clearTimeout(timer); - }, []); + const [create, setCreate] = useState([ + { + id: 1, + Type: "PDF", + fileName: "Investment Private Company", + document: "Investment.pdf", + status: true, + }, + { + id: 2, + Type: "PDF", + fileName: "Investment Private", + document: "Investment.pdf", + status: true, + }, + { + id: 3, + Type: "PDF", + fileName: "Investment Private", + document: "Investment.pdf", + status: true, + }, + { + id: 4, + Type: "PDF", + fileName: "Investment Private", + document: "Investment.pdf", + status: true, + }, + { + id: 5, + Type: "PDF", + fileName: "Investment Private", + document: "Investment.pdf", + status: true, + }, + { + id: 6, + Type: "PDF", + fileName: "Investment Private", + document: "Investment.pdf", + status: true, + }, + { + id: 7, + Type: "PDF", + fileName: "Investment Private", + document: "Investment.pdf", + status: true, + }, + ]); + useEffect(() => { + const timer = setTimeout(() => { + setIsLoading(false); + }, 1500); - - const tableHeadRow = [ - "Sr.no", - "Type", - "File Name", - "Document", - "Action", - ]; + return () => clearTimeout(timer); + }, []); + + const tableHeadRow = ["Sr.no", "Type", "File Name", "Document", "Action"]; const handleUpdateStatus = debounce((id) => { setCreate((prevCreate) => @@ -47,148 +107,140 @@ const InvestmentDocument = ({ control, errors, enableNextTab, index }) => { ) ); toast({ - render: () => , + render: () => ( + + Status changed successfully! + + ), }); }, 300); - const filteredData = create?.filter((item) => { - // Filter by name (case insensitive) - const name = item.Type; - const searchLower = searchTerm.toLowerCase(); - const nameMatches = name.toLowerCase().includes(searchLower); - - return nameMatches; - }); + const filteredData = create.filter((item) => + item?.fileName?.toLowerCase().includes(searchTerm.toLowerCase()) + ); const handleDelete = () => { const updatedCreate = create.filter((create) => create.id !== actionId); - setTimeout(() => { - setSponser(updatedCreate); + setCreate(updatedCreate); setDeleteAlert(false); setIsLoading(false); }, 100); setIsLoading(true); }; - const extractedArray = filteredData?.map((item, index) => ({ + const extractedArray = filteredData.map((item, index) => ({ "Sr.no": ( {index + 1} ), - "Type": ( + Type: ( {item.Type} ), "File Name": ( - - + + {item.fileName} ), - "Document": ( + Document: ( {item.document} ), Action: ( - + @@ -197,10 +249,9 @@ const InvestmentDocument = ({ control, errors, enableNextTab, index }) => { ), })); - return ( - + { - - - + + setDeleteAlert(false)} isOpen={deleteAlert} - message={"Are you sure you want to delete sponers?"} + message="Are you sure you want to delete the sponsor?" alertHandler={handleDelete} isLoading={isLoading} /> diff --git a/src/Pages/IO_Management/CreateIO/Investors.jsx b/src/Pages/IO_Management/CreateIO/Investors.jsx index ebd3eb0..7d3d6ea 100644 --- a/src/Pages/IO_Management/CreateIO/Investors.jsx +++ b/src/Pages/IO_Management/CreateIO/Investors.jsx @@ -27,15 +27,6 @@ import { OPACITY_ON_LOAD } from "../../../Layout/animations"; import DataTable from "../../../Components/DataTable/DataTable"; import { HiDotsVertical } from "react-icons/hi"; import { Link, Link as RouterLink } from "react-router-dom"; -import { - AddIcon, - CheckIcon, - CloseIcon, - DeleteIcon, - EditIcon, - EmailIcon, - ViewIcon, -} from "@chakra-ui/icons"; import Pagination from "../../../Components/Pagination"; import GlobalStateContext from "../../../Contexts/GlobalStateContext"; import CustomAlertDialog from "../../../Components/CustomAlertDialog"; @@ -396,7 +387,7 @@ const Investors = () => { centered={true} emptyMessage={`We don't have any Sponers `} tableHeadRow={tableHeadRow} - data={extractedArray} + data={extractedArray} setData={setExtractedArray} isLoading={isLoading} viewActionId={actionId} diff --git a/src/Pages/IO_Management/CreateIO/KeyMerits.jsx b/src/Pages/IO_Management/CreateIO/KeyMerits.jsx index 329f00b..dbd7fd6 100644 --- a/src/Pages/IO_Management/CreateIO/KeyMerits.jsx +++ b/src/Pages/IO_Management/CreateIO/KeyMerits.jsx @@ -20,6 +20,7 @@ const KeyMerits = ({enableNextTab, index}) => { const [mouseEntered, setMouseEntered] = useState(false); const [mouseEnteredId, setMouseEnteredId] = useState(""); const { isOpen, onOpen, onClose } = useDisclosure(); + useEffect(() => { // Simulate loading diff --git a/src/Pages/IO_Management/InvestmentDocuments.jsx b/src/Pages/IO_Management/InvestmentDocuments.jsx index e95146b..decb18e 100644 --- a/src/Pages/IO_Management/InvestmentDocuments.jsx +++ b/src/Pages/IO_Management/InvestmentDocuments.jsx @@ -11,63 +11,110 @@ import { FormControl, FormLabel, Input, - InputGroup, - Stack, + Text, } from "@chakra-ui/react"; import * as yup from "yup"; -import React, { useContext, useEffect, useRef, useState } from "react"; -import FormInputMain from "../../Components/FormInputMain"; +import React, { useContext, useState } from "react"; 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 { 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"; -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"), +export const bytesToMB = (bytes) => { + if (bytes === 0) return "0 MB"; + const bytesInMB = 1024 * 1024; + return (bytes / bytesInMB).toFixed(2) + " MB"; +}; + +export const investmentDocSchema = yup.object().shape({ + document: yup.mixed().required("Document is required"), + fileName: yup.string().required("File name is required"), }); -const InvestmentDocuments = ({ id, isOpen, onClose, firstField }) => { - const [file, setFile] = useState(""); - const [fileName, setFileName] = useState(""); +const InvestmentDocuments = ({ id, isOpen, onClose, firstField, create, setCreate }) => { + const [file, setFile] = useState(null); const [alert, setAlert] = useState(false); + const navigate = useNavigate(); + const { - control, + register, handleSubmit, formState: { errors }, } = useForm({ - resolver: yupResolver(investmentDoct), + resolver: yupResolver(investmentDocSchema), }); - + // const onSubmit = (data) => { + // console.log(data); + // setFile(data.document[0]); + // // Additional code for handling form submission + // }; const onSubmit = (data) => { console.log(data); - setSponser([ - { - ...data, - status: true, - id: uuidv4(), - createdAt: new Date().toISOString(), - }, - ...investmentDoct, - ]); + setFile(data.document[0]); + + 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]); + navigate(" "); }; - const handleSave = () => { - console.log({ - fileName: fileName, - file:file - }); - setAlert(false) - onClose() + const handleFileChange = (event) => { + const selectedFile = event.target.files[0]; + setFile(selectedFile); + }; - } + const getFileIcon = (type) => { + switch (type) { + case 'application/pdf': + return ; + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + case 'application/msword': + return ; + case 'image/jpeg': + case 'image/png': + case 'image/gif': + return ; + default: + return ; + } + }; + + const getFileTitle = (type) => { + switch (type) { + case 'application/pdf': + return "PDF"; + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + case 'application/msword': + return "DOCX"; + case 'image/jpeg': + case 'image/png': + case 'image/gif': + return "JPG"; + default: + return "HH"; + } + }; return ( <> - { - Add Details - - - - - File Name - setFileName(e.target.value)} - fontSize={"sm"} - type="text" - size={"sm"} - /> - - - File Name - setFile(e.target.value)} - fontSize={"sm"} - type="file" - className="form-control" - size={"sm"} - /> - - - - - - - - + Add Details + + + + File Name + + {errors.fileName && ( + + {errors.fileName.message} + + )} + + + Document + + {errors.document && ( + + {errors.document.message} + + )} + + {file && ( + + + {getFileIcon(file.type)} + + {file.name} + + + {bytesToMB(file.size)} + + )} + + + + + + setAlert(false)} - alertHandler={handleSave} - message={"Are you sure you want to add this document?"} + message="Are you sure you want to add this document?" /> ); diff --git a/src/Pages/Master/Sponser/AddSponser.jsx b/src/Pages/Master/Sponser/AddSponser.jsx index 238d22c..850c175 100644 --- a/src/Pages/Master/Sponser/AddSponser.jsx +++ b/src/Pages/Master/Sponser/AddSponser.jsx @@ -257,7 +257,7 @@ const AddSponser = () => { createdAt: new Date().toISOString(), }, ...sponser, - ]); + ]); navigate("/sponser"); }; diff --git a/src/Pages/Master/Sponser/Sponsers.jsx b/src/Pages/Master/Sponser/Sponsers.jsx index 8fb996a..ba5dea9 100644 --- a/src/Pages/Master/Sponser/Sponsers.jsx +++ b/src/Pages/Master/Sponser/Sponsers.jsx @@ -1,16 +1,8 @@ import { - Avatar, - Badge, Box, Button, HStack, Input, - Menu, - MenuButton, - MenuItem, - MenuList, - Portal, - Select, Switch, Tag, Text, @@ -194,7 +186,7 @@ const Sponser = () => { - + { }, 100); setIsLoading(true); }; + return (