fleet/frontend/components/SidePanel/SidePanel.jsx
Mike Stone bba69412b9 Side panel (#216)
* admin layout component

* Admin Dashboard page

* styleguide

* AdminSidePanel component

* Use Kolide logo

* Renames AdminSidePanel to SidePanel

* Avatar component to render user's gravatar image

* Adds CoreLayout with rendered SidePanel
2016-09-20 20:07:32 -07:00

169 lines
3.9 KiB
JavaScript

import React, { Component, PropTypes } from 'react';
import { isEqual, last } from 'lodash';
import componentStyles from './styles';
import kolideLogo from '../../../assets/images/kolide-logo.svg';
import navItems from './navItems';
class SidePanel extends Component {
static propTypes = {
user: PropTypes.object,
};
constructor (props) {
super(props);
this.state = {
activeTab: 'Hosts',
activeSubItem: 'Add Hosts',
};
}
setActiveTab = (activeTab) => {
return (evt) => {
evt.preventDefault();
this.setState({ activeTab });
return false;
};
}
setActiveSubItem = (activeSubItem) => {
return (evt) => {
evt.preventDefault();
this.setState({ activeSubItem });
return false;
};
}
renderHeader = () => {
const {
user: {
enabled,
username,
},
} = this.props;
const {
companyLogoStyles,
headerStyles,
orgNameStyles,
usernameStyles,
userStatusStyles,
} = componentStyles;
return (
<header style={headerStyles}>
<img
alt="Company logo"
src={kolideLogo}
style={companyLogoStyles}
/>
<h1 style={orgNameStyles}>Kolide, Inc.</h1>
<div style={userStatusStyles(enabled)} />
<h2 style={usernameStyles}>{username}</h2>
</header>
);
}
renderNavItem = (navItem, lastChild) => {
const { activeTab } = this.state;
const { icon, name, subItems } = navItem;
const active = activeTab === name;
const {
iconStyles,
navItemBeforeStyles,
navItemNameStyles,
navItemStyles,
navItemWrapperStyles,
} = componentStyles;
const { renderSubItems, setActiveTab } = this;
return (
<div style={navItemWrapperStyles(lastChild)} key={`nav-item-${name}`}>
{active && <div style={navItemBeforeStyles} />}
<li
onClick={setActiveTab(name)}
style={navItemStyles(active)}
>
<div style={{ position: 'relative' }}>
<i className={icon} style={iconStyles} />
<span style={navItemNameStyles}>
{name}
</span>
</div>
{active && renderSubItems(subItems)}
</li>
</div>
);
}
renderNavItems = () => {
const { renderNavItem } = this;
const { navItemListStyles } = componentStyles;
const { user: { admin } } = this.props;
const userNavItems = navItems(admin);
return (
<ul style={navItemListStyles}>
{userNavItems.map((navItem, index, collection) => {
const lastChild = admin && isEqual(navItem, last(collection));
return renderNavItem(navItem, lastChild);
})}
</ul>
);
}
renderSubItem = (subItem) => {
const { activeSubItem } = this.state;
const { name, path } = subItem;
const active = activeSubItem === name;
const { setActiveSubItem } = this;
const {
subItemBeforeStyles,
subItemStyles,
subItemLinkStyles,
} = componentStyles;
return (
<div
key={`sub-item-${name}`}
style={{ position: 'relative' }}
>
{active && <div style={subItemBeforeStyles} />}
<li
onClick={setActiveSubItem(name)}
style={subItemStyles(active)}
>
<span to={path} style={subItemLinkStyles(active)}>{name}</span>
</li>
</div>
);
}
renderSubItems = (subItems) => {
const { subItemsStyles } = componentStyles;
const { renderSubItem } = this;
return (
<ul style={subItemsStyles}>
{subItems.map(subItem => {
return renderSubItem(subItem);
})}
</ul>
);
}
render () {
const { navStyles } = componentStyles;
const { renderHeader, renderNavItems } = this;
return (
<nav style={navStyles}>
{renderHeader()}
{renderNavItems()}
</nav>
);
}
}
export default SidePanel;