Files
jobtrackingapp/vendor/saasable-ui-main/admin/vite/src/sections/dashboard/AnalyticsTopRef.jsx
T
2026-03-21 11:55:27 +01:00

252 lines
9.8 KiB
React

import PropTypes from 'prop-types';
import { useState } from 'react';
// @mui
import { useTheme } from '@mui/material/styles';
import Grid from '@mui/material/Grid';
import Stack from '@mui/material/Stack';
import Tab from '@mui/material/Tab';
import Tabs from '@mui/material/Tabs';
import Typography from '@mui/material/Typography';
import Box from '@mui/material/Box';
// @project
import ProgressCard from '@/components/cards/ProgressCard';
import { TabsType } from '@/enum';
import { getRadiusStyles } from '@/utils/getRadiusStyles';
/*************************** TABS - DATA ***************************/
const sevenDaysData = [
{ title: 'Direct', value: '16,890', progress: { value: 45 } },
{ title: 'Google.com', value: '4,909', progress: { value: 56 } },
{ title: 'Remix.com', value: '550', progress: { value: 74 } },
{ title: 'dev.to', value: '140', progress: { value: 25 } },
{ title: 'acpc.api.ic.io', value: '8,675', progress: { value: 45 } },
{ title: 'wewe.uv.us', value: '4,900', progress: { value: 95 } }
];
const monthData = [
{ title: 'Direct', value: '67,560', progress: { value: 75 } },
{ title: 'Google.com', value: '19,636', progress: { value: 45 } },
{ title: 'Remix.com', value: '2,220', progress: { value: 10 } },
{ title: 'dev.to', value: '560', progress: { value: 89 } },
{ title: 'acpc.api.ic.io', value: '34,700', progress: { value: 95 } },
{ title: 'wewe.uv.us', value: '19,600', progress: { value: 74 } }
];
const yearData = [
{ title: 'Direct', value: '8,10,720', progress: { value: 52 } },
{ title: 'Google.com', value: '2,35,632', progress: { value: 45 } },
{ title: 'Remix.com', value: '26,640', progress: { value: 85 } },
{ title: 'dev.to', value: '6,720', progress: { value: 42 } },
{ title: 'acpc.api.ic.io', value: '4,16,400', progress: { value: 55 } },
{ title: 'wewe.uv.us', value: '2,35,200', progress: { value: 45 } }
];
const routesData = [
{ title: 'Home', value: '16,890', progress: { value: 15 } },
{ title: 'Pricing', value: '4,909', progress: { value: 78 } },
{ title: 'Change-log', value: '550', progress: { value: 25 } },
{ title: 'Feature', value: '140', progress: { value: 47 } },
{ title: 'Service', value: '8,675', progress: { value: 20 } },
{ title: 'Pricing', value: '4,900', progress: { value: 74 } }
];
const pageData = [
{ title: 'Home', value: '67,560', progress: { value: 45 } },
{ title: 'Pricing', value: '19,636', progress: { value: 25 } },
{ title: 'Change-log', value: '2,220', progress: { value: 74 } },
{ title: 'Feature', value: '560', progress: { value: 44 } },
{ title: 'Service', value: '34,700', progress: { value: 41 } },
{ title: 'Pricing', value: '19,600', progress: { value: 95 } }
];
const affiliateData = [
{ title: 'No-Refference', value: '16,890', progress: { value: 44 } },
{ title: 'Medium', value: '4,909', progress: { value: 90 } },
{ title: 'remaixblock.com', value: '550', progress: { value: 20 } },
{ title: 'remaix-pge-block-hero', value: '140', progress: { value: 85 } },
{ title: 'remaix-pge-block-banner', value: '8,675', progress: { value: 75 } },
{ title: 'dev.io', value: '4,900', progress: { value: 78 } }
];
const campaignData = [
{ title: 'No-Refference', value: '67,560', progress: { value: 25 } },
{ title: 'Medium', value: '19,636', progress: { value: 74 } },
{ title: 'remaixblock.com', value: '2,220', progress: { value: 65 } },
{ title: 'remaix-pge-block-hero', value: '560', progress: { value: 45 } },
{ title: 'remaix-pge-block-banner', value: '34,700', progress: { value: 85 } },
{ title: 'dev.io', value: '19,600', progress: { value: 47 } }
];
const marketingData = [
{ title: 'No-Refference', value: '8,10,720', progress: { value: 41 } },
{ title: 'Medium', value: '2,35,632', progress: { value: 35 } },
{ title: 'remaixblock.com', value: '26,640', progress: { value: 55 } },
{ title: 'remaix-pge-block-hero', value: '6,720', progress: { value: 75 } },
{ title: 'remaix-pge-block-banner', value: '4,16,400', progress: { value: 100 } },
{ title: 'dev.io', value: '2,35,200', progress: { value: 20 } }
];
/*************************** TABS - A11Y ***************************/
function a11yProps(value) {
return { value: value, id: `simple-tab-${value}`, 'aria-controls': `simple-tabpanel-${value}` };
}
/*************************** TABS - PANEL ***************************/
function TabPanel({ children, value, index, ...other }) {
return (
<div role="tabpanel" hidden={value !== index} id={`simple-tabpanel-${index}`} aria-labelledby={`simple-tab-${index}`} {...other}>
{value === index && <Box sx={{ pt: 1.5 }}>{children}</Box>}
</div>
);
}
/*************************** TABS - CONTENT ***************************/
function TabContent({ data }) {
return (
<Stack sx={{ gap: 1.25 }}>
{data.map((item, index) => (
<ProgressCard key={index} {...item} />
))}
</Stack>
);
}
/*************************** CARDS - BORDER WITH RADIUS ***************************/
export function applyBorderWithRadius(radius, theme) {
return {
overflow: 'hidden',
'--Grid-borderWidth': '1px',
borderTop: 'var(--Grid-borderWidth) solid',
borderLeft: 'var(--Grid-borderWidth) solid',
borderColor: 'divider',
'& > div': {
overflow: 'hidden',
borderRight: 'var(--Grid-borderWidth) solid',
borderBottom: 'var(--Grid-borderWidth) solid',
borderColor: 'divider',
[theme.breakpoints.only('xs')]: {
'&:first-of-type': getRadiusStyles(radius, 'topLeft', 'topRight'),
'&:last-of-type': getRadiusStyles(radius, 'bottomLeft', 'bottomRight')
},
[theme.breakpoints.between('sm', 'md')]: {
'&:nth-of-type(1)': getRadiusStyles(radius, 'topLeft'),
'&:nth-of-type(2)': getRadiusStyles(radius, 'topRight'),
'&:nth-of-type(3)': getRadiusStyles(radius, 'bottomLeft', 'bottomRight')
},
[theme.breakpoints.up('md')]: {
'&:first-of-type': getRadiusStyles(radius, 'topLeft', 'bottomLeft'),
'&:last-of-type': getRadiusStyles(radius, 'topRight', 'bottomRight')
}
}
};
}
/*************************** CARDS - TOP REFERRERS ***************************/
export default function TopReferrers() {
const theme = useTheme();
const [httpReferrers, setHttpReferrers] = useState('days');
const [pages, setPages] = useState('routes');
const [sources, setSources] = useState('affiliate');
// Separate handleChange functions
const handleHTTPReferrers = (_event, newValue) => {
setHttpReferrers(newValue);
};
const handlePages = (_event, newValue) => {
setPages(newValue);
};
const handleSources = (_event, newValue) => {
setSources(newValue);
};
return (
<>
<Grid container sx={{ borderRadius: 4, boxShadow: theme.vars.customShadows.section, ...applyBorderWithRadius(16, theme) }}>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<Stack sx={{ gap: 2.5, p: 3 }}>
<Typography variant="subtitle1">Top HTTP Referrers</Typography>
<Box>
<Tabs
variant="fullWidth"
value={httpReferrers}
onChange={handleHTTPReferrers}
aria-label="basic tabs example"
type={TabsType.SEGMENTED}
>
<Tab label="Last 7 days" {...a11yProps('days')} />
<Tab label="Last Month" {...a11yProps('month')} />
<Tab label="Last Year" {...a11yProps('year')} />
</Tabs>
<TabPanel value={httpReferrers} index="days">
<TabContent data={sevenDaysData} />
</TabPanel>
<TabPanel value={httpReferrers} index="month">
<TabContent data={monthData} />
</TabPanel>
<TabPanel value={httpReferrers} index="year">
<TabContent data={yearData} />
</TabPanel>
</Box>
</Stack>
</Grid>
<Grid size={{ xs: 12, sm: 6, md: 4 }}>
<Stack sx={{ gap: 2.5, p: 3 }}>
<Typography variant="subtitle1">Top Pages</Typography>
<Box>
<Tabs variant="fullWidth" value={pages} onChange={handlePages} aria-label="basic tabs example" type={TabsType.SEGMENTED}>
<Tab label="Routes" {...a11yProps('routes')} />
<Tab label="Pages" {...a11yProps('pages')} />
</Tabs>
<TabPanel value={pages} index="routes">
<TabContent data={routesData} />
</TabPanel>
<TabPanel value={pages} index="pages">
<TabContent data={pageData} />
</TabPanel>
</Box>
</Stack>
</Grid>
<Grid size={{ xs: 12, md: 4 }}>
<Stack sx={{ gap: 2.5, p: 3 }}>
<Typography variant="subtitle1">Top Sources</Typography>
<Box>
<Tabs variant="fullWidth" value={sources} onChange={handleSources} aria-label="basic tabs example" type={TabsType.SEGMENTED}>
<Tab label="Affiliate" {...a11yProps('affiliate')} />
<Tab label="Campaign" {...a11yProps('campaign')} />
<Tab label="Marketing" {...a11yProps('marketing')} />
</Tabs>
<TabPanel value={sources} index="affiliate">
<TabContent data={affiliateData} />
</TabPanel>
<TabPanel value={sources} index="campaign">
<TabContent data={campaignData} />
</TabPanel>
<TabPanel value={sources} index="marketing">
<TabContent data={marketingData} />
</TabPanel>
</Box>
</Stack>
</Grid>
</Grid>
</>
);
}
TabPanel.propTypes = {
children: PropTypes.any,
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
index: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
other: PropTypes.any
};
TabContent.propTypes = { data: PropTypes.array };