saleor-dashboard/src/configuration/ConfigurationPage.tsx

293 lines
9.9 KiB
TypeScript
Raw Normal View History

2019-06-19 14:40:52 +00:00
import Card from "@material-ui/core/Card";
import CardContent from "@material-ui/core/CardContent";
import {
createStyles,
Theme,
withStyles,
WithStyles
} from "@material-ui/core/styles";
import Typography from "@material-ui/core/Typography";
2019-08-09 10:26:22 +00:00
import React from "react";
import { useIntl } from "react-intl";
2019-06-19 14:40:52 +00:00
import { IconProps } from "@material-ui/core/Icon";
import { sectionNames } from "@saleor/intl";
2019-09-03 08:58:58 +00:00
import { ConfigurationCategoryEnum } from "@saleor/types";
2019-06-19 14:40:52 +00:00
import { User } from "../auth/types/User";
import Container from "../components/Container";
import PageHeader from "../components/PageHeader";
import { PermissionEnum } from "../types/globalTypes";
export interface MenuItem {
2019-09-03 08:58:58 +00:00
category: ConfigurationCategoryEnum;
2019-06-19 14:40:52 +00:00
description: string;
icon: React.ReactElement<IconProps>;
permission: PermissionEnum;
title: string;
url?: string;
}
const styles = (theme: Theme) =>
createStyles({
card: {
"&:hover": {
boxShadow: "0px 5px 15px rgba(0, 0, 0, 0.15);"
},
cursor: "pointer",
marginBottom: theme.spacing.unit * 3,
transition: theme.transitions.duration.standard + "ms"
},
cardContent: {
// Overrides Material-UI default theme
"&:last-child": {
paddingBottom: 16
},
display: "grid",
gridColumnGap: theme.spacing.unit * 4 + "px",
gridTemplateColumns: "48px 1fr"
},
cardDisabled: {
"& $icon, & $sectionTitle, & $sectionDescription": {
color: theme.palette.text.disabled
},
marginBottom: theme.spacing.unit * 3
},
2019-09-03 08:58:58 +00:00
configurationCategory: {
2019-09-09 08:07:48 +00:00
borderTop: `solid 1px #eaeaea`,
paddingTop: theme.spacing.unit * 3 + "px",
2019-06-19 14:40:52 +00:00
[theme.breakpoints.down("md")]: {
gridTemplateColumns: "1fr"
},
2019-09-03 08:58:58 +00:00
display: "grid",
gridColumnGap: theme.spacing.unit * 4 + "px",
gridTemplateColumns: "1fr 3fr"
},
configurationItem: {
2019-06-19 14:40:52 +00:00
display: "grid",
gridColumnGap: theme.spacing.unit * 4 + "px",
gridTemplateColumns: "1fr 1fr"
},
2019-09-03 08:58:58 +00:00
configurationLabel: {
paddingBottom: 20
},
icon: {
color: theme.palette.primary.main,
fontSize: 48
},
2019-06-19 14:40:52 +00:00
sectionDescription: {},
sectionTitle: {
fontSize: 20,
fontWeight: 600 as 600
}
});
export interface ConfigurationPageProps {
2019-06-19 14:40:52 +00:00
menu: MenuItem[];
user: User;
onSectionClick: (sectionName: string) => void;
}
export const ConfigurationPage = withStyles(styles, {
name: "ConfigurationPage"
})(
({
classes,
menu,
user,
onSectionClick
}: ConfigurationPageProps & WithStyles<typeof styles>) => {
const intl = useIntl();
return (
<Container>
<PageHeader title={intl.formatMessage(sectionNames.configuration)} />
2019-09-03 08:58:58 +00:00
<div className={classes.configurationCategory}>
<div className={classes.configurationLabel}>
<Typography>
{intl.formatMessage({
defaultMessage: "Attributes and Product Types",
description: "configuration category"
})}
</Typography>
</div>
<div className={classes.configurationItem}>
{menu
.filter(menuItem =>
user.permissions
.map(perm => perm.code)
.includes(menuItem.permission)
)
.map(
(menuItem, menuItemIndex) =>
menuItem.category ===
ConfigurationCategoryEnum.ATTRUBUTES_PRODUCT_TYPES && (
<Card
className={
menuItem.url ? classes.card : classes.cardDisabled
}
onClick={() => onSectionClick(menuItem.url)}
key={menuItemIndex}
>
<CardContent className={classes.cardContent}>
<div className={classes.icon}>{menuItem.icon}</div>
<div>
<Typography
className={classes.sectionTitle}
color="primary"
>
{menuItem.title}
</Typography>
<Typography className={classes.sectionDescription}>
{menuItem.description}
</Typography>
</div>
</CardContent>
</Card>
)
)}
</div>
</div>
<div className={classes.configurationCategory}>
<div className={classes.configurationLabel}>
<Typography>
{intl.formatMessage({
defaultMessage: "Product Settings",
description: "configuration category"
})}
</Typography>
</div>
<div className={classes.configurationItem}>
{menu
.filter(menuItem =>
user.permissions
.map(perm => perm.code)
.includes(menuItem.permission)
)
.map(
(menuItem, menuItemIndex) =>
menuItem.category ===
ConfigurationCategoryEnum.PRODUCT_SETTINGS && (
<Card
className={
menuItem.url ? classes.card : classes.cardDisabled
}
onClick={() => onSectionClick(menuItem.url)}
key={menuItemIndex}
>
<CardContent className={classes.cardContent}>
<div className={classes.icon}>{menuItem.icon}</div>
<div>
<Typography
className={classes.sectionTitle}
color="primary"
>
{menuItem.title}
</Typography>
<Typography className={classes.sectionDescription}>
{menuItem.description}
</Typography>
</div>
</CardContent>
</Card>
)
)}
</div>
</div>
<div className={classes.configurationCategory}>
<div className={classes.configurationLabel}>
<Typography>
{intl.formatMessage({
defaultMessage: "Staff Settings",
description: "configuration category"
})}
</Typography>
</div>
<div className={classes.configurationItem}>
{menu
.filter(menuItem =>
user.permissions
.map(perm => perm.code)
.includes(menuItem.permission)
)
.map(
(menuItem, menuItemIndex) =>
menuItem.category ===
ConfigurationCategoryEnum.STAFF_SETTINGS && (
<Card
className={
menuItem.url ? classes.card : classes.cardDisabled
}
onClick={() => onSectionClick(menuItem.url)}
key={menuItemIndex}
>
<CardContent className={classes.cardContent}>
<div className={classes.icon}>{menuItem.icon}</div>
<div>
<Typography
className={classes.sectionTitle}
color="primary"
>
{menuItem.title}
</Typography>
<Typography className={classes.sectionDescription}>
{menuItem.description}
</Typography>
</div>
</CardContent>
</Card>
)
)}
</div>
</div>
<div className={classes.configurationCategory}>
<div className={classes.configurationLabel}>
<Typography>
{intl.formatMessage({
defaultMessage: "Miscellaneous",
description: "configuration category"
})}
</Typography>
</div>
<div className={classes.configurationItem}>
{menu
.filter(menuItem =>
user.permissions
.map(perm => perm.code)
.includes(menuItem.permission)
)
.map(
(menuItem, menuItemIndex) =>
menuItem.category ===
ConfigurationCategoryEnum.MISCELLANEOUS && (
<Card
className={
menuItem.url ? classes.card : classes.cardDisabled
}
onClick={() => onSectionClick(menuItem.url)}
key={menuItemIndex}
>
2019-09-03 08:58:58 +00:00
<CardContent className={classes.cardContent}>
<div className={classes.icon}>{menuItem.icon}</div>
<div>
<Typography
className={classes.sectionTitle}
color="primary"
>
{menuItem.title}
</Typography>
<Typography className={classes.sectionDescription}>
{menuItem.description}
</Typography>
</div>
</CardContent>
</Card>
)
)}
</div>
</div>
</Container>
);
}
);
2019-06-19 14:40:52 +00:00
ConfigurationPage.displayName = "ConfigurationPage";
export default ConfigurationPage;