This commit is contained in:
2024-07-18 14:32:42 +05:30
21 changed files with 1571 additions and 99 deletions

View File

@@ -17,7 +17,7 @@ import { useNavigate } from "react-router-dom";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
const DataTable = ({
data,
data,
setData,
isLoading,
tableHeadRow,

View File

@@ -1527,6 +1527,156 @@ const GlobalStateProvider = ({ children }) => {
},
]);
const [bankInvestor, setBankInvestor] = useState([
{
id: 1,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Completed",
},
{
id: 2,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Incompleted",
},
{
id: 3,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Completed",
},
{
id: 4,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Incompleted",
},
{
id: 5,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Completed",
},
{
id: 6,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Incompleted",
},
{
id: 7,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Incompleted",
},
{
id: 8,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Completed",
},
{
id: 9,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Completed",
},
{
id: 10,
date:"02-Jan-2024",
clientId: "SA00000001",
firstName: "John",
lastName: "David",
country: "Saudi Arabia",
phoneNumber: "8940035906",
mailId: "john@gmail.com",
status: "Incompleted",
},
]);
const [manageAcademy , setManageAcademy] = useState([
{
id: 1,
header:"Investing in Private Equity",
content: "Private equity investing involve...",
bannerImage: "John",
},
{
id: 2,
header:"Investing in Private Equity",
content: "Private equity investing involve...",
bannerImage: "John",
},
{
id: 3,
header:"Investing in Private Equity",
content: "Private equity investing involve...",
bannerImage: "John",
},
])
const [manageVideo , setManageVideo] = useState([
{
id: 1,
name:"Investing in Private Equity",
videoUploaded: "Video.mp4",
},
])
const [academicDocuments , setAcademicDocuments] = useState([
{
id: 1,
fullName:"Investing in Private Equity",
document: "Video.mp4",
},
])
return (
<GlobalStateContext.Provider
value={{
@@ -1584,6 +1734,14 @@ const GlobalStateProvider = ({ children }) => {
setDepositRequest,
depositHistory,
setDepositHistory,
bankInvestor,
setBankInvestor,
manageAcademy,
setManageAcademy,
manageVideo,
setManageVideo,
academicDocuments,
setAcademicDocuments,
}}
>
{children}

View File

@@ -1,22 +0,0 @@
import { Box, Image, Text } from "@chakra-ui/react"
// import error from "../assets/Error.svg"
import robot from "../../assets/robot.png"
// import robot from "../assets/robot.png"
const Academy = () => {
return (
<Box
h={'100vh'}
display={'flex'}
justifyContent={'center'}
alignItems={'center'}
flexDirection={'column'}
gap={8}
>
<Image src={robot} w={"171px"} />
{/* <Text color={'green.800'} as={'span'} fontSize={'small'}>The requested URL was not found on this server.</Text> */}
</Box>
)
}
export default Academy

View File

@@ -1,12 +1,199 @@
import { Box, HStack, Image, Input, Text } from "@chakra-ui/react";
// import error from "../assets/Error.svg"
import robot from "../../assets/robot.png";
import {
Avatar,
Badge,
Box,
Button,
HStack,
Input,
Menu,
MenuButton,
MenuItem,
MenuList,
Portal,
Select,
Switch,
Tag,
Text,
Tooltip,
useDisclosure,
useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState,useRef } from "react";
import { HiDotsVertical } from "react-icons/hi";
import { Link, Link as RouterLink,useNavigate } from "react-router-dom";
import {
AddIcon,
DeleteIcon,
EditIcon,
EmailIcon,
ViewIcon,
} from "@chakra-ui/icons";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import { debounce } from "../Master/Sponser/AddSponser";
import { OPACITY_ON_LOAD } from "../../Layout/animations";
import { useState } from "react";
import DataTable from "../../Components/DataTable/DataTable";
import CustomAlertDialog from "../../Components/CustomAlertDialog";
import Pagination from "../../Components/Pagination";
// import robot from "../assets/robot.png"
import ToastBox from "../../Components/ToastBox";
const formatDate = (date) => new Date(date).toLocaleDateString(); // Simple date formatter
const BankInvestor = () => {
const navigate = useNavigate();
const toast = useToast();
const thirdField = useRef();
const { bankInvestor, setBankInvestor, 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("");
const {isOpen: isEditOpen,onOpen: onEditOpen,onClose: onEditClose,} = useDisclosure();
const btnRef = React.useRef()
useEffect(() => {
// Simulate loading
const timer = setTimeout(() => {
setIsLoading(false);
}, 1500);
// Cleanup the timer on component unmount
return () => clearTimeout(timer);
}, []);
// ====================================================[Table Setup]================================================================
const tableHeadRow = [
"Sr N/O",
"Client ID",
"First Name",
"Last Name",
"Country",
"Phone Number",
"E-mail ID",
"KYC Status",
"Action",
];
const handleUpdateStatus = debounce((id) => {
setBankInvestor((prevData) =>
prevData.map((bankInvestor) =>
bankInvestor.id === id ? { ...bankInvestor } : bankInvestor
)
);
toast({
render: () => <ToastBox message={"Status changed succesfully.!"} />,
});
}, 300);
// ====================================================[Table Filter]================================================================
const filteredData = bankInvestor?.filter((item) => {
// Filter by name (case insensitive)
const name = item.firstName;
const searchLower = searchTerm.toLowerCase();
const nameMatches = name?.toLowerCase().includes(searchLower);
// Filter by status
// const status = item.status;
// const statusLower = status ? "active" : "inactive";
// const statusMatches =
// statusFilter === "all" ||
// (statusFilter === "active" && status === true) ||
// (statusFilter === "inactive" && status === false);
return nameMatches;
});
const extractedArray = filteredData?.map((item) => ({
id: item?.id,
"Sr N/O": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center fw-bold web-text-small"
>
{item.id}
</Text>
),
"Client ID": (
<Box w={"auto"} isTruncated={true}>
<Text as={"span"} color={"teal.900"}>
{item.clientId}
</Text>
</Box>
),
"First Name": (
<Box w={"auto"} isTruncated={true}>
<Text as={"span"} color={"teal.900"}>
{item.firstName}
</Text>
</Box>
),
"Last Name": (
<Box w={"auto"} isTruncated={true}>
<Text as={"span"} color={"teal.900"}>
{item.lastName}
</Text>
</Box>
),
Country: (
<Box w={"auto"} isTruncated={true}>
<Text as={"span"} color={"teal.900"}>
{item.country}
</Text>
</Box>
),
"Phone Number": (
<Box w={"auto"} isTruncated={true}>
<Text as={"span"} color={"teal.900"}>
{item.phoneNumber}
</Text>
</Box>
),
"E-mail ID": (
<Box w={"auto"} isTruncated={true}>
<Text as={"span"} color={"teal.900"}>
{item.mailId}
</Text>
</Box>
),
"KYC Status": (
<Box w={"auto"} isTruncated={true}>
<Badge fontWeight={'500'} textTransform={'none'} color={item.status === "Completed" ? "blue" : "red"} px={2} py={0.5}>
{item.status}
</Badge>
</Box>
),
Action: (
<Switch
size={"sm"}
colorScheme="green"
onChange={() => handleUpdateStatus(item.id)}
isChecked={item.status}
/>
),
}));
const handleDelete = () => {
const updatedInvestorDetails = InvestorDetails.filter(
(sponsor) => sponsor.id !== actionId
);
setTimeout(() => {
setInvestorDetails(updatedInvestorDetails);
setDeleteAlert(false);
setIsLoading(false);
}, 100);
setIsLoading(true);
};
const handleEdit = (id) => {
setActionId(id);
onEditOpen();
};
return (
<Box {...OPACITY_ON_LOAD} overflowY={"scroll"} height={"100vh"} pb={38}>
@@ -21,6 +208,7 @@ const BankInvestor = () => {
spacing="24px"
>
<Input
mt={1}
type="search"
width={300}
placeholder="Search..."
@@ -29,13 +217,31 @@ const BankInvestor = () => {
focusBorderColor="green.500"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
>
{/* <HStack display={"flex"} alignItems={"center"}>
<Pagination totalItems={10} />
</HStack> */}
</Input>
/>
<HStack display={"flex"} alignItems={"center"}>
<Pagination totalItems={10} />
</HStack>
</HStack>
</Box>
<DataTable
emptyMessage={`We don't have any Sponers `}
tableHeadRow={tableHeadRow}
data={extractedArray}
isLoading={isLoading}
viewActionId={actionId}
setViewActionId={setActionId}
setMouseEnteredId={setMouseEnteredId}
setMouseEntered={setMouseEntered}
/>
<CustomAlertDialog
onClose={() => setDeleteAlert(false)}
isOpen={deleteAlert}
message={"Are you sure you want to delete sponers?"}
alertHandler={handleDelete}
isLoading={isLoading}
/>
</Box>
);
};

View File

@@ -1,22 +1,117 @@
import { Box, Image, Text } from "@chakra-ui/react"
// import error from "../assets/Error.svg"
import robot from "../../assets/robot.png"
// import robot from "../assets/robot.png"
const Contact = () => {
return (
<Box
h={'100vh'}
display={'flex'}
justifyContent={'center'}
alignItems={'center'}
flexDirection={'column'}
gap={8}
>
<Image src={robot} w={"171px"} />
{/* <Text color={'green.800'} as={'span'} fontSize={'small'}>The requested URL was not found on this server.</Text> */}
</Box>
)
import React, { useContext, useState } from "react";
import {
Box,
Divider,
FormControl,
FormLabel,
Heading,
Input,
Select,
Textarea,
Button,
Text,
} from "@chakra-ui/react";
import { useForm, Controller } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as yup from "yup";
import { useNavigate } from "react-router-dom";
import { v4 as uuidv4 } from "uuid";
import GlobalStateContext from "../../Contexts/GlobalStateContext";
import { OPACITY_ON_LOAD } from "../../Layout/animations";
import FormInputMain from "../../Components/FormInputMain";
export const addSponser = yup.object().shape({
phoneNumber: yup.string().required("Phone Number is required"),
emailId: yup.string().required("E-mail ID is required"),
WebsiteURL: yup.string().required("Website URL is required"),
});
export function debounce(func, delay) {
let debounceTimer;
return function (...args) {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => func.apply(this, args), delay);
};
}
export default Contact
const Contact = () => {
const navigate = useNavigate();
const { sponser, setSponser } = useContext(GlobalStateContext);
const {
control,
handleSubmit,
formState: { errors },
} = useForm({
resolver: yupResolver(addSponser),
});
console.log(errors);
// console.log(selectedBannerImageData);
const formFields = [
{
label: "Phone Number",
placeHolder:" ",
name: "phoneNumber",
type: "text",
isRequired: true,
section: "Add Details",
},
{
label: "E-mail ID ",
name: "emailId",
placeHolder:" ",
type: "text",
isRequired: true,
section: "Add Details",
},
{
label: "Website URL",
name: "WebsiteURL",
placeHolder:" ",
type: "text",
isRequired: true,
section: "Add Details",
},
];
const groupedFields = formFields.reduce((groups, field) => {
const { section } = field;
if (!groups[section]) {
groups[section] = [];
}
groups[section].push(field);
return groups;
}, {});
const onSubmit = (data) => {
console.log(data);
setSponser([
{
...data,
status: true,
id: uuidv4(),
createdAt: new Date().toISOString(),
},
...sponser,
]);
navigate("/sponser");
};
return (
<Box {...OPACITY_ON_LOAD} overflowY={"scroll"} height={"100vh"} pb={14}>
<FormInputMain
groupedFields={groupedFields}
control={control}
errors={errors}
onSubmit={handleSubmit(onSubmit)}
/>
</Box>
);
};
export default Contact;

View File

@@ -0,0 +1,242 @@
import {
Box,
Button,
HStack,
Image,
Input,
Link,
Text,
Tooltip,
useDisclosure,
useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import { AddIcon, CheckIcon, CloseIcon, DeleteIcon, EditIcon, ViewIcon } from "@chakra-ui/icons";
import DataTable from "../../../Components/DataTable/DataTable";
import Pagination from "../../../Components/Pagination";
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
import { OPACITY_ON_LOAD } from "../../../Layout/animations";
import GlobalStateContext from "../../../Contexts/GlobalStateContext";
import AcademicDocumentsAdd from "./AcademicDocumentsAdd";
const AcademicDocuments = () => {
const toast = useToast();
const { slideFromRight, academicDocuments, setAcademicDocuments } =
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("");
const { isOpen, onOpen, onClose } = useDisclosure();
useEffect(() => {
// Simulate loading
const timer = setTimeout(() => {
setIsLoading(false);
}, 1500);
// Cleanup the timer on component unmount
return () => clearTimeout(timer);
}, []);
// ====================================================[Table Filter]================================================================
const filteredData = academicDocuments.filter((item) => {
// Filter by name (case insensitive)
const name = item.fullName;
const searchLower = searchTerm.toLowerCase();
const nameMatches = name.toLowerCase().includes(searchLower);
return nameMatches;
});
// ====================================================[Table Setup]================================================================
const tableHeadRow = [
"Sr No.",
"File Name",
"Document",
"Action",
];
const extractedArray = filteredData?.map((item, index) => ({
id: item?.id,
"Sr No.": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{index + 1}.
</Text>
),
"File Name": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{item.fullName}
</Text>
),
"Document": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{item.document}
</Text>
),
Action: (
<Box display={"flex"} justifyContent={"center"} gap={2}>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="View"
bg="#fff"
color={"green.500"}
placement="top"
>
<Button
_hover={{ color: "green.500" }}
// transition={"0.5s all"}
color="green.300"
rounded={"sm"}
size={"xs"}
>
<ViewIcon />
</Button>
</Tooltip>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="Edit"
bg="#fff"
color={"blue.500"}
placement="top"
>
<Button
_hover={{ color: "blue.500" }}
// transition={"0.5s all"}
color="blue.400"
rounded={"sm"}
size={"xs"}
>
<EditIcon />
</Button>
</Tooltip>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="Delete"
bg="#fff"
color={"red.500"}
placement="top"
>
<Button
onClick={() => {
setActionId(item?.id);
setDeleteAlert(true);
}}
_hover={{ color: "red.500" }}
// transition={"0.5s all"}
color="red.300"
rounded={"sm"}
size={"xs"}
>
<DeleteIcon />
</Button>
</Tooltip>
</Box>
),
}));
const handleDelete = () => {
const deleteHistory = sponser.filter((sponsor) => sponsor.id !== actionId);
setTimeout(() => {
setSponser(deleteHistory);
setDeleteAlert(false);
setIsLoading(false);
}, 100);
setIsLoading(true);
};
return (
<Box {...OPACITY_ON_LOAD} overflowY={"scroll"} height={"100vh"} pb={38}>
<Box bg="white.500">
<HStack
display={"flex"}
justifyContent={"space-between"}
ps={1}
pe={1}
pb={4}
pt={4}
spacing="24px"
>
<Input
type="search"
width={300}
placeholder="Search..."
size="sm"
rounded="sm"
focusBorderColor="green.500"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<HStack display={"flex"} alignItems={"center"}>
<Pagination totalItems={10} />
<Link to={""}>
<Button
leftIcon={<AddIcon />}
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
onClick={onOpen}
>
Add
</Button>
</Link>
</HStack>
</HStack>
<AcademicDocumentsAdd
isOpen={isOpen}
onClose={onClose}
/>
</Box>
<DataTable
emptyMessage={`We don't have any Sponers `}
tableHeadRow={tableHeadRow}
data={extractedArray}
isLoading={isLoading}
viewActionId={actionId}
setViewActionId={setActionId}
// totalPages={10}
setMouseEnteredId={setMouseEnteredId}
setMouseEntered={setMouseEntered}
/>
<CustomAlertDialog
onClose={() => setDeleteAlert(false)}
isOpen={deleteAlert}
message={"Are you sure you want to delete sponers?"}
alertHandler={handleDelete}
isLoading={isLoading}
/>
</Box>
);
};
export default AcademicDocuments;

View File

@@ -0,0 +1,73 @@
import {
Box,
Button,
Drawer,
DrawerBody,
DrawerCloseButton,
DrawerContent,
DrawerFooter,
DrawerHeader,
DrawerOverlay,
FormControl,
FormLabel,
Grid,
Input,
Textarea,
useDisclosure,
} from "@chakra-ui/react";
import React from "react";
const AcademicDocumentsAdd = ({ isOpen, onClose }) => {
return (
<>
<Drawer onClose={onClose} isOpen={isOpen} size={"xs"}>
<DrawerOverlay />
<DrawerContent>
<DrawerCloseButton />
<DrawerHeader fontSize={"md"}>Academic Documents</DrawerHeader>
<Box as="form">
<DrawerBody>
<Box mb={5}>
<FormLabel fontSize={"sm"}>Name</FormLabel>
<Input type="number" size={"sm"} value={""} />
</Box>
<Box mb={5}>
<FormLabel fontSize={"sm"}>Document</FormLabel>
<Input
type="file"
size={"sm"}
value={""}
className="form-control"
/>
</Box>
</DrawerBody>
<DrawerFooter>
<Button
variant="outline"
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
mr={3}
// onClick={onClose}
>
Cancel
</Button>
<Button
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
// onClick={() => setAlert(true)}
>
Save
</Button>
</DrawerFooter>
</Box>
</DrawerContent>
</Drawer>
</>
);
};
export default AcademicDocumentsAdd;

View File

@@ -0,0 +1,243 @@
import {
Box,
Button,
HStack,
Image,
Input,
Link,
Text,
Tooltip,
useDisclosure,
useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import { AddIcon, CheckIcon, CloseIcon, DeleteIcon, EditIcon, ViewIcon } from "@chakra-ui/icons";
import DataTable from "../../../Components/DataTable/DataTable";
import Pagination from "../../../Components/Pagination";
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
import { OPACITY_ON_LOAD } from "../../../Layout/animations";
import GlobalStateContext from "../../../Contexts/GlobalStateContext";
import banner from "../../../assets/accademicbanner.png";
import AcademicVideoAdd from "./AcademicVideoAdd";
const AcademicVideo = () => {
const toast = useToast();
const { slideFromRight, manageVideo, setManageVideo } =
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("");
const { isOpen, onOpen, onClose } = useDisclosure();
useEffect(() => {
// Simulate loading
const timer = setTimeout(() => {
setIsLoading(false);
}, 1500);
// Cleanup the timer on component unmount
return () => clearTimeout(timer);
}, []);
// ====================================================[Table Filter]================================================================
const filteredData = manageVideo.filter((item) => {
// Filter by name (case insensitive)
const name = item.name;
const searchLower = searchTerm.toLowerCase();
const nameMatches = name.toLowerCase().includes(searchLower);
return nameMatches;
});
// ====================================================[Table Setup]================================================================
const tableHeadRow = [
"Sr No.",
"Name",
"Video Uploaded",
"Action",
];
const extractedArray = filteredData?.map((item, index) => ({
id: item?.id,
"Sr No.": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{index + 1}.
</Text>
),
Name: (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{item.name}
</Text>
),
"Video Uploaded": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{item.videoUploaded}
</Text>
),
Action: (
<Box display={"flex"} justifyContent={"center"} gap={2}>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="View"
bg="#fff"
color={"green.500"}
placement="top"
>
<Button
_hover={{ color: "green.500" }}
// transition={"0.5s all"}
color="green.300"
rounded={"sm"}
size={"xs"}
>
<ViewIcon />
</Button>
</Tooltip>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="Edit"
bg="#fff"
color={"blue.500"}
placement="top"
>
<Button
_hover={{ color: "blue.500" }}
// transition={"0.5s all"}
color="blue.400"
rounded={"sm"}
size={"xs"}
>
<EditIcon />
</Button>
</Tooltip>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="Delete"
bg="#fff"
color={"red.500"}
placement="top"
>
<Button
onClick={() => {
setActionId(item?.id);
setDeleteAlert(true);
}}
_hover={{ color: "red.500" }}
// transition={"0.5s all"}
color="red.300"
rounded={"sm"}
size={"xs"}
>
<DeleteIcon />
</Button>
</Tooltip>
</Box>
),
}));
const handleDelete = () => {
const deleteHistory = sponser.filter((sponsor) => sponsor.id !== actionId);
setTimeout(() => {
setSponser(deleteHistory);
setDeleteAlert(false);
setIsLoading(false);
}, 100);
setIsLoading(true);
};
return (
<Box {...OPACITY_ON_LOAD} overflowY={"scroll"} height={"100vh"} pb={38}>
<Box bg="white.500">
<HStack
display={"flex"}
justifyContent={"space-between"}
ps={1}
pe={1}
pb={4}
pt={4}
spacing="24px"
>
<Input
type="search"
width={300}
placeholder="Search..."
size="sm"
rounded="sm"
focusBorderColor="green.500"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<HStack display={"flex"} alignItems={"center"}>
<Pagination totalItems={10} />
<Link to={""}>
<Button
leftIcon={<AddIcon />}
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
onClick={onOpen}
>
Add
</Button>
</Link>
</HStack>
</HStack>
<AcademicVideoAdd
isOpen={isOpen}
onClose={onClose}
/>
</Box>
<DataTable
emptyMessage={`We don't have any Sponers `}
tableHeadRow={tableHeadRow}
data={extractedArray}
isLoading={isLoading}
viewActionId={actionId}
setViewActionId={setActionId}
// totalPages={10}
setMouseEnteredId={setMouseEnteredId}
setMouseEntered={setMouseEntered}
/>
<CustomAlertDialog
onClose={() => setDeleteAlert(false)}
isOpen={deleteAlert}
message={"Are you sure you want to delete sponers?"}
alertHandler={handleDelete}
isLoading={isLoading}
/>
</Box>
);
};
export default AcademicVideo;

View File

@@ -0,0 +1,72 @@
import {
Box,
Button,
Drawer,
DrawerBody,
DrawerCloseButton,
DrawerContent,
DrawerFooter,
DrawerHeader,
DrawerOverlay,
FormControl,
FormLabel,
Grid,
Input,
Textarea,
useDisclosure,
} from "@chakra-ui/react";
import React from "react";
const AcademicVideoAdd = ({ isOpen, onClose }) => {
return (
<>
<Drawer onClose={onClose} isOpen={isOpen} size={"xs"}>
<DrawerOverlay />
<DrawerContent>
<DrawerCloseButton />
<DrawerHeader fontSize={"md"}>Academic Video</DrawerHeader>
<Box as="form">
<DrawerBody>
<Box mb={5}>
<FormLabel fontSize={"sm"}>Name</FormLabel>
<Input type="number" size={"sm"} value={""} />
</Box>
<Box mb={5}>
<FormLabel fontSize={"sm"}>Video Upload</FormLabel>
<Input
type="file"
size={"sm"}
value={""}
className="form-control"
/>
</Box>
</DrawerBody>
<DrawerFooter>
<Button
variant="outline"
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
mr={3}
// onClick={onClose}
>
Cancel
</Button>
<Button
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
// onClick={() => setAlert(true)}
>
Save
</Button>
</DrawerFooter>
</Box>
</DrawerContent>
</Drawer>
</>
);
};
export default AcademicVideoAdd;

View File

@@ -0,0 +1,261 @@
import {
Box,
Button,
HStack,
Image,
Input,
Link,
Text,
Tooltip,
useDisclosure,
useToast,
} from "@chakra-ui/react";
import React, { useContext, useEffect, useState } from "react";
import {
AddIcon,
DeleteIcon,
EditIcon,
ViewIcon,
} from "@chakra-ui/icons";
import DataTable from "../../../Components/DataTable/DataTable";
import Pagination from "../../../Components/Pagination";
import CustomAlertDialog from "../../../Components/CustomAlertDialog";
import { OPACITY_ON_LOAD } from "../../../Layout/animations";
import GlobalStateContext from "../../../Contexts/GlobalStateContext";
import banner from "../../../assets/accademicbanner.png";
import AcademicdetailsEdit from "./AcademicdetailsEdit";
const Academicdetails = () => {
const toast = useToast();
const { slideFromRight, manageAcademy, setManageAcademy } =
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("");
const { isOpen, onOpen, onClose } = useDisclosure();
useEffect(() => {
// Simulate loading
const timer = setTimeout(() => {
setIsLoading(false);
}, 1500);
// Cleanup the timer on component unmount
return () => clearTimeout(timer);
}, []);
// ====================================================[Table Filter]================================================================
const filteredData = manageAcademy.filter((item) => {
// Filter by name (case insensitive)
const name = item.header;
const searchLower = searchTerm.toLowerCase();
const nameMatches = name.toLowerCase().includes(searchLower);
return nameMatches;
});
// ====================================================[Table Setup]================================================================
const tableHeadRow = [
"Sr No.",
"Header",
"Content",
"Banner Image",
"Action",
];
const extractedArray = filteredData?.map((item, index) => ({
id: item?.id,
"Sr No.": (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{index + 1}.
</Text>
),
Header: (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{item.header}
</Text>
),
Content: (
<Text
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.600"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
{item.content}
</Text>
),
"Banner Image": (
<Text
w={"100px"}
justifyContent={slideFromRight ? "right" : "left"}
as={"span"}
color={"gray.800"}
className="d-flex align-items-center web-text-small"
fontWeight={"500"}
>
<Image src={banner} w={"150px"} h={"50px"} />
</Text>
),
Action: (
<Box display={"flex"} justifyContent={"center"} gap={2}>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="View"
bg="#fff"
color={"green.500"}
placement="top"
>
<Button
_hover={{ color: "green.500" }}
// transition={"0.5s all"}
color="green.300"
rounded={"sm"}
size={"xs"}
>
<ViewIcon />
</Button>
</Tooltip>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="Edit"
bg="#fff"
color={"blue.500"}
placement="top"
>
<Button
_hover={{ color: "blue.500" }}
// transition={"0.5s all"}
color="blue.400"
rounded={"sm"}
size={"xs"}
>
<EditIcon />
</Button>
</Tooltip>
<Tooltip
rounded={"sm"}
fontSize={"xs"}
label="Delete"
bg="#fff"
color={"red.500"}
placement="top"
>
<Button
onClick={() => {
setActionId(item?.id);
setDeleteAlert(true);
}}
_hover={{ color: "red.500" }}
// transition={"0.5s all"}
color="red.300"
rounded={"sm"}
size={"xs"}
>
<DeleteIcon />
</Button>
</Tooltip>
</Box>
),
}));
const handleDelete = () => {
const deleteHistory = sponser.filter((sponsor) => sponsor.id !== actionId);
setTimeout(() => {
setSponser(deleteHistory);
setDeleteAlert(false);
setIsLoading(false);
}, 100);
setIsLoading(true);
};
return (
<Box {...OPACITY_ON_LOAD} overflowY={"scroll"} height={"100vh"} pb={38}>
<Box bg="white.500">
<HStack
display={"flex"}
justifyContent={"space-between"}
ps={1}
pe={1}
pb={4}
pt={4}
spacing="24px"
>
<Input
type="search"
width={300}
placeholder="Search..."
size="sm"
rounded="sm"
focusBorderColor="green.500"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<HStack display={"flex"} alignItems={"center"}>
<Pagination totalItems={10} />
<Link to={""}>
<Button
leftIcon={<AddIcon />}
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
onClick={onOpen}
>
Add
</Button>
</Link>
</HStack>
</HStack>
<AcademicdetailsEdit
isOpen={isOpen}
onClose={onClose}
/>
</Box>
<DataTable
emptyMessage={`We don't have any Sponers `}
tableHeadRow={tableHeadRow}
data={extractedArray}
isLoading={isLoading}
viewActionId={actionId}
setViewActionId={setActionId}
// totalPages={10}
setMouseEnteredId={setMouseEnteredId}
setMouseEntered={setMouseEntered}
/>
<CustomAlertDialog
onClose={() => setDeleteAlert(false)}
isOpen={deleteAlert}
message={"Are you sure you want to delete sponers?"}
alertHandler={handleDelete}
isLoading={isLoading}
/>
</Box>
);
};
export default Academicdetails;

View File

@@ -0,0 +1,105 @@
import {
Box,
Button,
Drawer,
DrawerBody,
DrawerCloseButton,
DrawerContent,
DrawerFooter,
DrawerHeader,
DrawerOverlay,
FormControl,
FormLabel,
Grid,
Input,
Textarea,
useDisclosure,
} from "@chakra-ui/react";
import React from "react";
const AcademicdetailsEdit = ({ isOpen, onClose }) => {
return (
<>
<Drawer onClose={onClose} isOpen={isOpen} size={"lg"}>
<DrawerOverlay />
<DrawerContent>
<DrawerCloseButton />
<DrawerHeader fontSize={"md"}>manage Academy</DrawerHeader>
<Box as="form">
<DrawerBody>
<Grid templateColumns="repeat(2, 1fr)" gap={4}>
<Box>
<FormLabel fontSize={"sm"}>Header (English)</FormLabel>
<Input
type="number"
size={"sm"}
value={''}
/>
</Box>
<Box>
<FormLabel fontSize={"sm"}>Header (Arabic)</FormLabel>
<Input
type="number"
size={"sm"}
value={''}
/>
</Box>
<Box>
<FormLabel fontSize={"sm"}>Content (English)</FormLabel>
<Textarea
type="number"
size={"sm"}
value={''}
resize={'none'}
/>
</Box>
<Box>
<FormLabel fontSize={"sm"}>Content (Arabic)</FormLabel>
<Textarea
type="number"
size={"sm"}
value={''}
resize={'none'}
/>
</Box>
<Box>
<FormLabel fontSize={"sm"}>Content (Arabic)</FormLabel>
<Input
type="file"
size={"sm"}
value={''}
resize={'none'}
className="form-control"
/>
</Box>
</Grid>
</DrawerBody>
<DrawerFooter>
<Button
variant="outline"
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
mr={3}
onClick={onClose}
>
Cancel
</Button>
<Button
colorScheme={"green"}
rounded={"sm"}
size={"sm"}
onClick={() => setAlert(true)}
>
Save
</Button>
</DrawerFooter>
</Box>
</DrawerContent>
</Drawer>
</>
);
};
export default AcademicdetailsEdit;

View File

@@ -0,0 +1,74 @@
import {
Box,
Image,
Tab,
TabList,
TabPanel,
TabPanels,
Tabs,
Text,
} from "@chakra-ui/react";
import { OPACITY_ON_LOAD } from "../../../Layout/animations";
import Academicdetails from "./Academicdetails";
import AcademicVideo from "./AcademicVideo";
import AcademicDocuments from "./AcademicDocuments";
const Academy = () => {
return (
<Box
{...OPACITY_ON_LOAD}
overflowY={"scroll"}
height={"100vh"}
pb={38}
pt={"3"}
>
<Box bg="white.500">
<Tabs>
<TabList>
<Tab
fontSize={"sm"}
_selected={{
color: "#004118",
borderBottom: "2px solid #38a169",
}}
>
Academic details
</Tab>
<Tab
fontSize={"sm"}
_selected={{
color: "#004118",
borderBottom: "2px solid #38a169",
}}
>
Academic Video
</Tab>
<Tab
fontSize={"sm"}
_selected={{
color: "#004118",
borderBottom: "2px solid #38a169",
}}
>
Academic Documents
</Tab>
</TabList>
<TabPanels>
<TabPanel>
<Academicdetails />
{/* <manageAcademyAdd /> */}
</TabPanel>
<TabPanel>
<AcademicVideo />
</TabPanel>
<TabPanel>
<AcademicDocuments />
</TabPanel>
</TabPanels>
</Tabs>
</Box>
</Box>
);
};
export default Academy;

View File

@@ -75,7 +75,7 @@ console.log(data);
<DrawerBody>
<FormControl mb={4} isInvalid={errors.fileName}>
<FormLabel fontSize="sm">File Name</FormLabel>
<Input
<Input
fontSize="sm"
type="text"
size="sm"

View File

@@ -46,7 +46,7 @@ const EditExchangeRate = ({ id, setIsLoading, updateHistory }) => {
const [effectFrom, setEffectFrom] = useState("");
const [effectTill, setEffectTill] = useState("");
const [rate, setRate] = useState("");
const [rate, setRate] = useState("");
const [alert, setAlert] = useState(false);
useEffect(() => {

View File

@@ -172,7 +172,7 @@ const ExchangeRate = () => {
setIsLoading={setIsLoading}
id={item.id}
history={history}
/>
/>
</Box>
),
}));
@@ -196,7 +196,7 @@ const ExchangeRate = () => {
<HStack
display={"flex"}
justifyContent={"space-between"}
ps={1}
ps={1}
pe={1}
pb={4}
pt={4}

View File

@@ -115,7 +115,7 @@ const AddInvestmentType = () => {
section: "Personal Details",
},
{
label: "Description Name",
label: "Description Name",
name: "description",
type: "text",
isRequired: true,
@@ -129,42 +129,6 @@ const AddInvestmentType = () => {
arabic: true,
section: "Personal Details",
},
// {
// label: "Bank name",
// name: "bankName",
// type: "text",
// isRequired: true,
// section: "Bank Details",
// },
// {
// label: "Account Name",
// name: "accountNumber",
// type: "text",
// isRequired: true,
// section: "Bank Details",
// },
// {
// label: "SWIFT/BIC Code",
// name: "swiftCode",
// type: "number",
// isRequired: true,
// section: "Bank Details",
// },
// {
// label: "Account Email",
// name: "bankEmail",
// type: "text",
// isRequired: true,
// section: "Bank Details",
// },
// {
// label: "Annual yeild",
// name: "annualyield",
// type: "number",
// helperText: "Please enter value in percentage",
// isRequired: true,
// section: "Investment Object Details",
// },
];
const groupedFields = formFields.reduce((groups, field) => {

View File

@@ -54,7 +54,7 @@ const InvestmentType = () => {
useEffect(() => {
// Simulate loading
const timer = setTimeout(() => {
setIsLoading(false);
setIsLoading(false);
}, 1500);
// Cleanup the timer on component unmount

View File

@@ -32,7 +32,7 @@ export const addSponser = yup.object().shape({
accountNumber: yup.string().required("Account Number is required"),
swiftCode: yup.string().required("SWIFT/BIC Code is required"),
bankEmail: yup.string().email("Invalid email format"),
// routingNumber: yup.string().required("Routing Number is required"),
// iban: yup.string().required("IBAN is required"),
// accountType: yup.string().required("Account Type is required"),

View File

@@ -86,6 +86,7 @@ const ViewHistory = () => {
"Amount in Investor currency",
"Status",
];
const [extractedArray, setExtractedArray] = useState(
filteredData?.map((item, index) => ({
@@ -204,7 +205,7 @@ const ViewHistory = () => {
setTimeout(() => {
setSponser(updatedSponsors);
setDeleteAlert(false);
setIsLoading(false);
setIsLoading(false);
}, 100);
setIsLoading(true);
};
@@ -240,7 +241,6 @@ const ViewHistory = () => {
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<HStack display={"flex"} alignItems={"center"}>
<Pagination totalItems={10} />
</HStack>

View File

@@ -1,7 +1,7 @@
import DeletionHistory from "../Pages/AccountDeletion/DeletionHistory";
import DeletionRequest from "../Pages/AccountDeletion/DeletionRequest";
import Academy from "../Pages/Admin/Academy";
// import Academy from "../Pages/Admin/Academy";
import BankDetails from "../Pages/Admin/BankDetails";
import BankInvestor from "../Pages/Admin/BankInvestor";
import Contact from "../Pages/Admin/Contact";
@@ -34,6 +34,7 @@ import PendingRequest from "../Pages/WithDrawal/PendingRequest";
import ViewHistory from "../Pages/WithDrawal/DrawalView/ViewHistory";
import DepositRequest from "../Pages/Deposit/DepositRequest";
import DepositHistory from "../Pages/Deposit/DepositViewHistory/DepositHistory";
import Academy from "../Pages/Admin/ManageAcademy/Academy";
export const RouteLink = [
// =============[ Tanami ]================

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB