Add user icon to app bar
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import {  Link } from 'react-router-dom';
 | 
			
		||||
import { Link } from 'react-router-dom';
 | 
			
		||||
 | 
			
		||||
import { withStyles } from '@material-ui/core/styles';
 | 
			
		||||
import Drawer from '@material-ui/core/Drawer';
 | 
			
		||||
@@ -10,20 +10,28 @@ import Typography from '@material-ui/core/Typography';
 | 
			
		||||
import IconButton from '@material-ui/core/IconButton';
 | 
			
		||||
import Hidden from '@material-ui/core/Hidden';
 | 
			
		||||
import Divider from '@material-ui/core/Divider';
 | 
			
		||||
import Grow from '@material-ui/core/Grow';
 | 
			
		||||
import MenuItem from '@material-ui/core/MenuItem';
 | 
			
		||||
import MenuList from '@material-ui/core/MenuList';
 | 
			
		||||
 | 
			
		||||
import List from '@material-ui/core/List';
 | 
			
		||||
import ListItem from '@material-ui/core/ListItem';
 | 
			
		||||
import ListItemIcon from '@material-ui/core/ListItemIcon';
 | 
			
		||||
import ListItemText from '@material-ui/core/ListItemText';
 | 
			
		||||
 | 
			
		||||
import Popper from '@material-ui/core/Popper';
 | 
			
		||||
import MenuIcon from '@material-ui/icons/Menu';
 | 
			
		||||
import WifiIcon from '@material-ui/icons/Wifi';
 | 
			
		||||
import SystemUpdateIcon from  '@material-ui/icons/SystemUpdate';
 | 
			
		||||
import SystemUpdateIcon from '@material-ui/icons/SystemUpdate';
 | 
			
		||||
import AccessTimeIcon from '@material-ui/icons/AccessTime';
 | 
			
		||||
import AccountCircleIcon from '@material-ui/icons/AccountCircle';
 | 
			
		||||
import SettingsInputAntennaIcon from '@material-ui/icons/SettingsInputAntenna';
 | 
			
		||||
import LockIcon from '@material-ui/icons/Lock';
 | 
			
		||||
 | 
			
		||||
import ClickAwayListener from '@material-ui/core/ClickAwayListener';
 | 
			
		||||
 | 
			
		||||
import Paper from '@material-ui/core/Paper';
 | 
			
		||||
 | 
			
		||||
import { APP_NAME } from '../constants/App';
 | 
			
		||||
import { withAuthenticationContext } from '../authentication/Context.js';
 | 
			
		||||
 | 
			
		||||
@@ -31,79 +39,76 @@ const drawerWidth = 290;
 | 
			
		||||
 | 
			
		||||
