|
import PropTypes from 'prop-types' |
|
import { useEffect, useState } from 'react' |
|
import { Link } from 'react-router-dom' |
|
|
|
|
|
import { useTheme } from '@mui/material/styles' |
|
import { Box, Card, Divider, Grid, Typography } from '@mui/material' |
|
import MuiBreadcrumbs from '@mui/material/Breadcrumbs' |
|
|
|
|
|
import config from 'config' |
|
import { gridSpacing } from 'store/constant' |
|
|
|
|
|
import { IconTallymark1 } from '@tabler/icons' |
|
import AccountTreeTwoToneIcon from '@mui/icons-material/AccountTreeTwoTone' |
|
import HomeIcon from '@mui/icons-material/Home' |
|
import HomeTwoToneIcon from '@mui/icons-material/HomeTwoTone' |
|
|
|
const linkSX = { |
|
display: 'flex', |
|
color: 'grey.900', |
|
textDecoration: 'none', |
|
alignContent: 'center', |
|
alignItems: 'center' |
|
} |
|
|
|
|
|
|
|
const Breadcrumbs = ({ card, divider, icon, icons, maxItems, navigation, rightAlign, separator, title, titleBottom, ...others }) => { |
|
const theme = useTheme() |
|
|
|
const iconStyle = { |
|
marginRight: theme.spacing(0.75), |
|
marginTop: `-${theme.spacing(0.25)}`, |
|
width: '1rem', |
|
height: '1rem', |
|
color: theme.palette.secondary.main |
|
} |
|
|
|
const [main, setMain] = useState() |
|
const [item, setItem] = useState() |
|
|
|
|
|
const getCollapse = (menu) => { |
|
if (menu.children) { |
|
menu.children.filter((collapse) => { |
|
if (collapse.type && collapse.type === 'collapse') { |
|
getCollapse(collapse) |
|
} else if (collapse.type && collapse.type === 'item') { |
|
if (document.location.pathname === config.basename + collapse.url) { |
|
setMain(menu) |
|
setItem(collapse) |
|
} |
|
} |
|
return false |
|
}) |
|
} |
|
} |
|
|
|
useEffect(() => { |
|
navigation?.items?.map((menu) => { |
|
if (menu.type && menu.type === 'group') { |
|
getCollapse(menu) |
|
} |
|
return false |
|
}) |
|
}) |
|
|
|
|
|
const SeparatorIcon = separator |
|
const separatorIcon = separator ? <SeparatorIcon stroke={1.5} size='1rem' /> : <IconTallymark1 stroke={1.5} size='1rem' /> |
|
|
|
let mainContent |
|
let itemContent |
|
let breadcrumbContent = <Typography /> |
|
let itemTitle = '' |
|
let CollapseIcon |
|
let ItemIcon |
|
|
|
|
|
if (main && main.type === 'collapse') { |
|
CollapseIcon = main.icon ? main.icon : AccountTreeTwoToneIcon |
|
mainContent = ( |
|
<Typography component={Link} to='#' variant='subtitle1' sx={linkSX}> |
|
{icons && <CollapseIcon style={iconStyle} />} |
|
{main.title} |
|
</Typography> |
|
) |
|
} |
|
|
|
|
|
if (item && item.type === 'item') { |
|
itemTitle = item.title |
|
|
|
ItemIcon = item.icon ? item.icon : AccountTreeTwoToneIcon |
|
itemContent = ( |
|
<Typography |
|
variant='subtitle1' |
|
sx={{ |
|
display: 'flex', |
|
textDecoration: 'none', |
|
alignContent: 'center', |
|
alignItems: 'center', |
|
color: 'grey.500' |
|
}} |
|
> |
|
{icons && <ItemIcon style={iconStyle} />} |
|
{itemTitle} |
|
</Typography> |
|
) |
|
|
|
|
|
if (item.breadcrumbs !== false) { |
|
breadcrumbContent = ( |
|
<Card |
|
sx={{ |
|
border: 'none' |
|
}} |
|
{...others} |
|
> |
|
<Box sx={{ p: 2, pl: card === false ? 0 : 2 }}> |
|
<Grid |
|
container |
|
direction={rightAlign ? 'row' : 'column'} |
|
justifyContent={rightAlign ? 'space-between' : 'flex-start'} |
|
alignItems={rightAlign ? 'center' : 'flex-start'} |
|
spacing={1} |
|
> |
|
{title && !titleBottom && ( |
|
<Grid item> |
|
<Typography variant='h3' sx={{ fontWeight: 500 }}> |
|
{item.title} |
|
</Typography> |
|
</Grid> |
|
)} |
|
<Grid item> |
|
<MuiBreadcrumbs |
|
sx={{ '& .MuiBreadcrumbs-separator': { width: 16, ml: 1.25, mr: 1.25 } }} |
|
aria-label='breadcrumb' |
|
maxItems={maxItems || 8} |
|
separator={separatorIcon} |
|
> |
|
<Typography component={Link} to='/' color='inherit' variant='subtitle1' sx={linkSX}> |
|
{icons && <HomeTwoToneIcon sx={iconStyle} />} |
|
{icon && <HomeIcon sx={{ ...iconStyle, mr: 0 }} />} |
|
{!icon && 'Dashboard'} |
|
</Typography> |
|
{mainContent} |
|
{itemContent} |
|
</MuiBreadcrumbs> |
|
</Grid> |
|
{title && titleBottom && ( |
|
<Grid item> |
|
<Typography variant='h3' sx={{ fontWeight: 500 }}> |
|
{item.title} |
|
</Typography> |
|
</Grid> |
|
)} |
|
</Grid> |
|
</Box> |
|
{card === false && divider !== false && <Divider sx={{ borderColor: theme.palette.primary.main, mb: gridSpacing }} />} |
|
</Card> |
|
) |
|
} |
|
} |
|
|
|
return breadcrumbContent |
|
} |
|
|
|
Breadcrumbs.propTypes = { |
|
card: PropTypes.bool, |
|
divider: PropTypes.bool, |
|
icon: PropTypes.bool, |
|
icons: PropTypes.bool, |
|
maxItems: PropTypes.number, |
|
navigation: PropTypes.object, |
|
rightAlign: PropTypes.bool, |
|
separator: PropTypes.oneOfType([PropTypes.func, PropTypes.object]), |
|
title: PropTypes.bool, |
|
titleBottom: PropTypes.bool |
|
} |
|
|
|
export default Breadcrumbs |
|
|