initial commit
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Fade from '@mui/material/Fade'
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import IconButton from '@mui/material/IconButton'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Collapse from '@mui/material/Collapse'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Backdrop from '@mui/material/Backdrop'
|
||||
import CircularProgress from '@mui/material/CircularProgress'
|
||||
|
||||
const CardActionAll = () => {
|
||||
// States
|
||||
const [collapse, setCollapse] = useState(false)
|
||||
const [reload, setReload] = useState(false)
|
||||
const [visibility, setVisibility] = useState(false)
|
||||
|
||||
const handleBackDrop = () => {
|
||||
setReload(true)
|
||||
|
||||
setTimeout(() => {
|
||||
setReload(false)
|
||||
}, 2000)
|
||||
}
|
||||
|
||||
return (
|
||||
<Fade in={!visibility} timeout={300}>
|
||||
<Card className='relative'>
|
||||
<CardHeader
|
||||
title='All Actions'
|
||||
action={
|
||||
<div className='flex'>
|
||||
<IconButton size='small' aria-label='collapse' onClick={() => setCollapse(!collapse)}>
|
||||
<i className={collapse ? 'tabler-chevron-down' : 'tabler-chevron-up'} />
|
||||
</IconButton>
|
||||
<IconButton size='small' aria-label='refresh-content' onClick={handleBackDrop}>
|
||||
<i className='tabler-refresh' />
|
||||
</IconButton>
|
||||
<IconButton size='small' aria-label='remove-card' onClick={() => setVisibility(!visibility)}>
|
||||
<i className='tabler-x' />
|
||||
</IconButton>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
<Collapse in={!collapse}>
|
||||
<CardContent>
|
||||
<Typography>Click on the above icons to see them in action</Typography>
|
||||
</CardContent>
|
||||
|
||||
<Backdrop open={reload} className='absolute text-white z-[cal(var(--mui-zIndex-mobileStepper)-1)]'>
|
||||
<CircularProgress color='inherit' />
|
||||
</Backdrop>
|
||||
</Collapse>
|
||||
</Card>
|
||||
</Fade>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardActionAll
|
||||
@@ -0,0 +1,39 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import IconButton from '@mui/material/IconButton'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Collapse from '@mui/material/Collapse'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
const CardActionCollapsible = () => {
|
||||
// States
|
||||
const [collapse, setCollapse] = useState(false)
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Collapsible'
|
||||
action={
|
||||
<IconButton size='small' aria-label='collapse' onClick={() => setCollapse(!collapse)}>
|
||||
<i className={collapse ? 'tabler-chevron-down' : 'tabler-chevron-up'} />
|
||||
</IconButton>
|
||||
}
|
||||
/>
|
||||
<Collapse in={!collapse}>
|
||||
<CardContent>
|
||||
<Typography>
|
||||
Click on <i className='tabler-chevron-up text-xl align-sub' /> icon to see it in action
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</Collapse>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardActionCollapsible
|
||||
@@ -0,0 +1,50 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import IconButton from '@mui/material/IconButton'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Backdrop from '@mui/material/Backdrop'
|
||||
import CircularProgress from '@mui/material/CircularProgress'
|
||||
|
||||
const CardActionRefreshContent = () => {
|
||||
// States
|
||||
const [reload, setReload] = useState(false)
|
||||
|
||||
const handleBackDrop = () => {
|
||||
setReload(true)
|
||||
|
||||
setTimeout(() => {
|
||||
setReload(false)
|
||||
}, 2000)
|
||||
}
|
||||
|
||||
return (
|
||||
<Card className='relative'>
|
||||
<CardHeader
|
||||
title='Refresh Content'
|
||||
action={
|
||||
<IconButton size='small' aria-label='refresh-content' onClick={handleBackDrop}>
|
||||
<i className='tabler-refresh' />
|
||||
</IconButton>
|
||||
}
|
||||
/>
|
||||
<CardContent>
|
||||
<Typography>
|
||||
Click on <i className='tabler-refresh text-xl align-sub' /> icon to see it in action
|
||||
</Typography>
|
||||
</CardContent>
|
||||
|
||||
<Backdrop open={reload} className='absolute text-white z-[cal(var(--mui-zIndex-mobileStepper)-1)]'>
|
||||
<CircularProgress color='inherit' />
|
||||
</Backdrop>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardActionRefreshContent
|
||||
@@ -0,0 +1,39 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Fade from '@mui/material/Fade'
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import IconButton from '@mui/material/IconButton'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
const CardActionRemoveCard = () => {
|
||||
// States
|
||||
const [visibility, setVisibility] = useState(false)
|
||||
|
||||
return (
|
||||
<Fade in={!visibility} timeout={300}>
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Remove Card'
|
||||
action={
|
||||
<IconButton size='small' aria-label='remove-card' onClick={() => setVisibility(!visibility)}>
|
||||
<i className='tabler-x' />
|
||||
</IconButton>
|
||||
}
|
||||
/>
|
||||
<CardContent>
|
||||
<Typography>
|
||||
Click on <i className='tabler-x text-xl align-sub' /> icon to see it in action
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</Fade>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardActionRemoveCard
|
||||
@@ -0,0 +1,59 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import TableContainer from '@mui/material/TableContainer'
|
||||
import Table from '@mui/material/Table'
|
||||
import TableHead from '@mui/material/TableHead'
|
||||
import TableRow from '@mui/material/TableRow'
|
||||
import TableCell from '@mui/material/TableCell'
|
||||
import TableBody from '@mui/material/TableBody'
|
||||
|
||||
// Style Imports
|
||||
import tableStyles from '@core/styles/table.module.css'
|
||||
|
||||
const CardActionsTable = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Card Actions' />
|
||||
<CardContent className='p-0'>
|
||||
<TableContainer>
|
||||
<Table className={tableStyles.table}>
|
||||
<TableHead>
|
||||
<TableRow>
|
||||
<TableCell>Action</TableCell>
|
||||
<TableCell>Icon</TableCell>
|
||||
<TableCell>Details</TableCell>
|
||||
</TableRow>
|
||||
</TableHead>
|
||||
<TableBody>
|
||||
<TableRow>
|
||||
<TableCell>Collapse</TableCell>
|
||||
<TableCell>
|
||||
<i className='tabler-chevron-up text-xl' />
|
||||
</TableCell>
|
||||
<TableCell>Collapse card content using collapse action</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell>Refresh Content</TableCell>
|
||||
<TableCell>
|
||||
<i className='tabler-refresh text-xl' />
|
||||
</TableCell>
|
||||
<TableCell>Refresh your card content using refresh action</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell className='border-be-0'>Remove Card</TableCell>
|
||||
<TableCell className='border-be-0'>
|
||||
<i className='tabler-x text-xl' />
|
||||
</TableCell>
|
||||
<TableCell className='border-be-0'>Remove card from page using remove card action</TableCell>
|
||||
</TableRow>
|
||||
</TableBody>
|
||||
</Table>
|
||||
</TableContainer>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardActionsTable
|
||||
@@ -0,0 +1,103 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import LinearProgress from '@mui/material/LinearProgress'
|
||||
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
imgSrc: string
|
||||
progress: number
|
||||
subtitle: string
|
||||
progressColor: ThemeColor
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Laravel',
|
||||
subtitle: 'eCommerce',
|
||||
progress: 54,
|
||||
progressColor: 'error',
|
||||
imgSrc: '/images/logos/laravel.png'
|
||||
},
|
||||
{
|
||||
title: 'Figma',
|
||||
subtitle: 'App UI Kit',
|
||||
progress: 85,
|
||||
progressColor: 'primary',
|
||||
imgSrc: '/images/logos/figma.png'
|
||||
},
|
||||
{
|
||||
title: 'VusJs',
|
||||
subtitle: 'Calendar App',
|
||||
progress: 64,
|
||||
progressColor: 'success',
|
||||
imgSrc: '/images/logos/vue.png'
|
||||
},
|
||||
{
|
||||
title: 'React',
|
||||
subtitle: 'Dashboard',
|
||||
progress: 40,
|
||||
progressColor: 'info',
|
||||
imgSrc: '/images/logos/react.png'
|
||||
},
|
||||
{
|
||||
title: 'Bootstrap',
|
||||
subtitle: 'Website',
|
||||
progress: 17,
|
||||
progressColor: 'primary',
|
||||
imgSrc: '/images/logos/bootstrap.png'
|
||||
},
|
||||
{
|
||||
title: 'Sketch',
|
||||
subtitle: 'Website Design',
|
||||
progress: 30,
|
||||
progressColor: 'warning',
|
||||
imgSrc: '/images/logos/sketch.png'
|
||||
}
|
||||
]
|
||||
|
||||
const ActiveProjects = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Active Projects'
|
||||
subheader='Average 72% completed'
|
||||
action={<OptionMenu options={['Refresh', 'Update', 'Share']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<img src={item.imgSrc} alt={item.title} width={32} />
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<div className='flex justify-between items-center is-32'>
|
||||
<LinearProgress
|
||||
value={item.progress}
|
||||
variant='determinate'
|
||||
color={item.progressColor}
|
||||
className='min-bs-2 is-20'
|
||||
/>
|
||||
<Typography color='text.disabled'>{`${item.progress}%`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default ActiveProjects
|
||||
@@ -0,0 +1,117 @@
|
||||
'use client'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import { styled } from '@mui/material/styles'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
import AvatarGroup from '@mui/material/AvatarGroup'
|
||||
import MuiTimeline from '@mui/lab/Timeline'
|
||||
import TimelineDot from '@mui/lab/TimelineDot'
|
||||
import TimelineItem from '@mui/lab/TimelineItem'
|
||||
import TimelineContent from '@mui/lab/TimelineContent'
|
||||
import TimelineSeparator from '@mui/lab/TimelineSeparator'
|
||||
import TimelineConnector from '@mui/lab/TimelineConnector'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import type { TimelineProps } from '@mui/lab/Timeline'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Styled Timeline component
|
||||
const Timeline = styled(MuiTimeline)<TimelineProps>({
|
||||
paddingLeft: 0,
|
||||
paddingRight: 0,
|
||||
'& .MuiTimelineItem-root': {
|
||||
width: '100%',
|
||||
'&:before': {
|
||||
display: 'none'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const ActivityTimeline = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
avatar={<i className='tabler-list-details text-xl' />}
|
||||
title='Activity Timeline'
|
||||
titleTypographyProps={{ variant: 'h5' }}
|
||||
action={<OptionMenu options={['Share timeline', 'Suggest edits', 'Report bug']} />}
|
||||
sx={{ '& .MuiCardHeader-avatar': { mr: 3 } }}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-6 pbe-5'>
|
||||
<Timeline>
|
||||
<TimelineItem>
|
||||
<TimelineSeparator>
|
||||
<TimelineDot color='primary' />
|
||||
<TimelineConnector />
|
||||
</TimelineSeparator>
|
||||
<TimelineContent>
|
||||
<div className='flex flex-wrap items-center justify-between gap-x-2 mbe-2.5'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
12 Invoices have been paid
|
||||
</Typography>
|
||||
<Typography variant='caption'>12 min ago</Typography>
|
||||
</div>
|
||||
<Typography className='mbe-2'>Invoices have been paid to the company</Typography>
|
||||
<div className='flex items-center gap-2.5 is-fit rounded bg-actionHover plb-[5px] pli-2.5'>
|
||||
<img height={20} alt='invoice.pdf' src='/images/icons/pdf-document.png' />
|
||||
<Typography className='font-medium'>invoices.pdf</Typography>
|
||||
</div>
|
||||
</TimelineContent>
|
||||
</TimelineItem>
|
||||
|
||||
<TimelineItem>
|
||||
<TimelineSeparator>
|
||||
<TimelineDot color='success' />
|
||||
<TimelineConnector />
|
||||
</TimelineSeparator>
|
||||
<TimelineContent>
|
||||
<div className='flex flex-wrap items-center justify-between gap-x-2 mbe-2.5'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
Client Meeting
|
||||
</Typography>
|
||||
<Typography variant='caption'>45 min ago</Typography>
|
||||
</div>
|
||||
<Typography className='mbe-2'>Project meeting with john @10:15am</Typography>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<Avatar src='/images/avatars/1.png' className='is-8 bs-8' />
|
||||
<div className='flex flex-col flex-wrap'>
|
||||
<Typography variant='body2' className='font-medium'>
|
||||
Lester McCarthy (Client)
|
||||
</Typography>
|
||||
<Typography variant='body2'>CEO of Pixinvent</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</TimelineContent>
|
||||
</TimelineItem>
|
||||
|
||||
<TimelineItem>
|
||||
<TimelineSeparator>
|
||||
<TimelineDot color='info' />
|
||||
<TimelineConnector />
|
||||
</TimelineSeparator>
|
||||
<TimelineContent>
|
||||
<div className='flex flex-wrap items-center justify-between gap-x-2 mbe-2.5'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
Create a new project for client
|
||||
</Typography>
|
||||
<Typography variant='caption'>2 Day Ago</Typography>
|
||||
</div>
|
||||
<Typography className='mbe-2'>6 team members in a project</Typography>
|
||||
<AvatarGroup total={6} className='pull-up'>
|
||||
<Avatar alt='Travis Howard' src='/images/avatars/1.png' />
|
||||
<Avatar alt='Agnes Walker' src='/images/avatars/4.png' />
|
||||
<Avatar alt='John Doe' src='/images/avatars/2.png' />
|
||||
</AvatarGroup>
|
||||
</TimelineContent>
|
||||
</TimelineItem>
|
||||
</Timeline>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default ActivityTimeline
|
||||
@@ -0,0 +1,76 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CircularProgress from '@mui/material/CircularProgress'
|
||||
|
||||
// Type Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import CustomIconButton from '@core/components/mui/IconButton'
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import DirectionalIcon from '@components/DirectionalIcon'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
tasks: number
|
||||
progress: number
|
||||
color: ThemeColor
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{ title: 'User Experience Design', tasks: 120, progress: 72, color: 'primary' },
|
||||
{ title: 'Basic fundamentals', tasks: 32, progress: 48, color: 'success' },
|
||||
{ title: 'React Native components', tasks: 182, progress: 15, color: 'error' },
|
||||
{ title: 'Basic of music theory', tasks: 56, progress: 24, color: 'info' }
|
||||
]
|
||||
|
||||
const AssignmentProgress = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Assignment Progress' action={<OptionMenu options={['Refresh', 'Update', 'Share']} />} />
|
||||
<CardContent className='flex flex-col gap-8'>
|
||||
{data.map((item, i) => (
|
||||
<div key={i} className='flex items-center gap-4'>
|
||||
<div className='relative flex items-center justify-center'>
|
||||
<CircularProgress
|
||||
variant='determinate'
|
||||
size={54}
|
||||
value={100}
|
||||
thickness={3}
|
||||
className='absolute text-[var(--mui-palette-customColors-trackBg)]'
|
||||
/>
|
||||
<CircularProgress
|
||||
variant='determinate'
|
||||
size={54}
|
||||
value={item.progress}
|
||||
thickness={3}
|
||||
color={item.color}
|
||||
sx={{ '& .MuiCircularProgress-circle': { strokeLinecap: 'round' } }}
|
||||
/>
|
||||
<Typography className='absolute font-medium' color='text.primary'>
|
||||
{`${item.progress}%`}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className='flex justify-between items-center is-full gap-4'>
|
||||
<div>
|
||||
<Typography className='font-medium mbe-1.5' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{`${item.tasks} Tasks`}</Typography>
|
||||
</div>
|
||||
<CustomIconButton size='small' variant='tonal' color='secondary' className='min-is-fit'>
|
||||
<DirectionalIcon ltrIconClass='tabler-chevron-right' rtlIconClass='tabler-chevron-left' />
|
||||
</CustomIconButton>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default AssignmentProgress
|
||||
@@ -0,0 +1,113 @@
|
||||
'use client'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CircularProgress from '@mui/material/CircularProgress'
|
||||
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
imgSrc: string
|
||||
progress: number
|
||||
percentage: string
|
||||
progressColor: ThemeColor
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Google Chrome',
|
||||
progress: 67,
|
||||
percentage: '54.4%',
|
||||
progressColor: 'primary',
|
||||
imgSrc: '/images/logos/google-chrome.png'
|
||||
},
|
||||
{
|
||||
title: 'Apple Safari',
|
||||
progress: 40,
|
||||
percentage: '14.6%',
|
||||
progressColor: 'success',
|
||||
imgSrc: '/images/logos/safari.png'
|
||||
},
|
||||
{
|
||||
title: 'Mozilla Firefox',
|
||||
progress: 30,
|
||||
percentage: '6.1%',
|
||||
progressColor: 'secondary',
|
||||
imgSrc: '/images/logos/mozilla-firefox.png'
|
||||
},
|
||||
{
|
||||
title: 'Opera Mini',
|
||||
progress: 20,
|
||||
percentage: '8.0%',
|
||||
progressColor: 'info',
|
||||
imgSrc: '/images/logos/opera-mini.png'
|
||||
},
|
||||
{
|
||||
title: 'Internet Explorer',
|
||||
progress: 15,
|
||||
percentage: '4.2%',
|
||||
progressColor: 'warning',
|
||||
imgSrc: '/images/logos/internet-explorer.png'
|
||||
},
|
||||
{
|
||||
title: 'Brave',
|
||||
progress: 15,
|
||||
percentage: '0.3%',
|
||||
progressColor: 'error',
|
||||
imgSrc: '/images/logos/brave.png'
|
||||
}
|
||||
]
|
||||
|
||||
const BrowserStates = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Browser States'
|
||||
subheader='Counter April 2022'
|
||||
action={<OptionMenu options={['Last 28 Days', 'Last Month', 'Last Year']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-8'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<img src={item.imgSrc} alt={item.title} width={28} />
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<div className='flex items-center gap-4'>
|
||||
<Typography>{item.percentage}</Typography>
|
||||
<div className='flex relative'>
|
||||
<CircularProgress
|
||||
variant='determinate'
|
||||
size={26}
|
||||
value={100}
|
||||
thickness={5}
|
||||
sx={{ position: 'absolute', color: 'var(--mui-palette-customColors-trackBg)' }}
|
||||
/>
|
||||
<CircularProgress
|
||||
variant='determinate'
|
||||
size={26}
|
||||
value={item.progress}
|
||||
thickness={5}
|
||||
color={item.progressColor}
|
||||
sx={{ '& .MuiCircularProgress-circle': { strokeLinecap: 'round' } }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default BrowserStates
|
||||
@@ -0,0 +1,34 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Button from '@mui/material/Button'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
const CongratulationsJohn = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardContent className='relative'>
|
||||
<Typography variant='h5' className='mbe-0.5'>
|
||||
Congratulations John 🎉
|
||||
</Typography>
|
||||
<Typography variant='subtitle1' className='mbe-3'>
|
||||
Best seller of the month
|
||||
</Typography>
|
||||
<Typography variant='h4' color='primary.main' className='mbe-1'>
|
||||
$48.9k
|
||||
</Typography>
|
||||
<Button variant='contained' color='primary'>
|
||||
View Sales
|
||||
</Button>
|
||||
<img
|
||||
alt='Congratulations John'
|
||||
src='/images/illustrations/characters/8.png'
|
||||
className='absolute block-end-0 max-bs-[150px] is-[116px] inline-end-6'
|
||||
/>
|
||||
<img />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CongratulationsJohn
|
||||
@@ -0,0 +1,76 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
type dataTypes = {
|
||||
title: string
|
||||
value: string
|
||||
change: number
|
||||
icon: string
|
||||
color: ThemeColor
|
||||
}
|
||||
|
||||
const deliveryData: dataTypes[] = [
|
||||
{ title: 'Packages in transit', value: '10k', change: 25.8, icon: 'tabler-box', color: 'primary' },
|
||||
{ title: 'Packages out for delivery', value: '5k', change: 4.3, icon: 'tabler-truck', color: 'info' },
|
||||
{ title: 'Packages delivered', value: '15k', change: -12.5, icon: 'tabler-circle-check', color: 'success' },
|
||||
{ title: 'Delivery success rate', value: '95%', change: 35.6, icon: 'tabler-percentage', color: 'warning' },
|
||||
{ title: 'Average delivery time', value: '2.5 Days', change: -2.15, icon: 'tabler-clock', color: 'secondary' },
|
||||
{ title: 'Customer satisfaction', value: '4.5/5', change: 5.7, icon: 'tabler-users', color: 'error' }
|
||||
]
|
||||
|
||||
const DeliveryPerformance = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Delivery Performance'
|
||||
subheader='12% increase in this month'
|
||||
action={<OptionMenu options={['Select All', 'Refresh', 'Share']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-[30px]'>
|
||||
{deliveryData.map((data, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' color={data.color} variant='rounded' size={38}>
|
||||
<i className={data.icon} />
|
||||
</CustomAvatar>
|
||||
<div className='flex justify-between items-center gap-4 is-full'>
|
||||
<div>
|
||||
<Typography color='text.primary' className='line-clamp-1'>
|
||||
{data.title}
|
||||
</Typography>
|
||||
<div className='flex items-center gap-1'>
|
||||
<i
|
||||
className={classnames(
|
||||
'text-xl',
|
||||
data.change > 0 ? 'tabler-chevron-up text-success' : 'tabler-chevron-down text-error'
|
||||
)}
|
||||
/>
|
||||
<Typography variant='body2' color={data.change > 0 ? 'success.main' : 'error.main'}>
|
||||
{data.change}%
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
<Typography color='text.primary' className='font-medium'>
|
||||
{data.value}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default DeliveryPerformance
|
||||
@@ -0,0 +1,165 @@
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third Party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
subtitle: string
|
||||
amount: string
|
||||
trendNumber: number
|
||||
avatarIcon: string
|
||||
avatarColor: ThemeColor
|
||||
trend?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const series = [{ data: [32, 98, 61, 41, 88, 47, 71] }]
|
||||
|
||||
const data: DataType[] = [
|
||||
{
|
||||
amount: '$1,619',
|
||||
trendNumber: 18.6,
|
||||
title: 'Net Profit',
|
||||
avatarColor: 'primary',
|
||||
subtitle: '12.4k Sales',
|
||||
avatarIcon: 'tabler-chart-pie-2'
|
||||
},
|
||||
{
|
||||
amount: '$3,571',
|
||||
trendNumber: 39.6,
|
||||
title: 'Total Income',
|
||||
avatarColor: 'success',
|
||||
subtitle: 'Sales, Affiliation',
|
||||
avatarIcon: 'tabler-currency-dollar'
|
||||
},
|
||||
{
|
||||
amount: '$430',
|
||||
trendNumber: 52.8,
|
||||
title: 'Total Expenses',
|
||||
avatarColor: 'secondary',
|
||||
subtitle: 'ADVT, Marketing',
|
||||
avatarIcon: 'tabler-credit-card'
|
||||
}
|
||||
]
|
||||
|
||||
const EarningReports = () => {
|
||||
// Vars
|
||||
const primaryColorWithOpacity = 'var(--mui-palette-primary-lightOpacity)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: -16,
|
||||
left: -18,
|
||||
right: -17,
|
||||
bottom: -11
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 4,
|
||||
distributed: true,
|
||||
columnWidth: '60%'
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
dataLabels: { enabled: false },
|
||||
colors: [
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity,
|
||||
'var(--mui-palette-primary-main)',
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity
|
||||
],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
categories: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false },
|
||||
tickPlacement: 'on',
|
||||
labels: {
|
||||
style: {
|
||||
fontSize: '13px',
|
||||
colors: 'var(--mui-palette-text-disabled)'
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: { show: false }
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Earning Reports'
|
||||
subheader='Weekly Earnings Overview'
|
||||
action={<OptionMenu options={['Refresh', 'Update', 'Share']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={34}>
|
||||
<i className={classnames(item.avatarIcon, 'text-[22px]')} />
|
||||
</CustomAvatar>
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-4'>
|
||||
<Typography variant='body2'>{item.amount}</Typography>
|
||||
<div className='flex items-center gap-1'>
|
||||
<i
|
||||
className={classnames(
|
||||
item.trend === 'negative' ? 'tabler-chevron-down text-error' : 'tabler-chevron-up text-success',
|
||||
'text-xl'
|
||||
)}
|
||||
/>
|
||||
<Typography variant='body2' className='text-textDisabled'>{`${item.trendNumber}%`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
<AppReactApexCharts type='bar' height={158} width='100%' series={series} options={options} />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default EarningReports
|
||||
@@ -0,0 +1,164 @@
|
||||
'use client'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import Chip from '@mui/material/Chip'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
import { useColorScheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor, SystemMode } from '@core/types'
|
||||
|
||||
// Style Imports
|
||||
import tableStyles from '@core/styles/table.module.css'
|
||||
|
||||
type DataType = {
|
||||
date: string
|
||||
trend: string
|
||||
imgName: string
|
||||
cardType: string
|
||||
cardNumber: string
|
||||
status: 'verified' | 'rejected' | 'pending' | 'on-hold'
|
||||
}
|
||||
|
||||
type StatusObj = Record<
|
||||
DataType['status'],
|
||||
{
|
||||
text: string
|
||||
color: ThemeColor
|
||||
}
|
||||
>
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
trend: '+$1,678',
|
||||
status: 'verified',
|
||||
cardType: 'Credit',
|
||||
cardNumber: '*4230',
|
||||
imgName: 'visa',
|
||||
date: `17 Mar ${new Date().getFullYear()}`
|
||||
},
|
||||
{
|
||||
trend: '-$839',
|
||||
status: 'rejected',
|
||||
cardType: 'Credit',
|
||||
cardNumber: '*5578',
|
||||
imgName: 'mastercard',
|
||||
date: `12 Feb ${new Date().getFullYear()}`
|
||||
},
|
||||
{
|
||||
trend: '+$435',
|
||||
cardType: 'ATM',
|
||||
status: 'verified',
|
||||
cardNumber: '*4567',
|
||||
imgName: 'american-express',
|
||||
date: `28 Feb ${new Date().getFullYear()}`
|
||||
},
|
||||
{
|
||||
trend: '+$2,345',
|
||||
status: 'pending',
|
||||
cardType: 'Credit',
|
||||
cardNumber: '*5699',
|
||||
imgName: 'visa',
|
||||
date: `08 Jan ${new Date().getFullYear()}`
|
||||
},
|
||||
{
|
||||
trend: '+$1,758',
|
||||
status: 'rejected',
|
||||
cardType: 'Credit',
|
||||
cardNumber: '*2451',
|
||||
imgName: 'visa',
|
||||
date: `19 Oct ${new Date().getFullYear()}`
|
||||
}
|
||||
]
|
||||
|
||||
const statusObj: StatusObj = {
|
||||
rejected: { text: 'Rejected', color: 'error' },
|
||||
pending: { text: 'Pending', color: 'secondary' },
|
||||
'on-hold': { text: 'On hold', color: 'warning' },
|
||||
verified: { text: 'Verified', color: 'success' }
|
||||
}
|
||||
|
||||
const LastTransaction = ({ serverMode }: { serverMode: SystemMode }) => {
|
||||
// Hooks
|
||||
const { mode } = useColorScheme()
|
||||
|
||||
// Vars
|
||||
const _mode = (mode === 'system' ? serverMode : mode) || serverMode
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Last Transaction'
|
||||
action={<OptionMenu options={['Show all entries', 'Refresh', 'Download']} />}
|
||||
/>
|
||||
<div className='overflow-x-auto'>
|
||||
<table className={tableStyles.table}>
|
||||
<thead className='uppercase'>
|
||||
<tr className='border-be'>
|
||||
<th className='leading-6 plb-4 pis-6 pli-2'>Card</th>
|
||||
<th className='leading-6 plb-4 pli-2'>Date</th>
|
||||
<th className='leading-6 plb-4 pli-2'>Status</th>
|
||||
<th className='leading-6 plb-4 pie-6 pli-2 text-right'>Trend</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{data.map((row, index) => (
|
||||
<tr key={index} className='border-0'>
|
||||
<td className='pis-6 pli-2 plb-3'>
|
||||
<div className='flex items-center gap-4'>
|
||||
<Avatar
|
||||
variant='rounded'
|
||||
className={classnames('is-[50px] bs-[30px]', {
|
||||
'bg-white': _mode === 'dark',
|
||||
'bg-actionHover': _mode === 'light'
|
||||
})}
|
||||
>
|
||||
<img width={30} alt={row.imgName} src={`/images/logos/${row.imgName}.png`} />
|
||||
</Avatar>
|
||||
<div className='flex flex-col'>
|
||||
<Typography color='text.primary'>{row.cardNumber}</Typography>
|
||||
<Typography variant='body2' color='text.disabled'>
|
||||
{row.cardType}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td className='pli-2 plb-3'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography color='text.primary'>Sent</Typography>
|
||||
<Typography variant='body2' color='text.disabled'>
|
||||
{row.date}
|
||||
</Typography>
|
||||
</div>
|
||||
</td>
|
||||
<td className='pli-2 plb-3'>
|
||||
<Chip
|
||||
variant='tonal'
|
||||
size='small'
|
||||
label={statusObj[row.status].text}
|
||||
color={statusObj[row.status].color}
|
||||
/>
|
||||
</td>
|
||||
<td className='pli-2 plb-3 pie-6 text-right'>
|
||||
<Typography color='text.primary'>{row.trend}</Typography>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default LastTransaction
|
||||
@@ -0,0 +1,108 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
type DataType = {
|
||||
icon: string
|
||||
title: string
|
||||
amount: string
|
||||
avatarColor: ThemeColor
|
||||
trendNumber: string
|
||||
trend?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Emails',
|
||||
amount: '12,346',
|
||||
trendNumber: '0.3%',
|
||||
avatarColor: 'success',
|
||||
icon: 'tabler-mail'
|
||||
},
|
||||
{
|
||||
title: 'Opened',
|
||||
amount: '8,734',
|
||||
trendNumber: '2.1%',
|
||||
avatarColor: 'info',
|
||||
icon: 'tabler-link'
|
||||
},
|
||||
{
|
||||
title: 'Clicked',
|
||||
amount: '967',
|
||||
trendNumber: '1.4%',
|
||||
trend: 'negative',
|
||||
avatarColor: 'warning',
|
||||
icon: 'tabler-mouse'
|
||||
},
|
||||
{
|
||||
title: 'Subscribe',
|
||||
amount: '345',
|
||||
trendNumber: '8.5%',
|
||||
avatarColor: 'primary',
|
||||
icon: 'tabler-users'
|
||||
},
|
||||
{
|
||||
title: 'Complaints',
|
||||
amount: '10',
|
||||
trendNumber: '1.5%',
|
||||
trend: 'negative',
|
||||
avatarColor: 'secondary',
|
||||
icon: 'tabler-alert-triangle'
|
||||
},
|
||||
{
|
||||
title: 'Unsubscribe',
|
||||
amount: '86',
|
||||
trendNumber: '0.8%',
|
||||
avatarColor: 'error',
|
||||
icon: 'tabler-ban'
|
||||
}
|
||||
]
|
||||
|
||||
const MonthlyCampaignState = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Monthly Campaign State'
|
||||
subheader='8.52k Social Visitors'
|
||||
action={<OptionMenu options={['Last Month', 'Last 6 Months', 'Last Year']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-[1.5625rem]'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={34}>
|
||||
<i className={classnames(item.icon, 'text-[22px]')} />
|
||||
</CustomAvatar>
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<div className='flex items-center gap-4'>
|
||||
<Typography>{item.amount}</Typography>
|
||||
<Typography
|
||||
className='flex justify-end is-11'
|
||||
color={`${item.trend === 'negative' ? 'error' : 'success'}.main`}
|
||||
>
|
||||
{item.trendNumber}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default MonthlyCampaignState
|
||||
@@ -0,0 +1,197 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { Fragment, useState } from 'react'
|
||||
import type { SyntheticEvent } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Divider from '@mui/material/Divider'
|
||||
import { styled } from '@mui/material/styles'
|
||||
import Tab from '@mui/material/Tab'
|
||||
import TabList from '@mui/lab/TabList'
|
||||
import TabPanel from '@mui/lab/TabPanel'
|
||||
import TabContext from '@mui/lab/TabContext'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import TimelineDot from '@mui/lab/TimelineDot'
|
||||
import TimelineItem from '@mui/lab/TimelineItem'
|
||||
import TimelineContent from '@mui/lab/TimelineContent'
|
||||
import TimelineSeparator from '@mui/lab/TimelineSeparator'
|
||||
import TimelineConnector from '@mui/lab/TimelineConnector'
|
||||
import MuiTimeline from '@mui/lab/Timeline'
|
||||
import type { TimelineProps } from '@mui/lab/Timeline'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type TimelineItemData = {
|
||||
name: string
|
||||
address: string
|
||||
}
|
||||
|
||||
type TimelineData = Record<'sender' | 'receiver', TimelineItemData>
|
||||
|
||||
type Data = Record<'new' | 'preparing' | 'shipping', TimelineData[]>
|
||||
|
||||
// Styled Timeline component
|
||||
const Timeline = styled(MuiTimeline)<TimelineProps>({
|
||||
paddingLeft: 0,
|
||||
paddingRight: 0,
|
||||
'& .MuiTimelineItem-root': {
|
||||
width: '100%',
|
||||
'&:before': {
|
||||
display: 'none'
|
||||
}
|
||||
},
|
||||
'& .MuiTimelineDot-root': {
|
||||
border: 0,
|
||||
padding: 0
|
||||
}
|
||||
})
|
||||
|
||||
// Vars
|
||||
const data: Data = {
|
||||
new: [
|
||||
{
|
||||
sender: {
|
||||
name: 'Micheal Hughes',
|
||||
address: '101 Boulder, California (CA), 933130'
|
||||
},
|
||||
receiver: {
|
||||
name: 'Daisy Coleman',
|
||||
address: '939 Orange, California (CA), 910614'
|
||||
}
|
||||
},
|
||||
{
|
||||
sender: {
|
||||
name: 'Glenn Todd',
|
||||
address: '1713 Garnet, California (CA), 939573'
|
||||
},
|
||||
receiver: {
|
||||
name: 'Arthur West',
|
||||
address: '156 Blaze, California (CA), 925878'
|
||||
}
|
||||
}
|
||||
],
|
||||
preparing: [
|
||||
{
|
||||
sender: {
|
||||
name: 'Rose Cole',
|
||||
address: '61 Unions, California (CA), 922523'
|
||||
},
|
||||
receiver: {
|
||||
name: 'Polly Spencer',
|
||||
address: '865 Delta, California (CA), 932830'
|
||||
}
|
||||
},
|
||||
{
|
||||
sender: {
|
||||
name: 'Jerry Wood',
|
||||
address: '37 Marjory, California (CA), 951958'
|
||||
},
|
||||
receiver: {
|
||||
name: 'Sam McCormick',
|
||||
address: '926 Reynolds, California (CA), 910279'
|
||||
}
|
||||
}
|
||||
],
|
||||
shipping: [
|
||||
{
|
||||
sender: {
|
||||
name: 'Alex Walton',
|
||||
address: '78 Judson, California (CA), 956084'
|
||||
},
|
||||
receiver: {
|
||||
name: 'Eula Griffin',
|
||||
address: '56 Bernard, California (CA), 965133'
|
||||
}
|
||||
},
|
||||
{
|
||||
sender: {
|
||||
name: 'Lula Barton',
|
||||
address: '95 Gaylord, California (CA), 991955'
|
||||
},
|
||||
receiver: {
|
||||
name: 'Craig Jacobs',
|
||||
address: '73 Sandy, California (CA), 954566'
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
const Orders = () => {
|
||||
// States
|
||||
const [value, setValue] = useState<string>('new')
|
||||
|
||||
const handleChange = (event: SyntheticEvent, newValue: string) => {
|
||||
setValue(newValue)
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Orders by Countries'
|
||||
subheader='62 deliveries in progress'
|
||||
action={<OptionMenu options={['Show all orders', 'Share', 'Refresh']} />}
|
||||
className='pbe-4'
|
||||
/>
|
||||
<TabContext value={value}>
|
||||
<TabList variant='fullWidth' onChange={handleChange} aria-label='full width tabs example'>
|
||||
<Tab value='new' label='New' />
|
||||
<Tab value='preparing' label='Preparing' />
|
||||
<Tab value='shipping' label='Shipping' />
|
||||
</TabList>
|
||||
<TabPanel value={value} className='pbs-0'>
|
||||
<CardContent>
|
||||
{data[value as keyof Data].map((item: TimelineData, index: number) => {
|
||||
return (
|
||||
<Fragment key={index}>
|
||||
<Timeline>
|
||||
<TimelineItem>
|
||||
<TimelineSeparator>
|
||||
<TimelineDot variant='outlined' className='mlb-0'>
|
||||
<i className='tabler-circle-check text-xl text-success' />
|
||||
</TimelineDot>
|
||||
<TimelineConnector />
|
||||
</TimelineSeparator>
|
||||
<TimelineContent className='flex flex-col gap-0.5 pbs-0 pis-5 pbe-5'>
|
||||
<Typography variant='body2' className='uppercase' color='success.main'>
|
||||
Sender
|
||||
</Typography>
|
||||
<Typography color='text.primary' className='font-medium'>
|
||||
{item.sender.name}
|
||||
</Typography>
|
||||
<Typography>{item.sender.address}</Typography>
|
||||
</TimelineContent>
|
||||
</TimelineItem>
|
||||
<TimelineItem>
|
||||
<TimelineSeparator>
|
||||
<TimelineDot variant='outlined' className='mlb-0'>
|
||||
<i className='tabler-map-pin text-xl text-primary' />
|
||||
</TimelineDot>
|
||||
</TimelineSeparator>
|
||||
<TimelineContent className='flex flex-col pbe-0 gap-0.5 pbs-0 pis-5'>
|
||||
<Typography variant='body2' className='uppercase' color='primary.main'>
|
||||
Receiver
|
||||
</Typography>
|
||||
<Typography color='text.primary' className='font-medium'>
|
||||
{item.receiver.name}
|
||||
</Typography>
|
||||
<Typography>{item.receiver.address}</Typography>
|
||||
</TimelineContent>
|
||||
</TimelineItem>
|
||||
</Timeline>
|
||||
{index !== data[value as keyof Data].length - 1 && <Divider className='mlb-4 border-dashed' />}
|
||||
</Fragment>
|
||||
)
|
||||
})}
|
||||
</CardContent>
|
||||
</TabPanel>
|
||||
</TabContext>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default Orders
|
||||
@@ -0,0 +1,61 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Divider from '@mui/material/Divider'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Components Imports
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
name: string
|
||||
profession: string
|
||||
totalCourses: number
|
||||
avatar: string
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{ name: 'Jordan Stevenson', profession: 'Business Intelligence', totalCourses: 33, avatar: '/images/avatars/1.png' },
|
||||
{ name: 'Bentlee Emblin', profession: 'Digital Marketing', totalCourses: 52, avatar: '/images/avatars/2.png' },
|
||||
{ name: 'Benedetto Rossiter', profession: 'UI/UX Design', totalCourses: 12, avatar: '/images/avatars/3.png' },
|
||||
{ name: 'Beverlie Krabbe', profession: 'Vue', totalCourses: 8, avatar: '/images/avatars/4.png' },
|
||||
{ name: 'Emma Bowen', profession: 'React Native', totalCourses: 9, avatar: '/images/avatars/3.png' },
|
||||
{ name: 'Amy Patterson', profession: 'Java Developer', totalCourses: 10, avatar: '/images/avatars/6.png' }
|
||||
]
|
||||
|
||||
const PopularInstructors = () => {
|
||||
return (
|
||||
<Card className='bs-full'>
|
||||
<CardHeader title='Popular Instructors' action={<OptionMenu options={['Refresh', 'Update', 'Share']} />} />
|
||||
<Divider />
|
||||
<div className='flex justify-between plb-4 pli-6'>
|
||||
<Typography className='uppercase'>instructors</Typography>
|
||||
<Typography className='uppercase'>courses</Typography>
|
||||
</div>
|
||||
<Divider />
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
{data.map((item, i) => (
|
||||
<div key={i} className='flex items-center gap-4'>
|
||||
<CustomAvatar size={34} src={item.avatar} />
|
||||
<div className='flex justify-between items-center is-full gap-4'>
|
||||
<div>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.name}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.profession}</Typography>
|
||||
</div>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.totalCourses}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default PopularInstructors
|
||||
@@ -0,0 +1,85 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
imgSrc: string
|
||||
amount: string
|
||||
subtitle: string
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Apple iPhone 13',
|
||||
subtitle: '4567',
|
||||
amount: '$999.29',
|
||||
imgSrc: '/images/cards/apple-iPhone-13.png'
|
||||
},
|
||||
{
|
||||
title: 'Nike Air Jordan',
|
||||
subtitle: '3456',
|
||||
amount: '$72.40',
|
||||
imgSrc: '/images/cards/nike-air-jordan.png'
|
||||
},
|
||||
{
|
||||
title: 'Beats Studio 2',
|
||||
subtitle: '9485',
|
||||
amount: '$99.90',
|
||||
imgSrc: '/images/cards/beats-studio-2.png'
|
||||
},
|
||||
{
|
||||
title: 'Apple Watch Series 7',
|
||||
subtitle: '2345',
|
||||
amount: '$249.99',
|
||||
imgSrc: '/images/cards/apple-watch-series-7.png'
|
||||
},
|
||||
{
|
||||
title: 'Amazon Echo Dot',
|
||||
subtitle: '8959',
|
||||
amount: '$79.40',
|
||||
imgSrc: '/images/cards/amazon-echo-dot.png'
|
||||
},
|
||||
{
|
||||
title: 'PlayStation Console',
|
||||
subtitle: '7892',
|
||||
amount: '$129.48',
|
||||
imgSrc: '/images/cards/play-station-console.png'
|
||||
}
|
||||
]
|
||||
|
||||
const PopularProducts = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Popular Products'
|
||||
subheader='Total 10.4k Visitors'
|
||||
action={<OptionMenu options={['Price - low to high', 'Price - high to low', 'Best seller']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-[1.625rem]'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<img src={item.imgSrc} alt={item.title} width={46} />
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{`Item: #FXZ-${item.subtitle}`}</Typography>
|
||||
</div>
|
||||
<Typography>{item.amount}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default PopularProducts
|
||||
@@ -0,0 +1,102 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
imgSrc: string
|
||||
subtitle: string
|
||||
trendNumber: number
|
||||
trend?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: '$8.45k',
|
||||
subtitle: 'United States',
|
||||
trendNumber: 25.8,
|
||||
imgSrc: '/images/cards/us.png'
|
||||
},
|
||||
{
|
||||
title: '$7.78k',
|
||||
subtitle: 'Brazil',
|
||||
trendNumber: 16.2,
|
||||
trend: 'negative',
|
||||
imgSrc: '/images/cards/brazil.png'
|
||||
},
|
||||
{
|
||||
title: '$6.48k',
|
||||
subtitle: 'India',
|
||||
trendNumber: 12.3,
|
||||
imgSrc: '/images/cards/india.png'
|
||||
},
|
||||
{
|
||||
title: '$5.12k',
|
||||
subtitle: 'Australia',
|
||||
trendNumber: 11.9,
|
||||
trend: 'negative',
|
||||
imgSrc: '/images/cards/australia.png'
|
||||
},
|
||||
{
|
||||
title: '$4.45k',
|
||||
subtitle: 'France',
|
||||
trendNumber: 16.2,
|
||||
imgSrc: '/images/cards/france.png'
|
||||
},
|
||||
{
|
||||
title: '$3.90k',
|
||||
subtitle: 'China',
|
||||
trendNumber: 14.8,
|
||||
imgSrc: '/images/cards/china.png'
|
||||
}
|
||||
]
|
||||
|
||||
const SalesByCountries = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Sales by Countries'
|
||||
subheader='Monthly Sales Overview'
|
||||
action={<OptionMenu options={['Last Week', 'Last Month', 'Last Year']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<img src={item.imgSrc} alt={item.subtitle} width={34} />
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-1'>
|
||||
<i
|
||||
className={classnames(
|
||||
item.trend === 'negative' ? 'tabler-chevron-down text-error' : 'tabler-chevron-up text-success',
|
||||
'text-xl'
|
||||
)}
|
||||
/>
|
||||
<Typography
|
||||
variant='h6'
|
||||
color={`${item.trend === 'negative' ? 'error' : 'success'}.main`}
|
||||
>{`${item.trendNumber}%`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default SalesByCountries
|
||||
@@ -0,0 +1,109 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Chip from '@mui/material/Chip'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
type DataType = {
|
||||
icon: string
|
||||
title: string
|
||||
amount: string
|
||||
subtitle: string
|
||||
trendNumber: number
|
||||
trend?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Direct Source',
|
||||
subtitle: 'Direct link click',
|
||||
amount: '1.2k',
|
||||
trendNumber: 4.2,
|
||||
icon: 'tabler-shadow'
|
||||
},
|
||||
{
|
||||
title: 'Social Networks',
|
||||
subtitle: 'Social Channels',
|
||||
amount: '31.5k',
|
||||
trendNumber: 8.2,
|
||||
icon: 'tabler-globe'
|
||||
},
|
||||
{
|
||||
title: 'Email Newsletter',
|
||||
subtitle: 'Mail Campaigns',
|
||||
amount: '893',
|
||||
trendNumber: 2.4,
|
||||
icon: 'tabler-mail'
|
||||
},
|
||||
{
|
||||
title: 'Referrals',
|
||||
subtitle: 'Impact Radius Visits',
|
||||
amount: '342',
|
||||
trendNumber: 0.4,
|
||||
trend: 'negative',
|
||||
icon: 'tabler-external-link'
|
||||
},
|
||||
{
|
||||
title: 'ADVT',
|
||||
subtitle: 'Google ADVT',
|
||||
amount: '2.15k',
|
||||
trendNumber: 9.1,
|
||||
icon: 'tabler-ad'
|
||||
},
|
||||
{
|
||||
title: 'Other',
|
||||
subtitle: 'Many Sources',
|
||||
amount: '12.5k',
|
||||
trendNumber: 6.2,
|
||||
icon: 'tabler-star'
|
||||
}
|
||||
]
|
||||
|
||||
const SourceVisits = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Source Visits'
|
||||
subheader='38.4k Visitors'
|
||||
action={<OptionMenu options={['Last Week', 'Last Month', 'Last Year']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' size={34}>
|
||||
<i className={classnames(item.icon, 'text-[22px] text-textSecondary')} />
|
||||
</CustomAvatar>
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-4'>
|
||||
<Typography>{item.amount}</Typography>
|
||||
<Chip
|
||||
variant='tonal'
|
||||
size='small'
|
||||
color={item.trend === 'negative' ? 'error' : 'success'}
|
||||
label={`${item.trend === 'negative' ? '-' : '+'}${item.trendNumber}%`}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default SourceVisits
|
||||
@@ -0,0 +1,54 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Chip from '@mui/material/Chip'
|
||||
|
||||
// Type Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
views: string
|
||||
icon: string
|
||||
color: ThemeColor
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{ title: 'Videography Basic Design Course', views: '1.2k', icon: 'tabler-video', color: 'primary' },
|
||||
{ title: 'Basic Front-end Development Course', views: '834', icon: 'tabler-code', color: 'info' },
|
||||
{ title: 'Basic Fundamentals of Photography', views: '3.7k', icon: 'tabler-camera', color: 'success' },
|
||||
{ title: 'Advance Dribble Base Visual Design', views: '2.5k', icon: 'tabler-brand-dribbble', color: 'warning' },
|
||||
{ title: 'Your First Singing Lesson', views: '948', icon: 'tabler-microphone-2', color: 'error' }
|
||||
]
|
||||
|
||||
const TopCourses = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Top Courses' action={<OptionMenu options={['Last 28 Days', 'Last Month', 'Last Year']} />} />
|
||||
<CardContent className='flex flex-col gap-6'>
|
||||
{data.map((item, i) => (
|
||||
<div key={i} className='flex items-center gap-4'>
|
||||
<CustomAvatar variant='rounded' skin='light' color={item.color}>
|
||||
<i className={item.icon} />
|
||||
</CustomAvatar>
|
||||
<div className='flex justify-between items-center gap-4 is-full flex-wrap'>
|
||||
<Typography className='font-medium flex-1' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Chip label={`${item.views} Views`} variant='tonal' size='small' color='secondary' />
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default TopCourses
|
||||
@@ -0,0 +1,114 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
amount: number
|
||||
subtitle: string
|
||||
avatarIcon: string
|
||||
avatarColor: ThemeColor
|
||||
amountDiff?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Wallet',
|
||||
subtitle: 'Starbucks',
|
||||
amount: 75,
|
||||
amountDiff: 'negative',
|
||||
avatarColor: 'primary',
|
||||
avatarIcon: 'tabler-wallet'
|
||||
},
|
||||
{
|
||||
title: 'Bank Transfer',
|
||||
subtitle: 'Add Money',
|
||||
amount: 480,
|
||||
avatarColor: 'success',
|
||||
avatarIcon: 'tabler-browser-check'
|
||||
},
|
||||
{
|
||||
title: 'PayPal',
|
||||
subtitle: 'Client Payment',
|
||||
amount: 268,
|
||||
avatarColor: 'error',
|
||||
avatarIcon: 'tabler-brand-paypal'
|
||||
},
|
||||
{
|
||||
title: 'Master Card',
|
||||
subtitle: 'Ordered iPhone 13',
|
||||
amount: 699,
|
||||
amountDiff: 'negative',
|
||||
avatarColor: 'secondary',
|
||||
avatarIcon: 'tabler-credit-card'
|
||||
},
|
||||
{
|
||||
title: 'Bank Transaction',
|
||||
subtitle: 'Refund',
|
||||
amount: 98,
|
||||
avatarColor: 'info',
|
||||
avatarIcon: 'tabler-currency-dollar'
|
||||
},
|
||||
{
|
||||
title: 'PayPal',
|
||||
subtitle: 'Client Payment',
|
||||
amount: 126,
|
||||
avatarColor: 'error',
|
||||
avatarIcon: 'tabler-brand-paypal'
|
||||
},
|
||||
{
|
||||
title: 'Bank Transfer',
|
||||
subtitle: 'Pay Office Rent',
|
||||
amount: 1290,
|
||||
amountDiff: 'negative',
|
||||
avatarColor: 'success',
|
||||
avatarIcon: 'tabler-browser-check'
|
||||
}
|
||||
]
|
||||
|
||||
const Transactions = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Transactions'
|
||||
subheader='Total 58 transaction done in month'
|
||||
action={<OptionMenu options={['Refresh', 'Show all entries', 'Make payment']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-[1.125rem]'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={34}>
|
||||
<i className={classnames(item.avatarIcon, 'text-[22px]')} />
|
||||
</CustomAvatar>
|
||||
<div className='flex flex-wrap justify-between items-center gap-x-4 gap-y-1 is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<Typography
|
||||
variant='h6'
|
||||
color={`${item.amountDiff === 'negative' ? 'error' : 'success'}.main`}
|
||||
>{`${item.amountDiff === 'negative' ? '-' : '+'}${item.amount}`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default Transactions
|
||||
@@ -0,0 +1,61 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Button from '@mui/material/Button'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Components Imports
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
type DataType = {
|
||||
icon: string
|
||||
title: string
|
||||
value: string
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{ icon: 'tabler-calendar', title: '17 Nov 23', value: 'Date' },
|
||||
{ icon: 'tabler-clock', title: '32 Minutes', value: 'Duration' }
|
||||
]
|
||||
|
||||
const UpcomingWebinar = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
<div className='flex justify-center pli-2.5 pbs-4 rounded bg-primaryLight'>
|
||||
<img src='/images/illustrations/characters/4.png' className='bs-[146px]' />
|
||||
</div>
|
||||
<div>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Upcoming Webinar
|
||||
</Typography>
|
||||
<Typography variant='body2'>
|
||||
Next Generation Frontend Architecture Using Layout Engine And React Native Web.
|
||||
</Typography>
|
||||
</div>
|
||||
<div className='flex flex-wrap justify-between gap-4'>
|
||||
{data.map((item, i) => (
|
||||
<div key={i} className='flex items-center gap-3'>
|
||||
<CustomAvatar variant='rounded' skin='light' color='primary'>
|
||||
<i className={classnames('text-[28px]', item.icon)} />
|
||||
</CustomAvatar>
|
||||
<div>
|
||||
<Typography color='text.primary' className='font-medium'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.value}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<Button variant='contained'>Join the event</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default UpcomingWebinar
|
||||
@@ -0,0 +1,75 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CircularProgress from '@mui/material/CircularProgress'
|
||||
import Chip from '@mui/material/Chip'
|
||||
|
||||
// Type Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
subtitle: string
|
||||
progress: number
|
||||
color: ThemeColor
|
||||
chipLabel?: string
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{ title: 'Incorrect address', subtitle: 'All exceptions', progress: 83, color: 'success', chipLabel: '+10' },
|
||||
{ title: 'Good', subtitle: '24 Vehicles', progress: 11, color: 'info', chipLabel: '+9.1' },
|
||||
{ title: 'Average', subtitle: '14 Vehicles', progress: 8, color: 'primary', chipLabel: '+2.5' },
|
||||
{ title: 'Bad', subtitle: '8 Vehicles', progress: 6, color: 'warning', chipLabel: '-3.4' },
|
||||
{ title: 'Not Working', subtitle: '4 Vehicles', progress: 2, color: 'error', chipLabel: '-12.6' }
|
||||
]
|
||||
|
||||
const VehicleCondition = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Vehicles Condition' action={<OptionMenu options={['Refresh', 'Update', 'Share']} />} />
|
||||
<CardContent className='flex flex-col gap-8'>
|
||||
{data.map((item, i) => (
|
||||
<div key={i} className='flex items-center gap-4'>
|
||||
<div className='relative flex items-center justify-center'>
|
||||
<CircularProgress
|
||||
variant='determinate'
|
||||
size={54}
|
||||
value={100}
|
||||
thickness={3}
|
||||
className='absolute text-[var(--mui-palette-customColors-trackBg)]'
|
||||
/>
|
||||
<CircularProgress
|
||||
variant='determinate'
|
||||
size={54}
|
||||
value={item.progress}
|
||||
thickness={3}
|
||||
color={item.color}
|
||||
sx={{ '& .MuiCircularProgress-circle': { strokeLinecap: 'round' } }}
|
||||
/>
|
||||
<Typography className='absolute font-medium' color='text.primary'>
|
||||
{`${item.progress}%`}
|
||||
</Typography>
|
||||
</div>
|
||||
<div className='flex justify-between items-center is-full gap-4'>
|
||||
<div>
|
||||
<Typography className='font-medium mbe-1.5' color={`${item.color}.main`}>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<Chip variant='tonal' size='small' label={`${item.chipLabel}%`} />
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default VehicleCondition
|
||||
@@ -0,0 +1,192 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Badge from '@mui/material/Badge'
|
||||
import Card from '@mui/material/Card'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Components
|
||||
import classnames from 'classnames'
|
||||
import { useKeenSlider } from 'keen-slider/react'
|
||||
import type { KeenSliderPlugin } from 'keen-slider/react'
|
||||
|
||||
// Components Imports
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
import AppKeenSlider from '@/libs/styles/AppKeenSlider'
|
||||
|
||||
type DataType = {
|
||||
img: string
|
||||
title: string
|
||||
details: { [key: string]: string }
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Traffic',
|
||||
img: '/images/cards/graphic-illustration-1.png',
|
||||
details: {
|
||||
Sessions: '28%',
|
||||
'Page Views': '3.1k',
|
||||
Leads: '1.2k',
|
||||
Conversions: '12%'
|
||||
}
|
||||
},
|
||||
{
|
||||
title: 'Spending',
|
||||
img: '/images/cards/graphic-illustration-2.png',
|
||||
details: {
|
||||
Spend: '12h',
|
||||
Orders: '18',
|
||||
Order: '127',
|
||||
Items: '2.3k'
|
||||
}
|
||||
},
|
||||
{
|
||||
title: 'Revenue Sources',
|
||||
img: '/images/cards/graphic-illustration-3.png',
|
||||
details: {
|
||||
Direct: '268',
|
||||
Organic: '890',
|
||||
Referral: '62',
|
||||
Campaign: '1.2k'
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
const Slides = () => {
|
||||
return (
|
||||
<>
|
||||
{data.map((slide: DataType, index: number) => {
|
||||
return (
|
||||
<div key={index} className={classnames('keen-slider__slide p-6 pbe-3 is-full')}>
|
||||
<Typography variant='h5' className='mbe-0.5 text-[var(--mui-palette-common-white)]'>
|
||||
Website Analytics
|
||||
</Typography>
|
||||
<Typography variant='subtitle2' className='mbe-3 text-[var(--mui-palette-common-white)]'>
|
||||
Total 28.5% Conversion Rate
|
||||
</Typography>
|
||||
<Grid container spacing={4} className='relative'>
|
||||
<Grid size={{ xs: 12, sm: 8 }} className='order-2 sm:order-1'>
|
||||
<div className='flex flex-col gap-4 pbs-5 sm:plb-6'>
|
||||
<Typography className='font-medium text-[var(--mui-palette-common-white)]'>{slide.title}</Typography>
|
||||
<Grid container spacing={4}>
|
||||
{Object.keys(slide.details).map((key: string, index: number) => {
|
||||
return (
|
||||
<Grid key={index} size={{ xs: 6 }}>
|
||||
<div className='flex items-center gap-0.5'>
|
||||
<CustomAvatar
|
||||
color='primary'
|
||||
variant='rounded'
|
||||
className='font-medium mie-2 text-white bg-[var(--mui-palette-primary-dark)] bs-[30px] is-12'
|
||||
>
|
||||
{slide.details[key]}
|
||||
</CustomAvatar>
|
||||
<Typography noWrap className='text-[var(--mui-palette-common-white)]'>
|
||||
{key}
|
||||
</Typography>
|
||||
</div>
|
||||
</Grid>
|
||||
)
|
||||
})}
|
||||
</Grid>
|
||||
</div>
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, sm: 4 }} className='flex justify-center order-1 sm:order-2'>
|
||||
<img
|
||||
src={slide.img}
|
||||
height={150}
|
||||
className='max-bs-[150px] md:bs-[120px] xl:bs-[150px] drop-shadow-[0_4px_60px_rgba(0,0,0,0.5)] sm:absolute bottom-3 end-0'
|
||||
/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
const WebsiteAnalyticsSlider = () => {
|
||||
// States
|
||||
const [loaded, setLoaded] = useState<boolean>(false)
|
||||
const [currentSlide, setCurrentSlide] = useState<number>(0)
|
||||
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
const ResizePlugin: KeenSliderPlugin = slider => {
|
||||
const observer = new ResizeObserver(function () {
|
||||
slider.update()
|
||||
})
|
||||
|
||||
slider.on('created', () => {
|
||||
observer.observe(slider.container)
|
||||
})
|
||||
slider.on('destroyed', () => {
|
||||
observer.unobserve(slider.container)
|
||||
})
|
||||
}
|
||||
|
||||
const [sliderRef, instanceRef] = useKeenSlider<HTMLDivElement>(
|
||||
{
|
||||
loop: true,
|
||||
rtl: theme.direction === 'rtl',
|
||||
slideChanged(slider) {
|
||||
setCurrentSlide(slider.track.details.rel)
|
||||
},
|
||||
created() {
|
||||
setLoaded(true)
|
||||
}
|
||||
},
|
||||
[ResizePlugin]
|
||||
)
|
||||
|
||||
return (
|
||||
<AppKeenSlider>
|
||||
<Card className='bg-primary'>
|
||||
<div ref={sliderRef} className='keen-slider relative'>
|
||||
{loaded && instanceRef.current && (
|
||||
<div className='swiper-dots absolute top-1 inline-end-6'>
|
||||
{[...Array(instanceRef.current.track.details.slides.length).keys()].map(idx => {
|
||||
return (
|
||||
<Badge
|
||||
key={idx}
|
||||
variant='dot'
|
||||
component='div'
|
||||
className={classnames({
|
||||
active: currentSlide === idx
|
||||
})}
|
||||
onClick={() => {
|
||||
instanceRef.current?.moveToIdx(idx)
|
||||
}}
|
||||
sx={{
|
||||
'& .MuiBadge-dot': {
|
||||
width: '8px !important',
|
||||
height: '8px !important',
|
||||
backgroundColor: 'var(--mui-palette-common-white) !important',
|
||||
opacity: 0.4
|
||||
},
|
||||
'&.active .MuiBadge-dot': {
|
||||
opacity: 1
|
||||
}
|
||||
}}
|
||||
></Badge>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
<Slides />
|
||||
</div>
|
||||
</Card>
|
||||
</AppKeenSlider>
|
||||
)
|
||||
}
|
||||
|
||||
export default WebsiteAnalyticsSlider
|
||||
@@ -0,0 +1,42 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
|
||||
const CardFacebook = () => {
|
||||
return (
|
||||
<Card className='bg-facebook'>
|
||||
<CardContent>
|
||||
<div className='flex items-center gap-2 mbe-4'>
|
||||
<i className='tabler-brand-facebook text-3xl text-white' />
|
||||
<Typography variant='h5' className='text-white'>
|
||||
Facebook Card
|
||||
</Typography>
|
||||
</div>
|
||||
<Typography className='mbe-4 text-white'>
|
||||
You've read about the importance of being courageous, rebellious and imaginative. These are all vital
|
||||
ingredients in an effective.
|
||||
</Typography>
|
||||
<div className='flex align-center justify-between flex-wrap gap-x-4 gap-y-2'>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<Avatar src='/images/avatars/1.png' />
|
||||
<Typography className='text-white'>Eugene Clarke</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-1.5'>
|
||||
<i className='tabler-thumb-up-filled text-xl text-white' />
|
||||
<Typography variant='body2' className='text-white'>
|
||||
2.5k
|
||||
</Typography>
|
||||
<i className='tabler-share text-xl text-white' />
|
||||
<Typography variant='body2' className='text-white'>
|
||||
124
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardFacebook
|
||||
@@ -0,0 +1,45 @@
|
||||
'use client'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Rating from '@mui/material/Rating'
|
||||
import CardActions from '@mui/material/CardActions'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardHorizontalRatings = () => {
|
||||
return (
|
||||
<Card>
|
||||
<Grid container>
|
||||
<Grid size={{ xs: 12, md: 6, lg: 7 }}>
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Stumptown Roasters
|
||||
</Typography>
|
||||
<div className='flex flex-wrap gap-x-2 gap-y-1 mbe-2'>
|
||||
<Rating name='read-only' value={4} readOnly />
|
||||
<Typography>4 Star | 98 reviews</Typography>
|
||||
</div>
|
||||
<Typography color='text.secondary'>
|
||||
Before there was a United States of America, there were coffee houses, because how are you supposed to
|
||||
build.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
<CardActions className='card-actions-dense'>
|
||||
<Button>Location</Button>
|
||||
<Button>Reviews</Button>
|
||||
</CardActions>
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, md: 6, lg: 5 }} className='flex items-center justify-center md:order-[unset] -order-1'>
|
||||
<CardContent className='flex items-center justify-center'>
|
||||
<img src='/images/cards/5.png' height='175' className='rounded' />
|
||||
</CardContent>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardHorizontalRatings
|
||||
@@ -0,0 +1,32 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardActions from '@mui/material/CardActions'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardInfluencingInfluencer = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Influencing Influencer
|
||||
</Typography>
|
||||
<Typography className='mbe-4' color='text.secondary'>
|
||||
Computers have become ubiquitous in almost every facet of our lives. At work, desk jockeys spend hours in
|
||||
front of their desktops, while delivery people scan bar codes with handhelds and workers in the field stay in
|
||||
touch.
|
||||
</Typography>
|
||||
<Typography color='text.secondary'>
|
||||
If you're in the market for new desktops, notebooks, or PDAs, there are a myriad of choices. Here's a
|
||||
rundown of some of the best systems available.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
<CardActions className='card-actions-dense'>
|
||||
<Button>Read More</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardInfluencingInfluencer
|
||||
@@ -0,0 +1,24 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardMedia from '@mui/material/CardMedia'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
const CardInfluencingInfluencerWithImg = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardMedia image='/images/cards/1.png' className='bs-[200px]' />
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Influencing The Influencer
|
||||
</Typography>
|
||||
<Typography color='text.secondary'>
|
||||
Cancun is back, better than ever! Over a hundred Mexico resorts have reopened and the state tourism minister
|
||||
predicts Cancun will draw as many visitors in 2006 as it did two years ago.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardInfluencingInfluencerWithImg
|
||||
@@ -0,0 +1,83 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Divider from '@mui/material/Divider'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardLifetimeMembership = () => {
|
||||
return (
|
||||
<Card>
|
||||
<Grid container>
|
||||
<Grid size={{ xs: 12, sm: 7 }}>
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Lifetime Membership
|
||||
</Typography>
|
||||
<Typography color='text.secondary'>
|
||||
Here, I focus on a range of items and features that we use in life without giving them a second thought
|
||||
such as Coca Cola, body muscles and holding ones own breath. Though, most of these notes are not
|
||||
fundamentally necessary, they are such that you can use them for a good laugh, at a drinks party or for
|
||||
picking up women or men.
|
||||
</Typography>
|
||||
<Divider className='mbs-7 mbe-7' />
|
||||
<Grid container>
|
||||
<Grid size={{ xs: 12, sm: 6 }} className='flex flex-col pie-5 gap-[26px]'>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<div className='flex'>
|
||||
<i className='tabler-lock-open text-xl text-textSecondary' />
|
||||
</div>
|
||||
<Typography color='text.secondary'>Full Access</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<div className='flex'>
|
||||
<i className='tabler-user text-xl text-textSecondary' />
|
||||
</div>
|
||||
<Typography color='text.secondary'>15 Members</Typography>
|
||||
</div>
|
||||
</Grid>
|
||||
<Grid
|
||||
size={{ xs: 12, sm: 6 }}
|
||||
className='flex flex-col max-sm:mbs-[26px] sm:pis-5 sm:border-is gap-[26px]'
|
||||
>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<div className='flex'>
|
||||
<i className='tabler-lock-open text-xl text-textSecondary' />
|
||||
</div>
|
||||
<Typography color='text.secondary'>Access all Features</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<div className='flex'>
|
||||
<i className='tabler-user text-xl text-textSecondary' />
|
||||
</div>
|
||||
<Typography color='text.secondary'>Lifetime Free Update</Typography>
|
||||
</div>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</CardContent>
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, sm: 5 }}>
|
||||
<CardContent className='flex items-center justify-center bs-full bg-actionHover'>
|
||||
<div className='flex flex-col items-center justify-center gap-2'>
|
||||
<div className='flex items-baseline justify-center'>
|
||||
<Typography variant='h5'>$</Typography>
|
||||
<Typography variant='h1'>899</Typography>
|
||||
<Typography variant='h5'>USD</Typography>
|
||||
</div>
|
||||
<Typography color='text.secondary' className='flex flex-col text-center'>
|
||||
<span>5 Tips For Offshore</span>
|
||||
<span>Software Development</span>
|
||||
</Typography>
|
||||
<Button variant='contained' className='mbs-5'>
|
||||
Contact Now
|
||||
</Button>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardLifetimeMembership
|
||||
@@ -0,0 +1,42 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
|
||||
const CardLinkedIn = () => {
|
||||
return (
|
||||
<Card className='bg-linkedin'>
|
||||
<CardContent>
|
||||
<div className='flex items-center gap-2 mbe-4'>
|
||||
<i className='tabler-brand-linkedin text-3xl text-white' />
|
||||
<Typography variant='h5' className='text-white'>
|
||||
LinkedIn Card
|
||||
</Typography>
|
||||
</div>
|
||||
<Typography className='mbe-4 text-white'>
|
||||
With the Internet spreading like wildfire and reaching every part of our daily life, more and more traffic is
|
||||
directed.
|
||||
</Typography>
|
||||
<div className='flex align-center justify-between flex-wrap gap-x-4 gap-y-2'>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<Avatar src='/images/avatars/8.png' />
|
||||
<Typography className='text-white'>Anne Burke</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-1.5'>
|
||||
<i className='tabler-thumb-up-filled text-xl text-white' />
|
||||
<Typography variant='body2' className='text-white'>
|
||||
1.2k
|
||||
</Typography>
|
||||
<i className='tabler-share text-xl text-white' />
|
||||
<Typography variant='body2' className='text-white'>
|
||||
56
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardLinkedIn
|
||||
@@ -0,0 +1,89 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
import type { MouseEvent } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardActions from '@mui/material/CardActions'
|
||||
import Button from '@mui/material/Button'
|
||||
import IconButton from '@mui/material/IconButton'
|
||||
import Menu from '@mui/material/Menu'
|
||||
import MenuItem from '@mui/material/MenuItem'
|
||||
|
||||
const CardMobile = () => {
|
||||
// States
|
||||
const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)
|
||||
|
||||
const open = Boolean(anchorEl)
|
||||
|
||||
const handleClick = (event: MouseEvent<HTMLButtonElement>) => {
|
||||
setAnchorEl(event.currentTarget)
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null)
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<Grid container>
|
||||
<Grid size={{ xs: 12, md: 5 }} className='flex items-center justify-center'>
|
||||
<CardContent className='flex items-center justify-center'>
|
||||
<img alt='iPhone 11 Pro' src='/images/cards/4.png' height={175} />
|
||||
</CardContent>
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, md: 7 }} className='md:border-is border-bs md:border-bs-0'>
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Apple iPhone 11 Pro
|
||||
</Typography>
|
||||
<Typography className='mbe-2' color='text.secondary'>
|
||||
Apple iPhone 11 Pro smartphone. Announced Sep 2019. Features 5.8″ display Apple A13 Bionic
|
||||
</Typography>
|
||||
<div className='flex gap-1'>
|
||||
<Typography>Price:</Typography>
|
||||
<Typography className='font-medium'>$899</Typography>
|
||||
</div>
|
||||
</CardContent>
|
||||
<CardActions className='justify-between card-actions-dense'>
|
||||
<Button startIcon={<i className='tabler-shopping-cart' />}>Add to Cart</Button>
|
||||
<IconButton
|
||||
id='share-button'
|
||||
aria-haspopup='true'
|
||||
{...(open && { 'aria-expanded': true, 'aria-controls': 'share-menu' })}
|
||||
onClick={handleClick}
|
||||
>
|
||||
<i className='tabler-share' />
|
||||
</IconButton>
|
||||
<Menu
|
||||
anchorEl={anchorEl}
|
||||
open={open}
|
||||
MenuListProps={{ 'aria-labelledby': 'share-button' }}
|
||||
onClose={handleClose}
|
||||
>
|
||||
<MenuItem onClick={handleClose}>
|
||||
<i className='tabler-brand-facebook text-xl' />
|
||||
</MenuItem>
|
||||
<MenuItem onClick={handleClose}>
|
||||
<i className='tabler-brand-twitter text-xl' />
|
||||
</MenuItem>
|
||||
<MenuItem onClick={handleClose}>
|
||||
<i className='tabler-brand-linkedin text-xl' />
|
||||
</MenuItem>
|
||||
<MenuItem onClick={handleClose}>
|
||||
<i className='tabler-brand-google text-xl' />
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
</CardActions>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardMobile
|
||||
@@ -0,0 +1,28 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardSupport = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardContent className='flex flex-col items-center text-center'>
|
||||
<Avatar className='mbe-2 is-[56px] bs-[56px]'>
|
||||
<i className='tabler-help-circle text-[32px]' />
|
||||
</Avatar>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Support
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-4'>
|
||||
According to us blisters are a very common thing and we come across them very often in our daily lives. It is
|
||||
a very common occurrence like cold or fever depending upon your lifestyle.
|
||||
</Typography>
|
||||
<Button variant='contained'>Contact Now</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardSupport
|
||||
@@ -0,0 +1,42 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
|
||||
const CardTwitter = () => {
|
||||
return (
|
||||
<Card className='bg-twitter'>
|
||||
<CardContent>
|
||||
<div className='flex items-center gap-2 mbe-4'>
|
||||
<i className='tabler-brand-twitter text-3xl text-white' />
|
||||
<Typography variant='h5' className='text-white'>
|
||||
Twitter Card
|
||||
</Typography>
|
||||
</div>
|
||||
<Typography className='mbe-4 text-white'>
|
||||
Turns out semicolon-less style is easier and safer in TS because most gotcha edge cases are type invalid as
|
||||
well.
|
||||
</Typography>
|
||||
<div className='flex align-center justify-between flex-wrap gap-x-4 gap-y-2'>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<Avatar src='/images/avatars/6.png' />
|
||||
<Typography className='text-white'>Mary Vaughn</Typography>
|
||||
</div>
|
||||
<div className='flex items-center gap-1.5'>
|
||||
<i className='tabler-thumb-up text-xl text-white' />
|
||||
<Typography variant='body2' className='text-white'>
|
||||
1.6k
|
||||
</Typography>
|
||||
<i className='tabler-share text-xl text-white' />
|
||||
<Typography variant='body2' className='text-white'>
|
||||
98
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardTwitter
|
||||
@@ -0,0 +1,45 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardMedia from '@mui/material/CardMedia'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Avatar from '@mui/material/Avatar'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Button from '@mui/material/Button'
|
||||
import AvatarGroup from '@mui/material/AvatarGroup'
|
||||
|
||||
const CardUser = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardMedia image='/images/cards/2.png' className='bs-[180px]' />
|
||||
<CardContent className='relative'>
|
||||
<Avatar
|
||||
src='/images/avatars/3.png'
|
||||
alt='Robert Meyer'
|
||||
className='is-[78px] bs-[78px] border-[5px] border-backgroundPaper absolute start-[11px] block-start-[-39px]'
|
||||
/>
|
||||
<div className='flex justify-between items-center flex-wrap gap-x-4 gap-y-2 mbe-5 mbs-[30px]'>
|
||||
<div className='flex flex-col items-start'>
|
||||
<Typography variant='h5'>Robert Meyer</Typography>
|
||||
<Typography variant='body2'>London, UK</Typography>
|
||||
</div>
|
||||
<Button variant='contained'>Send Request</Button>
|
||||
</div>
|
||||
<div className='flex justify-between items-center flex-wrap gap-x-4 gap-y-2'>
|
||||
<Typography variant='subtitle2' color='text.disabled'>
|
||||
18 mutual friends
|
||||
</Typography>
|
||||
<AvatarGroup max={4}>
|
||||
<Avatar src='/images/avatars/1.png' />
|
||||
<Avatar src='/images/avatars/5.png' />
|
||||
<Avatar src='/images/avatars/4.png' />
|
||||
<Avatar src='/images/avatars/6.png' />
|
||||
<Avatar src='/images/avatars/7.png' />
|
||||
<Avatar src='/images/avatars/8.png' />
|
||||
</AvatarGroup>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardUser
|
||||
@@ -0,0 +1,37 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Rating from '@mui/material/Rating'
|
||||
import CardActions from '@mui/material/CardActions'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardVerticalRatings = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
The Best Answers
|
||||
</Typography>
|
||||
<div className='flex flex-wrap gap-x-2 gap-y-1 mbe-2'>
|
||||
<Rating name='read-only' value={4} readOnly />
|
||||
<Typography>4 Star | 98 reviews</Typography>
|
||||
</div>
|
||||
<Typography color='text.secondary' className='mbe-4'>
|
||||
If you are looking for a new way to promote your business that won't cost you more money, maybe printing
|
||||
is one of the options you won't resist.
|
||||
</Typography>
|
||||
<Typography color='text.secondary'>
|
||||
Printing is a widely use process in making printed materials that are used for advertising. It become fast,
|
||||
easy and simple.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
<CardActions className='card-actions-dense'>
|
||||
<Button>Location</Button>
|
||||
<Button>Review</Button>
|
||||
</CardActions>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardVerticalRatings
|
||||
@@ -0,0 +1,28 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardMedia from '@mui/material/CardMedia'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardWatch = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardMedia image='/images/cards/6.png' className='bs-[140px]' />
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Apple Watch
|
||||
</Typography>
|
||||
<Typography className='mbe-2'>$249.40</Typography>
|
||||
<Typography color='text.secondary'>
|
||||
3.1GHz 6-core 10th-generation Intel Core i5 processor, Turbo Boost up to 4.5GHz
|
||||
</Typography>
|
||||
</CardContent>
|
||||
<Button variant='contained' fullWidth className='rounded-none'>
|
||||
Add to Cart
|
||||
</Button>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardWatch
|
||||
@@ -0,0 +1,52 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardMedia from '@mui/material/CardMedia'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardActions from '@mui/material/CardActions'
|
||||
import Button from '@mui/material/Button'
|
||||
import IconButton from '@mui/material/IconButton'
|
||||
import Collapse from '@mui/material/Collapse'
|
||||
import Divider from '@mui/material/Divider'
|
||||
|
||||
const CardWithCollapse = () => {
|
||||
const [expanded, setExpanded] = useState(false)
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardMedia image='/images/cards/3.png' className='bs-[185px]' />
|
||||
<CardContent>
|
||||
<Typography variant='h5' className='mbe-3'>
|
||||
Popular Uses Of The Internet
|
||||
</Typography>
|
||||
<Typography color='text.secondary'>
|
||||
Although cards can support multiple actions, UI controls, and an overflow menu.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
<CardActions className='justify-between card-actions-dense'>
|
||||
<Button onClick={() => setExpanded(!expanded)}>Details</Button>
|
||||
<IconButton onClick={() => setExpanded(!expanded)}>
|
||||
<i className={expanded ? 'tabler-chevron-up' : 'tabler-chevron-down'} />
|
||||
</IconButton>
|
||||
</CardActions>
|
||||
<Collapse in={expanded} timeout={300}>
|
||||
<Divider />
|
||||
<CardContent>
|
||||
<Typography color='text.secondary'>
|
||||
I'm a thing. But, like most politicians, he promised more than he could deliver. You won't have time
|
||||
for sleeping, soldier, not with all the bed making you'll be doing. Then we'll go with that data
|
||||
file! Hey, you add a one and two zeros to that or we walk! You're going to do his laundry? I've got
|
||||
to find a way to escape.
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</Collapse>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardWithCollapse
|
||||
@@ -0,0 +1,70 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
import type { SyntheticEvent } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import TabContext from '@mui/lab/TabContext'
|
||||
import TabList from '@mui/lab/TabList'
|
||||
import Tab from '@mui/material/Tab'
|
||||
import TabPanel from '@mui/lab/TabPanel'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardWithTabs = () => {
|
||||
// ** State
|
||||
const [value, setValue] = useState<string>('1')
|
||||
|
||||
const handleChange = (event: SyntheticEvent, newValue: string) => {
|
||||
setValue(newValue)
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<TabContext value={value}>
|
||||
<TabList onChange={handleChange} aria-label='card navigation examples'>
|
||||
<Tab value='1' label='Item One' />
|
||||
<Tab value='2' label='Item Two' />
|
||||
<Tab value='3' label='Item Three' />
|
||||
</TabList>
|
||||
<CardContent>
|
||||
<TabPanel value='1'>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Header One
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-6'>
|
||||
Pudding tiramisu caramels. Gingerbread gummies danish chocolate bar toffee marzipan. Wafer wafer cake
|
||||
powder danish oat cake.
|
||||
</Typography>
|
||||
<Button variant='contained'>Button One</Button>
|
||||
</TabPanel>
|
||||
<TabPanel value='2'>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Header Two
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-6'>
|
||||
Dragée chupa chups soufflé cheesecake jelly tootsie roll cupcake marzipan. Carrot cake sweet roll gummi
|
||||
bears caramels jelly beans.
|
||||
</Typography>
|
||||
<Button variant='contained'>Button Two</Button>
|
||||
</TabPanel>
|
||||
<TabPanel value='3'>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Header Three
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-6'>
|
||||
Icing cake macaroon macaroon jelly chocolate bar. Chupa chups dessert dessert soufflé chocolate bar
|
||||
jujubes gummi bears lollipop.
|
||||
</Typography>
|
||||
<Button variant='contained'>Button Three</Button>
|
||||
</TabPanel>
|
||||
</CardContent>
|
||||
</TabContext>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardWithTabs
|
||||
@@ -0,0 +1,70 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
import type { SyntheticEvent } from 'react'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import TabContext from '@mui/lab/TabContext'
|
||||
import TabList from '@mui/lab/TabList'
|
||||
import Tab from '@mui/material/Tab'
|
||||
import TabPanel from '@mui/lab/TabPanel'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Button from '@mui/material/Button'
|
||||
|
||||
const CardWithTabsCenter = () => {
|
||||
// ** State
|
||||
const [value, setValue] = useState<string>('1')
|
||||
|
||||
const handleChange = (event: SyntheticEvent, newValue: string) => {
|
||||
setValue(newValue)
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<TabContext value={value}>
|
||||
<TabList centered onChange={handleChange} aria-label='card navigation examples'>
|
||||
<Tab value='1' label='Item One' />
|
||||
<Tab value='2' label='Item Two' />
|
||||
<Tab value='3' label='Item Three' />
|
||||
</TabList>
|
||||
<CardContent>
|
||||
<TabPanel value='1' className='text-center'>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Header One
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-6'>
|
||||
Pudding tiramisu caramels. Gingerbread gummies danish chocolate bar toffee marzipan. Wafer wafer cake
|
||||
powder danish oat cake.
|
||||
</Typography>
|
||||
<Button variant='contained'>Button One</Button>
|
||||
</TabPanel>
|
||||
<TabPanel value='2' className='text-center'>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Header Two
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-6'>
|
||||
Dragée chupa chups soufflé cheesecake jelly tootsie roll cupcake marzipan. Carrot cake sweet roll gummi
|
||||
bears caramels jelly beans.
|
||||
</Typography>
|
||||
<Button variant='contained'>Button Two</Button>
|
||||
</TabPanel>
|
||||
<TabPanel value='3' className='text-center'>
|
||||
<Typography variant='h5' className='mbe-2'>
|
||||
Header Three
|
||||
</Typography>
|
||||
<Typography color='text.secondary' className='mbe-6'>
|
||||
Icing cake macaroon macaroon jelly chocolate bar. Chupa chups dessert dessert soufflé chocolate bar
|
||||
jujubes gummi bears lollipop.
|
||||
</Typography>
|
||||
<Button variant='contained'>Button Three</Button>
|
||||
</TabPanel>
|
||||
</CardContent>
|
||||
</TabContext>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardWithTabsCenter
|
||||
@@ -0,0 +1,159 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
|
||||
// Third Party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Styles Imports
|
||||
import './styles.css'
|
||||
|
||||
// Vars
|
||||
const colors = {
|
||||
series1: '#7367F0',
|
||||
series2: '#8F85F3',
|
||||
series3: '#ABA4F6'
|
||||
}
|
||||
|
||||
const labelColor = 'var(--mui-palette-text-disabled)'
|
||||
const bodyColor = 'var(--mui-palette-text-secondary)'
|
||||
const borderColor = 'var(--mui-palette-divider)'
|
||||
|
||||
const series = [
|
||||
{
|
||||
name: 'Delivery rate',
|
||||
type: 'column',
|
||||
data: [5, 4.5, 4, 3]
|
||||
},
|
||||
{
|
||||
name: 'Delivery time',
|
||||
type: 'column',
|
||||
data: [4, 3.5, 3, 2.5]
|
||||
},
|
||||
{
|
||||
name: 'Delivery exceptions',
|
||||
type: 'column',
|
||||
data: [3.5, 3, 2.5, 2]
|
||||
}
|
||||
]
|
||||
|
||||
const CarrierPerformance = () => {
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
stacked: false,
|
||||
toolbar: {
|
||||
show: false
|
||||
},
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
enabled: false
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
horizontal: false,
|
||||
columnWidth: '50%',
|
||||
borderRadius: 4
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: false
|
||||
},
|
||||
xaxis: {
|
||||
tickAmount: 10,
|
||||
categories: ['Carrier A', 'Carrier B', 'Carrier C', 'Carrier D'],
|
||||
labels: {
|
||||
style: {
|
||||
colors: labelColor,
|
||||
fontSize: '13px',
|
||||
fontFamily: 'Public Sans',
|
||||
fontWeight: 400
|
||||
}
|
||||
},
|
||||
axisBorder: {
|
||||
show: false
|
||||
},
|
||||
axisTicks: {
|
||||
show: false
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
tickAmount: 4,
|
||||
max: 5,
|
||||
min: 0,
|
||||
labels: {
|
||||
style: {
|
||||
colors: labelColor,
|
||||
fontSize: '13px',
|
||||
fontFamily: 'Public Sans',
|
||||
fontWeight: 400
|
||||
},
|
||||
formatter(o: any) {
|
||||
return o
|
||||
}
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
markers: {
|
||||
width: 8,
|
||||
height: 8,
|
||||
offsetX: -3,
|
||||
radius: 12
|
||||
},
|
||||
height: 33,
|
||||
offsetY: 10,
|
||||
itemMargin: {
|
||||
horizontal: 10,
|
||||
vertical: 0
|
||||
},
|
||||
fontSize: '13px',
|
||||
fontFamily: 'Public Sans',
|
||||
fontWeight: 400,
|
||||
labels: {
|
||||
colors: bodyColor,
|
||||
useSeriesColors: false
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
borderColor,
|
||||
strokeDashArray: 6
|
||||
},
|
||||
colors: [colors.series1, colors.series2, colors.series3],
|
||||
fill: {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Carrier Performance' action={<OptionMenu options={['View More', 'Delete']} />} />
|
||||
<CardContent>
|
||||
<AppReactApexCharts
|
||||
id='carrier-performance'
|
||||
type='bar'
|
||||
height={360}
|
||||
width='100%'
|
||||
series={series}
|
||||
options={options}
|
||||
/>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default CarrierPerformance
|
||||
@@ -0,0 +1,115 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
const deliveryExceptionsChartSeries = [13, 25, 22, 40]
|
||||
|
||||
const DeliveryExceptions = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
const options: ApexOptions = {
|
||||
labels: ['Incorrect address', 'Weather conditions', 'Federal Holidays', 'Damage during transit'],
|
||||
stroke: {
|
||||
width: 0
|
||||
},
|
||||
colors: [
|
||||
'var(--mui-palette-success-main)',
|
||||
'rgba(var(--mui-palette-success-mainChannel) / 0.8)',
|
||||
'rgba(var(--mui-palette-success-mainChannel) / 0.6)',
|
||||
'rgba(var(--mui-palette-success-mainChannel) / 0.4)'
|
||||
],
|
||||
dataLabels: {
|
||||
enabled: false,
|
||||
formatter(val: string) {
|
||||
return `${Number.parseInt(val)}%`
|
||||
}
|
||||
},
|
||||
legend: {
|
||||
show: true,
|
||||
position: 'bottom',
|
||||
offsetY: 10,
|
||||
markers: {
|
||||
width: 8,
|
||||
height: 8,
|
||||
offsetY: 1,
|
||||
offsetX: theme.direction === 'rtl' ? 8 : -4
|
||||
},
|
||||
itemMargin: {
|
||||
horizontal: 15,
|
||||
vertical: 5
|
||||
},
|
||||
fontSize: '13px',
|
||||
fontWeight: 400,
|
||||
labels: {
|
||||
colors: 'var()',
|
||||
useSeriesColors: false
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: 15
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
pie: {
|
||||
donut: {
|
||||
size: '75%',
|
||||
labels: {
|
||||
show: true,
|
||||
value: {
|
||||
fontSize: '24px',
|
||||
color: 'var(--mui-palette-text-primary)',
|
||||
fontWeight: 500,
|
||||
offsetY: -20
|
||||
},
|
||||
name: { offsetY: 20 },
|
||||
total: {
|
||||
show: true,
|
||||
fontSize: '0.9375rem',
|
||||
fontWeight: 400,
|
||||
label: 'AVG. Exceptions',
|
||||
color: 'var(--mui-palette-text-secondary)',
|
||||
formatter() {
|
||||
return '30%'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card className='bs-full'>
|
||||
<CardHeader title='Delivery exceptions' action={<OptionMenu options={['Select All', 'Refresh', 'Share']} />} />
|
||||
<CardContent>
|
||||
<AppReactApexCharts
|
||||
type='donut'
|
||||
height={370}
|
||||
width='100%'
|
||||
series={deliveryExceptionsChartSeries}
|
||||
options={options}
|
||||
/>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default DeliveryExceptions
|
||||
@@ -0,0 +1,171 @@
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import LinearProgress from '@mui/material/LinearProgress'
|
||||
import Chip from '@mui/material/Chip'
|
||||
|
||||
// Third Party Imports
|
||||
import classnames from 'classnames'
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type DataType = {
|
||||
stats: string
|
||||
title: string
|
||||
progress: number
|
||||
avatarIcon: string
|
||||
avatarColor?: ThemeColor
|
||||
progressColor?: ThemeColor
|
||||
}
|
||||
|
||||
// Vars
|
||||
const series = [{ data: [37, 76, 65, 41, 99, 53, 70] }]
|
||||
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Earnings',
|
||||
progress: 64,
|
||||
stats: '$545.69',
|
||||
progressColor: 'primary',
|
||||
avatarColor: 'primary',
|
||||
avatarIcon: 'tabler-currency-dollar'
|
||||
},
|
||||
{
|
||||
title: 'Profit',
|
||||
progress: 59,
|
||||
stats: '$256.34',
|
||||
progressColor: 'info',
|
||||
avatarColor: 'info',
|
||||
avatarIcon: 'tabler-chart-pie-2'
|
||||
},
|
||||
{
|
||||
title: 'Expense',
|
||||
progress: 22,
|
||||
stats: '$74.19',
|
||||
progressColor: 'error',
|
||||
avatarColor: 'error',
|
||||
avatarIcon: 'tabler-brand-paypal'
|
||||
}
|
||||
]
|
||||
|
||||
const EarningReports = () => {
|
||||
// Vars
|
||||
const primaryColorWithOpacity = 'var(--mui-palette-primary-lightOpacity)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: -31,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: -9
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 4,
|
||||
distributed: true,
|
||||
columnWidth: '42%'
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
dataLabels: { enabled: false },
|
||||
colors: [
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity,
|
||||
'var(--mui-palette-primary-main)',
|
||||
primaryColorWithOpacity,
|
||||
primaryColorWithOpacity
|
||||
],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
categories: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false },
|
||||
labels: {
|
||||
style: {
|
||||
fontSize: '13px',
|
||||
colors: 'var(--mui-palette-text-disabled)'
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: { show: false }
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Earning Reports'
|
||||
subheader='Weekly Earnings Overview'
|
||||
action={<OptionMenu options={['Last Week', 'Last Month', 'Last Year']} />}
|
||||
className='pbe-0'
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-5 max-md:gap-5 max-[1015px]:gap-[62px] max-[1051px]:gap-10 max-[1200px]:gap-5 max-[1310px]:gap-10'>
|
||||
<div className='flex flex-col sm:flex-row items-center justify-between gap-8'>
|
||||
<div className='flex flex-col gap-3 is-full sm:is-[unset]'>
|
||||
<div className='flex items-center gap-2.5'>
|
||||
<Typography variant='h2'>$468</Typography>
|
||||
<Chip size='small' variant='tonal' color='success' label='+4.2%' />
|
||||
</div>
|
||||
<Typography variant='body2' className='text-balance'>
|
||||
You informed of this week compared to last week
|
||||
</Typography>
|
||||
</div>
|
||||
<AppReactApexCharts type='bar' height={163} width='100%' series={series} options={options} />
|
||||
</div>
|
||||
<div className='flex flex-col sm:flex-row gap-6 p-5 border rounded'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex flex-col gap-2 is-full'>
|
||||
<div className='flex items-center gap-2'>
|
||||
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={26}>
|
||||
<i className={classnames(item.avatarIcon, 'text-lg')} />
|
||||
</CustomAvatar>
|
||||
<Typography variant='h6' className='leading-6 font-normal'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
</div>
|
||||
<Typography variant='h4'>{item.stats}</Typography>
|
||||
<LinearProgress
|
||||
value={item.progress}
|
||||
variant='determinate'
|
||||
color={item.progressColor}
|
||||
className='max-bs-1'
|
||||
/>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default EarningReports
|
||||
@@ -0,0 +1,269 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
import type { SyntheticEvent } from 'react'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Tab from '@mui/material/Tab'
|
||||
import TabList from '@mui/lab/TabList'
|
||||
import TabPanel from '@mui/lab/TabPanel'
|
||||
import TabContext from '@mui/lab/TabContext'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import type { Theme } from '@mui/material/styles'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import classnames from 'classnames'
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type ApexChartSeries = NonNullable<ApexOptions['series']>
|
||||
type ApexChartSeriesData = Exclude<ApexChartSeries[0], number>
|
||||
|
||||
type TabCategory = 'orders' | 'sales' | 'profit' | 'income'
|
||||
|
||||
type TabType = {
|
||||
type: TabCategory
|
||||
avatarIcon: string
|
||||
series: ApexChartSeries
|
||||
}
|
||||
|
||||
// Vars
|
||||
const tabData: TabType[] = [
|
||||
{
|
||||
type: 'orders',
|
||||
avatarIcon: 'tabler-shopping-cart',
|
||||
series: [{ data: [28, 10, 46, 38, 15, 30, 35, 28, 8] }]
|
||||
},
|
||||
{
|
||||
type: 'sales',
|
||||
avatarIcon: 'tabler-chart-bar',
|
||||
series: [{ data: [35, 25, 15, 40, 42, 25, 48, 8, 30] }]
|
||||
},
|
||||
{
|
||||
type: 'profit',
|
||||
avatarIcon: 'tabler-currency-dollar',
|
||||
series: [{ data: [10, 22, 27, 33, 42, 32, 27, 22, 8] }]
|
||||
},
|
||||
{
|
||||
type: 'income',
|
||||
avatarIcon: 'tabler-chart-pie-2',
|
||||
series: [{ data: [5, 9, 12, 18, 20, 25, 30, 36, 48] }]
|
||||
}
|
||||
]
|
||||
|
||||
const renderTabs = (value: TabCategory) => {
|
||||
return tabData.map((item, index) => (
|
||||
<Tab
|
||||
key={index}
|
||||
value={item.type}
|
||||
className='mie-4'
|
||||
label={
|
||||
<div
|
||||
className={classnames(
|
||||
'flex flex-col items-center justify-center gap-2 is-[110px] bs-[100px] border rounded-xl',
|
||||
item.type === value ? 'border-solid border-[var(--mui-palette-primary-main)]' : 'border-dashed'
|
||||
)}
|
||||
>
|
||||
<CustomAvatar variant='rounded' skin='light' size={38} {...(item.type === value && { color: 'primary' })}>
|
||||
<i className={classnames('text-[22px]', { 'text-textSecondary': item.type !== value }, item.avatarIcon)} />
|
||||
</CustomAvatar>
|
||||
<Typography className='font-medium capitalize' color='text.primary'>
|
||||
{item.type}
|
||||
</Typography>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
))
|
||||
}
|
||||
|
||||
const renderTabPanels = (value: TabCategory, theme: Theme, options: ApexOptions, colors: string[]) => {
|
||||
return tabData.map((item, index) => {
|
||||
const max = Math.max(...((item.series[0] as ApexChartSeriesData).data as number[]))
|
||||
const seriesIndex = ((item.series[0] as ApexChartSeriesData).data as number[]).indexOf(max)
|
||||
|
||||
const finalColors = colors.map((color, i) => (seriesIndex === i ? 'var(--mui-palette-primary-main)' : color))
|
||||
|
||||
return (
|
||||
<TabPanel key={index} value={item.type} className='!p-0'>
|
||||
<AppReactApexCharts
|
||||
type='bar'
|
||||
height={230}
|
||||
width='100%'
|
||||
options={{ ...options, colors: finalColors }}
|
||||
series={item.series}
|
||||
/>
|
||||
</TabPanel>
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
const EarningReportsWithTabs = () => {
|
||||
// States
|
||||
const [value, setValue] = useState<TabCategory>('orders')
|
||||
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const disabledText = 'var(--mui-palette-text-disabled)'
|
||||
|
||||
const handleChange = (event: SyntheticEvent, newValue: TabCategory) => {
|
||||
setValue(newValue)
|
||||
}
|
||||
|
||||
const colors = Array(9).fill('var(--mui-palette-primary-lightOpacity)')
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 6,
|
||||
distributed: true,
|
||||
columnWidth: '33%',
|
||||
borderRadiusApplication: 'end',
|
||||
dataLabels: { position: 'top' }
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: {
|
||||
offsetY: -11,
|
||||
formatter: val => `${val}k`,
|
||||
style: {
|
||||
fontWeight: 500,
|
||||
colors: ['var(--mui-palette-text-primary)'],
|
||||
fontSize: theme.typography.body1.fontSize as string
|
||||
}
|
||||
},
|
||||
colors,
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: -19,
|
||||
left: -4,
|
||||
right: 0,
|
||||
bottom: -11
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { color: 'var(--mui-palette-divider)' },
|
||||
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep'],
|
||||
labels: {
|
||||
style: {
|
||||
colors: disabledText,
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
offsetX: -18,
|
||||
formatter: val => `$${val}k`,
|
||||
style: {
|
||||
colors: disabledText,
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
}
|
||||
},
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1450,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '45%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 600,
|
||||
options: {
|
||||
dataLabels: {
|
||||
style: {
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '58%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 500,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '70%' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Earning Reports'
|
||||
subheader='Yearly Earnings Overview'
|
||||
action={<OptionMenu options={['Last Week', 'Last Month', 'Last Year']} />}
|
||||
/>
|
||||
<CardContent>
|
||||
<TabContext value={value}>
|
||||
<TabList
|
||||
variant='scrollable'
|
||||
scrollButtons='auto'
|
||||
onChange={handleChange}
|
||||
aria-label='earning report tabs'
|
||||
className='!border-0 mbe-10'
|
||||
sx={{
|
||||
'& .MuiTabs-indicator': { display: 'none !important' },
|
||||
'& .MuiTab-root': { padding: '0 !important', border: '0 !important' }
|
||||
}}
|
||||
>
|
||||
{renderTabs(value)}
|
||||
<Tab
|
||||
disabled
|
||||
value='add'
|
||||
label={
|
||||
<div className='flex flex-col items-center justify-center is-[110px] bs-[100px] border border-dashed rounded-xl'>
|
||||
<CustomAvatar variant='rounded' size={34}>
|
||||
<i className='tabler-plus text-textSecondary' />
|
||||
</CustomAvatar>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
</TabList>
|
||||
{renderTabPanels(value, theme, options, colors)}
|
||||
</TabContext>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default EarningReportsWithTabs
|
||||
@@ -0,0 +1,193 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
value: number
|
||||
colorClass: string
|
||||
}
|
||||
|
||||
// Vars
|
||||
const series = [
|
||||
{
|
||||
data: [35, 20, 14, 12, 10, 9]
|
||||
}
|
||||
]
|
||||
|
||||
const data1: DataType[] = [
|
||||
{ title: 'UI Design', value: 35, colorClass: 'text-primary' },
|
||||
{ title: 'UX Design', value: 20, colorClass: 'text-info' },
|
||||
{ title: 'Music', value: 14, colorClass: 'text-success' }
|
||||
]
|
||||
|
||||
const data2: DataType[] = [
|
||||
{ title: 'Animation', value: 12, colorClass: 'text-secondary' },
|
||||
{ title: 'React', value: 10, colorClass: 'text-error' },
|
||||
{ title: 'SEO', value: 9, colorClass: 'text-warning' }
|
||||
]
|
||||
|
||||
const labels = ['UI Design', 'UX Design', 'Music', 'Animation', 'React', 'SEO']
|
||||
|
||||
const InterestedTopics = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
horizontal: true,
|
||||
barHeight: '70%',
|
||||
distributed: true,
|
||||
borderRadius: 7,
|
||||
borderRadiusApplication: 'end'
|
||||
}
|
||||
},
|
||||
|
||||
colors: [
|
||||
'var(--mui-palette-primary-main)',
|
||||
'var(--mui-palette-info-main)',
|
||||
'var(--mui-palette-success-main)',
|
||||
'var(--mui-palette-secondary-main)',
|
||||
'var(--mui-palette-error-main)',
|
||||
'var(--mui-palette-warning-main)'
|
||||
],
|
||||
grid: {
|
||||
strokeDashArray: 8,
|
||||
borderColor: 'var(--mui-palette-divider)',
|
||||
xaxis: {
|
||||
lines: { show: true }
|
||||
},
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
},
|
||||
padding: {
|
||||
top: -25,
|
||||
left: 21,
|
||||
right: 25,
|
||||
bottom: 0
|
||||
}
|
||||
},
|
||||
dataLabels: {
|
||||
enabled: true,
|
||||
offsetY: 8,
|
||||
style: {
|
||||
colors: ['#fff'],
|
||||
fontWeight: 500,
|
||||
fontSize: '0.8125rem'
|
||||
},
|
||||
formatter(val: string, opt: any) {
|
||||
return labels[opt.dataPointIndex]
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
enabled: true,
|
||||
style: {
|
||||
fontSize: '0.75rem'
|
||||
},
|
||||
onDatasetHover: {
|
||||
highlightDataSeries: false
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false },
|
||||
categories: ['6', '5', '4', '3', '2', '1'],
|
||||
labels: {
|
||||
formatter: val => `${val}%`,
|
||||
style: {
|
||||
fontSize: '0.8125rem',
|
||||
colors: 'var(--mui-palette-text-disabled)'
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
align: theme.direction === 'rtl' ? 'right' : 'left',
|
||||
style: {
|
||||
fontWeight: 500,
|
||||
fontSize: '0.8125rem',
|
||||
colors: 'var(--mui-palette-text-disabled)'
|
||||
},
|
||||
offsetX: theme.direction === 'rtl' ? -15 : -30
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Topic you are interested in'
|
||||
action={<OptionMenu options={['Refresh', 'Update', 'Share']} />}
|
||||
/>
|
||||
<CardContent>
|
||||
<Grid container>
|
||||
<Grid size={{ xs: 12, sm: 6 }} className='max-sm:mbe-6'>
|
||||
<AppReactApexCharts type='bar' height={296} width='100%' series={series} options={options} />
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, sm: 6 }} alignSelf='center'>
|
||||
<div className='flex justify-around items-start'>
|
||||
<div className='flex flex-col gap-y-12'>
|
||||
{data1.map((item, i) => (
|
||||
<div key={i} className='flex gap-2'>
|
||||
<i className={classnames('tabler-circle-filled text-xs m-[5px]', item.colorClass)} />
|
||||
<div>
|
||||
<Typography>{item.title}</Typography>
|
||||
<Typography variant='h5'>{`${item.value}%`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className='flex flex-col gap-y-12'>
|
||||
{data2.map((item, i) => (
|
||||
<div key={i} className='flex gap-2'>
|
||||
<i className={classnames('tabler-circle-filled text-xs m-[5px]', item.colorClass)} />
|
||||
<div>
|
||||
<Typography>{item.title}</Typography>
|
||||
<Typography variant='h5'>{`${item.value}%`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default InterestedTopics
|
||||
@@ -0,0 +1,159 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
amount: string
|
||||
trendDiff: number
|
||||
trend?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const series = [
|
||||
{ data: [2000, 2000, 4000, 4000, 3050, 3050, 2050, 2050, 3050, 3050, 4700, 4700, 2750, 2750, 5700, 5700] }
|
||||
]
|
||||
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Donates',
|
||||
trend: 'negative',
|
||||
amount: '$756.26',
|
||||
trendDiff: 139.34
|
||||
},
|
||||
{
|
||||
title: 'Podcasts',
|
||||
trendDiff: 576.24,
|
||||
amount: '$2,207.03'
|
||||
}
|
||||
]
|
||||
|
||||
const ProjectStatus = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const primaryColor = theme.palette.primary.main
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
stroke: {
|
||||
width: 4,
|
||||
curve: 'straight'
|
||||
},
|
||||
fill: {
|
||||
type: 'gradient',
|
||||
gradient: {
|
||||
opacityTo: 0,
|
||||
opacityFrom: 1,
|
||||
shadeIntensity: 1,
|
||||
stops: [0, 100],
|
||||
colorStops: [
|
||||
[
|
||||
{
|
||||
offset: 0,
|
||||
opacity: 0.4,
|
||||
color: primaryColor
|
||||
},
|
||||
{
|
||||
offset: 100,
|
||||
opacity: 0.1,
|
||||
color: 'var(--mui-palette-background-paper)'
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
theme: {
|
||||
monochrome: {
|
||||
enabled: true,
|
||||
shadeTo: 'light',
|
||||
shadeIntensity: 1,
|
||||
color: primaryColor
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: -42,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 30
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: { show: false }
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Project Status' action={<OptionMenu options={['Share', 'Refresh', 'Update']} />} />
|
||||
<CardContent className='flex flex-col gap-6'>
|
||||
<div className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' color='primary'>
|
||||
<i className='tabler-currency-dollar' />
|
||||
</CustomAvatar>
|
||||
<div className='flex justify-between items-center is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
$4,3742
|
||||
</Typography>
|
||||
<Typography variant='body2'>Your Earnings</Typography>
|
||||
</div>
|
||||
<Typography className='font-medium' color='success.main'>
|
||||
+10.2%
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
<AppReactApexCharts type='area' height={234} width='100%' series={series} options={options} />
|
||||
<div className='flex flex-col gap-4'>
|
||||
{data.map((item: DataType, index: number) => (
|
||||
<div key={index} className='flex items-center justify-between gap-4'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<div className='flex items-center gap-4'>
|
||||
<Typography>{item.amount}</Typography>
|
||||
<Typography color={`${item.trend === 'negative' ? 'error' : 'success'}.main`}>
|
||||
{`${item.trend === 'negative' ? '-' : '+'}${item.trendDiff}`}
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default ProjectStatus
|
||||
@@ -0,0 +1,286 @@
|
||||
'use client'
|
||||
|
||||
// React Imports
|
||||
import { useState } from 'react'
|
||||
import type { MouseEvent } from 'react'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Button from '@mui/material/Button'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
import Menu from '@mui/material/Menu'
|
||||
import MenuItem from '@mui/material/MenuItem'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const yearOptions = [new Date().getFullYear() - 1, new Date().getFullYear() - 2, new Date().getFullYear() - 3]
|
||||
|
||||
const barSeries = [
|
||||
{ name: 'Earning', data: [252, 203, 152, 173, 235, 299, 235, 252, 106] },
|
||||
{ name: 'Expense', data: [-128, -157, -190, -163, -89, -51, -89, -136, -190] }
|
||||
]
|
||||
|
||||
const lineSeries = [
|
||||
{ name: 'Last Month', data: [20, 10, 30, 16, 24, 5, 30, 23, 28, 5, 30] },
|
||||
{ name: 'This Month', data: [50, 40, 60, 46, 54, 35, 70, 53, 58, 35, 60] }
|
||||
]
|
||||
|
||||
const RevenueReport = () => {
|
||||
// States
|
||||
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)
|
||||
|
||||
const handleClick = (event: MouseEvent<HTMLButtonElement>) => {
|
||||
setAnchorEl(event.currentTarget)
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
setAnchorEl(null)
|
||||
}
|
||||
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const disabledText = 'var(--mui-palette-text-disabled)'
|
||||
|
||||
const barOptions: ApexOptions = {
|
||||
chart: {
|
||||
stacked: true,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
stroke: {
|
||||
width: 6,
|
||||
colors: ['var(--mui-palette-background-paper)']
|
||||
},
|
||||
colors: ['var(--mui-palette-primary-main)', 'var(--mui-palette-warning-main)'],
|
||||
legend: {
|
||||
offsetY: -4,
|
||||
offsetX: -35,
|
||||
position: 'top',
|
||||
horizontalAlign: 'left',
|
||||
fontSize: '13px',
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
labels: { colors: 'var(--mui-palette-text-secondary)' },
|
||||
itemMargin: {
|
||||
horizontal: 9
|
||||
},
|
||||
markers: {
|
||||
width: 12,
|
||||
height: 12,
|
||||
radius: 10,
|
||||
offsetY: 1,
|
||||
offsetX: theme.direction === 'rtl' ? 7 : -4
|
||||
}
|
||||
},
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 7,
|
||||
columnWidth: '40%',
|
||||
borderRadiusApplication: 'around',
|
||||
borderRadiusWhenStacked: 'all'
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
borderColor: 'var(--mui-palette-divider)',
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
},
|
||||
padding: {
|
||||
left: -6,
|
||||
right: -11,
|
||||
bottom: -11
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
axisTicks: { show: false },
|
||||
crosshairs: { opacity: 0 },
|
||||
axisBorder: { show: false },
|
||||
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep'],
|
||||
labels: {
|
||||
style: {
|
||||
colors: disabledText,
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: {
|
||||
labels: {
|
||||
offsetX: -14,
|
||||
style: {
|
||||
colors: disabledText,
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
}
|
||||
},
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.xl,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '48%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1380,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '55%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.lg,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { borderRadius: 7 }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.md,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '50%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 680,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '60%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.sm,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '55%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 450,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { borderRadius: 6, columnWidth: '65%' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
const lineOptions: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
stroke: {
|
||||
width: [1, 2],
|
||||
curve: 'smooth',
|
||||
dashArray: [5, 0]
|
||||
},
|
||||
colors: ['var(--mui-palette-divider)', 'var(--mui-palette-primary-main)'],
|
||||
legend: {
|
||||
show: false
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -28,
|
||||
left: -11,
|
||||
right: 0,
|
||||
bottom: -15
|
||||
},
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: {
|
||||
labels: { show: false }
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<Grid container>
|
||||
<Grid size={{ xs: 12, sm: 8 }} className='border-r'>
|
||||
<CardHeader title='Revenue Report' />
|
||||
<CardContent>
|
||||
<AppReactApexCharts type='bar' height={319} width='100%' series={barSeries} options={barOptions} />
|
||||
</CardContent>
|
||||
</Grid>
|
||||
<Grid size={{ xs: 12, sm: 4 }}>
|
||||
<CardContent className='flex flex-col items-center justify-center min-bs-full gap-8'>
|
||||
<Button
|
||||
size='small'
|
||||
variant='tonal'
|
||||
onClick={handleClick}
|
||||
endIcon={<i className='tabler-chevron-down text-xl' />}
|
||||
>
|
||||
{new Date().getFullYear()}
|
||||
</Button>
|
||||
<Menu
|
||||
keepMounted
|
||||
anchorEl={anchorEl}
|
||||
onClose={handleClose}
|
||||
open={Boolean(anchorEl)}
|
||||
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
||||
transformOrigin={{ vertical: 'top', horizontal: 'right' }}
|
||||
>
|
||||
{yearOptions.map((year: number) => (
|
||||
<MenuItem key={year} onClick={handleClose}>
|
||||
{year}
|
||||
</MenuItem>
|
||||
))}
|
||||
</Menu>
|
||||
<div className='flex flex-col items-center'>
|
||||
<Typography variant='h3'>$25,825</Typography>
|
||||
<Typography>
|
||||
<span className='font-medium text-textPrimary'>Budget: </span>56,800
|
||||
</Typography>
|
||||
</div>
|
||||
<AppReactApexCharts type='line' height={80} width='100%' series={lineSeries} options={lineOptions} />
|
||||
<Button variant='contained'>Increase Budget</Button>
|
||||
</CardContent>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default RevenueReport
|
||||
@@ -0,0 +1,88 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const series = [
|
||||
{ name: 'Sales', data: [32, 27, 27, 30, 25, 25] },
|
||||
{ name: 'Visits', data: [25, 35, 20, 20, 20, 20] }
|
||||
]
|
||||
|
||||
const Sales = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const textDisabled = 'var(--mui-palette-text-disabled)'
|
||||
const divider = 'var(--mui-palette-divider)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
colors: ['var(--mui-palette-primary-main)', 'var(--mui-palette-info-main)'],
|
||||
plotOptions: {
|
||||
radar: {
|
||||
polygons: {
|
||||
connectorColors: divider,
|
||||
strokeColors: divider
|
||||
}
|
||||
}
|
||||
},
|
||||
stroke: { width: 0 },
|
||||
fill: {
|
||||
opacity: [1, 0.85]
|
||||
},
|
||||
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'],
|
||||
markers: { size: 0 },
|
||||
legend: {
|
||||
fontSize: '13px',
|
||||
labels: { colors: 'var(--mui-palette-text-secondary)' },
|
||||
markers: { offsetY: -1, offsetX: theme.direction === 'rtl' ? 7 : -4 },
|
||||
itemMargin: { horizontal: 9 }
|
||||
},
|
||||
grid: { show: false },
|
||||
xaxis: {
|
||||
labels: {
|
||||
show: true,
|
||||
style: {
|
||||
fontSize: '13px',
|
||||
colors: [textDisabled, textDisabled, textDisabled, textDisabled, textDisabled, textDisabled]
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: { show: false }
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Sales'
|
||||
subheader='Last 6 Months'
|
||||
action={<OptionMenu options={['Last Month', 'Last 6 months', 'Last Year']} />}
|
||||
/>
|
||||
<CardContent>
|
||||
<AppReactApexCharts type='radar' height={299} width='100%' series={series} options={options} />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default Sales
|
||||
@@ -0,0 +1,215 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import classnames from 'classnames'
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
subtitle: string
|
||||
avatarIcon: string
|
||||
avatarColor?: ThemeColor
|
||||
}
|
||||
|
||||
// Vars
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'New Tickets',
|
||||
subtitle: '142',
|
||||
avatarColor: 'primary',
|
||||
avatarIcon: 'tabler-ticket'
|
||||
},
|
||||
{
|
||||
title: 'Open Tickets',
|
||||
subtitle: '28',
|
||||
avatarColor: 'info',
|
||||
avatarIcon: 'tabler-check'
|
||||
},
|
||||
{
|
||||
title: 'Response Time',
|
||||
subtitle: '1 Day',
|
||||
avatarColor: 'warning',
|
||||
avatarIcon: 'tabler-clock'
|
||||
}
|
||||
]
|
||||
|
||||
const SupportTracker = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const disabledText = 'var(--mui-palette-text-disabled)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
stroke: { dashArray: 10 },
|
||||
labels: ['Completed Task'],
|
||||
colors: ['var(--mui-palette-primary-main)'],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
fill: {
|
||||
type: 'gradient',
|
||||
gradient: {
|
||||
shade: 'dark',
|
||||
opacityTo: 0.5,
|
||||
opacityFrom: 1,
|
||||
shadeIntensity: 0.5,
|
||||
stops: [30, 70, 100],
|
||||
inverseColors: false,
|
||||
gradientToColors: ['var(--mui-palette-primary-main)']
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
radialBar: {
|
||||
endAngle: 130,
|
||||
startAngle: -140,
|
||||
hollow: { size: '60%' },
|
||||
track: { background: 'transparent' },
|
||||
dataLabels: {
|
||||
name: {
|
||||
offsetY: -24,
|
||||
color: disabledText,
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
},
|
||||
value: {
|
||||
offsetY: 8,
|
||||
fontWeight: 500,
|
||||
formatter: value => `${value}%`,
|
||||
color: 'var(--mui-palette-text-primary)',
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.h2.fontSize as string
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -18,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: 14
|
||||
}
|
||||
},
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1380,
|
||||
options: {
|
||||
grid: {
|
||||
padding: {
|
||||
top: 8,
|
||||
left: 12
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1280,
|
||||
options: {
|
||||
chart: {
|
||||
height: 325
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: 12,
|
||||
left: 12
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1201,
|
||||
options: {
|
||||
chart: {
|
||||
height: 362
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1135,
|
||||
options: {
|
||||
chart: {
|
||||
height: 350
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 980,
|
||||
options: {
|
||||
chart: {
|
||||
height: 300
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 900,
|
||||
options: {
|
||||
chart: {
|
||||
height: 350
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Support Tracker'
|
||||
subheader='Last 7 Days'
|
||||
action={<OptionMenu options={['Refresh', 'Edit', 'Share']} />}
|
||||
/>
|
||||
<CardContent className='flex flex-col sm:flex-row items-center justify-between gap-7'>
|
||||
<div className='flex flex-col gap-6 is-full sm:is-[unset]'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography variant='h2'>164</Typography>
|
||||
<Typography>Total Tickets</Typography>
|
||||
</div>
|
||||
<div className='flex flex-col gap-4 is-full'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={34}>
|
||||
<i className={classnames(item.avatarIcon, 'text-[22px]')} />
|
||||
</CustomAvatar>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<AppReactApexCharts type='radialBar' height={350} width='100%' series={[85]} options={options} />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default SupportTracker
|
||||
@@ -0,0 +1,225 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third Party Imports
|
||||
import classnames from 'classnames'
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
amount: number
|
||||
subtitle: string
|
||||
avatarIcon: string
|
||||
avatarColor: ThemeColor
|
||||
amountDiff?: 'positive' | 'negative'
|
||||
}
|
||||
|
||||
// Vars
|
||||
const series = [
|
||||
{ name: 'Earning', data: [15, 10, 20, 8, 12, 18, 12, 5] },
|
||||
{ name: 'Expense', data: [-7, -10, -7, -12, -6, -9, -5, -8] }
|
||||
]
|
||||
|
||||
const data: DataType[] = [
|
||||
{
|
||||
title: 'Total Revenue',
|
||||
subtitle: 'Client Payment',
|
||||
amount: 126,
|
||||
avatarColor: 'primary',
|
||||
avatarIcon: 'tabler-brand-paypal'
|
||||
},
|
||||
{
|
||||
title: 'Total Sales',
|
||||
subtitle: 'Refund',
|
||||
amount: 98,
|
||||
avatarColor: 'secondary',
|
||||
avatarIcon: 'tabler-currency-dollar'
|
||||
}
|
||||
]
|
||||
|
||||
const TotalEarning = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
stacked: true,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
zoom: {
|
||||
enabled: false
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
stroke: {
|
||||
width: 5,
|
||||
colors: ['var(--mui-palette-background-paper)']
|
||||
},
|
||||
colors: ['var(--mui-palette-primary-main)', 'var(--mui-palette-secondary-main)'],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 7,
|
||||
columnWidth: '40%',
|
||||
borderRadiusApplication: 'around',
|
||||
borderRadiusWhenStacked: 'all'
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
borderColor: 'var(--mui-palette-divider)',
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
},
|
||||
padding: {
|
||||
top: -56,
|
||||
left: -13,
|
||||
right: 0,
|
||||
bottom: -15
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
crosshairs: { opacity: 0 },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: {
|
||||
labels: { show: false }
|
||||
},
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.xl,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '50%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1380,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 5,
|
||||
columnWidth: '55%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.lg,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 7,
|
||||
columnWidth: '40%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.md,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '25%', borderRadius: 6 }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 680,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '28%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.sm,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '38%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 450,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '55%' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Total Earning'
|
||||
action={<OptionMenu options={['Refresh', 'Share', 'Update']} />}
|
||||
subheader={
|
||||
<div className='flex items-center gap-2'>
|
||||
<Typography variant='h2'>87%</Typography>
|
||||
<div className='flex items-center gap-1'>
|
||||
<i className='tabler-chevron-up text-xl text-success' />
|
||||
<Typography color='success.main'>25.8%</Typography>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
<CardContent className='flex flex-col gap-4'>
|
||||
<AppReactApexCharts type='bar' height={191} width='100%' series={series} options={options} />
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex items-center gap-4'>
|
||||
<CustomAvatar skin='light' variant='rounded' color={item.avatarColor} size={38}>
|
||||
<i className={classnames(item.avatarIcon, 'text-[22px]')} />
|
||||
</CustomAvatar>
|
||||
<div className='flex justify-between items-center is-full'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography className='font-medium' color='text.primary'>
|
||||
{item.title}
|
||||
</Typography>
|
||||
<Typography variant='body2'>{item.subtitle}</Typography>
|
||||
</div>
|
||||
<Typography
|
||||
className='font-medium'
|
||||
color={`${item.amountDiff === 'negative' ? 'error' : 'success'}.main`}
|
||||
>{`${item.amountDiff === 'negative' ? '-' : '+'}$${item.amount}`}</Typography>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default TotalEarning
|
||||
@@ -0,0 +1,140 @@
|
||||
'use client'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import LinearProgress from '@mui/material/LinearProgress'
|
||||
import Typography from '@mui/material/Typography'
|
||||
|
||||
// Third-party Imports
|
||||
import classnames from 'classnames'
|
||||
|
||||
// Components Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
// Style Imports
|
||||
import tableStyles from '@core/styles/table.module.css'
|
||||
import styles from '@views/apps/logistics/dashboard/styles.module.css'
|
||||
|
||||
type dataTypes = {
|
||||
icon: string
|
||||
heading: string
|
||||
time: string
|
||||
progressColor: string
|
||||
progressColorVariant: string
|
||||
progressData: string
|
||||
widthClass?: string
|
||||
}
|
||||
|
||||
const data: dataTypes[] = [
|
||||
{
|
||||
icon: 'tabler-car',
|
||||
heading: 'On the way',
|
||||
time: '2hr 10min',
|
||||
progressColor: 'action',
|
||||
progressColorVariant: 'hover',
|
||||
progressData: '39.7%',
|
||||
widthClass: 'is-[39.7%]'
|
||||
},
|
||||
{
|
||||
icon: 'tabler-circle-arrow-down',
|
||||
heading: 'Unloading',
|
||||
time: '3hr 15min',
|
||||
progressColor: 'primary',
|
||||
progressColorVariant: 'main',
|
||||
progressData: '28.3%',
|
||||
widthClass: 'is-[28.3%]'
|
||||
},
|
||||
{
|
||||
icon: 'tabler-circle-arrow-up',
|
||||
heading: 'Loading',
|
||||
time: '1hr 24min',
|
||||
progressColor: 'info',
|
||||
progressColorVariant: 'main',
|
||||
progressData: '17.4%',
|
||||
widthClass: 'is-[17.4%]'
|
||||
},
|
||||
{
|
||||
icon: 'tabler-clock',
|
||||
heading: 'Waiting',
|
||||
time: '5hr 19min',
|
||||
progressColor: 'SnackbarContent',
|
||||
progressColorVariant: 'bg',
|
||||
progressData: '14.6%',
|
||||
widthClass: 'is-[14.6%]'
|
||||
}
|
||||
]
|
||||
|
||||
const VehicleOverview = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Vehicle Overview' action={<OptionMenu options={['Refresh', 'Update', 'Share']} />} />
|
||||
<CardContent>
|
||||
<div className='flex flex-col gap-6'>
|
||||
<div className='flex is-full'>
|
||||
{data.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={classnames(item.widthClass, styles.linearRound, 'flex flex-col gap-[38px] relative')}
|
||||
>
|
||||
<Typography className={classnames(styles.header, 'relative max-sm:hidden')}>{item.heading}</Typography>
|
||||
<LinearProgress
|
||||
variant='determinate'
|
||||
value={-1}
|
||||
className={classnames('bs-[46px]')}
|
||||
// eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
sx={{
|
||||
backgroundColor: `var(--mui-palette-${item.progressColor}-${item.progressColorVariant})`,
|
||||
borderRadius: 0
|
||||
}}
|
||||
/>
|
||||
<Typography
|
||||
variant='body2'
|
||||
className='absolute bottom-3 start-2 font-medium'
|
||||
sx={{
|
||||
color: theme =>
|
||||
index === 0
|
||||
? 'var(--mui-palette-text-primary)'
|
||||
: item.progressColor === 'info'
|
||||
? 'var(--mui-palette-common-white)'
|
||||
: // eslint-disable-next-line lines-around-comment
|
||||
// @ts-ignore
|
||||
theme.palette.getContrastText(theme.palette[item.progressColor][item.progressColorVariant])
|
||||
}}
|
||||
>
|
||||
{item.progressData}
|
||||
</Typography>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<div className='overflow-x-auto'>
|
||||
<table className={tableStyles.table}>
|
||||
<tbody>
|
||||
{data.map((item, index) => (
|
||||
<tr key={index}>
|
||||
<td className='flex items-center gap-2 pis-0'>
|
||||
<i className={classnames(item.icon, 'text-textPrimary text-[1.5rem]')}></i>
|
||||
<Typography color='text.primary'>{item.heading}</Typography>
|
||||
</td>
|
||||
<td className='text-end'>
|
||||
<Typography color='text.primary' className='font-medium'>
|
||||
{item.time}
|
||||
</Typography>
|
||||
</td>
|
||||
<td className='text-end pie-0'>
|
||||
<Typography>{item.progressData}</Typography>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default VehicleOverview
|
||||
@@ -0,0 +1,7 @@
|
||||
#carrier-performance .apexcharts-legend .apexcharts-legend-series {
|
||||
border: 1px solid var(--mui-palette-divider);
|
||||
border-radius: var(--mui-shape-borderRadius);
|
||||
block-size: 83%;
|
||||
padding-block: 4px;
|
||||
padding-inline: 16px;
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Chip from '@mui/material/Chip'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
const series = [{ data: [40, 53, 66, 79, 92, 105, 118] }]
|
||||
|
||||
const BarChartDailyTraffic = () => {
|
||||
// Hook
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 5,
|
||||
columnWidth: '28%'
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
colors: ['var(--mui-palette-warning-main)'],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: -10,
|
||||
left: 5,
|
||||
right: 8,
|
||||
bottom: 5
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
categories: ['01', '02', '03', '04', '05', '06', '07'],
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false },
|
||||
tickPlacement: 'on',
|
||||
labels: {
|
||||
style: {
|
||||
colors: 'var(--mui-palette-text-disabled)',
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: { show: false },
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1459,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '35%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1200,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '20%' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardContent>
|
||||
<div className='flex items-start justify-between'>
|
||||
<div className='flex flex-col items-start'>
|
||||
<Typography variant='h4'>2.84k</Typography>
|
||||
<Typography variant='subtitle2' color='text.secondary'>
|
||||
Avg Daily Traffic
|
||||
</Typography>
|
||||
</div>
|
||||
<Chip variant='tonal' color='success' label='+15%' size='small' />
|
||||
</div>
|
||||
<AppReactApexCharts type='bar' height={156} width='100%' series={series} options={options} />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default BarChartDailyTraffic
|
||||
@@ -0,0 +1,136 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Chip from '@mui/material/Chip'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
const series = [{ data: [32, 52, 72, 94, 116, 94, 72] }]
|
||||
|
||||
const BarChartRevenueGrowth = () => {
|
||||
// Hook
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const successColorWithOpacity = 'var(--mui-palette-success-lightOpacity)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 5,
|
||||
distributed: true,
|
||||
columnWidth: '48%'
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
colors: [
|
||||
successColorWithOpacity,
|
||||
successColorWithOpacity,
|
||||
successColorWithOpacity,
|
||||
successColorWithOpacity,
|
||||
'var(--mui-palette-success-main)',
|
||||
successColorWithOpacity,
|
||||
successColorWithOpacity
|
||||
],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: -15,
|
||||
left: 0,
|
||||
right: 0,
|
||||
bottom: -5
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
categories: ['M', 'T', 'W', 'T', 'F', 'S', 'S'],
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false },
|
||||
tickPlacement: 'on',
|
||||
labels: {
|
||||
style: {
|
||||
colors: 'var(--mui-palette-text-disabled)',
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body2.fontSize as string
|
||||
}
|
||||
}
|
||||
},
|
||||
yaxis: { show: false },
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1335,
|
||||
options: {
|
||||
chart: {
|
||||
width: 150
|
||||
},
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '55%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1200,
|
||||
options: {
|
||||
chart: {
|
||||
width: 190
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 410,
|
||||
options: {
|
||||
chart: {
|
||||
width: 150
|
||||
},
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '60%' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardContent className='flex justify-between gap-4'>
|
||||
<div className='flex flex-col justify-between'>
|
||||
<div className='flex flex-col gap-y-2'>
|
||||
<Typography variant='h5'>Revenue Growth</Typography>
|
||||
<Typography>Weekly Report</Typography>
|
||||
</div>
|
||||
<div className='flex flex-col gap-y-2 items-start'>
|
||||
<Typography variant='h3'>$4,673</Typography>
|
||||
<Chip variant='tonal' size='small' color='success' label='+15.2%' />
|
||||
</div>
|
||||
</div>
|
||||
<AppReactApexCharts type='bar' width={190} height={172} series={series} options={options} />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default BarChartRevenueGrowth
|
||||
@@ -0,0 +1,180 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const series = [
|
||||
{
|
||||
name: 'Earning',
|
||||
data: [180, 120, 284, 180, 102]
|
||||
},
|
||||
{
|
||||
name: 'Expense',
|
||||
data: [-100, -130, -105, -85, -125]
|
||||
}
|
||||
]
|
||||
|
||||
const BarChartSessionsWithNegativeValues = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
stacked: true,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -20,
|
||||
left: -5,
|
||||
right: -5,
|
||||
bottom: -15
|
||||
},
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
},
|
||||
xaxis: {
|
||||
lines: { show: false }
|
||||
}
|
||||
},
|
||||
legend: { show: false },
|
||||
stroke: {
|
||||
lineCap: 'round',
|
||||
width: 3,
|
||||
colors: ['var(--mui-palette-background-paper)']
|
||||
},
|
||||
dataLabels: { enabled: false },
|
||||
colors: ['var(--mui-palette-primary-main)', 'var(--mui-palette-success-main)'],
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 5,
|
||||
columnWidth: '46%',
|
||||
borderRadiusApplication: 'around',
|
||||
borderRadiusWhenStacked: 'all'
|
||||
}
|
||||
},
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false },
|
||||
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May']
|
||||
},
|
||||
yaxis: {
|
||||
labels: { show: false }
|
||||
},
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1520,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '55%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1370,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '62%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1298,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '68%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1200,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '28%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 935,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '30%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.sm,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '18%'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 470,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: {
|
||||
columnWidth: '24%'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Sessions' subheader='This Month' className='pbe-0' />
|
||||
<CardContent className='flex flex-col'>
|
||||
<AppReactApexCharts type='bar' height={98} width='100%' options={options} series={series} />
|
||||
<div className='flex items-center justify-between flex-wrap gap-x-4 gap-y-0.5'>
|
||||
<Typography variant='h4' color='text.primary'>
|
||||
45.1k
|
||||
</Typography>
|
||||
<Typography variant='body2' color='success.main'>
|
||||
+12.6%
|
||||
</Typography>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default BarChartSessionsWithNegativeValues
|
||||
@@ -0,0 +1,26 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsWithAreaChartProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Component Imports
|
||||
import CardStatsWithAreaChart from '@components/card-statistics/StatsWithAreaChart'
|
||||
|
||||
const CardStatsLineAreaCharts = ({ data }: { data: CardStatsWithAreaChartProps[] }) => {
|
||||
const renderData = data
|
||||
? data.map((item: CardStatsWithAreaChartProps, index: number) => (
|
||||
<Grid size={{ xs: 12, sm: 6, md: 3 }} key={index}>
|
||||
<CardStatsWithAreaChart {...item} />
|
||||
</Grid>
|
||||
))
|
||||
: null
|
||||
|
||||
return (
|
||||
<Grid container spacing={6}>
|
||||
{renderData}
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
|
||||
export default CardStatsLineAreaCharts
|
||||
@@ -0,0 +1,22 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsCustomerStatsProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Component Imports
|
||||
import CustomerStats from '@components/card-statistics/CustomerStats'
|
||||
|
||||
const CustomerStatisticsCard = ({ customerStatData }: { customerStatData?: CardStatsCustomerStatsProps[] }) => {
|
||||
return (
|
||||
<Grid container spacing={6}>
|
||||
{customerStatData?.map((item, index) => (
|
||||
<Grid size={{ xs: 12, sm: 6, md: 3 }} key={index}>
|
||||
<CustomerStats {...item} />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
|
||||
export default CustomerStatisticsCard
|
||||
@@ -0,0 +1,143 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const series = [{ data: [77, 55, 23, 43, 77, 55, 89] }]
|
||||
|
||||
const DistributedBarChartOrder = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const actionSelectedColor = 'var(--mui-palette-action-selected)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
type: 'bar',
|
||||
stacked: false,
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
sparkline: { enabled: true }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
legend: { show: false },
|
||||
dataLabels: { enabled: false },
|
||||
colors: ['var(--mui-palette-primary-main)'],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
bar: {
|
||||
borderRadius: 3,
|
||||
horizontal: false,
|
||||
columnWidth: '32%',
|
||||
colors: {
|
||||
backgroundBarRadius: 5,
|
||||
backgroundBarColors: [
|
||||
actionSelectedColor,
|
||||
actionSelectedColor,
|
||||
actionSelectedColor,
|
||||
actionSelectedColor,
|
||||
actionSelectedColor
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
left: -3,
|
||||
right: 5,
|
||||
top: 15,
|
||||
bottom: 20
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: { show: false },
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1460,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '48%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1350,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '45%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1300,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '55%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: theme.breakpoints.values.lg,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '20%' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 600,
|
||||
options: {
|
||||
plotOptions: {
|
||||
bar: { columnWidth: '15%' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Order' subheader='Last Week' className='pbe-0' />
|
||||
<CardContent className='flex flex-col'>
|
||||
<AppReactApexCharts type='bar' height={98} width='100%' options={options} series={series} />
|
||||
<div className='flex items-center justify-between flex-wrap gap-x-4 gap-y-0.5'>
|
||||
<Typography variant='h4' color='text.primary'>
|
||||
124k
|
||||
</Typography>
|
||||
<Typography variant='body2' color='success.main'>
|
||||
+12.6%
|
||||
</Typography>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default DistributedBarChartOrder
|
||||
@@ -0,0 +1,114 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
const series = [32, 41, 41, 70]
|
||||
|
||||
const BarChartRevenueGrowth = () => {
|
||||
// Hook
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const textSecondary = 'var(--mui-palette-text-secondary)'
|
||||
const successColor = 'var(--mui-palette-success-main)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
colors: [
|
||||
successColor,
|
||||
'rgba(var(--mui-palette-success-mainChannel) / 0.7)',
|
||||
'rgba(var(--mui-palette-success-mainChannel) / 0.5)',
|
||||
'var(--mui-palette-success-lightOpacity)'
|
||||
],
|
||||
stroke: { width: 0 },
|
||||
legend: { show: false },
|
||||
tooltip: { theme: 'false' },
|
||||
dataLabels: { enabled: false },
|
||||
labels: ['Electronic', 'Sports', 'Decor', 'Fashion'],
|
||||
states: {
|
||||
hover: {
|
||||
filter: { type: 'none' }
|
||||
},
|
||||
active: {
|
||||
filter: { type: 'none' }
|
||||
}
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
top: -22,
|
||||
bottom: -18,
|
||||
right: 15
|
||||
}
|
||||
},
|
||||
plotOptions: {
|
||||
pie: {
|
||||
customScale: 0.8,
|
||||
expandOnClick: false,
|
||||
donut: {
|
||||
size: '73%',
|
||||
labels: {
|
||||
show: true,
|
||||
name: {
|
||||
offsetY: 25,
|
||||
color: textSecondary,
|
||||
fontFamily: theme.typography.fontFamily
|
||||
},
|
||||
value: {
|
||||
offsetY: -15,
|
||||
fontWeight: 500,
|
||||
formatter: val => `${val}`,
|
||||
color: 'var(--mui-palette-text-primary)',
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.h3.fontSize as string
|
||||
},
|
||||
total: {
|
||||
show: true,
|
||||
showAlways: true,
|
||||
label: 'Total',
|
||||
color: successColor,
|
||||
fontFamily: theme.typography.fontFamily,
|
||||
fontSize: theme.typography.body1.fontSize as string
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card className='overflow-visible'>
|
||||
<CardContent className='flex justify-between gap-4'>
|
||||
<div className='flex flex-col justify-between'>
|
||||
<div className='flex flex-col'>
|
||||
<Typography variant='h5'>Generated Leads</Typography>
|
||||
<Typography>Monthly Report</Typography>
|
||||
</div>
|
||||
<div className='flex flex-col items-start'>
|
||||
<Typography variant='h3'>4,350</Typography>
|
||||
<div className='flex items-center gap-1'>
|
||||
<i className='tabler-chevron-up text-success text-xl'></i>
|
||||
<Typography color='success.main' component='span'>
|
||||
+15.8%
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<AppReactApexCharts type='donut' width={165} height={229} series={series} options={options} />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default BarChartRevenueGrowth
|
||||
@@ -0,0 +1,24 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsHorizontalProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Component Imports
|
||||
import CardStatHorizontal from '@/components/card-statistics/Horizontal'
|
||||
|
||||
const Horizontal = ({ data }: { data: CardStatsHorizontalProps[] }) => {
|
||||
if (data) {
|
||||
return (
|
||||
<Grid container spacing={6}>
|
||||
{data.map((item, index) => (
|
||||
<Grid size={{ xs: 12, sm: 6, md: 3 }} key={index}>
|
||||
<CardStatHorizontal {...item} />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Horizontal
|
||||
@@ -0,0 +1,24 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsHorizontalWithAvatarProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Component Imports
|
||||
import CardStatsHorizontalWithAvatar from '@components/card-statistics/HorizontalWithAvatar'
|
||||
|
||||
const HorizontalStatisticsCard = ({ data }: { data?: CardStatsHorizontalWithAvatarProps[] }) => {
|
||||
return (
|
||||
data && (
|
||||
<Grid container spacing={6}>
|
||||
{data.map((item, index) => (
|
||||
<Grid size={{ xs: 12, sm: 6, md: 3 }} key={index}>
|
||||
<CardStatsHorizontalWithAvatar {...item} avatarSkin='light' />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
export default HorizontalStatisticsCard
|
||||
@@ -0,0 +1,95 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
const series = [{ data: [40, 20, 65, 50] }]
|
||||
|
||||
const LineAreaDailySalesChart = () => {
|
||||
// Hook
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
sparkline: { enabled: true }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
stroke: {
|
||||
width: 2,
|
||||
curve: 'smooth'
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
bottom: 20
|
||||
}
|
||||
},
|
||||
fill: {
|
||||
type: 'gradient',
|
||||
gradient: {
|
||||
opacityTo: 0,
|
||||
opacityFrom: 1,
|
||||
shadeIntensity: 1,
|
||||
stops: [0, 100],
|
||||
colorStops: [
|
||||
[
|
||||
{
|
||||
offset: 0,
|
||||
opacity: 0.4,
|
||||
color: theme.palette.success.main
|
||||
},
|
||||
{
|
||||
opacity: 0,
|
||||
offset: 100,
|
||||
color: 'var(--mui-palette-background-paper)'
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
theme: {
|
||||
monochrome: {
|
||||
enabled: true,
|
||||
shadeTo: 'light',
|
||||
shadeIntensity: 1,
|
||||
color: theme.palette.success.main
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: { show: false }
|
||||
}
|
||||
|
||||
return (
|
||||
<Card className='pbe-6'>
|
||||
<CardHeader title='Average Daily Sales' className='pbe-3' />
|
||||
<CardContent>
|
||||
<Typography>Total Sales This Month</Typography>
|
||||
<Typography variant='h4'>$28,450</Typography>
|
||||
</CardContent>
|
||||
<AppReactApexCharts type='area' height={90} width='100%' series={series} options={options} />
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default LineAreaDailySalesChart
|
||||
@@ -0,0 +1,105 @@
|
||||
'use client'
|
||||
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import { useTheme } from '@mui/material/styles'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const series = [{ data: [40, 10, 65, 45] }]
|
||||
|
||||
const LineAreaYearlySalesChart = () => {
|
||||
// Hooks
|
||||
const theme = useTheme()
|
||||
|
||||
// Vars
|
||||
const successColor = theme.palette.success.main
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
sparkline: { enabled: true }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
dataLabels: { enabled: false },
|
||||
stroke: {
|
||||
width: 2,
|
||||
curve: 'smooth'
|
||||
},
|
||||
grid: {
|
||||
show: false,
|
||||
padding: {
|
||||
top: 10,
|
||||
bottom: 20
|
||||
}
|
||||
},
|
||||
fill: {
|
||||
type: 'gradient',
|
||||
gradient: {
|
||||
opacityTo: 0,
|
||||
opacityFrom: 1,
|
||||
shadeIntensity: 1,
|
||||
stops: [0, 100],
|
||||
colorStops: [
|
||||
[
|
||||
{
|
||||
offset: 0,
|
||||
opacity: 0.4,
|
||||
color: successColor
|
||||
},
|
||||
{
|
||||
opacity: 0,
|
||||
offset: 100,
|
||||
color: 'var(--mui-palette-background-paper)'
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
theme: {
|
||||
monochrome: {
|
||||
enabled: true,
|
||||
shadeTo: 'light',
|
||||
shadeIntensity: 1,
|
||||
color: successColor
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: { show: false }
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Sales' subheader='Last Year' className='pbe-0' />
|
||||
<AppReactApexCharts type='area' height={98} width='100%' options={options} series={series} />
|
||||
<CardContent className='flex flex-col pbs-0'>
|
||||
<div className='flex items-center justify-between flex-wrap gap-x-4 gap-y-0.5'>
|
||||
<Typography variant='h4' color='text.primary'>
|
||||
175k
|
||||
</Typography>
|
||||
<Typography variant='body2' color='error.main'>
|
||||
-16.2%
|
||||
</Typography>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default LineAreaYearlySalesChart
|
||||
@@ -0,0 +1,72 @@
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const series = [{ name: 'Income', data: [3350, 3350, 5000, 5000, 2950, 2950, 1500, 1500, 3750, 3750, 5700, 5700] }]
|
||||
|
||||
const LineChartImpression = () => {
|
||||
// Vars
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false },
|
||||
sparkline: { enabled: true }
|
||||
},
|
||||
stroke: {
|
||||
width: 3,
|
||||
curve: 'straight',
|
||||
lineCap: 'round'
|
||||
},
|
||||
colors: ['var(--mui-palette-error-main)'],
|
||||
grid: {
|
||||
padding: {
|
||||
top: 10,
|
||||
bottom: 20,
|
||||
left: 5,
|
||||
right: 5
|
||||
},
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
}
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: {
|
||||
labels: { show: false }
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Impression' subheader='Expenses' className='pbe-0' />
|
||||
<CardContent className='flex flex-col'>
|
||||
<AppReactApexCharts type='line' height={98} width='100%' options={options} series={series} />
|
||||
<div className='flex items-center justify-between flex-wrap gap-x-4 gap-y-0.5'>
|
||||
<Typography variant='h4' color='text.primary'>
|
||||
26.1k
|
||||
</Typography>
|
||||
<Typography variant='body2' color='error.main'>
|
||||
-24.5%
|
||||
</Typography>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default LineChartImpression
|
||||
@@ -0,0 +1,94 @@
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
// Vars
|
||||
const series = [{ data: [0, 19, 7, 27, 15, 40] }]
|
||||
|
||||
const LineChartProfit = () => {
|
||||
// Vars
|
||||
const infoColor = 'var(--mui-palette-info-main)'
|
||||
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
parentHeightOffset: 0,
|
||||
toolbar: { show: false }
|
||||
},
|
||||
tooltip: { enabled: false },
|
||||
grid: {
|
||||
strokeDashArray: 6,
|
||||
borderColor: 'var(--mui-palette-divider)',
|
||||
xaxis: {
|
||||
lines: { show: true }
|
||||
},
|
||||
yaxis: {
|
||||
lines: { show: false }
|
||||
},
|
||||
padding: {
|
||||
top: -10,
|
||||
left: 0,
|
||||
right: 13,
|
||||
bottom: 8
|
||||
}
|
||||
},
|
||||
stroke: {
|
||||
width: 3,
|
||||
lineCap: 'butt',
|
||||
curve: 'straight'
|
||||
},
|
||||
colors: [infoColor],
|
||||
markers: {
|
||||
size: 4,
|
||||
strokeWidth: 3,
|
||||
colors: infoColor,
|
||||
strokeColors: 'transparent',
|
||||
discrete: [
|
||||
{
|
||||
size: 5.5,
|
||||
seriesIndex: 0,
|
||||
strokeColor: infoColor,
|
||||
fillColor: 'var(--mui-palette-background-paper)',
|
||||
dataPointIndex: series[0].data.length - 1
|
||||
}
|
||||
]
|
||||
},
|
||||
xaxis: {
|
||||
labels: { show: false },
|
||||
axisTicks: { show: false },
|
||||
axisBorder: { show: false }
|
||||
},
|
||||
yaxis: {
|
||||
labels: { show: false }
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Profit' subheader='Last Month' className='pbe-0' />
|
||||
<CardContent className='flex flex-col'>
|
||||
<AppReactApexCharts type='line' height={98} width='100%' options={options} series={series} />
|
||||
<div className='flex items-center justify-between flex-wrap gap-x-4 gap-y-0.5'>
|
||||
<Typography variant='h4' color='text.primary'>
|
||||
624k
|
||||
</Typography>
|
||||
<Typography variant='body2' color='success.main'>
|
||||
+8.2%
|
||||
</Typography>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default LineChartProfit
|
||||
@@ -0,0 +1,24 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsHorizontalWithBorderProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Components Imports
|
||||
import HorizontalWithBorder from '@components/card-statistics/HorizontalWithBorder'
|
||||
|
||||
const LogisticsStatisticsCard = ({ data }: { data?: CardStatsHorizontalWithBorderProps[] }) => {
|
||||
return (
|
||||
data && (
|
||||
<Grid container spacing={6}>
|
||||
{data.map((item, index) => (
|
||||
<Grid size={{ xs: 12, sm: 6, md: 3 }} key={index}>
|
||||
<HorizontalWithBorder {...item} />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
export default LogisticsStatisticsCard
|
||||
@@ -0,0 +1,111 @@
|
||||
// Next Imports
|
||||
import dynamic from 'next/dynamic'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
|
||||
// Third-party Imports
|
||||
import type { ApexOptions } from 'apexcharts'
|
||||
|
||||
// Styled Component Imports
|
||||
const AppReactApexCharts = dynamic(() => import('@/libs/styles/AppReactApexCharts'))
|
||||
|
||||
const RadialBarChart = () => {
|
||||
// Vars
|
||||
const options: ApexOptions = {
|
||||
chart: {
|
||||
sparkline: { enabled: true },
|
||||
parentHeightOffset: 0
|
||||
},
|
||||
grid: {
|
||||
padding: {
|
||||
bottom: 20
|
||||
}
|
||||
},
|
||||
stroke: {
|
||||
lineCap: 'round',
|
||||
curve: 'smooth'
|
||||
},
|
||||
colors: ['var(--mui-palette-warning-main)'],
|
||||
plotOptions: {
|
||||
radialBar: {
|
||||
endAngle: 90,
|
||||
startAngle: -90,
|
||||
hollow: { size: '60%' },
|
||||
track: { background: 'var(--mui-palette-divider)', strokeWidth: '40%' },
|
||||
dataLabels: {
|
||||
name: { show: false },
|
||||
value: {
|
||||
offsetY: 0,
|
||||
fontWeight: 500,
|
||||
fontSize: '1.5rem',
|
||||
color: 'var(--mui-palette-text-primary)'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
responsive: [
|
||||
{
|
||||
breakpoint: 1462,
|
||||
options: {
|
||||
chart: {
|
||||
width: 120,
|
||||
height: 130
|
||||
},
|
||||
plotOptions: {
|
||||
radialBar: {
|
||||
dataLabels: {
|
||||
value: {
|
||||
fontSize: '1rem'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1430,
|
||||
options: {
|
||||
chart: {
|
||||
height: 140
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
breakpoint: 1200,
|
||||
options: {
|
||||
chart: {
|
||||
width: 170,
|
||||
height: 189
|
||||
},
|
||||
plotOptions: {
|
||||
radialBar: {
|
||||
dataLabels: {
|
||||
value: {
|
||||
fontSize: '1.5rem'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='82.5k' subheader='Expenses' className='pbe-0' />
|
||||
<CardContent className='flex flex-col items-center'>
|
||||
<AppReactApexCharts type='radialBar' height={168} width='100%' options={options} series={[78]} />
|
||||
<Typography variant='body2' color='text.disabled' className='sm:mbs-2 lg:mbs-0'>
|
||||
$21k Expenses more than last month
|
||||
</Typography>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default RadialBarChart
|
||||
@@ -0,0 +1,74 @@
|
||||
'use client'
|
||||
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import Divider from '@mui/material/Divider'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import MuiLinearProgress from '@mui/material/LinearProgress'
|
||||
import { styled } from '@mui/material/styles'
|
||||
|
||||
// Custom Components Imports
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
const LinearProgress = styled(MuiLinearProgress)(() => ({
|
||||
'&.MuiLinearProgress-colorInfo': { backgroundColor: 'var(--mui-palette-primary-main)' },
|
||||
'& .MuiLinearProgress-bar': {
|
||||
borderTopRightRadius: 0,
|
||||
borderBottomRightRadius: 0
|
||||
}
|
||||
}))
|
||||
|
||||
const SalesOverview = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardContent>
|
||||
<div className='flex items-start justify-between gap-3'>
|
||||
<div>
|
||||
<Typography>Sales Overview</Typography>
|
||||
<Typography variant='h4'>$42.5k</Typography>
|
||||
</div>
|
||||
<Typography color='success.main' className='font-medium'>
|
||||
+18.2%
|
||||
</Typography>
|
||||
</div>
|
||||
<div className='flex items-center justify-between gap-2 mlb-6'>
|
||||
<div className='flex flex-col plb-2.25'>
|
||||
<div className='flex items-center mbe-2.5 gap-x-[6px]'>
|
||||
<CustomAvatar skin='light' color='info' variant='rounded' size={24}>
|
||||
<i className='tabler-shopping-cart text-lg' />
|
||||
</CustomAvatar>
|
||||
<Typography>Order</Typography>
|
||||
</div>
|
||||
<Typography variant='h5'>62.2%</Typography>
|
||||
<Typography variant='body2' color='text.disabled'>
|
||||
6,440
|
||||
</Typography>
|
||||
</div>
|
||||
<Divider flexItem orientation='vertical'>
|
||||
<CustomAvatar skin='light' color='secondary' size={24} className='text-xs text-textDisabled bg-actionHover'>
|
||||
VS
|
||||
</CustomAvatar>
|
||||
</Divider>
|
||||
<div className='flex items-end flex-col plb-2'>
|
||||
<div className='flex items-center mbe-2 gap-x-[6px]'>
|
||||
<Typography color='text.secondary' className='m'>
|
||||
Visits
|
||||
</Typography>
|
||||
<CustomAvatar skin='light' variant='rounded' size={24} color='primary'>
|
||||
<i className='tabler-link text-lg' />
|
||||
</CustomAvatar>
|
||||
</div>
|
||||
<Typography variant='h5'>25.5%</Typography>
|
||||
<Typography variant='body2' color='text.disabled'>
|
||||
12,749
|
||||
</Typography>
|
||||
</div>
|
||||
</div>
|
||||
<LinearProgress value={65} color='info' variant='determinate' className='bs-2.5' />
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default SalesOverview
|
||||
@@ -0,0 +1,24 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsSquareProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Component Imports
|
||||
import CardStatsSquare from '@components/card-statistics/CardStatsSquare'
|
||||
|
||||
const Square = ({ data }: { data: CardStatsSquareProps[] }) => {
|
||||
if (data) {
|
||||
return (
|
||||
<Grid container spacing={6}>
|
||||
{data.map((item, index) => (
|
||||
<Grid size={{ xs: 6 }} key={index}>
|
||||
<CardStatsSquare {...item} />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Square
|
||||
@@ -0,0 +1,78 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Type Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Component Imports
|
||||
import CustomAvatar from '@core/components/mui/Avatar'
|
||||
|
||||
type DataType = {
|
||||
icon: string
|
||||
stats: string
|
||||
title: string
|
||||
color: ThemeColor
|
||||
}
|
||||
|
||||
const data: DataType[] = [
|
||||
{
|
||||
stats: '230k',
|
||||
title: 'Sales',
|
||||
color: 'primary',
|
||||
icon: 'tabler-chart-pie-2'
|
||||
},
|
||||
{
|
||||
color: 'info',
|
||||
stats: '8.549k',
|
||||
title: 'Customers',
|
||||
icon: 'tabler-users'
|
||||
},
|
||||
{
|
||||
color: 'error',
|
||||
stats: '1.423k',
|
||||
title: 'Products',
|
||||
icon: 'tabler-shopping-cart'
|
||||
},
|
||||
{
|
||||
stats: '$9745',
|
||||
color: 'success',
|
||||
title: 'Revenue',
|
||||
icon: 'tabler-currency-dollar'
|
||||
}
|
||||
]
|
||||
|
||||
const StatisticsCard = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader
|
||||
title='Statistics'
|
||||
action={
|
||||
<Typography variant='subtitle2' color='text.disabled'>
|
||||
Updated 1 month ago
|
||||
</Typography>
|
||||
}
|
||||
/>
|
||||
<CardContent className='flex justify-between flex-wrap gap-4'>
|
||||
<Grid container spacing={4} flex={1}>
|
||||
{data.map((item, index) => (
|
||||
<Grid size={{ xs: 6, md: 3 }} key={index} className='flex gap-4 items-center'>
|
||||
<CustomAvatar color={item.color} variant='rounded' size={40} skin='light'>
|
||||
<i className={item.icon}></i>
|
||||
</CustomAvatar>
|
||||
<div>
|
||||
<Typography variant='h5'>{item.stats}</Typography>
|
||||
<Typography variant='body2'>{item.title}</Typography>
|
||||
</div>
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default StatisticsCard
|
||||
@@ -0,0 +1,69 @@
|
||||
// MUI Imports
|
||||
import Card from '@mui/material/Card'
|
||||
import CardHeader from '@mui/material/CardHeader'
|
||||
import CardContent from '@mui/material/CardContent'
|
||||
import Typography from '@mui/material/Typography'
|
||||
import Chip from '@mui/material/Chip'
|
||||
import Progress from '@mui/material/LinearProgress'
|
||||
|
||||
// Types Imports
|
||||
import type { ThemeColor } from '@core/types'
|
||||
|
||||
// Component Imports
|
||||
import OptionMenu from '@core/components/option-menu'
|
||||
|
||||
type DataType = {
|
||||
title: string
|
||||
chipText: string
|
||||
progress: number
|
||||
subtitle: string
|
||||
chipColor?: ThemeColor
|
||||
progressColor?: ThemeColor
|
||||
}
|
||||
|
||||
const data: DataType[] = [
|
||||
{
|
||||
progress: 85,
|
||||
chipText: '+92k',
|
||||
chipColor: 'success',
|
||||
title: 'Subscribers Gained',
|
||||
subtitle: '1.2k new subscriber'
|
||||
},
|
||||
{
|
||||
progress: 65,
|
||||
chipText: '+38k',
|
||||
chipColor: 'success',
|
||||
progressColor: 'info',
|
||||
title: 'Orders Received',
|
||||
subtitle: '2.4k new orders'
|
||||
}
|
||||
]
|
||||
|
||||
const SubscribersOrders = () => {
|
||||
return (
|
||||
<Card>
|
||||
<CardHeader title='Statistics' action={<OptionMenu options={['Refresh', 'Share', 'Update']} />} />
|
||||
<CardContent className='flex flex-col gap-y-6'>
|
||||
{data.map((item, index) => (
|
||||
<div key={index} className='flex flex-col gap-2'>
|
||||
<div className='flex items-center justify-between gap-3'>
|
||||
<Typography variant='h6'>{item.title}</Typography>
|
||||
<Chip variant='tonal' label={item.chipText} size='small' color={item.chipColor} />
|
||||
</div>
|
||||
<div>
|
||||
<div className='flex items-center justify-between gap-3'>
|
||||
<Typography>{item.subtitle}</Typography>
|
||||
<Typography variant='body2' color='text.disabled'>
|
||||
{item.progress}%
|
||||
</Typography>
|
||||
</div>
|
||||
<Progress variant='determinate' value={item.progress} className='bs-2 mbs-1' color={item.progressColor} />
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</CardContent>
|
||||
</Card>
|
||||
)
|
||||
}
|
||||
|
||||
export default SubscribersOrders
|
||||
@@ -0,0 +1,62 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Type Imports
|
||||
import type { UserDataType } from '@components/card-statistics/HorizontalWithSubtitle'
|
||||
|
||||
// Component Imports
|
||||
import HorizontalWithSubtitle from '@components/card-statistics/HorizontalWithSubtitle'
|
||||
|
||||
// Vars
|
||||
const data: UserDataType[] = [
|
||||
{
|
||||
title: 'Session',
|
||||
stats: '21,459',
|
||||
avatarIcon: 'tabler-users',
|
||||
avatarColor: 'primary',
|
||||
trend: 'positive',
|
||||
trendNumber: '29%',
|
||||
subtitle: 'Total User'
|
||||
},
|
||||
{
|
||||
title: 'Paid Users',
|
||||
stats: '4,567',
|
||||
avatarIcon: 'tabler-user-plus',
|
||||
avatarColor: 'error',
|
||||
trend: 'positive',
|
||||
trendNumber: '18%',
|
||||
subtitle: 'Last week analytics'
|
||||
},
|
||||
{
|
||||
title: 'Active Users',
|
||||
stats: '19,860',
|
||||
avatarIcon: 'tabler-user-check',
|
||||
avatarColor: 'success',
|
||||
trend: 'negative',
|
||||
trendNumber: '14%',
|
||||
subtitle: 'Last week analytics'
|
||||
},
|
||||
{
|
||||
title: 'Pending Users',
|
||||
stats: '237',
|
||||
avatarIcon: 'tabler-user-search',
|
||||
avatarColor: 'warning',
|
||||
trend: 'positive',
|
||||
trendNumber: '42%',
|
||||
subtitle: 'Last week analytics'
|
||||
}
|
||||
]
|
||||
|
||||
const UserListCards = () => {
|
||||
return (
|
||||
<Grid container spacing={6}>
|
||||
{data.map((item, i) => (
|
||||
<Grid key={i} size={{ xs: 12, sm: 6, md: 3 }}>
|
||||
<HorizontalWithSubtitle {...item} />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
|
||||
export default UserListCards
|
||||
@@ -0,0 +1,24 @@
|
||||
// MUI Imports
|
||||
import Grid from '@mui/material/Grid2'
|
||||
|
||||
// Types Imports
|
||||
import type { CardStatsVerticalProps } from '@/types/pages/widgetTypes'
|
||||
|
||||
// Component Imports
|
||||
import CardStatVertical from '@/components/card-statistics/Vertical'
|
||||
|
||||
const Vertical = ({ data }: { data: CardStatsVerticalProps[] }) => {
|
||||
if (data) {
|
||||
return (
|
||||
<Grid container spacing={6}>
|
||||
{data.map((item, index) => (
|
||||
<Grid size={{ xs: 6 }} key={index}>
|
||||
<CardStatVertical {...item} />
|
||||
</Grid>
|
||||
))}
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export default Vertical
|
||||
Reference in New Issue
Block a user