Files
rentalcalculator/src/@fuse/core/FusePageSimple/FusePageSimple.js

300 lines
7.7 KiB
JavaScript

import FuseScrollbars from '@fuse/core/FuseScrollbars';
import { styled } from '@mui/material/styles';
import clsx from 'clsx';
import * as PropTypes from 'prop-types';
import { forwardRef, memo, useImperativeHandle, useRef } from 'react';
import GlobalStyles from '@mui/material/GlobalStyles';
import FusePageSimpleHeader from './FusePageSimpleHeader';
import FusePageSimpleSidebar from './FusePageSimpleSidebar';
const Root = styled('div')(({ theme, ...props }) => ({
display: 'flex',
flexDirection: 'column',
minWidth: 0,
minHeight: '100%',
position: 'relative',
flex: '1 1 auto',
width: '100%',
height: 'auto',
backgroundColor: theme.palette.background.default,
'&.FusePageSimple-scroll-content': {
height: '100%',
},
'& .FusePageSimple-wrapper': {
display: 'flex',
flexDirection: 'row',
flex: '1 1 auto',
zIndex: 2,
minWidth: 0,
height: '100%',
backgroundColor: theme.palette.background.default,
...(props.scroll === 'content' && {
position: 'absolute',
top: 0,
bottom: 0,
right: 0,
left: 0,
overflow: 'hidden',
}),
},
'& .FusePageSimple-header': {
display: 'flex',
flex: '0 0 auto',
backgroundSize: 'cover',
},
'& .FusePageSimple-topBg': {
position: 'absolute',
left: 0,
right: 0,
top: 0,
height: headerHeight,
pointerEvents: 'none',
},
'& .FusePageSimple-contentWrapper': {
display: 'flex',
flexDirection: 'column',
width: '100%',
flex: '1 1 auto',
overflow: 'hidden',
// WebkitOverflowScrolling: 'touch',
zIndex: 9999,
},
'& .FusePageSimple-toolbar': {
height: toolbarHeight,
minHeight: toolbarHeight,
display: 'flex',
alignItems: 'center',
},
'& .FusePageSimple-content': {
display: 'flex',
flex: '1 1 auto',
alignItems: 'start',
minHeight: 0,
overflowY: 'auto',
},
'& .FusePageSimple-sidebarWrapper': {
overflow: 'hidden',
backgroundColor: 'transparent',
position: 'absolute',
'&.permanent': {
[theme.breakpoints.up('lg')]: {
position: 'relative',
marginLeft: 0,
marginRight: 0,
transition: theme.transitions.create('margin', {
easing: theme.transitions.easing.sharp,
duration: theme.transitions.duration.leavingScreen,
}),
'&.closed': {
transition: theme.transitions.create('margin', {
easing: theme.transitions.easing.easeOut,
duration: theme.transitions.duration.enteringScreen,
}),
'&.FusePageSimple-leftSidebar': {
marginLeft: -props.leftsidebarwidth,
},
'&.FusePageSimple-rightSidebar': {
marginRight: -props.rightsidebarwidth,
},
},
},
},
},
'& .FusePageSimple-sidebar': {
position: 'absolute',
backgroundColor: theme.palette.background.paper,
color: theme.palette.text.primary,
'&.permanent': {
[theme.breakpoints.up('lg')]: {
position: 'relative',
},
},
maxWidth: '100%',
height: '100%',
},
'& .FusePageSimple-leftSidebar': {
width: props.leftsidebarwidth,
[theme.breakpoints.up('lg')]: {
borderRight: `1px solid ${theme.palette.divider}`,
borderLeft: 0,
},
},
'& .FusePageSimple-rightSidebar': {
width: props.rightsidebarwidth,
[theme.breakpoints.up('lg')]: {
borderLeft: `1px solid ${theme.palette.divider}`,
borderRight: 0,
},
},
'& .FusePageSimple-sidebarHeader': {
height: headerHeight,
minHeight: headerHeight,
backgroundColor: theme.palette.primary.dark,
color: theme.palette.primary.contrastText,
},
'& .FusePageSimple-sidebarHeaderInnerSidebar': {
backgroundColor: 'transparent',
color: 'inherit',
height: 'auto',
minHeight: 'auto',
},
'& .FusePageSimple-sidebarContent': {
display: 'flex',
flexDirection: 'column',
minHeight: '100%',
},
'& .FusePageSimple-backdrop': {
position: 'absolute',
},
}));
const headerHeight = 120;
const toolbarHeight = 64;
const FusePageSimple = forwardRef((props, ref) => {
// console.info("render::FusePageSimple");
const leftSidebarRef = useRef(null);
const rightSidebarRef = useRef(null);
const rootRef = useRef(null);
useImperativeHandle(ref, () => ({
rootRef,
toggleLeftSidebar: (val) => {
leftSidebarRef.current.toggleSidebar(val);
},
toggleRightSidebar: (val) => {
rightSidebarRef.current.toggleSidebar(val);
},
}));
return (
<>
<GlobalStyles
styles={(theme) => ({
...(props.scroll !== 'page' && {
'#fuse-toolbar': {
position: 'static',
},
'#fuse-footer': {
position: 'static',
},
}),
...(props.scroll === 'page' && {
'#fuse-toolbar': {
position: 'sticky',
top: 0,
},
'#fuse-footer': {
position: 'sticky',
bottom: 0,
},
}),
})}
/>
<Root
className={clsx(
'FusePageSimple-root',
`FusePageSimple-scroll-${props.scroll}`,
props.className
)}
ref={rootRef}
scroll={props.scroll}
leftsidebarwidth={props.leftSidebarWidth}
rightsidebarwidth={props.rightSidebarWidth}
>
<div className="flex flex-auto flex-col z-10 h-full">
<div className="FusePageSimple-wrapper">
{props.leftSidebarContent && (
<FusePageSimpleSidebar
position="left"
content={props.leftSidebarContent}
variant={props.leftSidebarVariant || 'permanent'}
ref={leftSidebarRef}
rootRef={rootRef}
open={props.leftSidebarOpen}
onClose={props.leftSidebarOnClose}
sidebarWidth={props.leftSidebarWidth}
/>
)}
<div
className="FusePageSimple-contentWrapper"
// enable={props.scroll === 'page'}
>
{props.header && <FusePageSimpleHeader header={props.header} />}
{props.content && (
<FuseScrollbars
enable={props.scroll === 'content'}
className={clsx('FusePageSimple-content container')}
>
{props.content}
</FuseScrollbars>
)}
</div>
{props.rightSidebarContent && (
<FusePageSimpleSidebar
position="right"
content={props.rightSidebarContent}
variant={props.rightSidebarVariant || 'permanent'}
ref={rightSidebarRef}
rootRef={rootRef}
open={props.rightSidebarOpen}
onClose={props.rightSidebarOnClose}
sidebarWidth={props.rightSidebarWidth}
/>
)}
</div>
</div>
</Root>
</>
);
});
FusePageSimple.propTypes = {
leftSidebarContent: PropTypes.node,
leftSidebarVariant: PropTypes.node,
rightSidebarContent: PropTypes.node,
rightSidebarVariant: PropTypes.node,
header: PropTypes.node,
content: PropTypes.node,
scroll: PropTypes.oneOf(['normal', 'page', 'content']),
leftSidebarOpen: PropTypes.bool,
rightSidebarOpen: PropTypes.bool,
leftSidebarWidth: PropTypes.number,
rightSidebarWidth: PropTypes.number,
rightSidebarOnClose: PropTypes.func,
leftSidebarOnClose: PropTypes.func,
};
FusePageSimple.defaultProps = {
classes: {},
scroll: 'page',
leftSidebarOpen: false,
rightSidebarOpen: false,
rightSidebarWidth: 240,
leftSidebarWidth: 240,
};
export default memo(styled(FusePageSimple)``);