Fix configuration page layout
This commit is contained in:
parent
1bf481a72e
commit
ef6334b46b
3 changed files with 214 additions and 34 deletions
|
@ -12,12 +12,14 @@ import { useIntl } from "react-intl";
|
||||||
|
|
||||||
import { IconProps } from "@material-ui/core/Icon";
|
import { IconProps } from "@material-ui/core/Icon";
|
||||||
import { sectionNames } from "@saleor/intl";
|
import { sectionNames } from "@saleor/intl";
|
||||||
|
import { ConfigurationCategoryEnum } from "@saleor/types";
|
||||||
import { User } from "../auth/types/User";
|
import { User } from "../auth/types/User";
|
||||||
import Container from "../components/Container";
|
import Container from "../components/Container";
|
||||||
import PageHeader from "../components/PageHeader";
|
import PageHeader from "../components/PageHeader";
|
||||||
import { PermissionEnum } from "../types/globalTypes";
|
import { PermissionEnum } from "../types/globalTypes";
|
||||||
|
|
||||||
export interface MenuItem {
|
export interface MenuItem {
|
||||||
|
category: ConfigurationCategoryEnum;
|
||||||
description: string;
|
description: string;
|
||||||
icon: React.ReactElement<IconProps>;
|
icon: React.ReactElement<IconProps>;
|
||||||
permission: PermissionEnum;
|
permission: PermissionEnum;
|
||||||
|
@ -50,18 +52,26 @@ const styles = (theme: Theme) =>
|
||||||
},
|
},
|
||||||
marginBottom: theme.spacing.unit * 3
|
marginBottom: theme.spacing.unit * 3
|
||||||
},
|
},
|
||||||
icon: {
|
configurationCategory: {
|
||||||
color: theme.palette.primary.main,
|
|
||||||
fontSize: 48
|
|
||||||
},
|
|
||||||
root: {
|
|
||||||
[theme.breakpoints.down("md")]: {
|
[theme.breakpoints.down("md")]: {
|
||||||
gridTemplateColumns: "1fr"
|
gridTemplateColumns: "1fr"
|
||||||
},
|
},
|
||||||
|
display: "grid",
|
||||||
|
gridColumnGap: theme.spacing.unit * 4 + "px",
|
||||||
|
gridTemplateColumns: "1fr 3fr"
|
||||||
|
},
|
||||||
|
configurationItem: {
|
||||||
display: "grid",
|
display: "grid",
|
||||||
gridColumnGap: theme.spacing.unit * 4 + "px",
|
gridColumnGap: theme.spacing.unit * 4 + "px",
|
||||||
gridTemplateColumns: "1fr 1fr"
|
gridTemplateColumns: "1fr 1fr"
|
||||||
},
|
},
|
||||||
|
configurationLabel: {
|
||||||
|
paddingBottom: 20
|
||||||
|
},
|
||||||
|
icon: {
|
||||||
|
color: theme.palette.primary.main,
|
||||||
|
fontSize: 48
|
||||||
|
},
|
||||||
sectionDescription: {},
|
sectionDescription: {},
|
||||||
sectionTitle: {
|
sectionTitle: {
|
||||||
fontSize: 20,
|
fontSize: 20,
|
||||||
|
@ -85,20 +95,33 @@ export const ConfigurationPage = withStyles(styles, {
|
||||||
onSectionClick
|
onSectionClick
|
||||||
}: ConfigurationPageProps & WithStyles<typeof styles>) => {
|
}: ConfigurationPageProps & WithStyles<typeof styles>) => {
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<PageHeader title={intl.formatMessage(sectionNames.configuration)} />
|
<PageHeader title={intl.formatMessage(sectionNames.configuration)} />
|
||||||
<div className={classes.root}>
|
<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
|
{menu
|
||||||
.filter(menuItem =>
|
.filter(menuItem =>
|
||||||
user.permissions
|
user.permissions
|
||||||
.map(perm => perm.code)
|
.map(perm => perm.code)
|
||||||
.includes(menuItem.permission)
|
.includes(menuItem.permission)
|
||||||
)
|
)
|
||||||
.map((menuItem, menuItemIndex) => (
|
.map(
|
||||||
|
(menuItem, menuItemIndex) =>
|
||||||
|
menuItem.category ===
|
||||||
|
ConfigurationCategoryEnum.ATTRUBUTES_PRODUCT_TYPES && (
|
||||||
<Card
|
<Card
|
||||||
className={menuItem.url ? classes.card : classes.cardDisabled}
|
className={
|
||||||
|
menuItem.url ? classes.card : classes.cardDisabled
|
||||||
|
}
|
||||||
onClick={() => onSectionClick(menuItem.url)}
|
onClick={() => onSectionClick(menuItem.url)}
|
||||||
key={menuItemIndex}
|
key={menuItemIndex}
|
||||||
>
|
>
|
||||||
|
@ -117,7 +140,147 @@ export const ConfigurationPage = withStyles(styles, {
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</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}
|
||||||
|
>
|
||||||
|
<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>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
|
|
@ -23,12 +23,14 @@ import { shippingZonesListUrl } from "@saleor/shipping/urls";
|
||||||
import { siteSettingsUrl } from "@saleor/siteSettings/urls";
|
import { siteSettingsUrl } from "@saleor/siteSettings/urls";
|
||||||
import { staffListUrl } from "@saleor/staff/urls";
|
import { staffListUrl } from "@saleor/staff/urls";
|
||||||
import { taxSection } from "@saleor/taxes/urls";
|
import { taxSection } from "@saleor/taxes/urls";
|
||||||
|
import { ConfigurationCategoryEnum } from "@saleor/types";
|
||||||
import { PermissionEnum } from "@saleor/types/globalTypes";
|
import { PermissionEnum } from "@saleor/types/globalTypes";
|
||||||
import ConfigurationPage, { MenuItem } from "./ConfigurationPage";
|
import ConfigurationPage, { MenuItem } from "./ConfigurationPage";
|
||||||
|
|
||||||
export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.ATTRUBUTES_PRODUCT_TYPES,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Determine attributes used to create product types",
|
defaultMessage: "Determine attributes used to create product types",
|
||||||
id: "configurationMenuAttributes"
|
id: "configurationMenuAttributes"
|
||||||
|
@ -39,6 +41,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: attributeListUrl()
|
url: attributeListUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.ATTRUBUTES_PRODUCT_TYPES,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Define types of products you sell",
|
defaultMessage: "Define types of products you sell",
|
||||||
id: "configurationMenuProductTypes"
|
id: "configurationMenuProductTypes"
|
||||||
|
@ -49,6 +52,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: productTypeListUrl()
|
url: productTypeListUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.STAFF_SETTINGS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Manage your employees and their permissions",
|
defaultMessage: "Manage your employees and their permissions",
|
||||||
id: "configurationMenuStaff"
|
id: "configurationMenuStaff"
|
||||||
|
@ -59,6 +63,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: staffListUrl()
|
url: staffListUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.PRODUCT_SETTINGS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Manage how you ship out orders",
|
defaultMessage: "Manage how you ship out orders",
|
||||||
id: "configurationMenuShipping"
|
id: "configurationMenuShipping"
|
||||||
|
@ -69,6 +74,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: shippingZonesListUrl()
|
url: shippingZonesListUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.PRODUCT_SETTINGS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Manage how your store charges tax",
|
defaultMessage: "Manage how your store charges tax",
|
||||||
id: "configurationMenuTaxes"
|
id: "configurationMenuTaxes"
|
||||||
|
@ -79,6 +85,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: taxSection
|
url: taxSection
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.MISCELLANEOUS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Define how users can navigate through your store",
|
defaultMessage: "Define how users can navigate through your store",
|
||||||
id: "configurationMenuNavigation"
|
id: "configurationMenuNavigation"
|
||||||
|
@ -89,6 +96,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: menuListUrl()
|
url: menuListUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.MISCELLANEOUS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "View and update your site settings",
|
defaultMessage: "View and update your site settings",
|
||||||
id: "configurationMenuSiteSettings"
|
id: "configurationMenuSiteSettings"
|
||||||
|
@ -99,6 +107,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: siteSettingsUrl()
|
url: siteSettingsUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.MISCELLANEOUS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "Manage and add additional pages",
|
defaultMessage: "Manage and add additional pages",
|
||||||
id: "configurationMenuPages"
|
id: "configurationMenuPages"
|
||||||
|
@ -109,6 +118,7 @@ export function createConfigurationMenu(intl: IntlShape): MenuItem[] {
|
||||||
url: pageListUrl()
|
url: pageListUrl()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
category: ConfigurationCategoryEnum.MISCELLANEOUS,
|
||||||
description: intl.formatMessage({
|
description: intl.formatMessage({
|
||||||
defaultMessage: "View and update your plugins and their settings.",
|
defaultMessage: "View and update your plugins and their settings.",
|
||||||
id: "configurationPluginsPages"
|
id: "configurationPluginsPages"
|
||||||
|
|
|
@ -130,3 +130,10 @@ export interface FetchMoreProps {
|
||||||
hasMore: boolean;
|
hasMore: boolean;
|
||||||
onFetchMore: () => void;
|
onFetchMore: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum ConfigurationCategoryEnum {
|
||||||
|
ATTRUBUTES_PRODUCT_TYPES = "ATTRUBUTES_PRODUCT_TYPES",
|
||||||
|
PRODUCT_SETTINGS = "PRODUCT_SETTINGS",
|
||||||
|
STAFF_SETTINGS = "STAFF_SETTINGS",
|
||||||
|
MISCELLANEOUS = "MISCELLANEOUS"
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue