@mui/material#Icon JavaScript Examples
The following examples show how to use
@mui/material#Icon.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: SecondarySidebarToggle.jsx From matx-react with MIT License | 6 votes |
SecondarySidebarToggle = () => {
const { settings, updateSettings } = useSettings();
const toggle = () => {
updateSettings({
secondarySidebar: { open: !settings.secondarySidebar.open },
});
};
const { palette } = useTheme();
const textColor = palette.primary.contrastText;
return (
<Toggle className={clsx({ open: settings.secondarySidebar.open })}>
{settings.secondarySidebar.open && (
<IconButton onClick={toggle} size="small" aria-label="toggle">
<Icon sx={{ color: textColor }}>close</Icon>
</IconButton>
)}
{!settings.secondarySidebar.open && (
<Fab color="primary" aria-label="expand" onClick={toggle}>
<Icon sx={{ color: textColor }}>settings</Icon>
</Fab>
)}
</Toggle>
);
}
Example #2
Source File: SimpleTable.jsx From matx-react with MIT License | 6 votes |
SimpleTable = () => {
return (
<Box width="100%" overflow="auto">
<StyledTable>
<TableHead>
<TableRow>
<TableCell align="left">Name</TableCell>
<TableCell align="center">Company</TableCell>
<TableCell align="center">Start Date</TableCell>
<TableCell align="center">Status</TableCell>
<TableCell align="center">Amount</TableCell>
<TableCell align="right">Action</TableCell>
</TableRow>
</TableHead>
<TableBody>
{subscribarList.map((subscriber, index) => (
<TableRow key={index}>
<TableCell align="left">{subscriber.name}</TableCell>
<TableCell align="center">{subscriber.company}</TableCell>
<TableCell align="center">{subscriber.date}</TableCell>
<TableCell align="center">{subscriber.status}</TableCell>
<TableCell align="center">${subscriber.amount}</TableCell>
<TableCell align="right">
<IconButton>
<Icon color="error">close</Icon>
</IconButton>
</TableCell>
</TableRow>
))}
</TableBody>
</StyledTable>
</Box>
);
}
Example #3
Source File: MaxHeightMenu.jsx From matx-react with MIT License | 6 votes |
function MaxHeightMenu() {
const [anchorEl, setAnchorEl] = React.useState(null);
const open = Boolean(anchorEl);
function handleClick(event) {
setAnchorEl(event.currentTarget);
}
function handleClose() {
setAnchorEl(null);
}
return (
<Box>
<IconButton
aria-label="More"
aria-owns={open ? "long-menu" : undefined}
aria-haspopup="true"
onClick={handleClick}
>
<Icon>more_vert</Icon>
</IconButton>
<Menu
open={open}
id="long-menu"
anchorEl={anchorEl}
onClose={handleClose}
PaperProps={{ style: { maxHeight: ITEM_HEIGHT * 4.5, width: 200 } }}
>
{options.map((option) => (
<MenuItem key={option} selected={option === "Pyxis"} onClick={handleClose}>
{option}
</MenuItem>
))}
</Menu>
</Box>
);
}
Example #4
Source File: AppIcon.jsx From matx-react with MIT License | 6 votes |
AppIcon = () => {
return (
<Container>
<Box className="breadcrumb">
<Breadcrumb routeSegments={[{ name: "Material", path: "/material" }, { name: "Icons" }]} />
</Box>
<SimpleCard title="icons">
<Box display="flex" flexWrap="wrap" gap={3}>
{IconList.map((icon, key) => (
<Tooltip title={icon} key={key}>
<Icon fontSize="large">{icon}</Icon>
</Tooltip>
))}
</Box>
</SimpleCard>
</Container>
);
}
Example #5
Source File: StatCards.jsx From matx-react with MIT License | 6 votes |
StatCards = () => {
const cardList = [
{ name: 'New Leads', amount: 3050, icon: 'group' },
{ name: 'This week Sales', amount: '$80,500', icon: 'attach_money' },
{ name: 'Inventory Status', amount: '8.5% Stock Surplus', icon: 'store' },
{ name: 'Orders to deliver', amount: '305 Orders', icon: 'shopping_cart' },
];
return (
<Grid container spacing={3} sx={{ mb: '24px' }}>
{cardList.map((item, index) => (
<Grid item xs={12} md={6} key={index}>
<StyledCard elevation={6}>
<ContentBox>
<Icon className="icon">{item.icon}</Icon>
<Box ml="12px">
<Small>{item.name}</Small>
<Heading>{item.amount}</Heading>
</Box>
</ContentBox>
<Tooltip title="View Details" placement="top">
<IconButton>
<Icon>arrow_right_alt</Icon>
</IconButton>
</Tooltip>
</StyledCard>
</Grid>
))}
</Grid>
);
}
Example #6
Source File: SecondarySidebarContent.jsx From matx-react with MIT License | 6 votes |
SecondarySidebarContent = () => {
const { palette } = useTheme();
const textColor = palette.primary.contrastText;
return (
<SidebarRoot width={'50px'} className="secondary-sidebar">
<Span sx={{ m: 'auto' }}></Span>
<MatxCustomizer />
<ShoppingCart />
<ChatHead
icon={
<IconButton sx={{ my: '12px', color: textColor }} size="small">
<Icon>comments</Icon>
</IconButton>
}
>
<Chatbox />
</ChatHead>
<Span sx={{ m: 'auto' }}></Span>
</SidebarRoot>
);
}
Example #7
Source File: MatxSearchBox.jsx From matx-react with MIT License | 6 votes |
MatxSearchBox = () => {
const [open, setOpen] = useState(false);
const toggle = () => {
setOpen(!open);
};
const { palette } = useTheme();
const textColor = palette.text.primary;
return (
<React.Fragment>
{!open && (
<IconButton onClick={toggle}>
<Icon sx={{ color: textColor }}>search</Icon>
</IconButton>
)}
{open && (
<SearchContainer>
<SearchInput type="text" placeholder="Search here..." autoFocus />
<IconButton onClick={toggle} sx={{ mx: 2, verticalAlign: 'middle' }}>
<Icon sx={{ color: textColor }}>close</Icon>
</IconButton>
</SearchContainer>
)}
</React.Fragment>
);
}
Example #8
Source File: Breadcrumb.jsx From matx-react with MIT License | 6 votes |
Breadcrumb = ({ routeSegments }) => {
const theme = useTheme();
const hint = theme.palette.text.hint;
return (
<BreadcrumbRoot>
{routeSegments ? (
<Hidden xsDown>
<BreadcrumbName>{routeSegments[routeSegments.length - 1]['name']}</BreadcrumbName>
<Separator>|</Separator>
</Hidden>
) : null}
<Breadcrumbs
separator={<Icon sx={{ color: hint }}>navigate_next</Icon>}
sx={{ display: 'flex', alignItems: 'center', position: 'relative' }}
>
<NavLink to="/">
<StyledIcon color="primary">home</StyledIcon>
</NavLink>
{routeSegments
? routeSegments.map((route, index) => {
return index !== routeSegments.length - 1 ? (
<NavLink key={index} to={route.path}>
<SubName>{route.name}</SubName>
</NavLink>
) : (
<SubName key={index}>{route.name}</SubName>
);
})
: null}
</Breadcrumbs>
</BreadcrumbRoot>
);
}
Example #9
Source File: Breadcrumb.jsx From matx-react with MIT License | 5 votes |
StyledIcon = styled(Icon)(() => ({
marginLeft: 8,
marginBottom: '4px',
verticalAlign: 'middle',
}))
Example #10
Source File: MatxVerticalNavExpansionPanel.jsx From matx-react with MIT License | 5 votes |
MatxVerticalNavExpansionPanel = ({ item, children, mode }) => {
const [collapsed, setCollapsed] = useState(true);
const elementRef = useRef(null);
const componentHeight = useRef(0);
const { pathname } = useLocation();
const { name, icon, iconText, badge } = item;
const handleClick = () => {
componentHeight.current = 0;
calcaulateHeight(elementRef.current);
setCollapsed(!collapsed);
};
const calcaulateHeight = useCallback((node) => {
if (node.name !== 'child') {
for (let child of node.children) {
calcaulateHeight(child);
}
}
if (node.name === 'child') componentHeight.current += node.scrollHeight;
else componentHeight.current += 44; //here 44 is node height
return;
}, []);
useEffect(() => {
if (!elementRef) return;
calcaulateHeight(elementRef.current);
// OPEN DROPDOWN IF CHILD IS ACTIVE
for (let child of elementRef.current.children) {
if (child.getAttribute('href') === pathname) {
setCollapsed(false);
}
}
}, [pathname, calcaulateHeight]);
return (
<NavExpandRoot>
<BaseButton
className={clsx({
'has-submenu compactNavItem': true,
compactNavItem: mode === 'compact',
open: !collapsed,
})}
onClick={handleClick}
>
<Box display="flex" alignItems="center">
{icon && <Icon className="icon">{icon}</Icon>}
{iconText && <BulletIcon />}
<ItemText className="sidenavHoverShow">{name}</ItemText>
</Box>
{badge && <BadgeValue className="sidenavHoverShow itemIcon">{badge.value}</BadgeValue>}
<div
className={clsx({
sidenavHoverShow: true,
collapseIcon: collapsed,
expandIcon: !collapsed,
})}
>
<Icon fontSize="small" sx={{ verticalAlign: 'middle' }}>
chevron_right
</Icon>
</div>
</BaseButton>
<div
ref={elementRef}
className="expansion-panel submenu"
style={collapsed ? { maxHeight: '0px' } : { maxHeight: componentHeight.current + 'px' }}
>
{children}
</div>
</NavExpandRoot>
);
}
Example #11
Source File: PaginationTable.jsx From matx-react with MIT License | 5 votes |
PaginationTable = () => {
const [page, setPage] = useState(0);
const [rowsPerPage, setRowsPerPage] = useState(5);
const handleChangePage = (_, newPage) => {
setPage(newPage);
};
const handleChangeRowsPerPage = (event) => {
setRowsPerPage(+event.target.value);
setPage(0);
};
return (
<Box width="100%" overflow="auto">
<StyledTable>
<TableHead>
<TableRow>
<TableCell align="left">Name</TableCell>
<TableCell align="center">Company</TableCell>
<TableCell align="center">Start Date</TableCell>
<TableCell align="center">Status</TableCell>
<TableCell align="center">Amount</TableCell>
<TableCell align="right">Action</TableCell>
</TableRow>
</TableHead>
<TableBody>
{subscribarList
.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
.map((subscriber, index) => (
<TableRow key={index}>
<TableCell align="left">{subscriber.name}</TableCell>
<TableCell align="center">{subscriber.company}</TableCell>
<TableCell align="center">{subscriber.date}</TableCell>
<TableCell align="center">{subscriber.status}</TableCell>
<TableCell align="center">${subscriber.amount}</TableCell>
<TableCell align="right">
<IconButton>
<Icon color="error">close</Icon>
</IconButton>
</TableCell>
</TableRow>
))}
</TableBody>
</StyledTable>
<TablePagination
sx={{ px: 2 }}
page={page}
component="div"
rowsPerPage={rowsPerPage}
count={subscribarList.length}
onPageChange={handleChangePage}
rowsPerPageOptions={[5, 10, 25]}
onRowsPerPageChange={handleChangeRowsPerPage}
nextIconButtonProps={{ "aria-label": "Next Page" }}
backIconButtonProps={{ "aria-label": "Previous Page" }}
/>
</Box>
);
}
Example #12
Source File: RowCards.jsx From matx-react with MIT License | 5 votes |
RowCards = () => {
const { palette } = useTheme();
const textMuted = palette.text.secondary;
return [1, 2, 3, 4].map((id) => (
<Fragment key={id}>
<Card sx={{ py: 1, px: 2 }} className="project-card">
<Grid container alignItems="center">
<Grid item md={5} xs={7}>
<Box display="flex" alignItems="center">
<Checkbox />
<Hidden smDown>
{id % 2 === 1 ? (
<StarOutline size="small">
<Icon>star_outline</Icon>
</StarOutline>
) : (
<DateRange size="small">
<Icon>date_range</Icon>
</DateRange>
)}
</Hidden>
<ProjectName>Project {id}</ProjectName>
</Box>
</Grid>
<Grid item md={3} xs={4}>
<Box color={textMuted}>{format(new Date().getTime(), 'MM/dd/yyyy hh:mma')}</Box>
</Grid>
<Hidden smDown>
<Grid item xs={3}>
<Box display="flex" position="relative" marginLeft="-0.875rem !important">
<StyledAvatar src="/assets/images/face-4.jpg" />
<StyledAvatar src="/assets/images/face-4.jpg" />
<StyledAvatar src="/assets/images/face-4.jpg" />
<StyledAvatar sx={{ fontSize: '14px' }}>+3</StyledAvatar>
</Box>
</Grid>
</Hidden>
<Grid item xs={1}>
<Box display="flex" justifyContent="flex-end">
<IconButton>
<Icon>more_vert</Icon>
</IconButton>
</Box>
</Grid>
</Grid>
</Card>
<Box py={1} />
</Fragment>
));
}
Example #13
Source File: StatCards2.jsx From matx-react with MIT License | 5 votes |
StatCards2 = () => {
const { palette } = useTheme();
const textError = palette.error.main;
const bgError = lighten(palette.error.main, 0.85);
return (
<Grid container spacing={3} sx={{ mb: 3 }}>
<Grid item xs={12} md={6}>
<Card elevation={3} sx={{ p: 2 }}>
<ContentBox>
<FabIcon size="medium" sx={{ background: 'rgba(9, 182, 109, 0.15)' }}>
<Icon sx={{ color: '#08ad6c' }}>trending_up</Icon>
</FabIcon>
<H3 textcolor={'#08ad6c'}>Active Users</H3>
</ContentBox>
<ContentBox sx={{ pt: 2 }}>
<H1>10.8k</H1>
<IconBox sx={{ background: 'rgba(9, 182, 109, 0.15)' }}>
<Icon className="icon">expand_less</Icon>
</IconBox>
<Span textcolor={'#08ad6c'}>(+21%)</Span>
</ContentBox>
</Card>
</Grid>
<Grid item xs={12} md={6}>
<Card elevation={3} sx={{ p: 2 }}>
<ContentBox>
<FabIcon size="medium" sx={{ background: bgError, overflow: 'hidden' }}>
<Icon sx={{ color: textError }}>star_outline</Icon>
</FabIcon>
<H3 textcolor={textError}>Transactions</H3>
</ContentBox>
<ContentBox sx={{ pt: 2 }}>
<H1>$2.8M</H1>
<IconBox sx={{ background: bgError }}>
<Icon className="icon">expand_less</Icon>
</IconBox>
<Span textcolor={textError}>(+21%)</Span>
</ContentBox>
</Card>
</Grid>
</Grid>
);
}
Example #14
Source File: TopSellingTable.jsx From matx-react with MIT License | 5 votes |
TopSellingTable = () => {
const { palette } = useTheme();
const bgError = palette.error.main;
const bgPrimary = palette.primary.main;
const bgSecondary = palette.secondary.main;
return (
<Card elevation={3} sx={{ pt: '20px', mb: 3 }}>
<CardHeader>
<Title>top selling products</Title>
<Select size="small" defaultValue="this_month">
<MenuItem value="this_month">This Month</MenuItem>
<MenuItem value="last_month">Last Month</MenuItem>
</Select>
</CardHeader>
<Box overflow="auto">
<ProductTable>
<TableHead>
<TableRow>
<TableCell sx={{ px: 3 }} colSpan={4}>
Name
</TableCell>
<TableCell sx={{ px: 0 }} colSpan={2}>
Revenue
</TableCell>
<TableCell sx={{ px: 0 }} colSpan={2}>
Stock Status
</TableCell>
<TableCell sx={{ px: 0 }} colSpan={1}>
Action
</TableCell>
</TableRow>
</TableHead>
<TableBody>
{productList.map((product, index) => (
<TableRow key={index} hover>
<TableCell colSpan={4} align="left" sx={{ px: 0, textTransform: 'capitalize' }}>
<Box display="flex" alignItems="center">
<Avatar src={product.imgUrl} />
<Paragraph sx={{ m: 0, ml: 4 }}>{product.name}</Paragraph>
</Box>
</TableCell>
<TableCell align="left" colSpan={2} sx={{ px: 0, textTransform: 'capitalize' }}>
${product.price > 999 ? (product.price / 1000).toFixed(1) + 'k' : product.price}
</TableCell>
<TableCell sx={{ px: 0 }} align="left" colSpan={2}>
{product.available ? (
product.available < 20 ? (
<Small bgcolor={bgSecondary}>{product.available} available</Small>
) : (
<Small bgcolor={bgPrimary}>in stock</Small>
)
) : (
<Small bgcolor={bgError}>out of stock</Small>
)}
</TableCell>
<TableCell sx={{ px: 0 }} colSpan={1}>
<IconButton>
<Icon color="primary">edit</Icon>
</IconButton>
</TableCell>
</TableRow>
))}
</TableBody>
</ProductTable>
</Box>
</Card>
);
}
Example #15
Source File: Layout1Customizer.jsx From matx-react with MIT License | 4 votes |
Layout1Customizer = ({ settings, handleChange, handleControlChange }) => {
return (
<Fragment>
<Box mb="16px" mx="12px">
<ThemeName>Sidebar theme</ThemeName>
<ToolbarContainer>
{mainSidebarThemes.map((color, i) => (
<Tooltip key={i} title={color} placement="top">
<ToolbarContent
color={color}
onClick={() => handleChange('layout1Settings.leftSidebar.theme', color)}
>
{settings.layout1Settings.leftSidebar.theme === color && <Icon>done</Icon>}
<div className={settings.themes[color].palette.type}></div>
</ToolbarContent>
</Tooltip>
))}
</ToolbarContainer>
</Box>
<Box mb="32px" mx="12px">
<ThemeName>Sidebar theme</ThemeName>
<ToolbarContainer>
{topbarThemes.map((color, i) => (
<Tooltip key={i} title={color} placement="top">
<ToolbarContent
color={color}
onClick={() => handleChange('layout1Settings.topbar.theme', color)}
>
{settings.layout1Settings.topbar.theme === color && <Icon>done</Icon>}
<div className={settings.themes[color].palette.type}></div>
</ToolbarContent>
</Tooltip>
))}
</ToolbarContainer>
</Box>
<Box mb="18px" mx="12px">
<FormControl component="fieldset">
<FormLabel component="legend">Sidebar mode</FormLabel>
<RadioGroup
aria-label="Sidebar"
name="leftSidebar"
value={settings.layout1Settings.leftSidebar.mode}
onChange={handleControlChange('layout1Settings.leftSidebar.mode')}
>
<FormControlLabel value="full" control={<Radio />} label="Full" />
<FormControlLabel value="close" control={<Radio />} label="Close" />
<FormControlLabel value="compact" control={<Radio />} label="Compact" />
</RadioGroup>
</FormControl>
</Box>
<Box mb="32px" mx="12px">
<ThemeName sx={{ mb: 4 }}>Sidebar background image</ThemeName>
<div>
<Grid container spacing={3}>
{sidebarBG.map((bg, i) => (
<Grid item xs={4} key={i}>
<BadgeSelected
color="primary"
badgeContent={<Icon>done</Icon>}
invisible={settings.layout1Settings.leftSidebar.bgImgURL !== bg}
sx={{ width: '100%', height: '100%', cursor: 'pointer' }}
>
<Paper onClick={() => handleChange('layout1Settings.leftSidebar.bgImgURL', bg)}>
<IMG src={bg} alt="" />
</Paper>
</BadgeSelected>
</Grid>
))}
</Grid>
</div>
</Box>
<Box mb="24px" mx="12px">
<FormControl component="fieldset">
<FormLabel component="legend">Topbar</FormLabel>
<FormGroup>
<FormControlLabel
control={
<Switch
checked={get(settings.layout1Settings.topbar, 'show')}
onChange={handleControlChange('layout1Settings.topbar.show')}
/>
}
label="Show"
/>
<FormControlLabel
control={
<Switch
checked={get(settings.layout1Settings.topbar, 'fixed')}
onChange={handleControlChange('layout1Settings.topbar.fixed')}
/>
}
label="Fixed"
/>
</FormGroup>
</FormControl>
</Box>
</Fragment>
);
}
Example #16
Source File: Chatbox.jsx From matx-react with MIT License | 4 votes |
Chatbox = ({ togglePopup }) => {
const [isAlive, setIsAlive] = useState(true);
const [message, setMessage] = useState('');
const [messageList, setMessageList] = useState([]);
const currentUserId = '7863a6802ez0e277a0f98534';
const chatBottomRef = document.querySelector('#chat-scroll');
const sendMessageOnEnter = (event) => {
if (event.key === 'Enter' && !event.shiftKey) {
let tempMessage = message.trim();
if (tempMessage !== '') {
let tempList = [...messageList];
let messageObject = {
text: tempMessage,
contactId: currentUserId,
};
tempList.push(messageObject);
globalMessageList.push(messageObject);
if (isAlive) setMessageList(tempList);
dummyReply();
}
setMessage('');
}
};
const dummyReply = async () => {
setTimeout(() => {
let tempList = [...messageList];
let messageObject = {
text: 'Good to hear from you. enjoy!!!',
contactId: 'opponents contact id',
avatar: '/assets/images/faces/13.jpg',
name: 'Frank Powell',
};
tempList.push(messageObject);
globalMessageList.push(messageObject);
if (isAlive) setMessageList(globalMessageList);
}, 2000);
};
const scrollToBottom = useCallback(() => {
if (chatBottomRef) {
chatBottomRef.scrollTo({
top: chatBottomRef.scrollHeight,
behavior: 'smooth',
});
}
}, [chatBottomRef]);
useEffect(() => {
if (isAlive) {
setMessageList([
{
contactId: '323sa680b3249760ea21rt47',
text: 'Do you ever find yourself falling into the “discount trap?”',
time: '2018-02-10T08:45:28.291Z',
id: '323sa680b3249760ea21rt47',
name: 'Frank Powell',
avatar: '/assets/images/faces/13.jpg',
status: 'online',
mood: '',
},
{
contactId: '7863a6802ez0e277a0f98534',
text: 'Giving away your knowledge or product just to gain clients?',
time: '2018-02-10T08:45:28.291Z',
id: '7863a6802ez0e277a0f98534',
name: 'John Doe',
avatar: '/assets/images/face-1.jpg',
status: 'online',
mood: '',
},
{
contactId: '323sa680b3249760ea21rt47',
text: 'Yes',
time: '2018-02-10T08:45:28.291Z',
id: '323sa680b3249760ea21rt47',
name: 'Frank Powell',
avatar: '/assets/images/faces/13.jpg',
status: 'online',
mood: '',
},
{
contactId: '7863a6802ez0e277a0f98534',
text: 'Don’t feel bad. It happens to a lot of us',
time: '2018-02-10T08:45:28.291Z',
id: '7863a6802ez0e277a0f98534',
name: 'John Doe',
avatar: '/assets/images/face-1.jpg',
status: 'online',
mood: '',
},
{
contactId: '323sa680b3249760ea21rt47',
text: 'Do you ever find yourself falling into the “discount trap?”',
time: '2018-02-10T08:45:28.291Z',
id: '323sa680b3249760ea21rt47',
name: 'Frank Powell',
avatar: '/assets/images/faces/13.jpg',
status: 'online',
mood: '',
},
{
contactId: '7863a6802ez0e277a0f98534',
text: 'Giving away your knowledge or product just to gain clients?',
time: '2018-02-10T08:45:28.291Z',
id: '7863a6802ez0e277a0f98534',
name: 'John Doe',
avatar: '/assets/images/face-1.jpg',
status: 'online',
mood: '',
},
{
contactId: '323sa680b3249760ea21rt47',
text: 'Yes',
time: '2018-02-10T08:45:28.291Z',
id: '323sa680b3249760ea21rt47',
name: 'Frank Powell',
avatar: '/assets/images/faces/13.jpg',
status: 'online',
mood: '',
},
{
contactId: '7863a6802ez0e277a0f98534',
text: 'Don’t feel bad. It happens to a lot of us',
time: '2018-02-10T08:45:28.291Z',
id: '7863a6802ez0e277a0f98534',
name: 'John Doe',
avatar: '/assets/images/face-1.jpg',
status: 'online',
mood: '',
},
]);
}
// getChatRoomByContactId(currentUserId, "323sa680b3249760ea21rt47").then(
// ({ data }) => {
// if (isAlive) {
// setMessageList(data?.messageList);
// }
// }
// );
}, [isAlive]);
useEffect(() => {
scrollToBottom();
return () => setIsAlive(false);
}, [messageList, scrollToBottom]);
const { palette } = useTheme();
const primary = palette.primary.main;
const textPrimary = palette.text.primary;
return (
<ChatContainer>
<ProfileBox>
<Box display="flex" alignItems="center">
<ChatAvatar src="/assets/images/face-2.jpg" status="online" />
<ChatStatus>
<H5>Ryan Todd</H5>
<Span>Active</Span>
</ChatStatus>
</Box>
<IconButton onClick={togglePopup}>
<Icon fontSize="small">clear</Icon>
</IconButton>
</ProfileBox>
<StyledScrollBar id="chat-scroll">
{messageList.map((item, ind) => (
<Box
key={ind}
p="20px"
display="flex"
sx={{
justifyContent: currentUserId === item.contactId && 'flex-end',
}}
>
{currentUserId !== item.contactId && <Avatar src={item.avatar} />}
<Box ml="12px">
{currentUserId !== item.contactId && (
<H5
sx={{
mb: '4px',
fontSize: '14px',
color: primary,
}}
>
{item.name}
</H5>
)}
<ChatMessage>{item.text}</ChatMessage>
<MessageTime>1 minute ago</MessageTime>
</Box>
</Box>
))}
{/* example of image sent by current user*/}
<ChatImgContainer>
<Box ml="12px">
<ChatImgBox>
<ChatImg alt="laptop" src="/assets/images/laptop-1.png" />
<Box ml="12px">
<H6 sx={{ mt: 0, mb: '4px' }}>Asus K555LA.png</H6>
<ChatImgSize>21.5KB</ChatImgSize>
</Box>
</ChatImgBox>
<MessageTime>1 minute ago</MessageTime>
</Box>
</ChatImgContainer>
</StyledScrollBar>
<div>
<Divider
sx={{
background: `rgba(${convertHexToRGB(textPrimary)}, 0.15)`,
}}
/>
<TextField
placeholder="Type here ..."
multiline
rowsMax={4}
fullWidth
sx={{ '& textarea': { color: primary } }}
InputProps={{
endAdornment: (
<Box display="flex">
<IconButton size="small">
<Icon>tag_faces</Icon>
</IconButton>
<IconButton size="small">
<Icon>attachment</Icon>
</IconButton>
</Box>
),
classes: { root: 'pl-5 pr-3 py-3 text-body' },
}}
value={message}
onChange={(e) => setMessage(e.target.value)}
onKeyUp={sendMessageOnEnter}
/>
</div>
</ChatContainer>
);
}
Example #17
Source File: SimpleForm.jsx From matx-react with MIT License | 4 votes |
SimpleForm = () => {
const [state, setState] = useState({ date: new Date() });
useEffect(() => {
ValidatorForm.addValidationRule("isPasswordMatch", (value) => {
if (value !== state.password) return false;
return true;
});
return () => ValidatorForm.removeValidationRule("isPasswordMatch");
}, [state.password]);
const handleSubmit = (event) => {
// console.log("submitted");
// console.log(event);
};
const handleChange = (event) => {
event.persist();
setState({ ...state, [event.target.name]: event.target.value });
};
const handleDateChange = (date) => setState({ ...state, date });
const {
username,
firstName,
creditCard,
mobile,
password,
confirmPassword,
gender,
date,
email,
} = state;
return (
<div>
<ValidatorForm onSubmit={handleSubmit} onError={() => null}>
<Grid container spacing={6}>
<Grid item lg={6} md={6} sm={12} xs={12} sx={{ mt: 2 }}>
<TextField
type="text"
name="username"
id="standard-basic"
value={username || ""}
onChange={handleChange}
errorMessages={["this field is required"]}
label="Username (Min length 4, Max length 9)"
validators={["required", "minStringLength: 4", "maxStringLength: 9"]}
/>
<TextField
type="text"
name="firstName"
label="First Name"
onChange={handleChange}
value={firstName || ""}
validators={["required"]}
errorMessages={["this field is required"]}
/>
<TextField
type="email"
name="email"
label="Email"
value={email || ""}
onChange={handleChange}
validators={["required", "isEmail"]}
errorMessages={["this field is required", "email is not valid"]}
/>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DatePicker
value={date}
onChange={handleDateChange}
renderInput={(props) => (
<TextField
{...props}
label="Date picker"
id="mui-pickers-date"
sx={{ mb: 2, width: "100%" }}
/>
)}
/>
</LocalizationProvider>
<TextField
sx={{ mb: 4 }}
type="number"
name="creditCard"
label="Credit Card"
onChange={handleChange}
value={creditCard || ""}
errorMessages={["this field is required"]}
validators={["required", "minStringLength:16", "maxStringLength: 16"]}
/>
</Grid>
<Grid item lg={6} md={6} sm={12} xs={12} sx={{ mt: 2 }}>
<TextField
type="text"
name="mobile"
value={mobile || ""}
label="Mobile Nubmer"
onChange={handleChange}
validators={["required"]}
errorMessages={["this field is required"]}
/>
<TextField
name="password"
type="password"
label="Password"
value={password || ""}
onChange={handleChange}
validators={["required"]}
errorMessages={["this field is required"]}
/>
<TextField
type="password"
name="confirmPassword"
onChange={handleChange}
label="Confirm Password"
value={confirmPassword || ""}
validators={["required", "isPasswordMatch"]}
errorMessages={["this field is required", "password didn't match"]}
/>
<RadioGroup
row
name="gender"
sx={{ mb: 2 }}
value={gender || ""}
onChange={handleChange}
>
<FormControlLabel
value="Male"
label="Male"
labelPlacement="end"
control={<Radio color="secondary" />}
/>
<FormControlLabel
value="Female"
label="Female"
labelPlacement="end"
control={<Radio color="secondary" />}
/>
<FormControlLabel
value="Others"
label="Others"
labelPlacement="end"
control={<Radio color="secondary" />}
/>
</RadioGroup>
<FormControlLabel
control={<Checkbox />}
label="I have read and agree to the terms of service."
/>
</Grid>
</Grid>
<Button color="primary" variant="contained" type="submit">
<Icon>send</Icon>
<Span sx={{ pl: 1, textTransform: "capitalize" }}>Submit</Span>
</Button>
</ValidatorForm>
</div>
);
}
Example #18
Source File: AppButton.jsx From matx-react with MIT License | 4 votes |
export default function AppButton() {
return (
<AppButtonRoot>
<Box className="breadcrumb">
<Breadcrumb
routeSegments={[{ name: 'Material', path: '/material' }, { name: 'Buttons' }]}
/>
</Box>
<SimpleCard title="contained buttons">
<StyledButton variant="contained" color="inherit">
Default
</StyledButton>
<StyledButton variant="contained" color="primary">
Primary
</StyledButton>
<StyledButton variant="contained" color="secondary">
Secondary
</StyledButton>
<StyledButton variant="contained" color="secondary" disabled>
Disabled
</StyledButton>
<StyledButton variant="contained" href="#contained-buttons">
Link
</StyledButton>
<input accept="image/*" className="input" id="contained-button-file" multiple type="file" />
<label htmlFor="contained-button-file">
<StyledButton variant="contained" component="span">
Upload
</StyledButton>
</label>
</SimpleCard>
<Box py="12px" />
<SimpleCard title="text buttons">
<StyledButton>Default</StyledButton>
<StyledButton color="primary">Primary</StyledButton>
<StyledButton color="secondary">Secondary</StyledButton>
<StyledButton disabled>Disabled</StyledButton>
<StyledButton href="#text-buttons">Link</StyledButton>
<input accept="image/*" className="input" id="text-button-file" multiple type="file" />
<label htmlFor="text-button-file">
<StyledButton component="span">Upload</StyledButton>
</label>
</SimpleCard>
<Box py="12px" />
<SimpleCard title="outlined buttons">
<StyledButton variant="outlined">Default</StyledButton>
<StyledButton variant="outlined" color="primary">
Primary
</StyledButton>
<StyledButton variant="outlined" color="secondary">
Secondary
</StyledButton>
<StyledButton variant="outlined" disabled>
Disabled
</StyledButton>
<StyledButton variant="outlined" href="#outlined-buttons">
Link
</StyledButton>
<input accept="image/*" className="input" id="outlined-button-file" multiple type="file" />
<label htmlFor="outlined-button-file">
<StyledButton variant="outlined" component="span">
Upload
</StyledButton>
</label>
<StyledButton variant="outlined" color="inherit">
Inherit
</StyledButton>
</SimpleCard>
<Box py="12px" />
<SimpleCard title="icon buttons">
<IconButton className="button" aria-label="Delete">
<Icon>delete</Icon>
</IconButton>
<IconButton className="button" aria-label="Delete" disabled color="primary">
<Icon>delete</Icon>
</IconButton>
<IconButton color="secondary" className="button" aria-label="Add an alarm">
<Icon>alarm</Icon>
</IconButton>
<IconButton color="primary" className="button" aria-label="Add to shopping cart">
<Icon>add_shopping_cart</Icon>
</IconButton>
<input accept="image/*" className="input" id="icon-button-file" type="file" />
<label htmlFor="icon-button-file">
<IconButton
color="primary"
component="span"
className="button"
aria-label="Upload picture"
>
<Icon>photo_camera</Icon>
</IconButton>
</label>
</SimpleCard>
<Box py="12px" />
<SimpleCard title="different size buttons">
<Fab size="small" color="secondary" aria-label="Add" className="button">
<Icon>add</Icon>
</Fab>
<Fab size="medium" color="secondary" aria-label="Add" className="button">
<Icon>add</Icon>
</Fab>
<Fab color="secondary" aria-label="Add" className="button">
<Icon>add</Icon>
</Fab>
</SimpleCard>
<Box py="12px" />
<SimpleCard title="outlined buttons">
<Fab color="primary" aria-label="Add" className="button">
<Icon>add</Icon>
</Fab>
<Fab color="secondary" aria-label="Edit" className="button">
<Icon>edit_icon</Icon>
</Fab>
<Fab variant="extended" aria-label="Delete" className="button">
<Icon sx={{ mr: 4 }}>navigation</Icon>
Extended
</Fab>
<Fab disabled aria-label="Delete" className="button">
<Icon>delete</Icon>
</Fab>
</SimpleCard>
</AppButtonRoot>
);
}
Example #19
Source File: Layout1Topbar.jsx From matx-react with MIT License | 4 votes |
Layout1Topbar = () => {
const theme = useTheme();
const { settings, updateSettings } = useSettings();
const { logout, user } = useAuth();
const isMdScreen = useMediaQuery(theme.breakpoints.down('md'));
const updateSidebarMode = (sidebarSettings) => {
updateSettings({
layout1Settings: { leftSidebar: { ...sidebarSettings } },
});
};
const handleSidebarToggle = () => {
let { layout1Settings } = settings;
let mode;
if (isMdScreen) {
mode = layout1Settings.leftSidebar.mode === 'close' ? 'mobile' : 'close';
} else {
mode = layout1Settings.leftSidebar.mode === 'full' ? 'close' : 'full';
}
updateSidebarMode({ mode });
};
return (
<TopbarRoot>
<TopbarContainer>
<Box display="flex">
<StyledIconButton onClick={handleSidebarToggle}>
<Icon>menu</Icon>
</StyledIconButton>
<IconBox>
<StyledIconButton>
<Icon>mail_outline</Icon>
</StyledIconButton>
<StyledIconButton>
<Icon>web_asset</Icon>
</StyledIconButton>
<StyledIconButton>
<Icon>star_outline</Icon>
</StyledIconButton>
</IconBox>
</Box>
<Box display="flex" alignItems="center">
<MatxSearchBox />
<NotificationProvider>
<NotificationBar />
</NotificationProvider>
<ShoppingCart />
<MatxMenu
menuButton={
<UserMenu>
<Hidden xsDown>
<Span>
Hi <strong>{user.name}</strong>
</Span>
</Hidden>
<Avatar src={user.avatar} sx={{ cursor: 'pointer' }} />
</UserMenu>
}
>
<StyledItem>
<Link to="/">
<Icon> home </Icon>
<Span> Home </Span>
</Link>
</StyledItem>
<StyledItem>
<Link to="/page-layouts/user-profile">
<Icon> person </Icon>
<Span> Profile </Span>
</Link>
</StyledItem>
<StyledItem>
<Icon> settings </Icon>
<Span> Settings </Span>
</StyledItem>
<StyledItem onClick={logout}>
<Icon> power_settings_new </Icon>
<Span> Logout </Span>
</StyledItem>
</MatxMenu>
</Box>
</TopbarContainer>
</TopbarRoot>
);
}
Example #20
Source File: ShoppingCart.jsx From matx-react with MIT License | 4 votes |
function ShoppingCart({ container }) {
const [totalCost, setTotalCost] = useState(0);
const [panelOpen, setPanelOpen] = useState(false);
const dispatch = useDispatch();
const navigate = useNavigate();
const { user } = useAuth();
const { cartList } = useSelector((state) => state.ecommerce);
const { settings } = useSettings();
const theme = useTheme();
const secondary = theme.palette.text.secondary;
if (!cartListLoaded) {
dispatch(getCartList(user.id));
cartListLoaded = true;
}
const handleDrawerToggle = () => {
setPanelOpen(!panelOpen);
};
const handleCheckoutClick = () => {
if (totalCost > 0) {
navigate('/ecommerce/checkout');
setPanelOpen(false);
}
};
useEffect(() => {
let total = 0;
cartList.forEach((product) => {
total += product.price * product.amount;
});
setTotalCost(total);
}, [cartList]);
const { palette } = useTheme();
const textColor = palette.text.primary;
return (
<Fragment>
<IconButton onClick={handleDrawerToggle}>
<Badge color="secondary" badgeContent={cartList.length}>
<Icon sx={{ color: textColor }}>shopping_cart</Icon>
</Badge>
</IconButton>
<ThemeProvider theme={settings.themes[settings.activeTheme]}>
<Drawer
container={container}
variant="temporary"
anchor={'right'}
open={panelOpen}
onClose={handleDrawerToggle}
ModalProps={{
keepMounted: true,
}}
>
<MiniCart>
<CartBox>
<Icon color="primary">shopping_cart</Icon>
<h5>Cart</h5>
</CartBox>
<Box flexGrow={1} overflow="auto">
{cartList.map((product) => (
<ProductBox key={product.id}>
<Box mr="4px" display="flex" flexDirection="column">
<StyledIconButton
size="small"
onClick={() =>
dispatch(updateCartAmount(user.id, product.id, product.amount + 1))
}
>
<Icon sx={{ cursor: 'pinter' }}>keyboard_arrow_up</Icon>
</StyledIconButton>
<StyledIconButton
disabled={!(product.amount - 1)}
size="small"
onClick={() =>
dispatch(updateCartAmount(user.id, product.id, product.amount - 1))
}
>
<Icon id={!(product.amount - 1) && 'disable'}>keyboard_arrow_down</Icon>
</StyledIconButton>
</Box>
<Box mr={1}>
<IMG src={product.imgUrl} alt={product.title} />
</Box>
<ProductDetails>
<H6>{product.title}</H6>
<Small sx={{ color: secondary }}>
${product.price} x {product.amount}
</Small>
</ProductDetails>
<StyledIconButton
size="small"
onClick={() => dispatch(deleteProductFromCart(user.userId, product.id))}
>
<Icon fontSize="small">clear</Icon>
</StyledIconButton>
</ProductBox>
))}
</Box>
<Button
sx={{ width: '100%', borderRadius: 0 }}
variant="contained"
color="primary"
onClick={handleCheckoutClick}
>
Checkout (${totalCost.toFixed(2)})
</Button>
</MiniCart>
</Drawer>
</ThemeProvider>
</Fragment>
);
}
Example #21
Source File: ResourcePage.jsx From Edlib with GNU General Public License v3.0 | 4 votes |
ResourcePage = ({ filters, showDeleteButton = false }) => {
const { t } = useTranslation();
const theme = useTheme();
const forceGridView = useMediaQuery(theme.breakpoints.down(1400));
const [filtersExpanded, setFiltersExpanded] = React.useState(false);
const [sortingOrder, setSortingOrder] = React.useState(useDefaultOrder());
const [page, setPage] = React.useState(0);
const [pageSize, setPageSize] = React.useState(40);
const [_isGridView, setIsGridView] = React.useState(false);
const filterUtils = FilterUtils(filters);
const isGridView = forceGridView || _isGridView;
const { error, loading, resources, pagination, refetch, filterCount } =
useGetResources(
React.useMemo(
() => ({
limit: pageSize,
offset: page * pageSize,
resourceCapabilities: ['view'],
orderBy: sortingOrder,
...(filters && filters.requestData),
}),
[page, sortingOrder, filters && filters.requestData, pageSize]
)
);
React.useEffect(() => {
setPage(0);
}, [sortingOrder, filters.requestData]);
const setSearch = React.useCallback(
(searchText) => {
filters.setSearchInput(searchText);
if (sortingOrder !== resourceOrders.RELEVANT_DESC) {
setSortingOrder(resourceOrders.RELEVANT_DESC);
}
},
[filters, sortingOrder, setSortingOrder]
);
const sortOrderDropDown = (
<FormControl variant="outlined">
<InputLabel>{t('Sortering')}</InputLabel>
<Select
MenuProps={{
style: { zIndex: 2051 },
anchorOrigin: {
vertical: 'bottom',
horizontal: 'center',
},
transformOrigin: {
vertical: 'top',
horizontal: 'center',
},
}}
value={sortingOrder}
onChange={(e) => setSortingOrder(e.target.value)}
label={getOrderText(t, sortingOrder)}
>
{[
resourceOrders.RELEVANT_DESC,
resourceOrders.VIEWS_DESC,
resourceOrders.VIEWS_ASC,
resourceOrders.UPDATED_AT_DESC,
resourceOrders.UPDATED_AT_ASC,
].map((value, index) => (
<MenuItem key={index} value={value}>
{getOrderText(t, value)}
</MenuItem>
))}
</Select>
</FormControl>
);
return (
<StyledResourcePage>
<Box
sx={[
{
backgroundColor: 'white',
boxShadow: '5px 0 5px 0 rgba(0, 0, 0, 0.16)',
overflowY: 'auto',
position: {
xs: 'absolute',
md: 'initial',
},
right: {
xs: '110%',
md: 'initial',
},
zIndex: {
xs: 2,
md: 'initial',
},
},
filtersExpanded && {
width: '100vw',
right: 'unset',
left: 0,
},
]}
>
<ResourceFilters filters={filters} filterCount={filterCount} />
</Box>
<Box
onClick={() => setFiltersExpanded(false)}
sx={[
{
position: 'absolute',
top: 0,
bottom: 0,
left: 0,
right: 0,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
zIndex: 1,
cursor: 'pointer',
},
filtersExpanded && {
display: {
xs: 'block',
md: 'none',
},
},
!filtersExpanded && {
display: 'none',
},
]}
/>
<div className="pageContent">
<div className="contentOptions">
<Box display="flex" paddingRight={1}>
<Box
paddingRight={1}
style={{
width: 400,
}}
>
<TextField
fullWidth
label={t('Søk')}
variant="outlined"
value={filters.searchInput}
onChange={(e) => setSearch(e.target.value)}
InputProps={{
endAdornment: (
<InputAdornment position="end">
<Icon>
<SearchIcon />
</Icon>
</InputAdornment>
),
}}
/>
</Box>
<div
style={{
width: 200,
}}
>
<LanguageDropdown
language={
filters.languages.length !== 0
? filters.languages[0]
: null
}
setLanguage={(value) =>
filters.languages.setValue(
value ? [value] : []
)
}
/>
</div>
</Box>
<div>{sortOrderDropDown}</div>
</div>
<Box
pt={1}
sx={{
display: {
xs: 'block',
md: 'none',
},
}}
>
<Button
color="primary"
variant="contained"
onClick={() => setFiltersExpanded(!filtersExpanded)}
startIcon={<TuneIcon />}
>
{t('filter', { count: 2 })}
</Button>
</Box>
<Box
display="flex"
flexDirection="row"
justifyContent="space-between"
pt={1}
>
<Box>
<FilterChips
chips={filterUtils.getChipsFromFilters()}
/>
</Box>
<Box>
{!forceGridView && (
<IconButton
onClick={() => setIsGridView(!isGridView)}
size="large"
>
{isGridView ? <ListIcon /> : <ViewModuleIcon />}
</IconButton>
)}
</Box>
</Box>
<Content>
<div style={{ marginTop: 20 }}>
{loading && <Spinner />}
{error && <div>{t('Noe skjedde')}</div>}
{!loading && !error && resources && !isGridView && (
<ResourceTable
totalCount={pagination.totalCount}
resources={resources}
refetch={refetch}
showDeleteButton={showDeleteButton}
sortingOrder={sortingOrder}
setSortingOrder={setSortingOrder}
/>
)}
{!loading && !error && resources && isGridView && (
<CardView
totalCount={pagination.totalCount}
resources={resources}
refetch={refetch}
showDeleteButton={showDeleteButton}
/>
)}
</div>
{pagination && (
<PaginationWrapper>
<TablePagination
component="div"
count={pagination.totalCount}
page={page}
onPageChange={(e, page) => {
setPage(page);
}}
rowsPerPage={pageSize}
onRowsPerPageChange={(e, pageSize) => {
setPageSize(pageSize);
setPage(0);
}}
rowsPerPageOptions={[40]}
/>
</PaginationWrapper>
)}
</Content>
</div>
</StyledResourcePage>
);
}
Example #22
Source File: MatxCustomizer.jsx From matx-react with MIT License | 4 votes |
MatxCustomizer = () => {
const theme = useTheme();
const [open, setOpen] = useState(false);
const [tabIndex, setTabIndex] = useState(0);
const { settings, updateSettings } = useSettings();
const secondary = theme.palette.text.secondary;
const tooglePanel = () => setOpen(!open);
const handleTabChange = (index) => setTabIndex(index);
let activeTheme = { ...settings.themes[settings.activeTheme] };
return (
<Fragment>
<Tooltip title="Theme Settings" placement="left">
<Label className="open" onClick={tooglePanel}>
DEMOS
</Label>
</Tooltip>
<ThemeProvider theme={activeTheme}>
<Drawer
open={open}
anchor="right"
variant="temporary"
onClose={tooglePanel}
ModalProps={{ keepMounted: true }}
>
<MaxCustomaizer>
<Controller>
<Box display="flex">
<Icon className="icon" color="primary">
settings
</Icon>
<H5 sx={{ ml: 1, fontSize: '1rem' }}>Theme Settings</H5>
</Box>
<IconButton onClick={tooglePanel}>
<Icon className="icon">close</Icon>
</IconButton>
</Controller>
<Box px={3} mb={2} display="flex">
<Button
variant="outlined"
onClick={() => handleTabChange(0)}
color={tabIndex === 0 ? 'secondary' : 'primary'}
sx={{ mr: 2 }}
>
Demos
</Button>
<Button
variant="outlined"
onClick={() => handleTabChange(1)}
color={tabIndex === 1 ? 'secondary' : 'primary'}
>
Settings
</Button>
</Box>
<StyledScrollBar options={{ suppressScrollX: true }}>
{tabIndex === 0 && (
<Box sx={{ mb: 4, mx: 3 }}>
<Box sx={{ color: secondary }}>Layouts</Box>
<Box display="flex" flexDirection="column">
{demoLayouts.map((layout) => (
<LayoutBox
key={layout.name}
color="secondary"
badgeContent={'Pro'}
invisible={!layout.isPro}
>
<Card
elevation={4}
sx={{ position: 'relative' }}
onClick={() => updateSettings(layout.options)}
>
<Box sx={{ overflow: 'hidden' }} className="layout-name">
<Button variant="contained" color="secondary">
{layout.name}
</Button>
</Box>
<IMG src={layout.thumbnail} alt={layout.name} />
</Card>
</LayoutBox>
))}
</Box>
</Box>
)}
{/* END LAYOUT */}
{tabIndex === 1 && (
<div>
<div className="helpText">
We used React context API to control layout. Check out the{' '}
<Link href="http://demos.ui-lib.com/matx-react-doc/layout.html" target="_blank">
Documentation
</Link>
</div>
</div>
)}
</StyledScrollBar>
</MaxCustomaizer>
</Drawer>
</ThemeProvider>
</Fragment>
);
}
Example #23
Source File: NotificationBar.jsx From matx-react with MIT License | 4 votes |
NotificationBar = ({ container }) => {
const { settings } = useSettings();
const theme = useTheme();
const secondary = theme.palette.text.secondary;
const [panelOpen, setPanelOpen] = React.useState(false);
const { deleteNotification, clearNotifications, notifications } = useNotification();
const handleDrawerToggle = () => {
setPanelOpen(!panelOpen);
};
const { palette } = useTheme();
const textColor = palette.text.primary;
return (
<Fragment>
<IconButton onClick={handleDrawerToggle}>
<Badge color="secondary" badgeContent={notifications?.length}>
<Icon sx={{ color: textColor }}>notifications</Icon>
</Badge>
</IconButton>
<ThemeProvider theme={settings.themes[settings.activeTheme]}>
<Drawer
width={'100px'}
container={container}
variant="temporary"
anchor={'right'}
open={panelOpen}
onClose={handleDrawerToggle}
ModalProps={{
keepMounted: true,
}}
>
<Box sx={{ width: sideNavWidth }}>
<Notification>
<Icon color="primary">notifications</Icon>
<h5>Notifications</h5>
</Notification>
{notifications?.map((notification) => (
<NotificationCard key={notification.id}>
<DeleteButton
size="small"
className="deleteButton"
onClick={() => deleteNotification(notification.id)}
>
<Icon className="icon">clear</Icon>
</DeleteButton>
<Link
to={`/${notification.path}`}
onClick={handleDrawerToggle}
style={{ textDecoration: 'none' }}
>
<Card sx={{ mx: 2, mb: 3 }} elevation={3}>
<CardLeftContent>
<Box display="flex">
<Icon className="icon" color={notification.icon.color}>
{notification.icon.name}
</Icon>
<Heading>{notification.heading}</Heading>
</Box>
<Small className="messageTime">
{getTimeDifference(new Date(notification.timestamp))}
ago
</Small>
</CardLeftContent>
<Box sx={{ px: 2, pt: 1, pb: 2 }}>
<Paragraph sx={{ m: 0 }}>{notification.title}</Paragraph>
<Small sx={{ color: secondary }}>{notification.subtitle}</Small>
</Box>
</Card>
</Link>
</NotificationCard>
))}
{!!notifications?.length && (
<Box sx={{ color: secondary }}>
<Button onClick={clearNotifications}>Clear Notifications</Button>
</Box>
)}
</Box>
</Drawer>
</ThemeProvider>
</Fragment>
);
}
Example #24
Source File: MatxVerticalNav.jsx From matx-react with MIT License | 4 votes |
MatxVerticalNav = ({ items }) => {
const { settings } = useSettings();
const { mode } = settings.layout1Settings.leftSidebar;
const renderLevels = (data) => {
return data.map((item, index) => {
if (item.type === 'label')
return (
<ListLabel key={index} mode={mode} className="sidenavHoverShow">
{item.label}
</ListLabel>
);
if (item.children) {
return (
<MatxVerticalNavExpansionPanel mode={mode} item={item} key={index}>
{renderLevels(item.children)}
</MatxVerticalNavExpansionPanel>
);
} else if (item.type === 'extLink') {
return (
<ExternalLink
key={index}
href={item.path}
className={`${mode === 'compact' && 'compactNavItem'}`}
rel="noopener noreferrer"
target="_blank"
>
<ButtonBase key={item.name} name="child" sx={{ width: '100%' }}>
{(() => {
if (item.icon) {
return <Icon className="icon">{item.icon}</Icon>;
} else {
return <span className="item-icon icon-text">{item.iconText}</span>;
}
})()}
<StyledText mode={mode} className="sidenavHoverShow">
{item.name}
</StyledText>
<Box mx="auto"></Box>
{item.badge && <BadgeValue>{item.badge.value}</BadgeValue>}
</ButtonBase>
</ExternalLink>
);
} else {
return (
<InternalLink key={index}>
<NavLink
to={item.path}
className={({ isActive }) =>
isActive
? `navItemActive ${mode === 'compact' && 'compactNavItem'}`
: `${mode === 'compact' && 'compactNavItem'}`
}
>
<ButtonBase key={item.name} name="child" sx={{ width: '100%' }}>
{item?.icon ? (
<Icon className="icon" sx={{ width: 36 }}>
{item.icon}
</Icon>
) : (
<Fragment>
<BulletIcon
className={`nav-bullet`}
sx={{ display: mode === 'compact' && 'none' }}
/>
<Box
className="nav-bullet-text"
sx={{
ml: '20px',
fontSize: '11px',
display: mode !== 'compact' && 'none',
}}
>
{item.iconText}
</Box>
</Fragment>
)}
<StyledText mode={mode} className="sidenavHoverShow">
{item.name}
</StyledText>
<Box mx="auto" />
{item.badge && (
<BadgeValue className="sidenavHoverShow">{item.badge.value}</BadgeValue>
)}
</ButtonBase>
</NavLink>
</InternalLink>
);
}
});
};
return <div className="navigation">{renderLevels(items)}</div>;
}