const styles = theme => ({
 | 
			
		||||
  root: {
 | 
			
		||||
    zIndex: 1,
 | 
			
		||||
    width: '100%',
 | 
			
		||||
    height: '100%',
 | 
			
		||||
  },
 | 
			
		||||
  toolbar: {
 | 
			
		||||
    paddingLeft: theme.spacing.unit,
 | 
			
		||||
    paddingRight:  theme.spacing.unit,
 | 
			
		||||
    [theme.breakpoints.up('md')]: {
 | 
			
		||||
      paddingLeft: theme.spacing.unit * 3,
 | 
			
		||||
      paddingRight: theme.spacing.unit  * 3,
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  appFrame: {
 | 
			
		||||
    position: 'relative',
 | 
			
		||||
    display: 'flex',
 | 
			
		||||
    width: '100%',
 | 
			
		||||
    height: '100%',
 | 
			
		||||
  },
 | 
			
		||||
  drawer: {
 | 
			
		||||
    [theme.breakpoints.up('md')]: {
 | 
			
		||||
      width: drawerWidth,
 | 
			
		||||
      flexShrink: 0,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  title: {
 | 
			
		||||
    flexGrow: 1
 | 
			
		||||
  },
 | 
			
		||||
  appBar: {
 | 
			
		||||
    position: 'absolute',
 | 
			
		||||
    marginLeft: drawerWidth,
 | 
			
		||||
    [theme.breakpoints.up('md')]: {
 | 
			
		||||
      width: `calc(100% - ${drawerWidth}px)`,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  navIconHide: {
 | 
			
		||||
  menuButton: {
 | 
			
		||||
    marginRight: theme.spacing(2),
 | 
			
		||||
    [theme.breakpoints.up('md')]: {
 | 
			
		||||
      display: 'none',
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  toolbar: theme.mixins.toolbar,
 | 
			
		||||
  drawerPaper: {
 | 
			
		||||
    width: drawerWidth,
 | 
			
		||||
    height: '100%',
 | 
			
		||||
    [theme.breakpoints.up('md')]: {
 | 
			
		||||
      width: drawerWidth,
 | 
			
		||||
      position:'fixed',
 | 
			
		||||
      left:0,
 | 
			
		||||
      top:0,
 | 
			
		||||
      overflow:'auto'
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  content: {
 | 
			
		||||
    backgroundColor: theme.palette.background.default,
 | 
			
		||||
    width:"100%",
 | 
			
		||||
    marginTop: 56,
 | 
			
		||||
    [theme.breakpoints.up('md')]: {
 | 
			
		||||
      paddingLeft: drawerWidth
 | 
			
		||||
    },
 | 
			
		||||
    [theme.breakpoints.up('sm')]: {
 | 
			
		||||
      height: 'calc(100% - 64px)',
 | 
			
		||||
      marginTop: 64,
 | 
			
		||||
    },
 | 
			
		||||
    flexGrow: 1,
 | 
			
		||||
    padding: theme.spacing(),
 | 
			
		||||
  },
 | 
			
		||||
  popper: {
 | 
			
		||||
    zIndex: 3300
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
class MenuAppBar extends React.Component {
 | 
			
		||||
  state = {
 | 
			
		||||
    mobileOpen: false,
 | 
			
		||||
    authMenuOpen: false
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  anchorRef = React.createRef();
 | 
			
		||||
 | 
			
		||||
  handleToggle = () => {
 | 
			
		||||
    this.setState({ authMenuOpen: !this.state.authMenuOpen });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleClose = (event) => {
 | 
			
		||||
    if (this.anchorRef.current && this.anchorRef.current.contains(event.target)) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.setState({ authMenuOpen: false });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  handleDrawerToggle = () => {
 | 
			
		||||
    this.setState({ mobileOpen: !this.state.mobileOpen });
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  render() {
 | 
			
		||||
    const { classes, theme, children, sectionTitle, authenticationContext } = this.props;
 | 
			
		||||
    const { mobileOpen, authMenuOpen } = this.state;
 | 
			
		||||
 | 
			
		||||
    const drawer = (
 | 
			
		||||
      <div>
 | 
			
		||||
        <Toolbar>
 | 
			
		||||
            <Typography variant="h6" color="primary">
 | 
			
		||||
              {APP_NAME}
 | 
			
		||||
            </Typography>
 | 
			
		||||
          <Typography variant="h6" color="primary">
 | 
			
		||||
            {APP_NAME}
 | 
			
		||||
          </Typography>
 | 
			
		||||
          <Divider absolute />
 | 
			
		||||
        </Toolbar>
 | 
			
		||||
        <Divider />
 | 
			
		||||
@@ -137,13 +142,6 @@ class MenuAppBar extends React.Component {
 | 
			
		||||
              <LockIcon />
 | 
			
		||||
            </ListItemIcon>
 | 
			
		||||
            <ListItemText primary="Security" />
 | 
			
		||||
          </ListItem>          
 | 
			
		||||
          <Divider />
 | 
			
		||||
          <ListItem button onClick={authenticationContext.signOut}>
 | 
			
		||||
            <ListItemIcon>
 | 
			
		||||
              <AccountCircleIcon />
 | 
			
		||||
            </ListItemIcon>
 | 
			
		||||
            <ListItemText primary="Sign Out" secondary={"Signed in as: "+ authenticationContext.jwt.username} />
 | 
			
		||||
          </ListItem>
 | 
			
		||||
        </List>
 | 
			
		||||
      </div>
 | 
			
		||||
@@ -151,33 +149,66 @@ class MenuAppBar extends React.Component {
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className={classes.root}>
 | 
			
		||||
        <div className={classes.appFrame}>
 | 
			
		||||
          <AppBar className={classes.appBar}>
 | 
			
		||||
            <Toolbar className={classes.toolbar} disableGutters={true}>
 | 
			
		||||
        <AppBar position="fixed" className={classes.appBar}>
 | 
			
		||||
          <Toolbar>
 | 
			
		||||
            <IconButton
 | 
			
		||||
              color="inherit"
 | 
			
		||||
              aria-label="Open drawer"
 | 
			
		||||
              edge="start"
 | 
			
		||||
              onClick={this.handleDrawerToggle}
 | 
			
		||||
              className={classes.menuButton}
 | 
			
		||||
            >
 | 
			
		||||
              <MenuIcon />
 | 
			
		||||
            </IconButton>
 | 
			
		||||
            <Typography variant="h6" color="inherit" noWrap className={classes.title}>
 | 
			
		||||
              {sectionTitle}
 | 
			
		||||
            </Typography>
 | 
			
		||||
            <div>
 | 
			
		||||
              <IconButton
 | 
			
		||||
                ref={this.anchorRef}
 | 
			
		||||
                aria-owns={authMenuOpen ? 'menu-list-grow' : undefined}
 | 
			
		||||
                aria-haspopup="true"
 | 
			
		||||
                onClick={this.handleToggle}
 | 
			
		||||
                color="inherit"
 | 
			
		||||
                aria-label="open drawer"
 | 
			
		||||
                onClick={this.handleDrawerToggle}
 | 
			
		||||
                className={classes.navIconHide}
 | 
			
		||||
              >
 | 
			
		||||
                <MenuIcon />
 | 
			
		||||
                <AccountCircleIcon />
 | 
			
		||||
              </IconButton>
 | 
			
		||||
              <Typography variant="h6" color="inherit" noWrap>
 | 
			
		||||
                {sectionTitle}
 | 
			
		||||
              </Typography>
 | 
			
		||||
            </Toolbar>
 | 
			
		||||
          </AppBar>
 | 
			
		||||
          <Hidden mdUp>
 | 
			
		||||
              <Popper open={authMenuOpen} anchorEl={this.anchorRef.current} transition disablePortal>
 | 
			
		||||
                {({ TransitionProps, placement }) => (
 | 
			
		||||
                  <Grow
 | 
			
		||||
                    {...TransitionProps}
 | 
			
		||||
                    style={{ transformOrigin: placement === 'bottom' ? 'center top' : 'center bottom' }}
 | 
			
		||||
                  >
 | 
			
		||||
                    <Paper id="menu-list-grow">
 | 
			
		||||
                      <ClickAwayListener onClickAway={this.handleClose}>
 | 
			
		||||
                        <MenuList>
 | 
			
		||||
                          <MenuItem button onClick={authenticationContext.signOut}>
 | 
			
		||||
                            <ListItemIcon>
 | 
			
		||||
                              <AccountCircleIcon />
 | 
			
		||||
                            </ListItemIcon>
 | 
			
		||||
                            <ListItemText primary="Sign Out" secondary={"Signed in as: " + authenticationContext.jwt.username} />
 | 
			
		||||
                          </MenuItem>
 | 
			
		||||
                        </MenuList>
 | 
			
		||||
                      </ClickAwayListener>
 | 
			
		||||
                    </Paper>
 | 
			
		||||
                  </Grow>
 | 
			
		||||
                )}
 | 
			
		||||
              </Popper>
 | 
			
		||||
            </div>
 | 
			
		||||
          </Toolbar>
 | 
			
		||||
        </AppBar>
 | 
			
		||||
        <nav className={classes.drawer}>
 | 
			
		||||
          <Hidden mdUp implementation="css">
 | 
			
		||||
            <Drawer
 | 
			
		||||
              variant="temporary"
 | 
			
		||||
              anchor={theme.direction === 'rtl' ? 'right' : 'left'}
 | 
			
		||||
              open={this.state.mobileOpen}
 | 
			
		||||
              open={mobileOpen}
 | 
			
		||||
              onClose={this.handleDrawerToggle}
 | 
			
		||||
              classes={{
 | 
			
		||||
                paper: classes.drawerPaper,
 | 
			
		||||
              }}
 | 
			
		||||
              onClose={this.handleDrawerToggle}
 | 
			
		||||
              ModalProps={{
 | 
			
		||||
                keepMounted: true, // Better open performance on mobile.
 | 
			
		||||
                keepMounted: true,
 | 
			
		||||
              }}
 | 
			
		||||
            >
 | 
			
		||||
              {drawer}
 | 
			
		||||
@@ -185,19 +216,20 @@ class MenuAppBar extends React.Component {
 | 
			
		||||
          </Hidden>
 | 
			
		||||
          <Hidden smDown implementation="css">
 | 
			
		||||
            <Drawer
 | 
			
		||||
              variant="permanent"
 | 
			
		||||
              open
 | 
			
		||||
              classes={{
 | 
			
		||||
                paper: classes.drawerPaper,
 | 
			
		||||
              }}
 | 
			
		||||
              variant="permanent"
 | 
			
		||||
              open
 | 
			
		||||
            >
 | 
			
		||||
              {drawer}
 | 
			
		||||
            </Drawer>
 | 
			
		||||
          </Hidden>
 | 
			
		||||
          <main className={classes.content}>
 | 
			
		||||
            {children}
 | 
			
		||||
          </main>
 | 
			
		||||
        </div>
 | 
			
		||||
        </nav>
 | 
			
		||||
        <main className={classes.content}>
 | 
			
		||||
          <div className={classes.toolbar} />
 | 
			
		||||
          {children}
 | 
			
		||||
        </main>
 | 
			
		||||
      </div>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -239,7 +239,7 @@ class ManageUsersForm extends React.Component {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ManageUsersForm.propTypes = {
 | 
			
		||||
  authenticationContex: PropTypes.object.isRequired,
 | 
			
		||||
  authenticationContext: PropTypes.object.isRequired,
 | 
			
		||||
  classes: PropTypes.object.isRequired,
 | 
			
		||||
  userData: PropTypes.object,
 | 
			
		||||
  userDataFetched: PropTypes.bool.isRequired,
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ class UserForm extends React.Component {
 | 
			
		||||
      <ValidatorForm onSubmit={onDoneEditing} ref={this.formRef}>
 | 
			
		||||
        <Dialog onClose={onCancelEditing} aria-labelledby="user-form-dialog-title" open={true} scroll="paper">
 | 
			
		||||
          <DialogTitle id="user-form-dialog-title">{creating ? 'Create' : 'Modify'} User</DialogTitle>
 | 
			
		||||
          <DialogContent>
 | 
			
		||||
          <DialogContent dividers={true}>
 | 
			
		||||
            <TextValidator
 | 
			
		||||
              validators={creating ? ['required', 'uniqueUsername', 'matchRegexp:^[a-zA-Z0-9_\\.]{1,24}$'] : []}
 | 
			
		||||
              errorMessages={creating ? ['Username is required', "That username already exists", "Must be 1-24 characters: alpha numberic, '_' or '.'"] : []}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user