From 8af75c2747aeeb9efdad4099344a594575226836 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 21 Aug 2023 14:11:26 +0200 Subject: [PATCH] feat(Menu): keep icons in collapsed permanent menu variant --- .../admin/admin/src/mui/menu/Menu.styles.ts | 104 ++++++++++-------- packages/admin/admin/src/mui/menu/Menu.tsx | 26 ++--- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/packages/admin/admin/src/mui/menu/Menu.styles.ts b/packages/admin/admin/src/mui/menu/Menu.styles.ts index 52336ac2bb..0b7f4d67e7 100644 --- a/packages/admin/admin/src/mui/menu/Menu.styles.ts +++ b/packages/admin/admin/src/mui/menu/Menu.styles.ts @@ -1,58 +1,66 @@ -import { Theme } from "@mui/material"; -import { createStyles } from "@mui/styles"; +import { CSSObject, Drawer as MuiDrawer, DrawerProps, Theme } from "@mui/material"; +import { styled } from "@mui/material/styles"; +import { createStyles, StyledComponent } from "@mui/styles"; +import { MUIStyledCommonProps } from "@mui/system"; +import * as React from "react"; -import { MenuProps } from "./Menu"; +import { MasterLayoutContext } from "../MasterLayoutContext"; +import { DRAWER_WIDTH, DRAWER_WIDTH_COLLAPSED, MenuProps } from "./Menu"; -export type MenuClassKey = "drawer" | "permanent" | "temporary" | "open" | "closed"; +const openedMixin = (theme: Theme, drawerWidth?: number): CSSObject => ({ + width: drawerWidth ?? DRAWER_WIDTH, + transition: theme.transitions.create("width", { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen, + }), + overflowX: "hidden", +}); +const closedMixin = (theme: Theme, drawerVariant: DrawerProps["variant"], drawerWidth?: number, drawerWidthCollapsed?: number): CSSObject => ({ + width: drawerVariant === "temporary" ? drawerWidth ?? DRAWER_WIDTH : drawerWidthCollapsed ?? DRAWER_WIDTH_COLLAPSED, + transition: theme.transitions.create("width", { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen, + }), + overflowX: "hidden", +}); +export const Drawer: StyledComponent & Pick> = styled( + MuiDrawer, + { shouldForwardProp: (prop) => prop !== "drawerWidth" && prop !== "drawerWidthCollapsed" }, +) & Pick>( + ({ theme, open, variant, drawerWidth, drawerWidthCollapsed }) => { + const { headerHeight } = React.useContext(MasterLayoutContext); -export const styles = (theme: Theme) => - createStyles({ - drawer: { - "& [class*='MuiDrawer-paper']": { - backgroundColor: "#fff", - }, - "& [class*='MuiPaper-root']": { - flexGrow: 1, - overflowX: "hidden", + return { + ...(variant === "permanent" && { + backgroundColor: theme.palette.common.white, + flexShrink: 0, + whiteSpace: "nowrap", + boxSizing: "border-box", + ...(open ? openedMixin(theme, drawerWidth) : closedMixin(theme, variant, drawerWidth, drawerWidthCollapsed)), + }), + "& .MuiDrawer-paper": { + backgroundColor: theme.palette.common.white, + ...(variant === "permanent" && { + top: headerHeight, + height: `calc(100% - ${headerHeight}px)`, + }), + ...(open ? openedMixin(theme, drawerWidth) : closedMixin(theme, variant, drawerWidth, drawerWidthCollapsed)), }, - "& [class*='MuiDrawer-paperAnchorLeft']": { + "& .MuiDrawer-paperAnchorLeft": { borderRight: "none", }, - "&$permanent": { - "&$open": { - transition: theme.transitions.create("width", { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.enteringScreen, - }), - "& [class*='MuiPaper-root']": { - transition: theme.transitions.create("margin", { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - }, - }, - "&$closed": { - transition: theme.transitions.create("width", { - easing: theme.transitions.easing.easeOut, - duration: theme.transitions.duration.leavingScreen, - }), - "& [class*='MuiPaper-root']": { - transition: theme.transitions.create("margin", { - easing: theme.transitions.easing.easeOut, - duration: theme.transitions.duration.enteringScreen, - }), - }, - }, - }, - }, + }; + }, +); + +export type MenuClassKey = "drawer" | "permanent" | "temporary" | "open" | "closed"; + +export const styles = () => { + return createStyles({ + drawer: {}, permanent: {}, temporary: {}, open: {}, - closed: { - "&$permanent": { - "& [class*='MuiPaper']": { - boxShadow: "none", - }, - }, - }, + closed: {}, }); +}; diff --git a/packages/admin/admin/src/mui/menu/Menu.tsx b/packages/admin/admin/src/mui/menu/Menu.tsx index 2e15835556..e6df9714dc 100644 --- a/packages/admin/admin/src/mui/menu/Menu.tsx +++ b/packages/admin/admin/src/mui/menu/Menu.tsx @@ -1,16 +1,19 @@ -import { ComponentsOverrides, Drawer, DrawerProps, PaperProps, Theme } from "@mui/material"; +import { ComponentsOverrides, DrawerProps, PaperProps, Theme } from "@mui/material"; import { WithStyles, withStyles } from "@mui/styles"; import * as React from "react"; import { useHistory } from "react-router"; -import { MasterLayoutContext } from "../MasterLayoutContext"; import { MenuContext } from "./Context"; -import { MenuClassKey, styles } from "./Menu.styles"; +import { Drawer, MenuClassKey, styles } from "./Menu.styles"; + +export const DRAWER_WIDTH = 300; +export const DRAWER_WIDTH_COLLAPSED = 60; export interface MenuProps { children: React.ReactNode; variant?: "permanent" | "temporary"; drawerWidth?: number; + drawerWidthCollapsed?: number; temporaryDrawerProps?: DrawerProps; permanentDrawerProps?: DrawerProps; temporaryDrawerPaperProps?: PaperProps; @@ -20,7 +23,8 @@ export interface MenuProps { const MenuDrawer: React.FC & MenuProps> = ({ classes, children, - drawerWidth = 300, + drawerWidth = DRAWER_WIDTH, + drawerWidthCollapsed = DRAWER_WIDTH_COLLAPSED, variant = "permanent", temporaryDrawerProps = {}, permanentDrawerProps = {}, @@ -29,7 +33,6 @@ const MenuDrawer: React.FC & MenuProps> = ({ }) => { const history = useHistory(); const { open, toggleOpen } = React.useContext(MenuContext); - const { headerHeight } = React.useContext(MasterLayoutContext); const initialRender = React.useRef(true); // Close the menu on initial render if it is temporary to prevent a page-overlay when initially loading the page. @@ -66,10 +69,11 @@ const MenuDrawer: React.FC & MenuProps> = ({ <> @@ -78,17 +82,13 @@ const MenuDrawer: React.FC & MenuProps> = ({