diff options
| author | Dayana31 <[email protected]> | 2022-04-21 17:27:08 -0500 | 
|---|---|---|
| committer | Dayana31 <[email protected]> | 2022-04-21 17:27:08 -0500 | 
| commit | 67c50667678dd0ce4709b29a854f6a47093a1ac5 (patch) | |
| tree | b6f9f39092ad54bf6b815984d32b37d7c7ca67ab /front/odiparpack/app/components/Sidebar | |
| parent | 91140b24f0d49a9f89a080ee063e9eb023a4b73a (diff) | |
| parent | e13e630cd6e4fc0b1ff92098a28a770794c7bb9a (diff) | |
| download | DP1_project-67c50667678dd0ce4709b29a854f6a47093a1ac5.tar.gz DP1_project-67c50667678dd0ce4709b29a854f6a47093a1ac5.tar.bz2 DP1_project-67c50667678dd0ce4709b29a854f6a47093a1ac5.zip | |
Merge branch 'gabshr' into dayana
Diffstat (limited to 'front/odiparpack/app/components/Sidebar')
| -rw-r--r-- | front/odiparpack/app/components/Sidebar/MainMenu.js | 130 | ||||
| -rw-r--r-- | front/odiparpack/app/components/Sidebar/OtherMenu.js | 44 | ||||
| -rw-r--r-- | front/odiparpack/app/components/Sidebar/Sidebar.js | 122 | ||||
| -rw-r--r-- | front/odiparpack/app/components/Sidebar/sidebar-jss.js | 205 | 
4 files changed, 501 insertions, 0 deletions
| diff --git a/front/odiparpack/app/components/Sidebar/MainMenu.js b/front/odiparpack/app/components/Sidebar/MainMenu.js new file mode 100644 index 0000000..edeb420 --- /dev/null +++ b/front/odiparpack/app/components/Sidebar/MainMenu.js @@ -0,0 +1,130 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withStyles } from '@material-ui/core/styles'; +import classNames from 'classnames'; +import { bindActionCreators } from 'redux'; +import { connect } from 'react-redux'; +import { NavLink } from 'react-router-dom'; +import ExpandLess from '@material-ui/icons/ExpandLess'; +import ExpandMore from '@material-ui/icons/ExpandMore'; +// Menu Object +import MenuContent from 'ba-api/menu'; +import { List, ListItem, ListItemIcon, ListItemText, Collapse, Icon } from '@material-ui/core'; +import styles from './sidebar-jss'; + +function sortByKey(array, key) { +  return array.sort((a, b) => { +    const x = a[key]; const y = b[key]; +    return ((x < y) ? -1 : ((x > y) ? 1 : 0)); +  }); +} + +const LinkBtn = React.forwardRef(function LinkBtn(props, ref) { // eslint-disable-line +  return <NavLink to={props.to} {...props} innerRef={ref} />; // eslint-disable-line +}); + +function MainMenu(props) { +  const { +    classes, +    toggleDrawerOpen, +    loadTransition, +    openSubMenu, +    open, +  } = props; + +  const handleClick = () => { +    toggleDrawerOpen(); +    loadTransition(false); +  }; + +  const getMenus = menuArray => menuArray.map((item, index) => { +    if (item.child) { +      return ( +        <div key={index.toString()}> +          <ListItem +            button +            className={classNames(classes.head, open.indexOf(item.key) > -1 ? classes.opened : '')} +            onClick={() => openSubMenu(item.key, item.keyParent)} +          > +            {item.icon +              && ( +                <ListItemIcon className={classes.iconWrapper}> +                  <Icon className={classes.icon}>{item.icon}</Icon> +                </ListItemIcon> +              ) +            } +            <ListItemText classes={{ primary: classes.primary }} variant="inset" primary={item.name} /> +            { open.indexOf(item.key) > -1 ? <ExpandLess /> : <ExpandMore /> } +          </ListItem> +          <Collapse +            component="li" +            className={classNames( +              classes.nolist, +              (item.keyParent ? classes.child : ''), +            )} +            in={open.indexOf(item.key) > -1} +            timeout="auto" +            unmountOnExit +          > +            <List className={classes.dense} dense> +              { getMenus(sortByKey(item.child, 'key')) } +            </List> +          </Collapse> +        </div> +      ); +    } +    return ( +      <ListItem +        key={index.toString()} +        button +        exact +        className={classes.nested} +        activeClassName={classes.active} +        component={LinkBtn} +        to={item.link} +        onClick={handleClick} +      > +        {item.icon +          && ( +            <ListItemIcon> +              <Icon className={classes.icon}>{item.icon}</Icon> +            </ListItemIcon> +          ) +        } +        <ListItemText classes={{ primary: classes.primary }} inset primary={item.name} /> +      </ListItem> +    ); +  }); +  return ( +    <div> +      {getMenus(MenuContent)} +    </div> +  ); +} + +MainMenu.propTypes = { +  classes: PropTypes.object.isRequired, +  open: PropTypes.object.isRequired, +  openSubMenu: PropTypes.func.isRequired, +  toggleDrawerOpen: PropTypes.func.isRequired, +  loadTransition: PropTypes.func.isRequired, +}; + +const openAction = (key, keyParent) => ({ type: 'OPEN_SUBMENU', key, keyParent }); +const reducer = 'ui'; + +const mapStateToProps = state => ({ +  force: state, // force active class for sidebar menu +  open: state.getIn([reducer, 'subMenuOpen']) +}); + +const mapDispatchToProps = dispatch => ({ +  openSubMenu: bindActionCreators(openAction, dispatch) +}); + +const MainMenuMapped = connect( +  mapStateToProps, +  mapDispatchToProps +)(MainMenu); + +export default withStyles(styles)(MainMenuMapped); diff --git a/front/odiparpack/app/components/Sidebar/OtherMenu.js b/front/odiparpack/app/components/Sidebar/OtherMenu.js new file mode 100644 index 0000000..ea2f597 --- /dev/null +++ b/front/odiparpack/app/components/Sidebar/OtherMenu.js @@ -0,0 +1,44 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { withStyles } from '@material-ui/core/styles'; +import { NavLink } from 'react-router-dom'; +import OtherMenuContent from 'ba-api/otherMenu'; +import { ListItem, ListItemText } from '@material-ui/core'; +import styles from './sidebar-jss'; + +const LinkBtn = React.forwardRef(function LinkBtn(props, ref) { // eslint-disable-line +  return <NavLink to={props.to} {...props} innerRef={ref} />; // eslint-disable-line +}); + +function OtherMenu(props) { +  const { toggleDrawerOpen, classes } = props; +  const getOtherMenu = menuArray => menuArray.map((item, index) => { +    const keyIndex = index.toString(); +    return ( +      <div key={keyIndex}> +        <ListItem +          button +          component={LinkBtn} +          to={item.link} +          activeClassName={classes.active} +          onClick={toggleDrawerOpen} +        > +          <ListItemText secondary={item.name} /> +        </ListItem> +      </div> +    ); +  }); + +  return ( +    <div> +      {getOtherMenu(OtherMenuContent)} +    </div> +  ); +} + +OtherMenu.propTypes = { +  classes: PropTypes.object.isRequired, +  toggleDrawerOpen: PropTypes.func.isRequired, +}; + +export default withStyles(styles)(OtherMenu); diff --git a/front/odiparpack/app/components/Sidebar/Sidebar.js b/front/odiparpack/app/components/Sidebar/Sidebar.js new file mode 100644 index 0000000..01de4ec --- /dev/null +++ b/front/odiparpack/app/components/Sidebar/Sidebar.js @@ -0,0 +1,122 @@ +import React, { Fragment } from 'react'; +import PropTypes from 'prop-types'; +import { withStyles } from '@material-ui/core/styles'; +import classNames from 'classnames'; +import brand from 'ba-api/brand'; +import dummy from 'ba-api/dummyContents'; +import logo from 'ba-images/logo.svg'; +import { Hidden, Drawer, SwipeableDrawer, List, Divider, Avatar } from '@material-ui/core'; +import MainMenu from './MainMenu'; +import OtherMenu from './OtherMenu'; +import styles from './sidebar-jss'; + +const MenuContent = props => { +  const { +    classes, +    turnDarker, +    drawerPaper, +    toggleDrawerOpen, +    loadTransition +  } = props; +  return ( +    <div className={classNames(classes.drawerInner, !drawerPaper ? classes.drawerPaperClose : '')}> +      <div className={classes.drawerHeader}> +        <div className={classNames(classes.brand, classes.brandBar, turnDarker && classes.darker)}> +          <img src={logo} alt={brand.name} /> +          <h3>{brand.name}</h3> +        </div> +        <div className={classNames(classes.profile, classes.user)}> +          <Avatar +            alt={dummy.user.name} +            src={dummy.user.avatar} +            className={classNames(classes.avatar, classes.bigAvatar)} +          /> +          <div> +            <h4>{dummy.user.name}</h4> +            <span>{dummy.user.title}</span> +          </div> +        </div> +      </div> +      <div className={classes.menuContainer}> +        <MainMenu loadTransition={loadTransition} toggleDrawerOpen={toggleDrawerOpen} /> +        <Divider className={classes.divider} /> +        <List> +          <OtherMenu toggleDrawerOpen={toggleDrawerOpen} /> +        </List> +      </div> +    </div> +  ); +}; + +MenuContent.propTypes = { +  classes: PropTypes.object.isRequired, +  drawerPaper: PropTypes.bool.isRequired, +  turnDarker: PropTypes.bool, +  toggleDrawerOpen: PropTypes.func, +  loadTransition: PropTypes.func, +}; + +MenuContent.defaultProps = { +  turnDarker: false +}; + +MenuContent.defaultProps = { +  toggleDrawerOpen: () => {}, +  loadTransition: () => {}, +}; + +const MenuContentStyle = withStyles(styles)(MenuContent); + +function Sidebar(props) { +  const { +    classes, +    open, +    toggleDrawerOpen, +    loadTransition, +    turnDarker +  } = props; + +  return ( +    <Fragment> +      <Hidden lgUp> +        <SwipeableDrawer +          onClose={toggleDrawerOpen} +          onOpen={toggleDrawerOpen} +          open={!open} +          anchor="left" +        > +          <div className={classes.swipeDrawerPaper}> +            <MenuContentStyle drawerPaper toggleDrawerOpen={toggleDrawerOpen} loadTransition={loadTransition} /> +          </div> +        </SwipeableDrawer> +      </Hidden> +      <Hidden mdDown> +        <Drawer +          variant="permanent" +          onClose={toggleDrawerOpen} +          classes={{ +            paper: classNames(classes.drawer, classes.drawerPaper, !open ? classes.drawerPaperClose : ''), +          }} +          open={open} +          anchor="left" +        > +          <MenuContentStyle +            drawerPaper={open} +            turnDarker={turnDarker} +            loadTransition={loadTransition} +          /> +        </Drawer> +      </Hidden> +    </Fragment> +  ); +} + +Sidebar.propTypes = { +  classes: PropTypes.object.isRequired, +  toggleDrawerOpen: PropTypes.func.isRequired, +  loadTransition: PropTypes.func.isRequired, +  turnDarker: PropTypes.bool.isRequired, +  open: PropTypes.bool.isRequired, +}; + +export default withStyles(styles)(Sidebar); diff --git a/front/odiparpack/app/components/Sidebar/sidebar-jss.js b/front/odiparpack/app/components/Sidebar/sidebar-jss.js new file mode 100644 index 0000000..e9bf4f6 --- /dev/null +++ b/front/odiparpack/app/components/Sidebar/sidebar-jss.js @@ -0,0 +1,205 @@ +const drawerWidth = 240; +const styles = theme => ({ +  user: { +    justifyContent: 'center' +  }, +  drawerPaper: { +    position: 'relative', +    height: '100%', +    overflow: 'hidden', +    backgroundColor: theme.palette.background.default, +    border: 'none', +    width: drawerWidth, +    transition: theme.transitions.create('width', { +      easing: theme.transitions.easing.sharp, +      duration: theme.transitions.duration.enteringScreen, +    }), +  }, +  swipeDrawerPaper: { +    width: drawerWidth, +  }, +  opened: { +    background: theme.palette.grey[200], +    '& $primary, & $icon': { +      color: theme.palette.secondary.dark, +    }, +  }, +  drawerInner: { +    height: '100%', +    position: 'fixed', +    width: drawerWidth, +  }, +  drawerPaperClose: { +    width: 66, +    position: 'fixed', +    overflowX: 'hidden', +    transition: theme.transitions.create('width', { +      easing: theme.transitions.easing.sharp, +      duration: theme.transitions.duration.leavingScreen, +    }), +    '& $user': { +      justifyContent: 'flex-start' +    }, +    '& $bigAvatar': { +      width: 40, +      height: 40, +    }, +    '& li ul': { +      display: 'none' +    }, +    '&:hover': { +      width: drawerWidth, +      boxShadow: theme.shadows[6], +      '& li ul': { +        display: 'block' +      } +    }, +    '& $menuContainer': { +      paddingLeft: theme.spacing(1.5), +      paddingRight: theme.spacing(1.5), +      width: drawerWidth, +    }, +    '& $drawerInner': { +      width: 'auto' +    }, +    '& $brandBar': { +      opacity: 0 +    } +  }, +  drawerHeader: { +    background: theme.palette.primary.main, +    color: theme.palette.primary.contrastText, +    padding: '0', +    ...theme.mixins.toolbar, +    '& h3': { +      color: theme.palette.primary.contrastText, +    } +  }, +  avatar: { +    margin: 10, +  }, +  bigAvatar: { +    width: 80, +    height: 80, +  }, +  brandBar: { +    transition: theme.transitions.create(['width', 'margin', 'background'], { +      easing: theme.transitions.easing.sharp, +      duration: theme.transitions.duration.enteringScreen, +    }), +    '&:after': { +      transition: theme.transitions.create(['box-shadow'], { +        easing: theme.transitions.easing.sharp, +        duration: theme.transitions.duration.enteringScreen, +      }), +    } +  }, +  darker: { +    background: theme.palette.primary.dark, +  }, +  title: {}, +  nested: { +    paddingLeft: 0, +    paddingTop: theme.spacing(0.5), +    paddingBottom: theme.spacing(0.5), +    '& > div > span': { +      fontSize: '0.8125rem' +    } +  }, +  child: { +    '& a': { +      paddingLeft: theme.spacing(3), +    } +  }, +  dense: { +    '& > $title:first-child': { +      margin: '0' +    }, +    '& $head': { +      paddingLeft: theme.spacing(7) +    } +  }, +  active: { +    backgroundColor: theme.palette.primary.light, +    '& $primary, & $icon': { +      color: theme.palette.secondary.dark, +    }, +    '&:hover': { +      backgroundColor: theme.palette.primary.light, +    } +  }, +  nolist: { +    listStyle: 'none', +  }, +  primary: {}, +  iconWrapper: { +    width: theme.spacing(5), +    minWidth: 0, +    marginRight: 0, +    marginLeft: theme.spacing(2) +  }, +  icon: { +    marginRight: 0, +    color: theme.palette.secondary.dark, +  }, +  head: { +    paddingLeft: 0 +  }, +  brand: { +    display: 'flex', +    alignItems: 'center', +    justifyContent: 'center', +    padding: '10px 10px 5px', +    height: 64, +    position: 'relative', +    '& img': { +      width: 20 +    }, +    '& h3': { +      fontSize: 16, +      margin: 0, +      paddingLeft: 10, +      fontWeight: 500 +    } +  }, +  profile: { +    height: 120, +    display: 'flex', +    fontSize: 14, +    padding: 10, +    alignItems: 'center', +    '& h4': { +      fontSize: 18, +      marginBottom: 0, +      textOverflow: 'ellipsis', +      overflow: 'hidden', +      whiteSpace: 'nowrap', +      width: 110 +    }, +    '& span': { +      fontSize: 12, +      textOverflow: 'ellipsis', +      whiteSpace: 'nowrap', +      width: 110, +      display: 'block', +      overflow: 'hidden' +    } +  }, +  menuContainer: { +    padding: theme.spacing(1), +    background: theme.palette.background.default, +    [theme.breakpoints.up('lg')]: { +      padding: theme.spacing(1.5), +    }, +    paddingRight: theme.spacing(1), +    overflow: 'auto', +    height: 'calc(100% - 185px)', +    position: 'relative', +    display: 'block' +  }, +  divider: { +    marginTop: theme.spacing(1) +  } +}); + +export default styles; | 
