saleor-dashboard/src/configuration/ConfigurationPage.tsx

182 lines
5.1 KiB
TypeScript
Raw Normal View History

import { Card, CardContent, Typography } from "@material-ui/core";
import { IconProps } from "@material-ui/core/Icon";
import { useTheme } from "@material-ui/core/styles";
import useMediaQuery from "@material-ui/core/useMediaQuery";
import { User } from "@saleor/fragments/types/User";
import { sectionNames } from "@saleor/intl";
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
import { makeStyles } from "@saleor/macaw-ui";
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
2019-09-12 14:38:40 +00:00
import { hasPermission } from "../auth/misc";
2019-06-19 14:40:52 +00:00
import Container from "../components/Container";
import PageHeader from "../components/PageHeader";
import VersionInfo from "../components/VersionInfo";
2019-06-19 14:40:52 +00:00
import { PermissionEnum } from "../types/globalTypes";
export interface MenuItem {
2019-09-16 11:43:02 +00:00
description: string;
icon: React.ReactElement<IconProps>;
permission: PermissionEnum;
title: string;
url?: string;
testId?: string;
2019-09-16 11:43:02 +00:00
}
export interface MenuSection {
2019-09-12 14:38:40 +00:00
label: string;
2019-09-16 11:43:02 +00:00
menuItems: MenuItem[];
2019-06-19 14:40:52 +00:00
}
interface VersionInfo {
dashboardVersion: string;
coreVersion: string;
}
2019-12-03 15:28:40 +00:00
const useStyles = makeStyles(
theme => ({
card: {
"&:hover": {
boxShadow: "0px 5px 15px rgba(0, 0, 0, 0.15);"
},
cursor: "pointer",
marginBottom: theme.spacing(3),
transition: theme.transitions.duration.standard + "ms"
2019-06-19 14:40:52 +00:00
},
2019-12-03 15:28:40 +00:00
cardContent: {
// Overrides Material-UI default theme
"&:last-child": {
paddingBottom: 16
},
display: "grid",
gridColumnGap: theme.spacing(4),
gridTemplateColumns: "48px 1fr"
2019-06-19 14:40:52 +00:00
},
2019-12-03 15:28:40 +00:00
cardDisabled: {
"& $icon, & $sectionTitle, & $sectionDescription": {
color: theme.palette.text.disabled
},
marginBottom: theme.spacing(3)
2019-06-19 14:40:52 +00:00
},
2019-12-03 15:28:40 +00:00
configurationCategory: {
[theme.breakpoints.down("md")]: {
gridTemplateColumns: "1fr"
},
borderTop: `solid 1px ${theme.palette.divider}`,
display: "grid",
Use MacawUI (#1229) * Replace withStyleswith useStyles (#1100) * Replace withStyleswith useStyles * Update messages * Use rem as a spacing unit (#1101) * Use rems as spacing units * Fix visual bugs * Update stories * Use macaw-ui as theme provider (#1108) * Use macaw ui as a theme provider * Add react-dom to aliases * Fix jest module resolution * Update useTheme hook usage * Fix test wrapper * Use macaw from git repo * Fix CI * Update stories * Fix aliasing * Extract savebar to macaw ui (#1146) * wip * Use savebar from macaw * Use confirm button from macaw * Improve file structure * Use sidebar context from macaw * Update macaw * Update macaw version * Remove savebar from storybook * Update stories * Use alerts and notifications from macaw (#1166) * Use alerts from macaw * Add notifications from macaw * Update stories * Pin macaw version * Encapsulate limit reached in one component * Remove unused imports * Use backlinks from macaw (#1183) * Use backlink from macaw * Update macaw version * Use macaw sidebar (#1148) * Use sidebar from macaw * Use shipped logo * Use lowercase * Update stories * Use user chip from macaw (#1191) * Use user chip from macaw * Use dedicated components for menu items * Simplify code * Bump version and fix types (#1210) * Rename onBack to onClick * Rename UserChip to UserChipMenu * Rename IMenuItem to SidebarMenuItem * Update macaw version * Fix tables after changes in macaw (#1220) * Update macaw version * Update changelog * Update stories * Fix after rebase * Update to macaw 0.2.0 * Lint files * Update macaw to 0.2.2
2021-07-21 08:59:52 +00:00
gridColumnGap: theme.spacing(4),
2019-12-03 15:28:40 +00:00
gridTemplateColumns: "1fr 3fr",
paddingTop: theme.spacing(3)
2019-09-03 08:58:58 +00:00
},
2019-12-03 15:28:40 +00:00
configurationItem: {
[theme.breakpoints.down("md")]: {
gridTemplateColumns: "1fr"
},
display: "grid",
gridColumnGap: theme.spacing(4),
gridTemplateColumns: "1fr 1fr"
2019-11-04 19:32:57 +00:00
},
2019-12-03 15:28:40 +00:00
configurationLabel: {
paddingBottom: 20
},
header: {
margin: 0
},
icon: {
2020-05-12 01:20:21 +00:00
"& path": {
fill: theme.palette.primary.main
},
fontSize: 48
2019-12-03 15:28:40 +00:00
},
sectionDescription: {},
sectionTitle: {
fontSize: 20,
fontWeight: 600 as 600
}
}),
{ name: "ConfigurationPage" }
);
2019-06-19 14:40:52 +00:00
export interface ConfigurationPageProps {
2019-09-16 11:43:02 +00:00
menu: MenuSection[];
2019-06-19 14:40:52 +00:00
user: User;
versionInfo: VersionInfo;
2019-06-19 14:40:52 +00:00
onSectionClick: (sectionName: string) => void;
}
2019-10-30 14:34:24 +00:00
export const ConfigurationPage: React.FC<ConfigurationPageProps> = props => {
const {
menu: menus,
user,
onSectionClick,
versionInfo: { dashboardVersion, coreVersion }
} = props;
2019-10-30 14:34:24 +00:00
const classes = useStyles(props);
const theme = useTheme();
const isSmUp = useMediaQuery(theme.breakpoints.up("sm"));
const renderVersionInfo = (
<VersionInfo
dashboardVersion={dashboardVersion}
coreVersion={coreVersion}
/>
);
2019-10-30 14:34:24 +00:00
const intl = useIntl();
return (
<Container>
{!isSmUp && renderVersionInfo}
2019-10-30 14:34:24 +00:00
<PageHeader
className={classes.header}
title={intl.formatMessage(sectionNames.configuration)}
>
{isSmUp && renderVersionInfo}
</PageHeader>
2019-10-30 14:34:24 +00:00
{menus
.filter(menu =>
menu.menuItems.some(menuItem =>
hasPermission(menuItem.permission, user)
2019-09-12 14:38:40 +00:00
)
2019-10-30 14:34:24 +00:00
)
.map((menu, menuIndex) => (
<div className={classes.configurationCategory} key={menuIndex}>
<div className={classes.configurationLabel}>
<Typography>{menu.label}</Typography>
2019-09-12 14:38:40 +00:00
</div>
2019-10-30 14:34:24 +00:00
<div className={classes.configurationItem}>
{menu.menuItems
.filter(menuItem => hasPermission(menuItem.permission, user))
.map((item, itemIndex) => (
<Card
className={item.url ? classes.card : classes.cardDisabled}
onClick={() => onSectionClick(item.url)}
key={itemIndex}
data-test="settingsSubsection"
data-testid={item.title.toLowerCase()}
data-test-id={item.testId}
2019-10-30 14:34:24 +00:00
>
<CardContent className={classes.cardContent}>
<div className={classes.icon}>{item.icon}</div>
<div>
<Typography
className={classes.sectionTitle}
color="primary"
>
{item.title}
</Typography>
<Typography className={classes.sectionDescription}>
{item.description}
</Typography>
</div>
</CardContent>
</Card>
))}
</div>
</div>
))}
</Container>
);
};
2019-06-19 14:40:52 +00:00
ConfigurationPage.displayName = "ConfigurationPage";
export default ConfigurationPage;