import React, { Fragment } from 'react'; import { ConfigContext } from './context'; import { Redirect, Switch, withRouter } from 'react-router-dom'; import { BackgroundImage, BackgroundImageSrc, Nav, NavExpandable, NavList, NavItem, Page, PageHeader, PageSidebar, Toolbar, ToolbarGroup, ToolbarItem } from '@patternfly/react-core'; import { global_breakpoint_md as breakpointMd } from '@patternfly/react-tokens'; import api from './api'; import { API_LOGOUT, API_CONFIG } from './endpoints'; import HelpDropdown from './components/HelpDropdown'; import LogoutButton from './components/LogoutButton'; import TowerLogo from './components/TowerLogo'; import ConditionalRedirect from './components/ConditionalRedirect'; import Applications from './pages/Applications'; import Credentials from './pages/Credentials'; import CredentialTypes from './pages/CredentialTypes'; import Dashboard from './pages/Dashboard'; import InstanceGroups from './pages/InstanceGroups'; import Inventories from './pages/Inventories'; import InventoryScripts from './pages/InventoryScripts'; import Jobs from './pages/Jobs'; import Login from './pages/Login'; import ManagementJobs from './pages/ManagementJobs'; import NotificationTemplates from './pages/NotificationTemplates'; import Organizations from './pages/Organizations'; import Portal from './pages/Portal'; import Projects from './pages/Projects'; import Schedules from './pages/Schedules'; import AuthSettings from './pages/AuthSettings'; import JobsSettings from './pages/JobsSettings'; import SystemSettings from './pages/SystemSettings'; import UISettings from './pages/UISettings'; import License from './pages/License'; import Teams from './pages/Teams'; import Templates from './pages/Templates'; import Users from './pages/Users'; const SideNavItems = ({ items, history }) => { const currentPath = history.location.pathname.split('/')[1]; let activeGroup; if (currentPath !== '') { [{ groupName: activeGroup }] = items .map(({ groupName, routes }) => ({ groupName, paths: routes.map(({ path }) => path) })) .filter(({ paths }) => paths.indexOf(currentPath) > -1); } else { activeGroup = 'views'; } return (items.map(({ title, groupName, routes }) => ( {routes.map(({ path, title: itemTitle }) => ( {itemTitle} ))} ))); }; class App extends React.Component { constructor(props) { super(props); const isNavOpen = typeof window !== 'undefined' && window.innerWidth >= parseInt(breakpointMd.value, 10); this.state = { isNavOpen, }; } getSessionObject(key) { return JSON.parse(sessionStorage.getItem(key) || '{}'); } onNavToggle = () => { this.setState(({ isNavOpen }) => ({ isNavOpen: !isNavOpen })); }; onLogoClick = () => { this.setState({ activeGroup: 'views_group' }); } onDevLogout = async () => { await api.get(API_LOGOUT); this.setState({ activeGroup: 'views_group', activeItem: 'views_group_dashboard' }); if (sessionStorage.config) { sessionStorage.clear(); } } async componentDidMount() { // Grab our config data from the API and store in sessionStorage if (!sessionStorage.config) { const { data } = await api.get(API_CONFIG); sessionStorage.setItem('config', JSON.stringify(data)); } } render() { const { isNavOpen } = this.state; const { logo, loginInfo, history } = this.props; const PageToolbar = ( this.onDevLogout()} /> ); return ( api.isAuthenticated()} redirectPath="/" path="/login" component={() => } /> } toolbar={PageToolbar} showNavToggle onNavToggle={this.onNavToggle} /> )} sidebar={( )} /> )} useCondensed > !api.isAuthenticated()} redirectPath="/login" exact path="/" component={() => ()} /> !api.isAuthenticated()} redirectPath="/login" path="/home" component={Dashboard} /> !api.isAuthenticated()} redirectPath="/login" path="/jobs" component={Jobs} /> !api.isAuthenticated()} redirectPath="/login" path="/schedules" component={Schedules} /> !api.isAuthenticated()} redirectPath="/login" path="/portal" component={Portal} /> !api.isAuthenticated()} redirectPath="/login" path="/templates" component={Templates} /> !api.isAuthenticated()} redirectPath="/login" path="/credentials" component={Credentials} /> !api.isAuthenticated()} redirectPath="/login" path="/projects" component={Projects} /> !api.isAuthenticated()} redirectPath="/login" path="/inventories" component={Inventories} /> !api.isAuthenticated()} redirectPath="/login" path="/inventory_scripts" component={InventoryScripts} /> !api.isAuthenticated()} redirectPath="/login" path="/organizations" component={Organizations} /> !api.isAuthenticated()} redirectPath="/login" path="/users" component={Users} /> !api.isAuthenticated()} redirectPath="/login" path="/teams" component={Teams} /> !api.isAuthenticated()} redirectPath="/login" path="/credential_types" component={CredentialTypes} /> !api.isAuthenticated()} redirectPath="/login" path="/notification_templates" component={NotificationTemplates} /> !api.isAuthenticated()} redirectPath="/login" path="/management_jobs" component={ManagementJobs} /> !api.isAuthenticated()} redirectPath="/login" path="/instance_groups" component={InstanceGroups} /> !api.isAuthenticated()} redirectPath="/login" path="/applications" component={Applications} /> !api.isAuthenticated()} redirectPath="/login" path="/auth_settings" component={AuthSettings} /> !api.isAuthenticated()} redirectPath="/login" path="/jobs_settings" component={JobsSettings} /> !api.isAuthenticated()} redirectPath="/login" path="/system_settings" component={SystemSettings} /> !api.isAuthenticated()} redirectPath="/login" path="/ui_settings" component={UISettings} /> !api.isAuthenticated()} redirectPath="/login" path="/license" component={License} /> ); } } export default withRouter(App);