From 6826bd5b6aa611186e6e4aede4e8a7e612ec3933 Mon Sep 17 00:00:00 2001 From: Mike Stone Date: Mon, 5 Dec 2016 12:55:30 -0500 Subject: [PATCH] Nav bar fixes (#569) * Main nav item click brings user to default sub nav item * Converts SiteNavHeader to a dumb component * Stop passing dispatch to the FlashMessage component --- .../components/FlashMessage/FlashMessage.jsx | 21 +--- .../SiteNavHeader/SiteNavHeader.jsx | 24 ++--- .../SiteNavSidePanel/SiteNavSidePanel.jsx | 95 ++++--------------- .../side_panels/SiteNavSidePanel/helpers.js | 23 ----- .../side_panels/SiteNavSidePanel/navItems.js | 62 ++++++------ frontend/layouts/CoreLayout/CoreLayout.jsx | 51 +++++++++- 6 files changed, 106 insertions(+), 170 deletions(-) delete mode 100644 frontend/components/side_panels/SiteNavSidePanel/helpers.js diff --git a/frontend/components/FlashMessage/FlashMessage.jsx b/frontend/components/FlashMessage/FlashMessage.jsx index 723b3b6afc..4f1e5e58b7 100644 --- a/frontend/components/FlashMessage/FlashMessage.jsx +++ b/frontend/components/FlashMessage/FlashMessage.jsx @@ -1,24 +1,12 @@ import React, { PropTypes } from 'react'; -import { hideFlash } from '../../redux/nodes/notifications/actions'; import notificationInterface from '../../interfaces/notification'; const baseClass = 'flash-message'; -const FlashMessage = ({ notification, dispatch }) => { +const FlashMessage = ({ notification, onRemoveFlash, onUndoActionClick }) => { const { alertType, isVisible, message, undoAction } = notification; - const submitUndoAction = () => { - dispatch(undoAction); - dispatch(hideFlash); - return false; - }; - - const removeFlashMessage = () => { - dispatch(hideFlash); - return false; - }; - if (!isVisible) { return false; } @@ -31,13 +19,13 @@ const FlashMessage = ({ notification, dispatch }) => {
@@ -47,8 +35,9 @@ const FlashMessage = ({ notification, dispatch }) => { }; FlashMessage.propTypes = { - dispatch: PropTypes.func, notification: notificationInterface, + onRemoveFlash: PropTypes.func, + onUndoActionClick: PropTypes.func, }; export default FlashMessage; diff --git a/frontend/components/side_panels/SiteNavHeader/SiteNavHeader.jsx b/frontend/components/side_panels/SiteNavHeader/SiteNavHeader.jsx index 08584876cd..4f5b1c7cb0 100644 --- a/frontend/components/side_panels/SiteNavHeader/SiteNavHeader.jsx +++ b/frontend/components/side_panels/SiteNavHeader/SiteNavHeader.jsx @@ -1,19 +1,17 @@ import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; import classnames from 'classnames'; import configInterface from 'interfaces/config'; -import { logoutUser } from 'redux/nodes/auth/actions'; import userInterface from 'interfaces/user'; import Icon from 'components/Icon'; import kolideLogo from '../../../../assets/images/kolide-logo.svg'; import UserMenu from './UserMenu'; -class SiteNavSidePanel extends Component { +class SiteNavHeader extends Component { static propTypes = { config: configInterface, - dispatch: PropTypes.func, + onLogoutUser: PropTypes.func, user: userInterface, }; @@ -31,16 +29,6 @@ class SiteNavSidePanel extends Component { document.addEventListener('mousedown', closeUserMenu, false); } - onLogout = (evt) => { - evt.preventDefault(); - - const { dispatch } = this.props; - - dispatch(logoutUser()); - - return false; - } - closeUserMenu = (evt) => { const { headerNav } = this; @@ -61,11 +49,12 @@ class SiteNavSidePanel extends Component { config: { org_name: orgName, }, + onLogoutUser, user, } = this.props; const { userMenuOpened } = this.state; - const { onLogout, toggleUserMenu } = this; + const { toggleUserMenu } = this; const { enabled, username } = user; const headerBaseClass = 'site-nav-header'; @@ -99,7 +88,7 @@ class SiteNavSidePanel extends Component { @@ -108,5 +97,4 @@ class SiteNavSidePanel extends Component { } } -const ConnectedComponent = connect()(SiteNavSidePanel); -export default ConnectedComponent; +export default SiteNavHeader; diff --git a/frontend/components/side_panels/SiteNavSidePanel/SiteNavSidePanel.jsx b/frontend/components/side_panels/SiteNavSidePanel/SiteNavSidePanel.jsx index 4f06bcc642..6b15aed189 100644 --- a/frontend/components/side_panels/SiteNavSidePanel/SiteNavSidePanel.jsx +++ b/frontend/components/side_panels/SiteNavSidePanel/SiteNavSidePanel.jsx @@ -1,19 +1,14 @@ import React, { Component, PropTypes } from 'react'; -import { connect } from 'react-redux'; -import { isEqual } from 'lodash'; -import { push } from 'react-router-redux'; import classnames from 'classnames'; -import { logoutUser } from 'redux/nodes/auth/actions'; import userInterface from 'interfaces/user'; import Icon from 'components/Icon'; -import { activeTabFromPathname, activeSubTabFromPathname } from './helpers'; import navItems from './navItems'; class SiteNavSidePanel extends Component { static propTypes = { - dispatch: PropTypes.func, + onNavItemClick: PropTypes.func, pathname: PropTypes.string, user: userInterface, }; @@ -21,78 +16,24 @@ class SiteNavSidePanel extends Component { constructor (props) { super(props); - const { pathname, user: { admin } } = this.props; + const { user: { admin } } = this.props; this.userNavItems = navItems(admin); - const activeTab = activeTabFromPathname(this.userNavItems, pathname); - const activeSubItem = activeSubTabFromPathname(activeTab, pathname); - this.state = { - activeTab, - activeSubItem, showSubItems: false, userMenuOpened: false, }; } - componentWillReceiveProps (nextProps) { - if (isEqual(nextProps, this.props)) return false; - - const { pathname } = nextProps; - - const activeTab = activeTabFromPathname(this.userNavItems, pathname); - const activeSubItem = activeSubTabFromPathname(activeTab, pathname); - - this.setState({ - activeTab, - activeSubItem, - }); - - return false; - } - - onLogout = (evt) => { - evt.preventDefault(); - - const { dispatch } = this.props; - - dispatch(logoutUser()); - - return false; - } - - setActiveSubItem = (activeSubItem) => { + onNavItemClick = (navItem) => { return (evt) => { evt.preventDefault(); - if (activeSubItem) { - const { dispatch } = this.props; - const { path: { location: tabLocation } } = activeSubItem; + const { onNavItemClick: handleNavItemClick } = this.props; + const { pathname: navItemPathname } = navItem.location; - if (!tabLocation) return false; - - dispatch(push(tabLocation)); - } - - return false; - }; - } - - setActiveTab = (activeTab) => { - return (evt) => { - evt.preventDefault(); - - const { pathname, dispatch } = this.props; - const activeSubItem = activeSubTabFromPathname(activeTab, pathname); - - this.setState({ activeTab, activeSubItem }); - - const tabLocation = activeSubItem ? activeSubItem.path.location : activeTab.path.location; - - dispatch(push(tabLocation)); - - return false; + return handleNavItemClick(navItemPathname); }; } @@ -117,10 +58,10 @@ class SiteNavSidePanel extends Component { } renderNavItem = (navItem) => { - const { activeTab = {} } = this.state; const { icon, name, subItems } = navItem; - const active = activeTab.name === name; - const { renderSubItems, setActiveTab } = this; + const { pathname } = this.props; + const { onNavItemClick, renderSubItems } = this; + const active = navItem.location.regex.test(pathname); const navItemBaseClass = 'site-nav-item'; @@ -133,7 +74,7 @@ class SiteNavSidePanel extends Component {