ResponsiveDrawer.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import AppBar from '@material-ui/core/AppBar';
  4. import CssBaseline from '@material-ui/core/CssBaseline';
  5. import Divider from '@material-ui/core/Divider';
  6. import Drawer from '@material-ui/core/Drawer';
  7. import Hidden from '@material-ui/core/Hidden';
  8. import IconButton from '@material-ui/core/IconButton';
  9. import InboxIcon from '@material-ui/icons/MoveToInbox';
  10. import List from '@material-ui/core/List';
  11. import ListItem from '@material-ui/core/ListItem';
  12. import ListItemIcon from '@material-ui/core/ListItemIcon';
  13. import ListItemText from '@material-ui/core/ListItemText';
  14. import MailIcon from '@material-ui/icons/Mail';
  15. import MenuIcon from '@material-ui/icons/Menu';
  16. import Toolbar from '@material-ui/core/Toolbar';
  17. import Typography from '@material-ui/core/Typography';
  18. import { makeStyles, useTheme } from '@material-ui/core/styles';
  19. import MkFormPage from './MkFormPage';
  20. import { Route, Router, Switch } from 'react-router-dom';
  21. import WelcomPage from './WelcomPage';
  22. import { createBrowserHistory } from 'history';
  23. import MkTablePage from './MkTablePage';
  24. const browserHistory = createBrowserHistory();
  25. const drawerWidth = 240;
  26. const useStyles = makeStyles((theme) => ({
  27. root: {
  28. display: 'flex',
  29. },
  30. drawer: {
  31. [theme.breakpoints.up('sm')]: {
  32. width: drawerWidth,
  33. flexShrink: 0,
  34. },
  35. },
  36. appBar: {
  37. [theme.breakpoints.up('sm')]: {
  38. width: `calc(100% - ${drawerWidth}px)`,
  39. marginLeft: drawerWidth,
  40. },
  41. },
  42. menuButton: {
  43. marginRight: theme.spacing(2),
  44. [theme.breakpoints.up('sm')]: {
  45. display: 'none',
  46. },
  47. },
  48. // necessary for content to be below app bar
  49. toolbar: theme.mixins.toolbar,
  50. drawerPaper: {
  51. width: drawerWidth,
  52. },
  53. content: {
  54. flexGrow: 1,
  55. padding: theme.spacing(3),
  56. },
  57. }));
  58. function ResponsiveDrawer(props) {
  59. const { window } = props;
  60. const classes = useStyles();
  61. const theme = useTheme();
  62. const [mobileOpen, setMobileOpen] = React.useState(false);
  63. const [menuName, setMenuName] = React.useState('');
  64. const handleDrawerToggle = () => {
  65. setMobileOpen(!mobileOpen);
  66. };
  67. const handleOnClick = (path) => {
  68. setMenuName(path);
  69. browserHistory.push(path);
  70. }
  71. const menus = [
  72. {name: 'MkForm', path:'MkForm'},
  73. {name: 'MkTable', path:'MkTable'}
  74. ]
  75. const drawer = (
  76. <div>
  77. <div className={classes.toolbar} ><Typography variant="h4">Mokkon</Typography></div>
  78. <Divider />
  79. <List>
  80. {menus.map((menu, index) => (
  81. <ListItem button key={menu.name} onClick={() => handleOnClick(menu.path)}>
  82. <ListItemText primary={menu.name} />
  83. </ListItem>
  84. ))}
  85. </List>
  86. </div>
  87. );
  88. const container = window !== undefined ? () => window().document.body : undefined;
  89. return (
  90. <div className={classes.root}>
  91. <CssBaseline />
  92. <AppBar position="fixed" className={classes.appBar}>
  93. <Toolbar>
  94. <IconButton
  95. color="inherit"
  96. aria-label="open drawer"
  97. edge="start"
  98. onClick={handleDrawerToggle}
  99. className={classes.menuButton}
  100. >
  101. <MenuIcon />
  102. </IconButton>
  103. <Typography variant="h6" noWrap>
  104. {menuName}
  105. </Typography>
  106. </Toolbar>
  107. </AppBar>
  108. <nav className={classes.drawer} aria-label="mailbox folders">
  109. {/* The implementation can be swapped with js to avoid SEO duplication of links. */}
  110. <Hidden smUp implementation="css">
  111. <Drawer
  112. container={container}
  113. variant="temporary"
  114. anchor={theme.direction === 'rtl' ? 'right' : 'left'}
  115. open={mobileOpen}
  116. onClose={handleDrawerToggle}
  117. classes={{
  118. paper: classes.drawerPaper,
  119. }}
  120. ModalProps={{
  121. keepMounted: true, // Better open performance on mobile.
  122. }}
  123. >
  124. {drawer}
  125. </Drawer>
  126. </Hidden>
  127. <Hidden xsDown implementation="css">
  128. <Drawer
  129. classes={{
  130. paper: classes.drawerPaper,
  131. }}
  132. variant="permanent"
  133. open
  134. >
  135. {drawer}
  136. </Drawer>
  137. </Hidden>
  138. </nav>
  139. <main className={classes.content}>
  140. <div className={classes.toolbar} />
  141. <Router history={browserHistory}>
  142. <Switch>
  143. <Route path="/" component={WelcomPage} exact />
  144. <Route path="/MkForm" component={MkFormPage} />
  145. <Route path="/MkTable" component={MkTablePage} />
  146. </Switch>
  147. </Router>
  148. </main>
  149. </div>
  150. );
  151. }
  152. ResponsiveDrawer.propTypes = {
  153. /**
  154. * Injected by the documentation to work in an iframe.
  155. * You won't need it on your project.
  156. */
  157. window: PropTypes.func,
  158. };
  159. export default ResponsiveDrawer;