@mui/material#Grid JavaScript Examples
The following examples show how to use
@mui/material#Grid.
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: Analytics.jsx From matx-react with MIT License | 6 votes |
Analytics = () => {
const { palette } = useTheme();
return (
<Fragment>
<ContentBox className="analytics">
<Grid container spacing={3}>
<Grid item lg={8} md={8} sm={12} xs={12}>
<StatCards />
<TopSellingTable />
<StatCards2 />
<H4>Ongoing Projects</H4>
<RowCards />
</Grid>
<Grid item lg={4} md={4} sm={12} xs={12}>
<Card sx={{ px: 3, py: 2, mb: 3 }}>
<Title>Traffic Sources</Title>
<SubTitle>Last 30 days</SubTitle>
<DoughnutChart
height="300px"
color={[palette.primary.dark, palette.primary.main, palette.primary.light]}
/>
</Card>
<UpgradeCard />
<Campaigns />
</Grid>
</Grid>
</ContentBox>
</Fragment>
);
}
Example #2
Source File: Permissions.js From admin-web with GNU Affero General Public License v3.0 | 6 votes |
render() {
const { classes, t } = this.props;
const { snackbar, permittedUsers } = this.state;
return (
<FormControl className={classes.form}>
<Grid container alignItems="center" className={classes.headline}>
<Typography variant="h6">{t('Permitted Users')}</Typography>
<IconButton onClick={this.handleAddDialog(true)} size="large">
<AddCircleOutline color="primary" fontSize="small"/>
</IconButton>
</Grid>
<List>
{(permittedUsers || []).map((user, key) => <Fragment key={key}>
<ListItem className={classes.listItem}>
<ListItemText primary={user.displayName} />
<IconButton onClick={this.handleRemoveUser(user.ID, key)} size="large">
<Delete color="error" />
</IconButton>
</ListItem>
<Divider />
</Fragment>)}
</List>
<Feedback
snackbar={snackbar}
onClose={() => this.setState({ snackbar: '' })}
/>
</FormControl>
);
}
Example #3
Source File: MatxProgressBar.jsx From matx-react with MIT License | 6 votes |
MatxProgressBar = ({
value = 75,
color = 'primary',
text = '',
spacing = 2,
coloredText = false,
}) => {
const theme = useTheme();
const secondary = theme.palette.text.secondary;
return (
<Grid container spacing={spacing} alignItems="center">
<Grid item xs={text ? 8 : 12}>
<CustomLinearProgress
color={color}
value={value}
variant="determinate"
></CustomLinearProgress>
</Grid>
{text !== '' && (
<Grid item xs={text ? 4 : false}>
<Typography color={color}>
<Small sx={{ color: coloredText ? '' : secondary }}>{text}</Small>
</Typography>
</Grid>
)}
</Grid>
);
}
Example #4
Source File: FeatureSection.js From react-saas-template with MIT License | 6 votes |
function FeatureSection(props) {
const { theme } = props;
const width = useWidth();
const isWidthUpMd = useMediaQuery(theme.breakpoints.up("md"));
return (
<div style={{ backgroundColor: "#FFFFFF" }}>
<div className="container-fluid lg-p-top">
<Typography variant="h3" align="center" className="lg-mg-bottom">
Features
</Typography>
<div className="container-fluid">
<Grid container spacing={calculateSpacing(width, theme)}>
{features.map((element) => (
<Grid
item
xs={6}
md={4}
data-aos="zoom-in-up"
data-aos-delay={isWidthUpMd ? element.mdDelay : element.smDelay}
key={element.headline}
>
<FeatureCard
Icon={element.icon}
color={element.color}
headline={element.headline}
text={element.text}
/>
</Grid>
))}
</Grid>
</div>
</div>
</div>
);
}
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: CreateDbconfFile.js From admin-web with GNU Affero General Public License v3.0 | 5 votes |
render() {
const { classes, t, open, onClose, commands } = this.props;
const { service, data, loading } = this.state;
return (
<Dialog
onClose={onClose}
open={open}
maxWidth="md"
fullWidth
>
<DialogTitle>Configure grommunio-dbconf</DialogTitle>
<DialogContent style={{ minWidth: 400 }}>
<FormControl className={classes.form}>
<TextField
className={classes.input}
label={t("Service name")}
fullWidth
value={service || ''}
onChange={this.handleInput('service')}
autoFocus
required
/>
<Typography variant="h6">Data</Typography>
{data.map((pair, idx) => <Grid key={idx} container alignItems="flex-end">
<Typography className={classes.gridTypo}>
{pair.key}
</Typography>
<TextField
label="value"
value={pair.value}
onChange={this.handleDataInput(idx)}
className={classes.flexTextfield}
select
>
{commands[this.commandKeys[idx]].map((command, idx) =>
<MenuItem key={idx} value={command}>
{command}
</MenuItem>
)}
</TextField>
</Grid>
)}
</FormControl>
</DialogContent>
<DialogActions>
<Button
onClick={onClose}
color="secondary"
>
{t('Cancel')}
</Button>
<Button
onClick={this.handleUpload}
variant="contained"
color="primary"
disabled={loading || !service}
>
{loading ? <CircularProgress size={24}/> : t('Add')}
</Button>
</DialogActions>
</Dialog>
);
}
Example #7
Source File: DashboardApp.js From Django-REST-Framework-React-BoilerPlate with MIT License | 5 votes |
// ----------------------------------------------------------------------
export default function DashboardApp() {
return (
<Page title="Dashboard">
<Container maxWidth="xl">
<Typography variant="h4" sx={{ mb: 5 }}>
Hi, Welcome ?
</Typography>
<Grid container spacing={3}>
<Grid item xs={12} md={6} lg={8}>
<Card>
<Box sx={{ p: 3, pb: 1 }} dir="ltr">
<Typography variant="p" sx={{ mb: 5 }}>
Kick start your project ?
</Typography>
All the best for your new project
<Typography>
Please make sure to{' '}
<Link
href="https://github.com/faisalnazik/Django-REST-Framework-React-BoilerPlate/blob/master/README.md"
target="_blank"
>
README
</Link>
to understand where to go from here to use this BoilerPlate
</Typography>
<Box m={2} pt={3}>
<Button
href="https://github.com/faisalnazik/Django-REST-Framework-React-BoilerPlate"
target="_blank"
variant="outlined"
>
Get more information
</Button>
</Box>
</Box>
</Card>
</Grid>
<Grid item xs={12} md={6} lg={4}>
<Card>
{' '}
<CardContent>
<Typography sx={{ fontSize: 14 }} color="text.secondary" gutterBottom>
@faisalnazik
</Typography>
<Typography variant="h5" component="div">
Give a ⭐️ if this project helped you!
</Typography>
<Typography variant="body2">
If you have find any type of Bug, Raise an Issue So we can fix it
</Typography>
</CardContent>
<CardActions>
<Box m={2} pt={2}>
<Button
href="https://github.com/faisalnazik/Django-REST-Framework-React-BoilerPlate"
target="_blank"
variant="outlined"
>
Github
</Button>
</Box>
</CardActions>
</Card>
</Grid>
</Grid>
</Container>
</Page>
);
}
Example #8
Source File: DBService.js From admin-web with GNU Affero General Public License v3.0 | 5 votes |
render() {
const { classes, t } = this.props;
const { name, snackbar, files, deleting } = this.state;
const writable = this.context.includes(SYSTEM_ADMIN_WRITE);
return (
<ViewWrapper
topbarTitle={t('DB Service')}
snackbar={snackbar}
onSnackbarClose={() => this.setState({ snackbar: '' })}
>
<Paper className={classes.paper} elevation={1}>
<Grid container>
<Typography
color="primary"
variant="h5"
>
{t('editHeadline', { item: 'Service' })}
</Typography>
</Grid>
<FormControl className={classes.form}>
<TextField
label={t("Service")}
className={classes.input}
value={name || ''}
autoFocus
onChange={this.handleInput('name')}
/>
</FormControl>
<Typography variant="h6">Files</Typography>
<List>
{files.map((file, idx) => <React.Fragment key={idx}>
<ListItem button onClick={this.handleNavigation(`dbconf/${name}/${file}`)}>
<ListItemText
primary={file}
/>
{writable && <IconButton onClick={this.handleDelete(file)} size="large">
<Delete color="error" />
</IconButton>}
</ListItem>
<Divider />
</React.Fragment>
)}
</List>
<Button
color="secondary"
onClick={this.handleNavigation('dbconf')}
style={{ marginRight: 8 }}
>
{t('Back')}
</Button>
<Button
variant="contained"
color="primary"
onClick={this.handleEdit}
disabled={!writable}
>
{t('Save')}
</Button>
</Paper>
<DomainDataDelete
open={!!deleting}
delete={this.props.delete}
onSuccess={this.handleDeleteSuccess}
onError={this.handleDeleteError}
onClose={this.handleDeleteClose}
item={deleting}
id={deleting}
domainID={name}
/>
</ViewWrapper>
);
}
Example #9
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 #10
Source File: BlogPost.js From react-saas-template with MIT License | 5 votes |
function BlogPost(props) {
const { classes, date, title, src, content, otherArticles } = props;
useEffect(() => {
document.title = `WaVer - ${title}`;
smoothScrollTop();
}, [title]);
return (
<Box
className={classNames("lg-p-top", classes.wrapper)}
display="flex"
justifyContent="center"
>
<div className={classes.blogContentWrapper}>
<Grid container spacing={5}>
<Grid item md={9}>
<Card className={classes.card}>
<Box pt={3} pr={3} pl={3} pb={2}>
<Typography variant="h4">
<b>{title}</b>
</Typography>
<Typography variant="body1" color="textSecondary">
{format(new Date(date * 1000), "PPP", {
awareOfUnicodeTokens: true,
})}
</Typography>
</Box>
<ZoomImage className={classes.img} src={src} alt="" />
<Box p={3}>
{content}
<Box pt={2}>
<Grid spacing={1} container>
{["Facebook", "Twitter", "Reddit", "Tumblr"].map(
(type, index) => (
<Grid item key={index}>
<ShareButton
type={type}
title="React SaaS Template"
description="I found an awesome template for an webapp using React!"
disableElevation
variant="contained"
className="text-white"
classes={{
label: "text-white",
}}
/>
</Grid>
)
)}
</Grid>
</Box>
</Box>
</Card>
</Grid>
<Grid item md={3}>
<Typography variant="h6" paragraph>
Other articles
</Typography>
{otherArticles.map((blogPost) => (
<Box key={blogPost.id} mb={3}>
<BlogCard
title={blogPost.title}
snippet={blogPost.snippet}
date={blogPost.date}
url={`${blogPost.url}${blogPost.params}`}
/>
</Box>
))}
</Grid>
</Grid>
</div>
</Box>
);
}
Example #11
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 #12
Source File: HeadSection.js From react-saas-template with MIT License | 5 votes |
function HeadSection(props) {
const { classes, theme } = props;
const isWidthUpLg = useMediaQuery(theme.breakpoints.up("lg"));
return (
<Fragment>
<div className={classNames("lg-p-top", classes.wrapper)}>
<div className={classNames("container-fluid", classes.container)}>
<Box display="flex" justifyContent="center" className="row">
<Card
className={classes.card}
data-aos-delay="200"
data-aos="zoom-in"
>
<div className={classNames(classes.containerFix, "container")}>
<Box justifyContent="space-between" className="row">
<Grid item xs={12} md={5}>
<Box
display="flex"
flexDirection="column"
justifyContent="space-between"
height="100%"
>
<Box mb={4}>
<Typography variant={isWidthUpLg ? "h3" : "h4"}>
Free Template for building a SaaS app using
Material-UI
</Typography>
</Box>
<div>
<Box mb={2}>
<Typography
variant={isWidthUpLg ? "h6" : "body1"}
color="textSecondary"
>
Lorem ipsum dolor sit amet, consetetur sadipscing
elitr, sed diam nonumy eirmod tempor invidunt
</Typography>
</Box>
<Button
variant="contained"
color="secondary"
fullWidth
className={classes.extraLargeButton}
classes={{ label: classes.extraLargeButtonLabel }}
href="https://github.com/dunky11/react-saas-template"
>
Download from GitHub
</Button>
</div>
</Box>
</Grid>
<Hidden mdDown>
<Grid item md={6}>
<ZoomImage
src={`${process.env.PUBLIC_URL}/images/logged_out/headerImage.jpg`}
className={classes.image}
alt="header example"
/>
</Grid>
</Hidden>
</Box>
</div>
</Card>
</Box>
</div>
</div>
<WaveBorder
upperColor={theme.palette.secondary.main}
lowerColor="#FFFFFF"
className={classes.waveBorder}
animationNegativeDelay={2}
/>
</Fragment>
);
}
Example #13
Source File: DatePicker.jsx From matx-react with MIT License | 5 votes |
export default function MaterialUIDatePickers() {
const [selectedDate, setSelectedDate] = React.useState(
new Date('2014-08-18T21:11:54')
)
function handleDateChange(date) {
setSelectedDate(date)
}
return (
<LocalizationProvider dateAdapter={AdapterDateFns}>
<Grid
container
sx={{ width: '60%' }}
justify="space-around"
>
<DatePicker
value={selectedDate}
onChange={handleDateChange}
renderInput={(props) => (
<TextField
{...props}
variant="standard"
id="mui-pickers-date"
label="Date picker"
/>
)}
/>
<TimePicker
value={selectedDate}
onChange={handleDateChange}
renderInput={(props) => (
<TextField
{...props}
variant="standard"
id="mui-pickers-date"
label="Time picker"
/>
)}
/>
</Grid>
</LocalizationProvider>
)
}
Example #14
Source File: Ldap.js From admin-web with GNU Affero General Public License v3.0 | 5 votes |
render() {
const { classes, t, domain, ldapUsers } = this.props;
const { loading, snackbar, confirming } = this.state;
const writable = this.context.includes(DOMAIN_ADMIN_WRITE);
return (
<ViewWrapper
topbarTitle={domain.domainname}
snackbar={snackbar}
onSnackbarClose={() => this.setState({ snackbar: '' })}
>
<Typography variant="h2" className={classes.pageTitle}>
<BackIcon onClick={this.handleNavigation(domain.ID + '/users')} className={classes.backIcon} />
<span className={classes.pageTitleSecondary}>| </span>
{t("LDAP")}
</Typography>
<Grid container justifyContent="center">
<TextField
autoFocus
placeholder={t("Search LDAP")}
onChange={this.handleLdapSearch}
variant="outlined"
color="primary"
fullWidth
className={classes.searchTf}
InputProps={{
startAdornment: (
<InputAdornment position="start">
<Search color="primary"/>
</InputAdornment>
),
}}
/>
</Grid>
{ldapUsers.length > 0 && <Paper elevation={1}>
<List>
{ldapUsers.map((user, idx) => <React.Fragment key={idx}>
<ListItem >
<ListItemText
primary={user.name}
primaryTypographyProps={{ color: 'primary' }}
secondary={user.email}
/>
{writable && <IconButton onClick={this.handleImport(user)} size="large">
<Import />
</IconButton>}
</ListItem>
<Divider />
</React.Fragment>
)}
</List>
</Paper>}
<Grid container justifyContent="center" className={classes.loaderContainer}>
<Grow
in={loading}
timeout={{
appear: 500,
enter: 10,
exit: 10,
}}
>
<CircularProgress color="primary" size={40}/>
</Grow>
</Grid>
<ImportDialog
open={!!confirming}
user={confirming || {}}
onSuccess={this.handleSuccess}
onClose={this.handleClose}
onError={this.handleError}
/>
</ViewWrapper>
);
}
Example #15
Source File: InputSlider.jsx From matx-react with MIT License | 5 votes |
export default function InputSlider() {
const [value, setValue] = React.useState(30);
const handleSliderChange = (_, newValue) => {
setValue(newValue);
};
const handleInputChange = (event) => {
setValue(event.target.value === "" ? "" : Number(event.target.value));
};
const handleBlur = () => {
if (value < 0) {
setValue(0);
} else if (value > 100) {
setValue(100);
}
};
return (
<Box width={250}>
<Typography id="input-slider" gutterBottom>
Volume
</Typography>
<Grid container spacing={2} alignItems="center">
<Grid item>
<VolumeUp />
</Grid>
<Grid item xs>
<Slider
value={typeof value === "number" ? value : 0}
onChange={handleSliderChange}
aria-labelledby="input-slider"
/>
</Grid>
<Grid item>
<Input
value={value}
margin="dense"
sx={{ width: 42 }}
onChange={handleInputChange}
onBlur={handleBlur}
inputProps={{
step: 10,
min: 0,
max: 100,
type: "number",
"aria-labelledby": "input-slider",
}}
/>
</Grid>
</Grid>
</Box>
);
}
Example #16
Source File: MLists.js From admin-web with GNU Affero General Public License v3.0 | 4 votes |
render() {
const { classes, t, mLists, domain, tableState, handleMatch, handleRequestSort,
handleAdd, handleAddingSuccess, handleAddingClose, handleAddingError,
clearSnackbar, handleDelete, handleDeleteClose, handleDeleteError,
handleDeleteSuccess, handleEdit } = this.props;
const { order, orderBy, match, snackbar, adding, deleting } = tableState;
const writable = this.context.includes(DOMAIN_ADMIN_WRITE);
return (
<TableViewContainer
handleScroll={this.handleScroll}
headline={t("Mail lists")}
subtitle={t('mlists_sub')}
href="https://docs.grommunio.com/admin/administration.html#mail-lists"
snackbar={snackbar}
onSnackbarClose={clearSnackbar}
>
<Grid container alignItems="flex-end" className={classes.buttonGrid}>
<Button
variant="contained"
color="primary"
onClick={handleAdd}
className={classes.newButton}
disabled={!writable}
>
{t('New mail list')}
</Button>
<div className={classes.actions}>
<TextField
value={match}
onChange={handleMatch}
placeholder={t("Search")}
variant="outlined"
className={classes.textfield}
InputProps={{
startAdornment: (
<InputAdornment position="start">
<Search color="secondary" />
</InputAdornment>
),
}}
color="primary"
/>
</div>
</Grid>
<Typography className={classes.count} color="textPrimary">
{t("showingMLists", { count: mLists.MLists.length })}
</Typography>
<Paper className={classes.tablePaper} elevation={1}>
<Table size="small">
<TableHead>
<TableRow>
{this.columns.map(column =>
<TableCell key={column.value}>
<TableSortLabel
active={orderBy === column.value}
align="left"
direction={orderBy === column.value ? order : 'asc'}
onClick={handleRequestSort(column.value)}
>
{t(column.label)}
</TableSortLabel>
</TableCell>
)}
<TableCell></TableCell>
</TableRow>
</TableHead>
<TableBody>
{mLists.MLists.map((obj, idx) =>
<TableRow key={idx} hover onClick={handleEdit('/' + domain.ID + '/mailLists/' + obj.ID)}>
<TableCell>{obj.listname}</TableCell>
<TableCell>{this.listTypes[obj.listType]}</TableCell>
<TableCell>{this.listPrivileges[obj.listPrivilege]}</TableCell>
<TableCell align="right">
{writable && <IconButton onClick={handleDelete(obj)} size="large">
<Delete color="error"/>
</IconButton>}
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
{(mLists.MLists.length < mLists.count) && <Grid container justifyContent="center">
<CircularProgress color="primary" className={classes.circularProgress}/>
</Grid>}
</Paper>
<AddMList
open={adding}
onSuccess={handleAddingSuccess}
onError={handleAddingError}
domain={domain}
onClose={handleAddingClose}
/>
<DomainDataDelete
open={!!deleting}
delete={this.props.delete}
onSuccess={handleDeleteSuccess}
onError={handleDeleteError}
onClose={handleDeleteClose}
item={deleting.listname}
id={deleting.ID}
domainID={domain.ID}
/>
</TableViewContainer>
);
}
Example #17
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 #18
Source File: AddRole.js From admin-web with GNU Affero General Public License v3.0 | 4 votes |
render() {
const { classes, t, open, onClose, Permissions, Users, Domains, Orgs } = this.props;
const { name, permissions, description, loading, users, autocompleteInput } = this.state;
const orgs = [{ ID: '*', name: 'All'}].concat(Orgs);
const domains = [{ ID: '*', domainname: 'All'}].concat(Domains);
return (
<Dialog
onClose={onClose}
open={open}
maxWidth="sm"
fullWidth
>
<DialogTitle>{t('addHeadline', { item: 'Role' })}</DialogTitle>
<DialogContent style={{ minWidth: 400 }}>
<FormControl className={classes.form}>
<TextField
label={t("Name")}
value={name}
onChange={this.handleInput('name')}
className={classes.input}
autoFocus
required
/>
<MagnitudeAutocomplete
multiple
value={users || []}
filterAttribute={'username'}
inputValue={autocompleteInput}
onChange={this.handleAutocomplete('users')}
className={classes.input}
options={Users || []}
onInputChange={this.handleInput('autocompleteInput')}
label={t('Users')}
placeholder={t("Search users") + "..."}
/>
{permissions.map((permission, idx) =>
<div key={idx} className={classes.row}>
<TextField
select
label={t("Permission")}
value={permission.permission || ''}
onChange={this.handleSelectPermission(idx)}
fullWidth
variant="standard"
>
{Permissions.map((name) => (
<MenuItem key={name} value={name}>
{name}
</MenuItem>
))}
</TextField>
{permission.permission.includes('DomainAdmin') /*Read and Write*/ &&
<MagnitudeAutocomplete
value={permission.params}
filterAttribute={'domainname'}
inputValue={permission.autocompleteInput}
onChange={this.handleSetParams(idx)}
className={classes.rowTextfield}
options={domains || []}
onInputChange={this.handleAutocompleteInput(idx)}
label={t('Params')}
placeholder={t('Search domains') + "..."}
variant="standard"
autoSelect
fullWidth
/>}
{permission.permission === ORG_ADMIN /*Read and Write*/ &&
<MagnitudeAutocomplete
value={permission.params}
filterAttribute={'name'}
inputValue={permission.autocompleteInput}
onChange={this.handleSetParams(idx)}
className={classes.rowTextfield}
options={orgs || []}
onInputChange={this.handleAutocompleteInput(idx)}
label={t('Params')}
placeholder={t('Search organizations') + "..."}
variant="standard"
autoSelect
fullWidth
/>}
<IconButton size="small" onClick={this.removeRow(idx)}>
<Delete fontSize="small" color="error" />
</IconButton>
</div>
)}
<Grid container justifyContent="center" className={classes.addButton}>
<Button size="small" onClick={this.handleNewRow}>
<Add color="primary" />
</Button>
</Grid>
<TextField
className={classes.input}
label={t("Description")}
fullWidth
multiline
variant="outlined"
rows={4}
value={description}
onChange={this.handleInput('description')}
/>
</FormControl>
</DialogContent>
<DialogActions>
<Button
onClick={onClose}
color="secondary"
>
{t('Cancel')}
</Button>
<Button
onClick={this.handleAdd}
variant="contained"
color="primary"
disabled={!name || loading || permissions.length === 0 || !permissions[0].permission}
>
{loading ? <CircularProgress size={24}/> : 'Add'}
</Button>
</DialogActions>
</Dialog>
);
}
Example #19
Source File: RelatedProductCard.jsx From hr-atx58-fec-havarti with Mozilla Public License 2.0 | 4 votes |
export default function RelatedProductCard({ RelatedObj, updatedWardrobe }) {
//useContext
const { overviewProduct, clickTracker } = useContext(ProductsContext);
const [overviewProductState, setOverviewProductState] = overviewProduct;
const [clickTrackerFunc] = clickTracker;
//State
const [open, setOpen] = React.useState(false);
const [currentItem, setCurrentItem] = useState({});
const [compareFeatures, setCompareFeatures] = useState([]);
const [clickedStar, setClickedStar] = useState(false);
const [relatedProductName, updateRelatedProductName] = useState("");
const [relatedProductFeatures, setRelatedProductFeatures] = useState({});
const [overviewProductFeatures, setOverviewProductFeatures] = useState({});
const isInitialMount = useRef(true);
//Component Updates
useEffect(() => {
if (isInitialMount.current) {
isInitialMount.current = false;
} else {
if (Object.values(currentItem).length > 0) {
setCurrentItem({});
updatedWardrobe(currentItem, clickedStar);
}
}
});
//Functions
const handleStarClick = (relatedProduct) => {
let relatedProductFeaturesObj = {};
let overviewProductFeaturesObj = {};
let combinedFeatures = [];
relatedProduct.features.forEach((feature) => {
combinedFeatures.push(feature.feature);
relatedProductFeaturesObj[feature.feature] = feature.value;
});
overviewProductState.features.forEach((feature) => {
combinedFeatures.push(feature.feature);
overviewProductFeaturesObj[feature.feature] = feature.value;
});
updateRelatedProductName(relatedProduct.name);
setOverviewProductFeatures(overviewProductFeaturesObj);
setRelatedProductFeatures(relatedProductFeaturesObj);
setCompareFeatures(combinedFeatures);
setClickedStar(true);
handleClickOpen();
};
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setClickedStar(false);
setOpen(false);
};
//Styling
const useStyles = makeStyles({
root: {
maxWidth: 500,
},
media: {
height: 250,
},
iconDepth: {
zIndex: 1,
marginLeft: "auto",
},
});
const classes = useStyles();
return (
<Card
onClick={() =>
clickTrackerFunc.clickTrackerFunc("Related Products", event.target)
}
className={classes.root}
>
<CardMedia
className={classes.media}
image={RelatedObj.url ? RelatedObj.url : noImage}
>
<Grid container direction="column" alignItems="flex-end">
<Grid id="starClick" item>
{clickedStar ? (
<StarBorderIcon
className={classes.iconDepth}
onClick={() => {
handleStarClick(RelatedObj);
}}
color="primary"
style={{ fontSize: 45, color: "rgb(73, 137, 199)" }}
/>
) : (
<StarIcon
className={classes.iconDepth}
onClick={() => {
handleStarClick(RelatedObj);
}}
color="primary"
style={{ fontSize: 45, color: "rgb(73, 137, 199)" }}
/>
)}
</Grid>
</Grid>
</CardMedia>
<CardActionArea>
<CardContent
onClick={() => {
setOverviewProductState(RelatedObj);
}}
>
<Typography gutterBottom variant="body1" component="h2">
{RelatedObj.name}
</Typography>
<Typography gutterBottom variant="caption" component="h2">
{RelatedObj.category}
</Typography>
<Typography variant="body2" color="textSecondary" component="p">
${RelatedObj.default_price}
</Typography>
<Typography variant="body2" color="textSecondary" component="p">
{RelatedObj.description}
</Typography>
{/* <StarRatings rating={2} starDimension={"15px"} starSpacing={"1px"} /> */}
</CardContent>
</CardActionArea>
<CardActions>
<ModalPopup
maxWidth={"lg"}
compareFeatures={compareFeatures}
relatedProductName={relatedProductName}
relatedProductFeatures={relatedProductFeatures}
overviewProductFeatures={overviewProductFeatures}
open={open}
onClose={handleClose}
/>
</CardActions>
</Card>
);
}
Example #20
Source File: ResourceModal.jsx From Edlib with GNU General Public License v3.0 | 4 votes |
ResourceModal = ({ isOpen, onClose, resource }) => {
const { classes } = useStyles();
const { t } = useTranslation();
const history = useHistory();
const { getUserConfig } = useEdlibComponentsContext();
const { getPath } = useIframeStandaloneContext();
const canReturnResources = getUserConfig('canReturnResources');
const { www } = useConfigurationContext();
const [actionStatus, setActionStatus] = React.useState({
loading: false,
error: false,
});
const { onInsert } = useResourceCapabilities();
const insertResource = React.useCallback(async () => {
setActionStatus({
loading: true,
error: false,
});
await onInsert(
resource.id,
resource.version.id,
resource.version.title
);
}, [onInsert, setActionStatus, resource]);
const editResource = React.useCallback(() => {
history.push(getPath(`/resources/${resource.id}`));
onClose();
}, [resource]);
const capabilities = useResourceCapabilitiesFlags(resource);
return (
<Dialog
maxWidth="lg"
fullWidth
onClose={onClose}
open={isOpen}
classes={{
paperScrollPaper: classes.dialog,
}}
>
<DialogTitle disableTypography className={classes.dialogTitle}>
<Box display="flex">
<Box
display="flex"
flexDirection="column"
justifyContent="center"
>
<ResourceIcon
contentTypeInfo={resource.contentTypeInfo}
fontSizeRem={2}
/>
</Box>
<Box>
<Box
display="flex"
flexDirection="column"
justifyContent="center"
marginLeft={1}
>
<Typography variant="h6">
{resource.version.title}
</Typography>
</Box>
<Box display="flex" marginLeft={1}>
<Typography>
<a
href={www(`/s/resources/${resource.id}`)}
target="_blank"
>
{www(`/s/resources/${resource.id}`)}
</a>
</Typography>
</Box>
</Box>
</Box>
{onClose ? (
<Box
display="flex"
flexDirection="column"
justifyContent="center"
>
<IconButton
aria-label="close"
className={classes.closeButton}
onClick={onClose}
size="large"
>
<CloseIcon />
</IconButton>
</Box>
) : null}
</DialogTitle>
<DialogContent dividers>
<Grid container spacing={1}>
<Grid item lg={7} xs={12}>
<ResourcePreview resource={resource}>
{({ loading, error, frame }) => {
if (loading) {
return (
<div
style={{
display: 'flex',
justifyContent: 'center',
padding: '20px 0',
}}
>
<Spinner />
</div>
);
}
if (error) {
return <div>Noe skjedde</div>;
}
return (
<>
<div>{frame}</div>
<div className={classes.footer}>
<div className={classes.meta}>
<div>
{_.capitalize(
t('publishing_date')
)}
</div>
<div>
{moment(
resource.version
.createdAt
).format('D. MMMM YYYY')}
</div>
</div>
<div className={classes.meta}>
<div>
{_.capitalize(t('license'))}
</div>
<div>
<License
license={
resource.version
.license
}
/>
</div>
</div>
</div>
</>
);
}}
</ResourcePreview>
</Grid>
<Grid item lg={5} xs={12}>
<ResourceStats resourceId={resource.id} />
</Grid>
</Grid>
</DialogContent>
<DialogActions classes={{ root: classes.dialogActions }}>
{capabilities[resourceCapabilities.EDIT] && (
<Button
color="primary"
variant="contained"
onClick={editResource}
startIcon={<EditIcon />}
>
{t('Rediger ressurs').toUpperCase()}
</Button>
)}
{canReturnResources && (
<Button
color="primary"
variant="contained"
onClick={insertResource}
startIcon={<ArrowForward />}
>
{t('Bruk ressurs').toUpperCase()}
</Button>
)}
</DialogActions>
</Dialog>
);
}
Example #21
Source File: index.js From fireact with MIT License | 4 votes |
UserProfileView = () => {
const history = useHistory();
return (
<AuthContext.Consumer>
{(context) => (
<List component="nav">
<ListItem>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><strong>AVATAR</strong><br /><Typography color="textSecondary">Update via social login</Typography></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2}></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2} style={{marginLeft: "auto", marginRight: "0px",}}>
<Avatar alt={context.authUser.user.displayName} src={context.authUser.user.photoURL} style={{height:'64px',width:'64px'}} />
</Box>
</Grid>
</Grid>
</ListItem>
<Divider />
<ListItem button onClick={() => {
history.push('/user/profile/update-name');
}}>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><strong>NAME</strong></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2}>{context.authUser.user.displayName}</Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2} style={{marginLeft: "auto", marginRight: "0px",}}>
<EditIcon />
</Box>
</Grid>
</Grid>
</ListItem>
<Divider />
<ListItem button onClick={() => {
history.push('/user/profile/update-email');
}}>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><strong>EMAIL</strong></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2}>{context.authUser.user.email}</Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2} style={{marginLeft: "auto", marginRight: "0px",}}>
<EditIcon />
</Box>
</Grid>
</Grid>
</ListItem>
<Divider />
<ListItem button={!context.authUser.user.emailVerified} onClick={() => {
if(!context.authUser.user.emailVerified)history.push('/user/profile/verify-email');
}}>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><strong>EMAIL VERIFIED</strong></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2}>{(context.authUser.user.emailVerified?" Verified":"Unverified email")}</Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2} style={{marginLeft: "auto", marginRight: "0px",}}>
{context.authUser.user.emailVerified?(<VerifiedUserIcon />):(<SendIcon />)}
</Box>
</Grid>
</Grid>
</ListItem>
<Divider />
<ListItem button onClick={() => {
history.push('/user/profile/update-phone');
}}>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><strong>PHONE</strong></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2}>{context.authUser.user.phoneNumber}</Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2} style={{marginLeft: "auto", marginRight: "0px",}}>
<EditIcon />
</Box>
</Grid>
</Grid>
</ListItem>
<Divider />
<ListItem button onClick={() => {
history.push('/user/profile/update-password');
}}>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><strong>PASSWORD</strong></Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2}>••••••••</Box>
</Grid>
<Grid container item xs={12} md={4}>
<Box p={2} style={{marginLeft: "auto", marginRight: "0px",}}>
<EditIcon />
</Box>
</Grid>
</Grid>
</ListItem>
<Divider />
<ListItem button onClick={() => {
history.push('/user/profile/delete');
}}>
<Grid container spacing={1}>
<Grid container item xs={12} md={4}>
<Box p={2}><Typography color="error"><strong>DELETE ACCOUNT</strong></Typography></Box>
</Grid>
</Grid>
</ListItem>
</List>
)}
</AuthContext.Consumer>
)
}
Example #22
Source File: PostContent.js From react-saas-template with MIT License | 4 votes |
function PostContent(props) {
const {
pushMessageToSnackbar,
setPosts,
posts,
openAddPostModal,
classes,
} = props;
const [page, setPage] = useState(0);
const [isDeletePostDialogOpen, setIsDeletePostDialogOpen] = useState(false);
const [isDeletePostDialogLoading, setIsDeletePostDialogLoading] = useState(
false
);
const closeDeletePostDialog = useCallback(() => {
setIsDeletePostDialogOpen(false);
setIsDeletePostDialogLoading(false);
}, [setIsDeletePostDialogOpen, setIsDeletePostDialogLoading]);
const deletePost = useCallback(() => {
setIsDeletePostDialogLoading(true);
setTimeout(() => {
const _posts = [...posts];
const index = _posts.find((element) => element.id === deletePost.id);
_posts.splice(index, 1);
setPosts(_posts);
pushMessageToSnackbar({
text: "Your post has been deleted",
});
closeDeletePostDialog();
}, 1500);
}, [
posts,
setPosts,
setIsDeletePostDialogLoading,
pushMessageToSnackbar,
closeDeletePostDialog,
]);
const onDelete = useCallback(() => {
setIsDeletePostDialogOpen(true);
}, [setIsDeletePostDialogOpen]);
const handleChangePage = useCallback(
(__, page) => {
setPage(page);
},
[setPage]
);
const printImageGrid = useCallback(() => {
if (posts.length > 0) {
return (
<Box p={1}>
<Grid container spacing={1}>
{posts
.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
.map((post) => (
<Grid item xs={6} sm={4} md={3} key={post.id}>
<SelfAligningImage
src={post.src}
title={post.name}
timeStamp={post.timestamp}
options={[
{
name: "Delete",
onClick: () => {
onDelete(post);
},
icon: <DeleteIcon />,
},
]}
/>
</Grid>
))}
</Grid>
</Box>
);
}
return (
<Box m={2}>
<HighlightedInformation>
No posts added yet. Click on "NEW" to create your first one.
</HighlightedInformation>
</Box>
);
}, [posts, onDelete, page]);
return (
<Paper>
<Toolbar className={classes.toolbar}>
<Typography variant="h6">Your Posts</Typography>
<Button
variant="contained"
color="secondary"
onClick={openAddPostModal}
disableElevation
>
Add Post
</Button>
</Toolbar>
<Divider />
{printImageGrid()}
<TablePagination
component="div"
count={posts.length}
rowsPerPage={rowsPerPage}
page={page}
backIconButtonProps={{
"aria-label": "Previous Page",
}}
nextIconButtonProps={{
"aria-label": "Next Page",
}}
onPageChange={handleChangePage}
classes={{
select: classes.dNone,
selectIcon: classes.dNone,
actions: posts.length > 0 ? classes.dBlock : classes.dNone,
caption: posts.length > 0 ? classes.dBlock : classes.dNone,
}}
labelRowsPerPage=""
/>
<ConfirmationDialog
open={isDeletePostDialogOpen}
title="Confirmation"
content="Do you really want to delete the post?"
onClose={closeDeletePostDialog}
loading={isDeletePostDialogLoading}
onConfirm={deletePost}
/>
</Paper>
);
}
Example #23
Source File: AddClass.js From admin-web with GNU Affero General Public License v3.0 | 4 votes |
render() {
const { classes, t, open, onClose, _classes } = this.props;
const { classname, parentClasses, members, filters, loading, autocompleteInput } = this.state;
return (
<Dialog
onClose={onClose}
open={open}
maxWidth="md"
fullWidth
TransitionProps={{
onEnter: this.handleEnter,
}}>
<DialogTitle>{t('addHeadline', { item: 'Group' })}</DialogTitle>
<DialogContent style={{ minWidth: 400 }}>
<FormControl className={classes.form}>
<TextField
className={classes.input}
label={t("Groupname")}
fullWidth
value={classname || ''}
onChange={this.handleInput('classname')}
autoFocus
required
/>
<MagnitudeAutocomplete
value={parentClasses || []}
filterAttribute={'classname'}
inputValue={autocompleteInput}
onChange={this.handleAuto('parentClasses')}
className={classes.input}
options={_classes}
onInputChange={this.handleInput('autocompleteInput')}
label={t("Parent groups")}
multiple
/>
<TextField
className={classes.input}
label={t("Members (separate by comma)")}
fullWidth
value={members || ''}
onChange={this.handleMemberInput}
/>
</FormControl>
<div>
<Typography variant="body1">{t('Filters (All must be true)')}</Typography>
{filters.map((ANDFilter, ANDidx) =>
<Accordion
className={classes.panel}
elevation={2 /* 1 has global overwrite */}
key={ANDidx}
defaultExpanded
>
<AccordionSummary>
<Grid container justifyContent="space-between">
<Typography body="body1">{t('Filter (One must be true)')}</Typography>
<IconButton onClick={this.handleRemoveAND(ANDidx)} size="large">
<Delete fontSize="small" color="error"/>
</IconButton>
</Grid>
</AccordionSummary>
<AccordionDetails>
<Grid container>
{ANDFilter.map((ORFilter, ORidx) =>
<Grid item xs={12} key={ORidx} className={classes.grid}>
<Autocomplete
value={ORFilter.prop || ''}
inputValue={ORFilter.prop || ''}
onChange={this.handleAutocomplete(ANDidx, ORidx, 'prop')}
onInputChange={this.handleFilterInput(ANDidx, ORidx, 'prop')}
freeSolo
className={classes.flexTextfield}
options={this.columns}
renderInput={(params) => (
<TextField
{...params}
label={t("Name of property to match")}
/>
)}
/>
<TextField
className={classes.flexTextfield}
label={t("Comparison operator")}
value={ORFilter.op || ''}
onChange={this.handleFilterInput(ANDidx, ORidx, 'op')}
select
>
{this.operators.map(op =>
<MenuItem value={op.value} key={op.label}>{op.label}</MenuItem>
)}
</TextField>
<TextField
className={classes.flexTextfield}
label={t("Compare value (binary operators)")}
value={ORFilter.val || ''}
onChange={this.handleFilterInput(ANDidx, ORidx, 'val')}
/>
{filters[ANDidx].length > 1 &&
<IconButton onClick={this.handleRemoveOR(ANDidx, ORidx)} size="large">
<Delete fontSize="small" color="error"/>
</IconButton>}
</Grid>
)}
<Grid container justifyContent="center" className={classes.marginTop}>
<Button variant="outlined" onClick={this.handleAddOR(ANDidx)}>{t('Add or-statement')}</Button>
</Grid>
</Grid>
</AccordionDetails>
</Accordion>
)}
<Grid container justifyContent="center" className={classes.marginTop}>
<Button variant="outlined" onClick={this.handleAddAND}>{t('Add and-statement')}</Button>
</Grid>
</div>
</DialogContent>
<DialogActions>
<Button
onClick={onClose}
color="secondary"
>
{t('Cancel')}
</Button>
<Button
onClick={this.handleAdd}
variant="contained"
color="primary"
disabled={loading || !classname}
>
{loading ? <CircularProgress size={24}/> : t('Add')}
</Button>
</DialogActions>
</Dialog>
);
}
Example #24
Source File: OutfitCard.jsx From hr-atx58-fec-havarti with Mozilla Public License 2.0 | 4 votes |
export default function OutfitCard({ OutfitObj, remove }) {
const classes = useStyles();
//useContext
const {
overviewProduct,
clickedComponent,
clickedElement,
clickTracker,
selectedStyleState,
} = useContext(ProductsContext);
const [overviewProductState, setOverviewProductState] = overviewProduct;
const [selectedStyle, setSelectedStyle] = selectedStyleState;
const [clickTrackerFunc] = clickTracker;
return (
<Card
onClick={() =>
clickTrackerFunc.clickTrackerFunc("Outfit List Item", event.target)
}
className={classes.root}
>
<CardMedia
className={classes.media}
image={
OutfitObj.photos[0].thumbnail_url
? OutfitObj.photos[0].thumbnail_url
: noImage
}
title={OutfitObj.name}
>
<Grid container direction="column" alignItems="flex-end">
<Grid item>
<HighlightOffIcon
style={{ fill: "black", fontSize: 45 }}
onClick={() => {
remove(OutfitObj);
}}
/>
</Grid>
</Grid>
</CardMedia>
<CardActionArea>
<CardContent
onClick={() => {
setOverviewProductState(OutfitObj.overviewProduct);
setSelectedStyle(OutfitObj.selectedStyleObj);
}}
>
<Typography gutterBottom variant="body1" component="h2">
{OutfitObj.name}
</Typography>
<Typography gutterBottom variant="caption" component="h2">
{OutfitObj.category}
</Typography>
{OutfitObj.sale_price ? (
<>
<strike>
<Typography
className={{ textDecoration: "line-through" }}
variant="body2"
color="textSecondary"
component="p"
>
${OutfitObj.original_price}
</Typography>
</strike>
<Typography
variant="body2"
style={{ color: "red" }}
component="div"
>
On sale!! ${OutfitObj.sale_price}{" "}
</Typography>
</>
) : (
<Typography variant="body2" color="textSecondary" component="p">
${OutfitObj.original_price}
</Typography>
)}
<Typography variant="body2" color="textSecondary" component="p">
{OutfitObj.description}
</Typography>
{/* <StarRatings
rating={3.75}
starDimension={"15px"}
starSpacing={"1px"}
/> */}
</CardContent>
</CardActionArea>
<CardActions></CardActions>
</Card>
);
}
Example #25
Source File: DBConf.js From admin-web with GNU Affero General Public License v3.0 | 4 votes |
render() {
const { classes, t, services, commands } = this.props;
const { adding, configuring, snackbar, match, tab, deleting } = this.state;
const writable = this.context.includes(SYSTEM_ADMIN_WRITE);
return (
<TableViewContainer
headline={t("Configuration DB")}
href="https://docs.grommunio.com/admin/administration.html#db-configuration"
subtitle={t('dbconf_sub')}
snackbar={snackbar}
onSnackbarClose={() => this.setState({ snackbar: '' })}
>
<Grid container alignItems="flex-end" className={classes.buttonGrid}>
<Button
variant="contained"
color="primary"
onClick={() => this.setState({ adding: true })}
disabled={!writable}
>
{t("Create file")}
</Button>
<Button
variant="contained"
color="primary"
onClick={() => this.setState({ configuring: true })}
className={classes.button}
disabled={!writable}
>
{t("Configure grommunio-dbconf")}
</Button>
<div className={classes.actions}>
<TextField
value={match}
onChange={this.handleMatch}
placeholder={t("search services")}
variant="outlined"
className={classes.textfield}
InputProps={{
startAdornment: (
<InputAdornment position="start">
<Search color="secondary" />
</InputAdornment>
),
}}
color="primary"
/>
</div>
</Grid>
<Grid container alignItems="flex-end" className={classes.buttonGrid}>
<Tabs
textColor="primary"
indicatorColor="primary"
value={tab}
onChange={this.handleTab}
>
<Tab value={0} label="Services" />
<Tab value={1} label="Commands" />
</Tabs>
</Grid>
{tab === 0 ? <Paper elevation={1}>
<Table size="small">
<TableHead>
<TableRow>
<TableCell>
{t('Name')}
</TableCell>
<TableCell padding="checkbox"></TableCell>
</TableRow>
</TableHead>
<TableBody>
{services.filter(s => s.includes(match)).map((service, idx) =>
<TableRow onClick={this.handleNavigation('dbconf/' + service)} key={idx} hover>
<TableCell>{service}</TableCell>
<TableCell align="right">
{writable && <IconButton onClick={this.handleDelete(service)} size="large">
<Delete color="error" />
</IconButton>}
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</Paper> : <Paper className={classes.paper}>
<Typography variant="h6">Key</Typography>
{commands.key.length > 0 ? commands.key.map((key, idx) =>
<pre className={classes.pre} key={idx}>
<code key={idx}>{key}</code>
</pre>
) : <Typography><i>none</i></Typography>}
<Typography className={classes.title} variant="h6">File</Typography>
{commands.file.length > 0 ? commands.file.map((key, idx) =>
<pre className={classes.pre} key={idx}>
<code>{key}</code>
</pre>
) : <Typography><i>none</i></Typography>}
<Typography className={classes.title} variant="h6">Service</Typography>
{commands.service.length > 0 ? commands.service.map((key, idx) =>
<pre className={classes.pre} key={idx}>
<code>{key}</code>
</pre>
) : <Typography><i>none</i></Typography>}
</Paper>}
<GeneralDelete
open={!!deleting}
delete={this.props.delete}
onSuccess={this.handleDeleteSuccess}
onError={this.handleDeleteError}
onClose={this.handleDeleteClose}
item={deleting}
id={deleting}
/>
<UploadServiceFile
open={adding}
onClose={this.handleAddingClose}
onError={this.handleAddingError}
onSuccess={this.handleAddingSuccess}
/>
<CreateDbconfFile
open={configuring}
onClose={this.handleAddingClose}
onError={this.handleAddingError}
onSuccess={this.handleAddingSuccess}
/>
</TableViewContainer>
);
}