Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3671270ee3 | |||
| c8e167d9d0 | |||
| 8c29d5adcc | |||
| 91c5491274 | |||
| 24e6c6846a | |||
| f26def10ba | |||
| 06a0d4d7cd | |||
| a19942b12b | |||
| 9520b2e851 | |||
| 4d89908200 |
@@ -0,0 +1,29 @@
|
|||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
const CustomCounter = ({ targetNumber, timeInSeconds }) => {
|
||||||
|
const [count, setCount] = useState(0);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (targetNumber <= 0 || timeInSeconds <= 0) return; // Handle edge cases
|
||||||
|
|
||||||
|
const interval = Math.floor(timeInSeconds * 1000 / targetNumber); // Time interval for each count in milliseconds
|
||||||
|
const totalTime = timeInSeconds * 1000; // Total time for the entire count in milliseconds
|
||||||
|
|
||||||
|
let currentCount = 0;
|
||||||
|
const intervalId = setInterval(() => {
|
||||||
|
currentCount++;
|
||||||
|
setCount((prevCount) => prevCount + 1); // Update state using the previous state
|
||||||
|
|
||||||
|
if (currentCount >= targetNumber) {
|
||||||
|
clearInterval(intervalId); // Stop the counting when the target number is reached
|
||||||
|
}
|
||||||
|
}, interval);
|
||||||
|
|
||||||
|
// Cleanup the interval on component unmount
|
||||||
|
return () => clearInterval(intervalId);
|
||||||
|
}, [targetNumber, timeInSeconds]);
|
||||||
|
|
||||||
|
return <>{count}</>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default CustomCounter;
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
export default function DummyLogo() {
|
export default function DummyLogo() {
|
||||||
return (
|
return (
|
||||||
<div className="w-20 rounded cursor-pointer bg-primary text-white-light p-2 flex flex-col justify-center items-center gap-0">
|
<div className="w-20 rounded cursor-pointer bg-black text-white p-2 flex flex-col justify-center items-center gap-0">
|
||||||
<h1 className="text-sm font-bold">digiFI</h1>
|
<h1 className="text-sm font-bold">digiFI</h1>
|
||||||
<p className="text-12">Logo</p>
|
<p className="text-12">logo here</p>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,11 @@ import { FaEye, FaRegMoneyBill1 } from 'react-icons/fa6'
|
|||||||
import { GoDotFill } from 'react-icons/go'
|
import { GoDotFill } from 'react-icons/go'
|
||||||
import { IoPeople, IoTrash } from 'react-icons/io5'
|
import { IoPeople, IoTrash } from 'react-icons/io5'
|
||||||
import { TbPlayerTrackNext, TbPlayerTrackPrev } from 'react-icons/tb'
|
import { TbPlayerTrackNext, TbPlayerTrackPrev } from 'react-icons/tb'
|
||||||
|
import { IoMdSettings } from "react-icons/io";
|
||||||
|
import { LuMessageSquareText } from "react-icons/lu";
|
||||||
|
import { LuPanelRight } from "react-icons/lu";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default function Icons({name, className}) {
|
export default function Icons({name, className}) {
|
||||||
return (
|
return (
|
||||||
@@ -29,6 +34,12 @@ export default function Icons({name, className}) {
|
|||||||
<TbPlayerTrackPrev className={`text-base ${className}`} />
|
<TbPlayerTrackPrev className={`text-base ${className}`} />
|
||||||
:name.toLowerCase() == 'edit' ?
|
:name.toLowerCase() == 'edit' ?
|
||||||
<FaEdit className={`text-base ${className}`} />
|
<FaEdit className={`text-base ${className}`} />
|
||||||
|
:name.toLowerCase() == 'settings' ?
|
||||||
|
<IoMdSettings className={`text-base ${className}`} />
|
||||||
|
:name.toLowerCase() == 'message' ?
|
||||||
|
<LuMessageSquareText className={`text-base ${className}`} />
|
||||||
|
:name.toLowerCase() == 'right-panel' ?
|
||||||
|
<LuPanelRight className={`text-base ${className}`} />
|
||||||
:
|
:
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,51 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
import { MdKeyboardDoubleArrowRight } from 'react-icons/md'
|
import { MdKeyboardDoubleArrowRight } from 'react-icons/md'
|
||||||
import { TiHomeOutline } from 'react-icons/ti'
|
import { TiHomeOutline } from 'react-icons/ti'
|
||||||
|
import DashboardHeader from '../layouts/DashboardHeader'
|
||||||
|
|
||||||
export default function BreadcrumbCom({title, span, paths}) {
|
export default function BreadcrumbCom({title, span, paths}) {
|
||||||
|
|
||||||
|
const [stickNav, setStickNav] = useState(false)
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
console.log('tru')
|
||||||
|
|
||||||
|
// var rect = navRef?.current?.getBoundingClientRect()?.bottom;
|
||||||
|
var rect = 10;
|
||||||
|
window.addEventListener('scroll', ()=>{
|
||||||
|
if(window.scrollY >= rect + 20){
|
||||||
|
setStickNav(true)
|
||||||
|
console.log('tru')
|
||||||
|
}else{
|
||||||
|
setStickNav(false)
|
||||||
|
console.log('false')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},[])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='w-full py-2 flex justify-between items-center'>
|
// ${stickNav ? 'sticky top-0 transition-[top] duration-1000 shadow-md shadow-black' : '-top-[100px] static'}
|
||||||
<div className='flex flex-col md:flex-row gap-1 md:items-center'>
|
<div className={`sticky -top-10 bg-white-body dark:bg-black-body dark:border-b dark:border-black-box dark:shadow-sm dark:shadow-black-box`}>
|
||||||
<h1 className='text-12 sm:text-lg md:text-2xl text-black dark:text-black-gray font-semibold'>{title}</h1>
|
<div className= {`w-full py-2 flex justify-between items-center`}>
|
||||||
<span className='text-red-500 text-10 sm:text-base md:text-xl'>{span && span}</span>
|
<div className='flex flex-col gap-2'>
|
||||||
|
<div className='flex flex-col md:flex-row gap-1 md:items-center'>
|
||||||
|
<h1 className='text-12 sm:text-lg md:text-2xl text-black dark:text-white-body font-semibold'>{title}</h1>
|
||||||
|
<span className='text-red-500 text-10 sm:text-base md:text-xl'>{span && span}</span>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-2 items-center text-black-gray dark:text-white-body text-base'>
|
||||||
|
<TiHomeOutline className='text-black dark:text-white-body' />
|
||||||
|
{paths.map((item, index) => (
|
||||||
|
<div className='flex gap-2 items-center text-black dark:text-white-body text-10 sm:text-sm' key={index}>
|
||||||
|
<MdKeyboardDoubleArrowRight />
|
||||||
|
<p className={`${index + 1 == paths.length ? 'text-sky-600 dark:text-white-body/70' : ''}`}>{item}</p>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex gap-2 items-center text-black-gray dark:text-black-gray text-base'>
|
<div className='hidden lg:flex'>
|
||||||
<TiHomeOutline className='text-black dark:text-black-gray' />
|
<DashboardHeader />
|
||||||
{paths.map((item, index) => (
|
|
||||||
<div className='flex gap-2 items-center text-black dark:text-black-gray text-10 sm:text-sm' key={index}>
|
|
||||||
<MdKeyboardDoubleArrowRight />
|
|
||||||
<p className={`${index + 1 == paths.length ? 'text-sky-600 dark:text-black-gray' : ''}`}>{item}</p>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,28 +10,19 @@ import RouteLinks from "../../RouteLinks"
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import MainBtn from "../MainBtn";
|
import MainBtn from "../MainBtn";
|
||||||
import { TbLogout2 } from "react-icons/tb";
|
import { TbLogout2 } from "react-icons/tb";
|
||||||
|
import Icons from "../Icons";
|
||||||
|
|
||||||
export default function DashboardHeader({showAsideDrawer, setShowAsideDrawer}) {
|
export default function DashboardHeader() {
|
||||||
|
|
||||||
const {theme, handleTheme, handleDrawer, setLogoutModal} = generalLayoutContext()
|
const {theme, handleTheme, setLogoutModal, activeMenu, handleActiveMenu, showAsideDrawer, setShowAsideDrawer} = generalLayoutContext()
|
||||||
|
|
||||||
const [activeMenu, setActiveMenu] = useState('')
|
|
||||||
|
|
||||||
const handleActiveMenu = (name) => {
|
|
||||||
if(activeMenu == name){
|
|
||||||
setActiveMenu('')
|
|
||||||
}else{
|
|
||||||
setActiveMenu(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* HEADER SECTION*/}
|
{/* HEADER SECTION*/}
|
||||||
<header className='sticky top-0 z-[777] w-full px-3 md:px-10 bg-white shadow-sm text-brown dark:shadow-white dark:bg-black dark:text-white'>
|
<header className='text-brown dark:text-white'>
|
||||||
<div className='w-full flex h-20 justify-between lg:justify-end items-center'>
|
<div className='w-full flex h-20 justify-between lg:justify-end items-center'>
|
||||||
<div className="lg:hidden">
|
<div className="lg:hidden cursor-pointer" onClick={()=>setShowAsideDrawer('aside')}>
|
||||||
<HandBurger asideDisplay={()=>setShowAsideDrawer(prev => !prev)} showAside={showAsideDrawer} barColor="bg-black-gray" />
|
<HandBurger showAside={showAsideDrawer} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* USER AVATAR */}
|
{/* USER AVATAR */}
|
||||||
@@ -42,20 +33,17 @@ export default function DashboardHeader({showAsideDrawer, setShowAsideDrawer}) {
|
|||||||
<i className="fa-solid fa-wallet text-xl"></i>
|
<i className="fa-solid fa-wallet text-xl"></i>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
|
<div onClick={()=>setShowAsideDrawer('right-aside')} className='large:hidden w-10 h-10 border border-slate-300 text-slate-500 dark:text-white-body rounded-md px-2 flex justify-center items-center gap-2 cursor-pointer' title='Switch Color Mode'>
|
||||||
|
<Icons name='right-panel' className="text-sm md:text-xl font-bold" />
|
||||||
|
</div>
|
||||||
{/* MESSAGE */}
|
{/* MESSAGE */}
|
||||||
{/* <button onClick={()=>handleDrawer(drawerName.chat)} className="relative px-2 flex justify-center items-center gap-2 cursor-pointer">
|
{/* <button onClick={()=>handleDrawer(drawerName.chat)} className="relative px-2 flex justify-center items-center gap-2 cursor-pointer">
|
||||||
<i className="fa-regular fa-envelope text-xl"></i>
|
<i className="fa-regular fa-envelope text-xl"></i>
|
||||||
<div className="absolute w-4 h-4 right-0 top-4 text-[8px] flex justify-center items-center rounded-full bg-emerald-500 animate-pulse">1</div>
|
<div className="absolute w-4 h-4 right-0 top-4 text-[8px] flex justify-center items-center rounded-full bg-emerald-500 animate-pulse">1</div>
|
||||||
</button> */}
|
</button> */}
|
||||||
|
|
||||||
{/* NOTIFICATION */}
|
|
||||||
{/* <button onClick={()=>{}} className="relative px-2 flex justify-center items-center gap-2 cursor-pointer">
|
|
||||||
<i className="fa-regular fa-bell text-xl"></i>
|
|
||||||
<div className="absolute w-4 h-4 right-0 top-4 text-[8px] flex justify-center items-center rounded-full bg-emerald-500 animate-pulse">1</div>
|
|
||||||
</button> */}
|
|
||||||
|
|
||||||
{/* THEME SELECTION */}
|
{/* THEME SELECTION */}
|
||||||
<div onClick={handleTheme} className='px-2 flex justify-center items-center gap-2 cursor-pointer' title='Switch Color Mode'>
|
<div onClick={handleTheme} className='w-10 h-10 border border-slate-300 text-slate-500 dark:text-white-body rounded-md px-2 flex justify-center items-center gap-2 cursor-pointer' title='Switch Color Mode'>
|
||||||
{theme == 'dark' ?
|
{theme == 'dark' ?
|
||||||
<IoMdSunny className="text-sm md:text-xl font-bold" />
|
<IoMdSunny className="text-sm md:text-xl font-bold" />
|
||||||
:
|
:
|
||||||
@@ -63,24 +51,19 @@ export default function DashboardHeader({showAsideDrawer, setShowAsideDrawer}) {
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* USER AVATRA */}
|
|
||||||
{/* <div className='w-10 h-10 rounded shadow-round_black dark:shadow-round_white'>
|
|
||||||
<img src={UserAvatar} alt='user image' className='w-full h-full p-1 rounded-full' />
|
|
||||||
</div> */}
|
|
||||||
|
|
||||||
<div onClick={()=>handleActiveMenu('avatar')} className='relative cursor-pointer w-10 h-10 rounded shadow-round_black dark:shadow-round_white'>
|
<div onClick={()=>handleActiveMenu('avatar')} className='relative cursor-pointer w-10 h-10 rounded shadow-round_black dark:shadow-round_white'>
|
||||||
<img src={UserAvatar} alt='user avatar' className='w-full h-full p-1 rounded-full' />
|
<img src={UserAvatar} alt='user avatar' className='w-full h-full p-1 rounded-full' />
|
||||||
{activeMenu == 'avatar' &&
|
{activeMenu == 'avatar' &&
|
||||||
<div className="pop-modal absolute p-4 w-52 sm:w-96 bg-white dark:bg-black right-0 top-16 rounded shadow-round_black dark:shadow-round_white">
|
<div className="pop-modal z-[777] absolute p-4 w-52 sm:w-96 bg-white-body dark:bg-black-box right-0 top-16 rounded shadow-round_black dark:shadow-round_white">
|
||||||
<div className="w-full h-full flex flex-col gap-4">
|
<div className="w-full h-full flex flex-col gap-4">
|
||||||
<div className="flex flex-col text-black dark:text-white text-base sm:text-lg">
|
<div className="flex flex-col text-black dark:text-white text-base sm:text-lg">
|
||||||
<h1 className="font-semibold">Username</h1>
|
<h1 className="font-semibold">Username</h1>
|
||||||
<p className="-mt-2">username@gmail.com</p>
|
<p className="-mt-2">username@gmail.com</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-primary rounded w-full flex justify-center items-center gap-2">
|
<div className="rounded w-full flex justify-center items-center gap-2">
|
||||||
<MainBtn
|
<MainBtn
|
||||||
text='Logout'
|
text='Logout'
|
||||||
className="w-full text-center text-white font-medium text-lg flex justify-center gap-2 items-center"
|
className="w-full text-center text-black-body hover:text-red-500 dark:text-white-body font-bold text-lg flex justify-center gap-2 items-center"
|
||||||
onClick={()=>setLogoutModal(true)}
|
onClick={()=>setLogoutModal(true)}
|
||||||
>
|
>
|
||||||
<TbLogout2 className="text-base" />
|
<TbLogout2 className="text-base" />
|
||||||
|
|||||||
@@ -1,66 +1,57 @@
|
|||||||
import { useEffect, useState } from 'react'
|
import { useEffect, useState } from 'react'
|
||||||
import { Outlet } from 'react-router-dom'
|
import { Outlet } from 'react-router-dom'
|
||||||
import { FaArrowRight, FaArrowLeft } from "react-icons/fa6";
|
|
||||||
|
|
||||||
import DashboardAside from './aside/DashboardAside'
|
|
||||||
import DashboardHeader from './DashboardHeader'
|
import DashboardHeader from './DashboardHeader'
|
||||||
import { generalLayoutContext } from '../../context/GeneralLayoutContext'
|
import { generalLayoutContext } from '../../context/GeneralLayoutContext'
|
||||||
|
import DashboardAside from './aside/DashboardAside'
|
||||||
|
import RightAsideBar from './rightaside/RightAsideBar'
|
||||||
|
|
||||||
export default function DashboardLayout() {
|
export default function DashboardLayout() {
|
||||||
const [shrinkAside, setShrinkAside] = useState(false)
|
|
||||||
|
|
||||||
const [showAsideDrawer, setShowAsideDrawer] = useState(false)
|
const {showAsideDrawer, setShowAsideDrawer} = generalLayoutContext()
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
window.addEventListener('resize', ()=>{
|
|
||||||
setShrinkAside(false)
|
|
||||||
setShowAsideDrawer(false)
|
|
||||||
})
|
|
||||||
},[])
|
|
||||||
return (
|
return (
|
||||||
<div className='w-full flex relative m-auto h-screen overflow-hidden'>
|
<div className='w-full flex gap-10 relative m-auto h-screen overflow-x-hidden overflow-y-auto bg-white-body dark:bg-black-body p-8 pt-0 lg:p-10'>
|
||||||
<div
|
<div className='hidden lg:block min-w-[300px] px-8 py-4 rounded-3xl sticky top-0 h-full bg-white-aside dark:bg-black-aside shadow-round_black dark:shadow-round_white'>
|
||||||
className={`${shrinkAside ? 'w-28' : 'w-72'} hidden lg:block relative z-[999] bg-black text-white-light`}
|
|
||||||
>
|
|
||||||
<div className='sticky top-0 h-full'>
|
|
||||||
<DashboardAside shrinkAside={shrinkAside} />
|
|
||||||
<button
|
|
||||||
className='absolute top-[72px] -translate-y-[50px] -right-5 block p-2 rounded shadow-round_black dark:shadow-round_white bg-white dark:bg-black text-black dark:text-white'
|
|
||||||
onClick={()=>setShrinkAside(prev => !prev)}
|
|
||||||
>
|
|
||||||
{shrinkAside ? <FaArrowRight />: <FaArrowLeft />}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
// onClick={()=>setShowAsideDrawer(prev => !prev)}
|
|
||||||
className={`${showAsideDrawer ? 'left-0' : '-left-96'} w-4/5 sm:w-72 lg:hidden fixed inset-0 z-[999] bg-black text-white-light`}>
|
|
||||||
<DashboardAside />
|
<DashboardAside />
|
||||||
<button
|
|
||||||
className='absolute top-[72px] -translate-y-[50px] -right-5 block p-2 rounded shadow-round_black dark:shadow-round_white bg-white dark:bg-black text-black dark:text-white'
|
|
||||||
onClick={(e)=>setShowAsideDrawer(prev => !prev)}
|
|
||||||
>
|
|
||||||
<FaArrowLeft />
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='relative w-full h-full overflow-y-auto'>
|
{/* <div className={`${showAsideDrawer =='aside' ? 'left-0' : '-left-full'} w-4/5 sm:w-72 px-8 py-4 lg:hidden fixed inset-0 z-[999] bg-white-aside dark:bg-black-aside dark:text-white-light`}>
|
||||||
{/* HEADER SECTION generalLayoutContext*/}
|
<DashboardAside />
|
||||||
<DashboardHeader showAsideDrawer={showAsideDrawer} setShowAsideDrawer={setShowAsideDrawer} />
|
</div> */}
|
||||||
|
<div className={`${showAsideDrawer =='aside' ? 'left-0' : '-left-full'} lg:hidden w-full fixed inset-0 z-[999]`}>
|
||||||
|
<div className={`${showAsideDrawer =='aside' ? 'fixed left-0 top-0 inset-0' : '-left-full'} w-full bg-[rgba(0,_0,_0,_0.2)] dark:bg-[rgba(0,_0,_0,_0.4)] transition-all cursor-pointer`} onClick={()=>setShowAsideDrawer('')} ></div>
|
||||||
|
<div className={`fixed px-8 py-4 h-full w-4/5 sm:w-[400px] bg-white-aside dark:bg-black-aside dark:text-white-light`}>
|
||||||
|
<DashboardAside />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* BODY SECTION */}
|
<div className='main w-full bg-inherit large:mr-[400px]'>
|
||||||
{/* main takes the full width minus that of the header and footer 72 for header, 39 for footer total 111 */}
|
<div className='fixed top-0 left-0 z-[777] w-full px-8 bg-inherit lg:hidden'>
|
||||||
<div className='main p-3 md:p-10 bg-white-light dark:bg-slate-800 text-brown dark:text-white-light min-h-[calc(99vh-111px)]'>
|
<DashboardHeader />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* main body section */}
|
||||||
|
<div className='min-h-[calc(99vh-111px)] pt-20 lg:pt-0'>
|
||||||
<Outlet />
|
<Outlet />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* FOOTER SECTION */}
|
{/* FOOTER SECTION */}
|
||||||
<footer className="sticky bottom-0 text-center lg:text-end w-full bg-white dark:bg-slate-800 dark:text-white-light p-3 md:px-10 shadow-[0px_0px_2px_black]">
|
<footer className="py-5 text-center lg:text-end w-full text-brown dark:text-white-light">
|
||||||
<p className="text-10">Copyright @ {new Date().getFullYear()} - Developed by digiFi. All Rights Reserved</p>
|
<p className="text-10">Copyright @ {new Date().getFullYear()} - Developed by digiFi. All Rights Reserved</p>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Right Aisde */}
|
||||||
|
<div className={`px-8 py-4 hidden large:flex fixed right-5 top-0 bottom-0 sm:w-[400px] bg-[#192440] dark:bg-[#1E1E2D] text-white-body`}>
|
||||||
|
<RightAsideBar />
|
||||||
|
</div>
|
||||||
|
<div className={`${showAsideDrawer =='right-aside' ? 'right-0 w-full' : '-right-full w-0'} fixed inset-0 z-[999] large:hidden bg-[rgba(0,_0,_0,_0.2)] dark:bg-[rgba(0,_0,_0,_0.4)] transition-all cursor-pointer`} onClick={()=>setShowAsideDrawer('')}>
|
||||||
|
{/* <div className={`${showAsideDrawer =='right-aside' ? 'right-0' : '-right-full'} fixed z-[999] right-0 top-0 inset-0 w-full bg-white/20 bg-red-400 transition-all cursor-pointer`} onClick={()=>setShowAsideDrawer('')} ></div> */}
|
||||||
|
<div onClick={(e)=>e.stopPropagation()} className={`${showAsideDrawer =='right-aside' ? 'right-0' : '-right-full'} fixed z-[999] top-0 botom-0 px-8 py-4 h-full w-4/5 sm:w-[400px] bg-[#192440] dark:bg-[#1E1E2D] text-white-body`}>
|
||||||
|
<RightAsideBar />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
export default function HandBurger({showAside, asideDisplay, barColor}) {
|
export default function HandBurger({showAside, barColor}) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="relative lg:hidden w-5 h-5 flex flex-col items-center justify-between cursor-pointer"
|
className="relative lg:hidden w-5 h-5 flex flex-col items-center justify-between"
|
||||||
onClick={asideDisplay}
|
|
||||||
>
|
>
|
||||||
{/* <div
|
{/* <div
|
||||||
className={`absolute left-0 w-5 h-1 rounded-md ${barColor ? barColor :'bg-primary'} dark:bg-dark-light${
|
className={`absolute left-0 w-5 h-1 rounded-md ${barColor ? barColor :'bg-primary'} dark:bg-dark-light${
|
||||||
@@ -11,22 +10,22 @@ export default function HandBurger({showAside, asideDisplay, barColor}) {
|
|||||||
}`}
|
}`}
|
||||||
></div> */}
|
></div> */}
|
||||||
<div
|
<div
|
||||||
className={`absolute left-0 w-5 h-1 rounded-md ${barColor ? barColor :'bg-primary'} dark:bg-white-light ${
|
className={`absolute left-0 w-5 h-1 rounded-md ${barColor ? barColor :'bg-black-box'} dark:bg-white-light ${
|
||||||
showAside
|
showAside =='aside'
|
||||||
? "bottom-1/2 translate-y-1/2 rotate-45"
|
? "bottom-1/2 translate-y-1/2 rotate-45"
|
||||||
: ""
|
: ""
|
||||||
}`}
|
}`}
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
className={`absolute left-0 top-1/2 -translate-y-1/2 w-5 h-1 rounded-md ${barColor ? barColor :'bg-primary'} dark:bg-white-light transition-all duration-300 ${
|
className={`absolute left-0 top-1/2 -translate-y-1/2 w-5 h-1 rounded-md ${barColor ? barColor :'bg-black-box/50'} dark:bg-white-light transition-all duration-300 ${
|
||||||
showAside
|
showAside =='aside'
|
||||||
? "rotate-[2000deg] opacity-0"
|
? "rotate-[2000deg] opacity-0"
|
||||||
: ""
|
: ""
|
||||||
}`}
|
}`}
|
||||||
></div>
|
></div>
|
||||||
<div
|
<div
|
||||||
className={`absolute left-0 w-5 h-1 rounded-md ${barColor ? barColor :'bg-primary'} dark:bg-white-light ${
|
className={`absolute left-0 w-5 h-1 rounded-md ${barColor ? barColor :'bg-black-box/50'} dark:bg-white-light ${
|
||||||
showAside
|
showAside =='aside'
|
||||||
? "top-1/2 -translate-y-1/2 -rotate-45"
|
? "top-1/2 -translate-y-1/2 -rotate-45"
|
||||||
: "bottom-0"
|
: "bottom-0"
|
||||||
}`}
|
}`}
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { Outlet } from 'react-router-dom'
|
||||||
|
import { FaArrowRight, FaArrowLeft } from "react-icons/fa6";
|
||||||
|
|
||||||
|
import DashboardAside from './aside/DashboardAside'
|
||||||
|
import DashboardHeader from './DashboardHeader'
|
||||||
|
import { generalLayoutContext } from '../../context/GeneralLayoutContext'
|
||||||
|
|
||||||
|
export default function DashboardLayout() {
|
||||||
|
const [shrinkAside, setShrinkAside] = useState(false)
|
||||||
|
|
||||||
|
const [showAsideDrawer, setShowAsideDrawer] = useState(false)
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
window.addEventListener('resize', ()=>{
|
||||||
|
setShrinkAside(false)
|
||||||
|
setShowAsideDrawer(false)
|
||||||
|
})
|
||||||
|
},[])
|
||||||
|
return (
|
||||||
|
<div className='w-full flex relative m-auto h-screen overflow-hidden'>
|
||||||
|
<div
|
||||||
|
className={`${shrinkAside ? 'w-28' : 'w-72'} hidden lg:block relative z-[999] bg-black text-white-light`}
|
||||||
|
>
|
||||||
|
<div className='sticky top-0 h-full'>
|
||||||
|
<DashboardAside shrinkAside={shrinkAside} />
|
||||||
|
<button
|
||||||
|
className='absolute top-[72px] -translate-y-[50px] -right-5 block p-2 rounded shadow-round_black dark:shadow-round_white bg-white dark:bg-black text-black dark:text-white'
|
||||||
|
onClick={()=>setShrinkAside(prev => !prev)}
|
||||||
|
>
|
||||||
|
{shrinkAside ? <FaArrowRight />: <FaArrowLeft />}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
// onClick={()=>setShowAsideDrawer(prev => !prev)}
|
||||||
|
className={`${showAsideDrawer ? 'left-0' : '-left-96'} w-4/5 sm:w-72 lg:hidden fixed inset-0 z-[999] bg-black text-white-light`}>
|
||||||
|
<DashboardAside />
|
||||||
|
<button
|
||||||
|
className='absolute top-[72px] -translate-y-[50px] -right-5 block p-2 rounded shadow-round_black dark:shadow-round_white bg-white dark:bg-black text-black dark:text-white'
|
||||||
|
onClick={(e)=>setShowAsideDrawer(prev => !prev)}
|
||||||
|
>
|
||||||
|
<FaArrowLeft />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='relative w-full h-full overflow-y-auto'>
|
||||||
|
{/* HEADER SECTION generalLayoutContext*/}
|
||||||
|
<DashboardHeader showAsideDrawer={showAsideDrawer} setShowAsideDrawer={setShowAsideDrawer} />
|
||||||
|
|
||||||
|
{/* BODY SECTION */}
|
||||||
|
{/* main takes the full width minus that of the header and footer 72 for header, 39 for footer total 111 */}
|
||||||
|
<div className='main p-3 md:p-10 bg-white-light dark:bg-slate-800 text-brown dark:text-white-light min-h-[calc(99vh-111px)]'>
|
||||||
|
<Outlet />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* FOOTER SECTION */}
|
||||||
|
<footer className="sticky bottom-0 text-center lg:text-end w-full bg-white dark:bg-slate-800 dark:text-white-light p-3 md:px-10 shadow-[0px_0px_2px_black]">
|
||||||
|
<p className="text-10">Copyright @ {new Date().getFullYear()} - Developed by digiFi. All Rights Reserved</p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -1,14 +1,18 @@
|
|||||||
import { Link, useLocation } from "react-router-dom"
|
import { Link, useLocation } from "react-router-dom"
|
||||||
import Icons from "../../Icons"
|
import Icons from "../../Icons"
|
||||||
|
import { generalLayoutContext } from "../../../context/GeneralLayoutContext"
|
||||||
|
|
||||||
export default function AsideLink({shrinkAside, name, to, icon}) {
|
export default function AsideLink({name, to, icon}) {
|
||||||
|
|
||||||
|
const {shrinkAside, setShowAsideDrawer} = generalLayoutContext()
|
||||||
|
|
||||||
const {pathname} = useLocation()
|
const {pathname} = useLocation()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link
|
<Link
|
||||||
className={`w-full flex items-center gap-2 px-4 py-2 my-1 text-[13px] font-semibold rounded-md hover:text-white-light hover:bg-white/10 ${pathname == to ? 'bg-white/10 text-white-light' : 'text-slate-400'}`}
|
className={`w-full flex items-center gap-2 px-4 py-2 my-1 text-[13px] sm:text-sm font-semibold rounded-md hover:bg-white dark:hover:bg-black-box text-slate-500 dark:text-white-body/80 ${pathname == to ? 'bg-white-body dark:bg-black-box' : ''}`}
|
||||||
to={to}
|
to={to}
|
||||||
|
onClick={()=>setShowAsideDrawer(false)}
|
||||||
>
|
>
|
||||||
{icon && <Icons name={icon} />}
|
{icon && <Icons name={icon} />}
|
||||||
{shrinkAside ? '' : name}
|
{shrinkAside ? '' : name}
|
||||||
|
|||||||
@@ -2,11 +2,12 @@ import { useState } from "react";
|
|||||||
import { useLocation } from "react-router-dom"
|
import { useLocation } from "react-router-dom"
|
||||||
import { FaCaretDown } from "react-icons/fa";
|
import { FaCaretDown } from "react-icons/fa";
|
||||||
import Icons from "../../Icons";
|
import Icons from "../../Icons";
|
||||||
|
import { generalLayoutContext } from "../../../context/GeneralLayoutContext";
|
||||||
|
|
||||||
|
|
||||||
export default function AsideLinkWithSubLinks({shrinkAside, name, icon, to, children, isOpen}) {
|
export default function AsideLinkWithSubLinks({name, icon, to, children, isOpen}) {
|
||||||
|
|
||||||
// const btnName = name
|
const {shrinkAside} = generalLayoutContext()
|
||||||
|
|
||||||
const {pathname} = useLocation()
|
const {pathname} = useLocation()
|
||||||
|
|
||||||
@@ -17,9 +18,9 @@ export default function AsideLinkWithSubLinks({shrinkAside, name, icon, to, chil
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={`w-full px-4 text-[13px] font-semibold rounded`}
|
className={`w-full px-4 py-2 my-1 text-[13px] sm:text-sm font-semibold rounded`}
|
||||||
>
|
>
|
||||||
<button onClick={()=>setHideSubMenu(prev => !prev)} name={name} className="py-2 w-full flex items-center justify-between gap-2 cursor-pointer text-slate-400">
|
<button onClick={()=>setHideSubMenu(prev => !prev)} name={name} className="py-2 w-full flex items-center justify-between gap-2 cursor-pointer text-slate-500 dark:text-white-body/90">
|
||||||
<span className="flex gap-2 items-center">{icon && <Icons name={icon} />}{shrinkAside ? '' : name}</span>
|
<span className="flex gap-2 items-center">{icon && <Icons name={icon} />}{shrinkAside ? '' : name}</span>
|
||||||
<FaCaretDown className={`text-base ${(hideSubMenu) ? 'rotate-180' : 'rotate-0'}`} />
|
<FaCaretDown className={`text-base ${(hideSubMenu) ? 'rotate-180' : 'rotate-0'}`} />
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { useEffect, useState } from "react";
|
import {useLocation} from 'react-router-dom'
|
||||||
import {Link, useLocation} from 'react-router-dom'
|
|
||||||
import RouteLinks from "../../../RouteLinks";
|
import RouteLinks from "../../../RouteLinks";
|
||||||
import DummyLogo from "../../DummyLogo";
|
import DummyLogo from "../../DummyLogo";
|
||||||
import MainBtn from "../../MainBtn";
|
import MainBtn from "../../MainBtn";
|
||||||
@@ -8,45 +7,33 @@ import AsideLinkWithSubLinks from "./AsideLinkWithSubLinks";
|
|||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { generalLayoutContext } from "../../../context/GeneralLayoutContext";
|
import { generalLayoutContext } from "../../../context/GeneralLayoutContext";
|
||||||
import { TbLogout2 } from "react-icons/tb";
|
import { TbLogout2 } from "react-icons/tb";
|
||||||
|
import UserAvatar from '../../../assets/user_avatar.jpg'
|
||||||
|
import Icons from "../../Icons";
|
||||||
|
|
||||||
|
export default function DashboardAside() {
|
||||||
export default function DashboardAside({shrinkAside=false}) {
|
|
||||||
|
|
||||||
const {pathname} = useLocation()
|
const {pathname} = useLocation()
|
||||||
|
|
||||||
const {setLogoutModal} = generalLayoutContext()
|
const {setLogoutModal, activeMenu, handleActiveMenu} = generalLayoutContext()
|
||||||
|
|
||||||
const {userDetails} = useSelector((state) => state.userDetails) // GETS LOGGED IN USER ROLE DETAILS
|
const {userDetails} = useSelector((state) => state.userDetails) // GETS LOGGED IN USER ROLE DETAILS
|
||||||
const {role}= userDetails
|
const {role}= userDetails
|
||||||
|
|
||||||
// const [hideSubMenu, setHideSubMenu] = useState('')
|
|
||||||
|
|
||||||
// const handleHideSubMenu = (name) => {
|
|
||||||
// // e.stopPropagation()
|
|
||||||
// setHideSubMenu((prev) => {
|
|
||||||
// if(prev == name){
|
|
||||||
// return ''
|
|
||||||
// }else{
|
|
||||||
// return name
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='w-full h-full flex flex-col'>
|
<div className='w-full h-full flex flex-col'>
|
||||||
<div className="px-4 w-full h-24 logo flex items-center">
|
<div className="mb-3 w-full h-24 logo flex items-center">
|
||||||
<DummyLogo />
|
<DummyLogo />
|
||||||
</div>
|
</div>
|
||||||
<hr className="border-slate-400" />
|
{/* <hr className="border-slate-400" /> */}
|
||||||
|
|
||||||
<div className="p-4 w-full flex flex-col gap-2 h-full overflow-y-auto">
|
<div className="aside-scroll-design w-full flex flex-col gap-2 h-full overflow-y-auto">
|
||||||
{asideNavLinks.map((link, index) => {
|
{asideNavLinks.map((link, index) => {
|
||||||
let active = link.status == 1 ? true : false
|
let active = link.status == 1 ? true : false
|
||||||
let hasSubLinks = (link.subLinks && link.subLinks.length > 0) ? true : false
|
let hasSubLinks = (link.subLinks && link.subLinks.length > 0) ? true : false
|
||||||
if(active && !hasSubLinks){
|
if(active && !hasSubLinks){
|
||||||
return (
|
return (
|
||||||
<div key={index}>
|
<div key={index}>
|
||||||
<AsideLink to={link.to} shrinkAside={shrinkAside} name={link.name} icon={link.icon} />
|
<AsideLink to={link.to} name={link.name} icon={link.icon} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -70,9 +57,9 @@ export default function DashboardAside({shrinkAside=false}) {
|
|||||||
return (
|
return (
|
||||||
<div key={index} className="w-full">
|
<div key={index} className="w-full">
|
||||||
{link.title &&
|
{link.title &&
|
||||||
<h1 className="px-4 py-2 text-12 text-slate-400 font-semibold uppercase mt-3 mb-1 border-b border-slate-800">{link.title}</h1>
|
<h1 className="px-4 py-2 text-sm sm:text-sm text-slate-500 dark:text-white font-semibold uppercase mt-3 mb-1 border-b border-slate-800">{link.title}</h1>
|
||||||
}
|
}
|
||||||
<AsideLinkWithSubLinks shrinkAside={shrinkAside} name={link.name} icon={link.icon} isOpen={subLinkList.includes(pathname)} >
|
<AsideLinkWithSubLinks name={link.name} icon={link.icon} isOpen={subLinkList.includes(pathname)} >
|
||||||
<>
|
<>
|
||||||
{link.subLinks.map((subItem, index)=>{
|
{link.subLinks.map((subItem, index)=>{
|
||||||
let active = subItem.status == 1 ? true : false
|
let active = subItem.status == 1 ? true : false
|
||||||
@@ -80,7 +67,7 @@ export default function DashboardAside({shrinkAside=false}) {
|
|||||||
if(active && !hasSubLinks){
|
if(active && !hasSubLinks){
|
||||||
return (
|
return (
|
||||||
<div key={index}>
|
<div key={index}>
|
||||||
<AsideLink key={index} to={subItem.to} shrinkAside={shrinkAside} name={subItem.name} icon={subItem.icon} />
|
<AsideLink key={index} to={subItem.to} name={subItem.name} icon={subItem.icon} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}else if(active && hasSubLinks){
|
}else if(active && hasSubLinks){
|
||||||
@@ -90,14 +77,14 @@ export default function DashboardAside({shrinkAside=false}) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
return(
|
return(
|
||||||
<AsideLinkWithSubLinks shrinkAside={shrinkAside} name={subItem.name} icon={subItem.icon} isOpen={subLinkList.includes(pathname)}>
|
<AsideLinkWithSubLinks name={subItem.name} icon={subItem.icon} isOpen={subLinkList.includes(pathname)}>
|
||||||
<>
|
<>
|
||||||
{subItem.subLinks.map((item, index)=>{
|
{subItem.subLinks.map((item, index)=>{
|
||||||
let active = item.status == 1 ? true : false
|
let active = item.status == 1 ? true : false
|
||||||
if(active){
|
if(active){
|
||||||
return (
|
return (
|
||||||
<div key={index}>
|
<div key={index}>
|
||||||
<AsideLink key={index} to={item.to} shrinkAside={shrinkAside} name={item.name} icon={item.icon} />
|
<AsideLink key={index} to={item.to} name={item.name} icon={item.icon} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -117,17 +104,40 @@ export default function DashboardAside({shrinkAside=false}) {
|
|||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='px-4 py-2'>
|
<div className='py-2 mt-4 relative'>
|
||||||
<div className="bg-primary rounded w-full flex justify-center items-center gap-2">
|
<div className="w-full flex items-center gap-2">
|
||||||
<MainBtn
|
<div className="w-full flex items-center gap-2">
|
||||||
shrinkAside={shrinkAside}
|
<img src={UserAvatar} alt='user avatar' className='w-12 h-12 p-1 rounded-full' />
|
||||||
text='Logout'
|
<div>
|
||||||
className="w-full text-center flex justify-center gap-2 items-center"
|
<p className="text-sm font-bold text-black-body dark:text-white-body">Username</p>
|
||||||
onClick={()=>setLogoutModal(true)}
|
<p className="text-12 text-black-box/90 dark:text-white-body/80">username@gmail.com</p>
|
||||||
>
|
</div>
|
||||||
<TbLogout2 className="text-base" />
|
</div>
|
||||||
</MainBtn>
|
<button onClick={()=>handleActiveMenu('settings')} className="text-slate-500 dark:text-white-body">
|
||||||
|
<Icons name='settings' className='text-3xl' />
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
{activeMenu == 'settings' &&
|
||||||
|
<div className="pop-modal-down absolute p-4 w-full bg-white-body dark:bg-black-box left-0 bottom-[60%] rounded shadow-round_black dark:shadow-round_white">
|
||||||
|
<div className="w-full min-h-48 flex flex-col justify-between gap-4">
|
||||||
|
<div className="w-full h-full">
|
||||||
|
<div className="flex flex-col text-black dark:text-white text-base sm:text-lg">
|
||||||
|
<h1 className="font-semibold">Username</h1>
|
||||||
|
<p className="-mt-2">username@gmail.com</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="rounded w-full flex items-center gap-2">
|
||||||
|
<MainBtn
|
||||||
|
text='Logout'
|
||||||
|
className="w-full text-center text-black-body hover:text-red-500 dark:text-white-body font-bold text-lg flex justify-center gap-2 items-center"
|
||||||
|
onClick={()=>setLogoutModal(true)}
|
||||||
|
>
|
||||||
|
<TbLogout2 className="text-base" />
|
||||||
|
</MainBtn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,163 @@
|
|||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import {Link, useLocation} from 'react-router-dom'
|
||||||
|
import RouteLinks from "../../../RouteLinks";
|
||||||
|
import DummyLogo from "../../DummyLogo";
|
||||||
|
import MainBtn from "../../MainBtn";
|
||||||
|
import AsideLink from "./AsideLink";
|
||||||
|
import AsideLinkWithSubLinks from "./AsideLinkWithSubLinks";
|
||||||
|
import { useSelector } from "react-redux";
|
||||||
|
import { generalLayoutContext } from "../../../context/GeneralLayoutContext";
|
||||||
|
import { TbLogout2 } from "react-icons/tb";
|
||||||
|
|
||||||
|
|
||||||
|
export default function DashboardAside({shrinkAside=false}) {
|
||||||
|
|
||||||
|
const {pathname} = useLocation()
|
||||||
|
|
||||||
|
const {setLogoutModal} = generalLayoutContext()
|
||||||
|
|
||||||
|
const {userDetails} = useSelector((state) => state.userDetails) // GETS LOGGED IN USER ROLE DETAILS
|
||||||
|
const {role}= userDetails
|
||||||
|
|
||||||
|
// const [hideSubMenu, setHideSubMenu] = useState('')
|
||||||
|
|
||||||
|
// const handleHideSubMenu = (name) => {
|
||||||
|
// // e.stopPropagation()
|
||||||
|
// setHideSubMenu((prev) => {
|
||||||
|
// if(prev == name){
|
||||||
|
// return ''
|
||||||
|
// }else{
|
||||||
|
// return name
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='w-full h-full flex flex-col'>
|
||||||
|
<div className="px-4 w-full h-24 logo flex items-center">
|
||||||
|
<DummyLogo />
|
||||||
|
</div>
|
||||||
|
<hr className="border-slate-400" />
|
||||||
|
|
||||||
|
<div className="p-4 w-full flex flex-col gap-2 h-full overflow-y-auto">
|
||||||
|
{asideNavLinks.map((link, index) => {
|
||||||
|
let active = link.status == 1 ? true : false
|
||||||
|
let hasSubLinks = (link.subLinks && link.subLinks.length > 0) ? true : false
|
||||||
|
if(active && !hasSubLinks){
|
||||||
|
return (
|
||||||
|
<div key={index}>
|
||||||
|
<AsideLink to={link.to} shrinkAside={shrinkAside} name={link.name} icon={link.icon} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
if(active && hasSubLinks){
|
||||||
|
// let subLinkList = link.subLinks.filter(value => value.to).map(item => { //any of all open
|
||||||
|
// if(item.to){
|
||||||
|
// return item.to
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
let subLinkList = []
|
||||||
|
link.subLinks.forEach(item =>{
|
||||||
|
if(item.to){
|
||||||
|
subLinkList.push(item.to)
|
||||||
|
}else if(item.subLinks?.length > 0){
|
||||||
|
item.subLinks.forEach(item => {
|
||||||
|
subLinkList.push(item.to)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// console.log('subLinkList', subLinkList)
|
||||||
|
return (
|
||||||
|
<div key={index} className="w-full">
|
||||||
|
{link.title &&
|
||||||
|
<h1 className="px-4 py-2 text-12 text-slate-400 font-semibold uppercase mt-3 mb-1 border-b border-slate-800">{link.title}</h1>
|
||||||
|
}
|
||||||
|
<AsideLinkWithSubLinks shrinkAside={shrinkAside} name={link.name} icon={link.icon} isOpen={subLinkList.includes(pathname)} >
|
||||||
|
<>
|
||||||
|
{link.subLinks.map((subItem, index)=>{
|
||||||
|
let active = subItem.status == 1 ? true : false
|
||||||
|
let hasSubLinks = (subItem.subLinks && subItem.subLinks.length > 0) ? true : false
|
||||||
|
if(active && !hasSubLinks){
|
||||||
|
return (
|
||||||
|
<div key={index}>
|
||||||
|
<AsideLink key={index} to={subItem.to} shrinkAside={shrinkAside} name={subItem.name} icon={subItem.icon} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}else if(active && hasSubLinks){
|
||||||
|
let subLinkList = subItem.subLinks.filter(value => value.to).map(item => { // specific open
|
||||||
|
if(item.to){
|
||||||
|
return item.to
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return(
|
||||||
|
<AsideLinkWithSubLinks shrinkAside={shrinkAside} name={subItem.name} icon={subItem.icon} isOpen={subLinkList.includes(pathname)}>
|
||||||
|
<>
|
||||||
|
{subItem.subLinks.map((item, index)=>{
|
||||||
|
let active = item.status == 1 ? true : false
|
||||||
|
if(active){
|
||||||
|
return (
|
||||||
|
<div key={index}>
|
||||||
|
<AsideLink key={index} to={item.to} shrinkAside={shrinkAside} name={item.name} icon={item.icon} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
</AsideLinkWithSubLinks>
|
||||||
|
)
|
||||||
|
}else{
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
</AsideLinkWithSubLinks>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className='px-4 py-2'>
|
||||||
|
<div className="bg-primary rounded w-full flex justify-center items-center gap-2">
|
||||||
|
<MainBtn
|
||||||
|
shrinkAside={shrinkAside}
|
||||||
|
text='Logout'
|
||||||
|
className="w-full text-center flex justify-center gap-2 items-center"
|
||||||
|
onClick={()=>setLogoutModal(true)}
|
||||||
|
>
|
||||||
|
<TbLogout2 className="text-base" />
|
||||||
|
</MainBtn>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const asideNavLinks = [
|
||||||
|
{name:'Dashboard', status:1, icon: 'dashboard', to: RouteLinks.homePage},
|
||||||
|
{name:'Salary Loan', title:'Loan', status:1, icon: 'money', subLinks: [
|
||||||
|
{name: 'Selected Loans', status:1, icon: 'dot', to: RouteLinks.selectedLoanPage},
|
||||||
|
{name: 'Applications', status:1, icon: 'dot', to: RouteLinks.applicationsLoanPage},
|
||||||
|
{name: 'Approved Loans', status:1, icon: 'dot', to: RouteLinks.approvedLoansPage},
|
||||||
|
{name: 'Disbursements', status:1, icon: 'dot', to: RouteLinks.disbursementsLoanPage},
|
||||||
|
{name: 'Payments', status:1, icon: 'dot', to: ''},
|
||||||
|
{name: 'Configurations', status:1, icon: 'dot', subLinks: [
|
||||||
|
{name: 'Loan Offers', status:1, icon: 'dot', to: RouteLinks.loanOffersPage },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// {name:'Product 2', title:'Product 2', status:1, icon: 'product', subLinks: [
|
||||||
|
// {name: 'Applications', status:1, icon: 'dot', to: ''},
|
||||||
|
// ]
|
||||||
|
// },
|
||||||
|
// {name:'Product 3', title:'Product 3', status:1, icon: 'product', subLinks: [
|
||||||
|
// {name: 'Applications', status:1, icon: 'dot', to: ''},
|
||||||
|
// {name: 'Configuration', status:1, icon: 'dot', to: ''},
|
||||||
|
// ]
|
||||||
|
// },
|
||||||
|
// {name:'Administration', title:'Admin', status:1, icon: 'people', subLinks: [
|
||||||
|
// {name: 'Users', status:1, icon: 'dot', to: RouteLinks.usersPage},
|
||||||
|
// ]
|
||||||
|
// },
|
||||||
|
]
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Img from '../../../assets/user_avatar.jpg'
|
||||||
|
import CustomCounter from '../../CustomCounter'
|
||||||
|
|
||||||
|
export default function Orders() {
|
||||||
|
return (
|
||||||
|
<div className='h-full p-2 sm:p-4 large:p-8 flex flex-col gap-16 overflow-y-auto aside-scroll-design'>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<p className='text-base text-white-body font-bold'>Support Ticket</p>
|
||||||
|
<div className='grid grid-cols-2 gap-4 sm:gap-6 large:gap-8'>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={18} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Pending</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={5} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Approved</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={1} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Rejected</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={1} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Created</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<p className='text-base text-white-body font-bold'>Best Ticket</p>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import React, { useState } from 'react'
|
||||||
|
import Icons from '../../Icons'
|
||||||
|
import Orders from './Orders'
|
||||||
|
import Tickets from './Tickets'
|
||||||
|
import Tasks from './Tasks'
|
||||||
|
|
||||||
|
export default function RightAsideBar() {
|
||||||
|
|
||||||
|
let [active, setActive] = useState('orders')
|
||||||
|
|
||||||
|
const handleActiveMenu = ({target:{name}}) => {
|
||||||
|
let lowerStr = name.toLowerCase()
|
||||||
|
setActive(lowerStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className='w-full h-full flex flex-col gap-8'>
|
||||||
|
{/* Menu */}
|
||||||
|
<div className='grid grid-cols-3 gap-8'>
|
||||||
|
<button name='orders' onClick={(e) => handleActiveMenu(e)} className={`flex justify-center items-center px-2 py-3 large:px-4 large:py-5 rounded-md shadow-round_white bg-[#0E172E] text-white-body hover:scale-[1.1] ${active == 'orders' && 'scale-[1.2]'}`}>
|
||||||
|
<Icons name='dashboard' className='text-3xl' />
|
||||||
|
</button>
|
||||||
|
<button name='tickets' onClick={(e) => handleActiveMenu(e)} className={`flex justify-center items-center px-2 py-3 large:px-4 large:py-5 rounded-md shadow-round_white bg-[#0E172E] text-white-body hover:scale-[1.1] ${active == 'tickets' && 'scale-[1.2]'}`}>
|
||||||
|
<Icons name='settings' className='text-3xl' />
|
||||||
|
</button>
|
||||||
|
<button name='tasks' onClick={(e) => handleActiveMenu(e)} className={`flex justify-center items-center px-2 py-3 large:px-4 large:py-5 rounded-md shadow-round_white bg-[#0E172E] text-white-body hover:scale-[1.1] ${active == 'tasks' && 'scale-[1.2]'}`}>
|
||||||
|
<Icons name='dashboard' className='text-3xl' />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Body */}
|
||||||
|
{active == 'orders' && <Orders />}
|
||||||
|
{active == 'tickets' && <Tickets />}
|
||||||
|
{active == 'tasks' && <Tasks />}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Img from '../../../assets/user_avatar.jpg'
|
||||||
|
import CustomCounter from '../../CustomCounter'
|
||||||
|
|
||||||
|
export default function Tasks() {
|
||||||
|
return (
|
||||||
|
<div className='h-full p-2 sm:p-4 large:p-8 flex flex-col gap-16 overflow-y-auto aside-scroll-design'>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<p className='text-base text-white-body font-bold'>Support Tasks</p>
|
||||||
|
<div className='grid grid-cols-2 gap-4 sm:gap-6 large:gap-8'>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={2} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Pending</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={20} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Completed</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={3} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Rejected</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={8} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Created</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<p className='text-base text-white-body font-bold'>Best Tasks</p>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import Img from '../../../assets/user_avatar.jpg'
|
||||||
|
import CustomCounter from '../../CustomCounter'
|
||||||
|
|
||||||
|
export default function Tickets() {
|
||||||
|
return (
|
||||||
|
<div className='h-full p-2 sm:p-4 large:p-8 flex flex-col gap-16 overflow-y-auto aside-scroll-design'>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<p className='text-base text-white-body font-bold'>Support Ticket</p>
|
||||||
|
<div className='grid grid-cols-2 gap-4 sm:gap-6 large:gap-8'>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={18} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Pending</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={2} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Offers</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={3} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Created</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-2 sm:p-3 large:p-4 flex flex-col border border-slate-500 border-dashed'>
|
||||||
|
<p className='text-base font-bold text-white-body'>
|
||||||
|
<CustomCounter targetNumber={1} timeInSeconds={1} />
|
||||||
|
</p>
|
||||||
|
<p className='text-sm text-slate-500'>Rejected</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<p className='text-base text-white-body font-bold'>Best Ticket</p>
|
||||||
|
<div className='flex flex-col gap-4'>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='flex gap-3 items-center'>
|
||||||
|
<div className='px-4 py-2 bg-[#0E172E] rounded-md'>
|
||||||
|
<img src={Img} className='w-8' alt="Order Image" />
|
||||||
|
</div>
|
||||||
|
<div className='flex-col'>
|
||||||
|
<p className='text-base font-bold text-white-body'>Project Briefing</p>
|
||||||
|
<p className='text-sm text-slate-500'>Project Manager</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -14,6 +14,20 @@ export default function GeneralLayoutContext({children}) {
|
|||||||
|
|
||||||
const [logoutModal, setLogoutModal] = useState(false) // USE TO SHOW LOGOUT MODAL BOX
|
const [logoutModal, setLogoutModal] = useState(false) // USE TO SHOW LOGOUT MODAL BOX
|
||||||
|
|
||||||
|
const [activeMenu, setActiveMenu] = useState('')
|
||||||
|
|
||||||
|
const [shrinkAside, setShrinkAside] = useState(false)
|
||||||
|
|
||||||
|
const [showAsideDrawer, setShowAsideDrawer] = useState('')
|
||||||
|
|
||||||
|
const handleActiveMenu = (name) => {
|
||||||
|
if(activeMenu == name){
|
||||||
|
setActiveMenu('')
|
||||||
|
}else{
|
||||||
|
setActiveMenu(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const handleDrawer = (drawerToOpen) => { // FUNCTION TO DETERMINE WHICH ASIDE DRAWER TO SHOW
|
const handleDrawer = (drawerToOpen) => { // FUNCTION TO DETERMINE WHICH ASIDE DRAWER TO SHOW
|
||||||
setDrawer((prev)=>{
|
setDrawer((prev)=>{
|
||||||
if(!prev){
|
if(!prev){
|
||||||
@@ -42,6 +56,10 @@ export default function GeneralLayoutContext({children}) {
|
|||||||
setAlertBox(valObj)
|
setAlertBox(valObj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleTheme = () => {
|
||||||
|
setTheme(theme === "dark" ? "light" : "dark");
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
||||||
setTheme("dark");
|
setTheme("dark");
|
||||||
@@ -58,11 +76,29 @@ export default function GeneralLayoutContext({children}) {
|
|||||||
}
|
}
|
||||||
}, [theme]);
|
}, [theme]);
|
||||||
|
|
||||||
const handleTheme = () => {
|
useEffect(()=>{
|
||||||
setTheme(theme === "dark" ? "light" : "dark");
|
window.addEventListener('resize', ()=>{
|
||||||
}
|
setShrinkAside(false)
|
||||||
|
setShowAsideDrawer('')
|
||||||
|
setActiveMenu('')
|
||||||
|
})
|
||||||
|
return () => window.removeEventListener('resize', window.addEventListener('resize', ()=>{
|
||||||
|
setShrinkAside(false)
|
||||||
|
setShowAsideDrawer('')
|
||||||
|
setActiveMenu('')
|
||||||
|
}))
|
||||||
|
},[])
|
||||||
|
|
||||||
let value = {theme, handleTheme, drawer, handleDrawer, booking, handleBooking, alertBox, handleAlertBox, logoutModal, setLogoutModal}
|
let value = {
|
||||||
|
theme, handleTheme,
|
||||||
|
activeMenu, handleActiveMenu,
|
||||||
|
drawer, handleDrawer,
|
||||||
|
booking, handleBooking,
|
||||||
|
alertBox, handleAlertBox,
|
||||||
|
logoutModal, setLogoutModal,
|
||||||
|
shrinkAside, setShrinkAside,
|
||||||
|
showAsideDrawer, setShowAsideDrawer
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<GeneralContextProvider.Provider value={value}>
|
<GeneralContextProvider.Provider value={value}>
|
||||||
|
|||||||
+19
-1
@@ -7,7 +7,7 @@ html{
|
|||||||
}
|
}
|
||||||
|
|
||||||
*{
|
*{
|
||||||
transition: all .3s;
|
transition: all .2s;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
@@ -24,6 +24,13 @@ code {
|
|||||||
monospace;
|
monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@layer utilities {
|
||||||
|
.aside-scroll-design {
|
||||||
|
@apply [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-gray-100 [&::-webkit-scrollbar-thumb]:bg-gray-300 dark:[&::-webkit-scrollbar-track]:bg-neutral-700 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-500 [&::-webkit-scrollbar-track]:rounded-full [&::-webkit-scrollbar-thumb]:rounded-full
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@layer components {
|
@layer components {
|
||||||
.change-text::after{
|
.change-text::after{
|
||||||
content: '';
|
content: '';
|
||||||
@@ -38,6 +45,10 @@ code {
|
|||||||
animation: pop-modal .1s linear 0s forwards;
|
animation: pop-modal .1s linear 0s forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pop-modal-down{
|
||||||
|
animation: pop-modal-down .1s linear 0s forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ANIMATIONS */
|
/* ANIMATIONS */
|
||||||
@keyframes text-change {
|
@keyframes text-change {
|
||||||
@@ -58,4 +69,11 @@ code {
|
|||||||
0%{margin-top: 20px; opacity: 0;}
|
0%{margin-top: 20px; opacity: 0;}
|
||||||
100%{margin-top: 0; opacity: 1;}
|
100%{margin-top: 0; opacity: 1;}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes pop-modal-down {
|
||||||
|
/* 0%{left: -200%;}
|
||||||
|
100%{left: 0%;} */
|
||||||
|
0%{margin-bottom: 20px; opacity: 0;}
|
||||||
|
100%{margin-bottom: 0; opacity: 1;}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-7
@@ -5,15 +5,31 @@ export default function HomePage() {
|
|||||||
return (
|
return (
|
||||||
<div className='w-full flex flex-col gap-8'>
|
<div className='w-full flex flex-col gap-8'>
|
||||||
<BreadcrumbCom title='Dashboard' paths={['Home', 'Dashboard']} />
|
<BreadcrumbCom title='Dashboard' paths={['Home', 'Dashboard']} />
|
||||||
<div className='grid grid-cols-1 2xl:grid-cols-2 gap-8'>
|
<div className='grid grid-cols-1 gap-8'>
|
||||||
<div className='w-full grid grid-cols-1 sm:grid-cols-2 gap-8'>
|
<div className='w-full grid grid-cols-1 md:grid-cols-2 gap-8'>
|
||||||
<div className='w-full bg-white dark:bg-slate-800 hover:scale-[1.02] cursor-pointer rounded h-[300px] shadow-round_black dark:shadow-round_white'></div>
|
<div className='p-8 w-full bg-[#F7D9E3] dark:bg-black-box text-black-body dark:text-white-body hover:scale-[1.0] cursor-pointer rounded-lg h-[300px] shadow-round_black dark:shadow-round_white'>
|
||||||
<div className='w-full bg-white dark:bg-slate-800 hover:scale-[1.02] cursor-pointer rounded h-[300px] shadow-round_black dark:shadow-round_white'></div>
|
<p className='text-base sm:text-lg font-bold'>Earnings</p>
|
||||||
<div className='w-full bg-white dark:bg-slate-800 hover:scale-[1.02] cursor-pointer rounded h-[300px] shadow-round_black dark:shadow-round_white'></div>
|
</div>
|
||||||
<div className='w-full bg-white dark:bg-slate-800 hover:scale-[1.02] cursor-pointer rounded h-[300px] shadow-round_black dark:shadow-round_white'></div>
|
<div className='p-8 w-full bg-[#CBF0F5] dark:bg-black-box text-black-body dark:text-white-body hover:scale-[1.0] cursor-pointer rounded-lg h-[300px] shadow-round_black dark:shadow-round_white'>
|
||||||
|
<p className='text-base sm:text-lg font-bold'>Contributions</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-8 w-full bg-[#CBD4F4] dark:bg-black-box text-black-body dark:text-white-body hover:scale-[1.0] cursor-pointer rounded-lg h-[300px] shadow-round_black dark:shadow-round_white'>
|
||||||
|
<p className='text-base sm:text-lg font-bold'>Summary</p>
|
||||||
|
</div>
|
||||||
|
<div className='p-8 w-full bg-[#F7D9E3] dark:bg-black-box text-black-body dark:text-white-body hover:scale-[1.0] cursor-pointer rounded-lg h-[300px] shadow-round_black dark:shadow-round_white'>
|
||||||
|
<p className='text-base sm:text-lg font-bold'>Earnings</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='w-full'>
|
<div className='w-full'>
|
||||||
<div className='w-full bg-white dark:bg-slate-800 hover:scale-[1.02] cursor-pointer rounded h-full shadow-round_black dark:shadow-round_white'></div>
|
<div className='w-full p-8 min-h-96 bg-white dark:bg-black-box text-black-body dark:text-white-body hover:scale-[1.0] cursor-pointer rounded-lg h-full shadow-[0px_0px_2px_rgba(0,_0,_0,_50)] dark:shadow-round_white'>
|
||||||
|
<div className='flex justify-between items-center'>
|
||||||
|
<div className='flex flex-col gap-1'>
|
||||||
|
<p className='font-bold text-base'>Members Statistics</p>
|
||||||
|
<p className='text-12'>Over 500 members</p>
|
||||||
|
</div>
|
||||||
|
<button className='font-bold text-primary text-12 px-4 py-2 bg-sky-100 rounded-md'>+ New Member</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+12
-5
@@ -9,8 +9,10 @@ module.exports = {
|
|||||||
DEFAULT: '#393536',
|
DEFAULT: '#393536',
|
||||||
},
|
},
|
||||||
black:{
|
black:{
|
||||||
DEFAULT: '#222',
|
DEFAULT: '#000',
|
||||||
gray: '#a6a9b7'
|
aside: '#0D0E12',
|
||||||
|
body: '#0F1014',
|
||||||
|
box: '#15171C',
|
||||||
},
|
},
|
||||||
primary: {
|
primary: {
|
||||||
DEFAULT: '#0284c7',
|
DEFAULT: '#0284c7',
|
||||||
@@ -21,10 +23,13 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
white: {
|
white: {
|
||||||
DEFAULT: '#fff',
|
DEFAULT: '#fff',
|
||||||
light: '#f1f5f9'
|
light: '#f1f5f9',
|
||||||
|
body: '#f9f9f9',
|
||||||
|
aside: '#F1F1F4',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
screens: {
|
screens: {
|
||||||
|
large: '1535px',
|
||||||
max_width: '1700px'
|
max_width: '1700px'
|
||||||
},
|
},
|
||||||
fontSize:{
|
fontSize:{
|
||||||
@@ -36,8 +41,10 @@ module.exports = {
|
|||||||
login_gradient: 'linear-gradient(to right, #8e54e9 0, #4776e6 100%)'
|
login_gradient: 'linear-gradient(to right, #8e54e9 0, #4776e6 100%)'
|
||||||
},
|
},
|
||||||
boxShadow: {
|
boxShadow: {
|
||||||
round_black: '0 0px 1px 0 rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.19)',
|
// round_black: '0 0px 1px 0 rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.19)',
|
||||||
round_white: '0 0px 1px 0 rgba(255, 255, 255, 0.2), 0 1px 5px 0 rgba(255, 255, 255, 0.19)'
|
// round_white: '0 0px 1px 0 rgba(255, 255, 255, 0.2), 0 1px 5px 0 rgba(255, 255, 255, 0.19)'
|
||||||
|
round_black: '0px 3px 4px 0px rgba(0, 0, 0, 0.03)',
|
||||||
|
round_white: '0px 3px 4px 0px rgba(255, 255, 255, 0.03)'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user