summaryrefslogtreecommitdiff
path: root/frontend/src/components/navigation
diff options
context:
space:
mode:
authorGeorgios Andreadis <info@gandreadis.com>2020-06-29 15:47:09 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2020-08-24 16:08:41 +0200
commit90fae26aa4bd0e0eb3272ff6e6524060e9004fbb (patch)
treebf6943882f5fa5f3114c01fc571503c79ee1056d /frontend/src/components/navigation
parent7032a007d4431f5a0c4c5e2d3f3bd20462d49950 (diff)
Prepare frontend repository for monorepo
This change prepares the frontend Git repository for the monorepo residing at https://github.com/atlarge-research.com/opendc. To accomodate for this, we move all files into a frontend subdirectory.
Diffstat (limited to 'frontend/src/components/navigation')
-rw-r--r--frontend/src/components/navigation/AppNavbar.js56
-rw-r--r--frontend/src/components/navigation/HomeNavbar.js24
-rw-r--r--frontend/src/components/navigation/LogoutButton.js16
-rw-r--r--frontend/src/components/navigation/Navbar.js102
-rw-r--r--frontend/src/components/navigation/Navbar.sass29
5 files changed, 227 insertions, 0 deletions
diff --git a/frontend/src/components/navigation/AppNavbar.js b/frontend/src/components/navigation/AppNavbar.js
new file mode 100644
index 00000000..1a35f85d
--- /dev/null
+++ b/frontend/src/components/navigation/AppNavbar.js
@@ -0,0 +1,56 @@
+import React from "react";
+import FontAwesome from "react-fontawesome";
+import { Link } from "react-router-dom";
+import Navbar, { NavItem } from "./Navbar";
+import "./Navbar.css";
+
+const AppNavbar = ({ simulationId, inSimulation, fullWidth }) => (
+ <Navbar fullWidth={fullWidth}>
+ {inSimulation ? (
+ <NavItem route={"/simulations/" + simulationId}>
+ <Link
+ className="nav-link"
+ title="Construction"
+ to={"/simulations/" + simulationId}
+ >
+ <FontAwesome name="industry" className="mr-2" />
+ Construction
+ </Link>
+ </NavItem>
+ ) : (
+ undefined
+ )}
+ {inSimulation ? (
+ <NavItem route={"/simulations/" + simulationId + "/experiments"}>
+ <Link
+ className="nav-link"
+ title="Experiments"
+ to={"/simulations/" + simulationId + "/experiments"}
+ >
+ <FontAwesome name="play" className="mr-2" />
+ Experiments
+ </Link>
+ </NavItem>
+ ) : (
+ undefined
+ )}
+ <NavItem route="/simulations">
+ <Link className="nav-link" title="My Simulations" to="/simulations">
+ <FontAwesome name="list" className="mr-2" />
+ My Simulations
+ </Link>
+ </NavItem>
+ <NavItem route="email">
+ <a
+ className="nav-link"
+ title="Support"
+ href="mailto:opendc@atlarge-research.com"
+ >
+ <FontAwesome name="envelope" className="mr-2" />
+ Support
+ </a>
+ </NavItem>
+ </Navbar>
+);
+
+export default AppNavbar;
diff --git a/frontend/src/components/navigation/HomeNavbar.js b/frontend/src/components/navigation/HomeNavbar.js
new file mode 100644
index 00000000..5d08bf3c
--- /dev/null
+++ b/frontend/src/components/navigation/HomeNavbar.js
@@ -0,0 +1,24 @@
+import React from "react";
+import Navbar from "./Navbar";
+import "./Navbar.css";
+
+const ScrollNavItem = ({ id, name }) => (
+ <li className="nav-item">
+ <a className="nav-link" href={id}>
+ {name}
+ </a>
+ </li>
+);
+
+const HomeNavbar = () => (
+ <Navbar fullWidth={false}>
+ <ScrollNavItem id="#stakeholders" name="Stakeholders" />
+ <ScrollNavItem id="#modeling" name="Modeling" />
+ <ScrollNavItem id="#simulation" name="Simulation" />
+ <ScrollNavItem id="#technologies" name="Technologies" />
+ <ScrollNavItem id="#team" name="Team" />
+ <ScrollNavItem id="#contact" name="Contact" />
+ </Navbar>
+);
+
+export default HomeNavbar;
diff --git a/frontend/src/components/navigation/LogoutButton.js b/frontend/src/components/navigation/LogoutButton.js
new file mode 100644
index 00000000..800a3da8
--- /dev/null
+++ b/frontend/src/components/navigation/LogoutButton.js
@@ -0,0 +1,16 @@
+import PropTypes from "prop-types";
+import React from "react";
+import FontAwesome from "react-fontawesome";
+import { Link } from "react-router-dom";
+
+const LogoutButton = ({ onLogout }) => (
+ <Link className="logout nav-link" title="Sign out" to="#" onClick={onLogout}>
+ <FontAwesome name="power-off" size="lg" />
+ </Link>
+);
+
+LogoutButton.propTypes = {
+ onLogout: PropTypes.func.isRequired
+};
+
+export default LogoutButton;
diff --git a/frontend/src/components/navigation/Navbar.js b/frontend/src/components/navigation/Navbar.js
new file mode 100644
index 00000000..44458949
--- /dev/null
+++ b/frontend/src/components/navigation/Navbar.js
@@ -0,0 +1,102 @@
+import classNames from "classnames";
+import React from "react";
+import { Link, withRouter } from "react-router-dom";
+import { userIsLoggedIn } from "../../auth/index";
+import Login from "../../containers/auth/Login";
+import Logout from "../../containers/auth/Logout";
+import ProfileName from "../../containers/auth/ProfileName";
+import "./Navbar.css";
+
+export const NAVBAR_HEIGHT = 60;
+
+export const NavItem = withRouter(props => <NavItemWithoutRoute {...props} />);
+export const LoggedInSection = withRouter(props => (
+ <LoggedInSectionWithoutRoute {...props} />
+));
+
+const GitHubLink = () => (
+ <a
+ href="https://github.com/atlarge-research/opendc"
+ className="ml-2 mr-3 text-dark"
+ style={{ position: "relative", top: 7 }}
+ >
+ <span className="fa fa-github fa-2x" />
+ </a>
+);
+
+const NavItemWithoutRoute = ({ route, location, children }) => (
+ <li
+ className={classNames(
+ "nav-item",
+ location.pathname === route ? "active" : undefined
+ )}
+ >
+ {children}
+ </li>
+);
+
+const LoggedInSectionWithoutRoute = ({ location }) => (
+ <ul className="navbar-nav auth-links">
+ {userIsLoggedIn() ? (
+ [
+ location.pathname === "/" ? (
+ <NavItem route="/simulations" key="simulations">
+ <Link className="nav-link" title="My Simulations" to="/simulations">
+ My Simulations
+ </Link>
+ </NavItem>
+ ) : (
+ <NavItem route="/profile" key="profile">
+ <Link className="nav-link" title="My Profile" to="/profile">
+ <ProfileName />
+ </Link>
+ </NavItem>
+ ),
+ <NavItem route="logout" key="logout">
+ <Logout />
+ </NavItem>
+ ]
+ ) : (
+ <NavItem route="login">
+ <GitHubLink />
+ <Login visible={true} />
+ </NavItem>
+ )}
+ </ul>
+);
+
+const Navbar = ({ fullWidth, children }) => (
+ <nav
+ className="navbar fixed-top navbar-expand-lg navbar-light bg-faded"
+ id="navbar"
+ >
+ <div className={fullWidth ? "container-fluid" : "container"}>
+ <button
+ className="navbar-toggler navbar-toggler-right"
+ type="button"
+ data-toggle="collapse"
+ data-target="#navbarSupportedContent"
+ aria-controls="navbarSupportedContent"
+ aria-expanded="false"
+ aria-label="Toggle navigation"
+ >
+ <span className="navbar-toggler-icon" />
+ </button>
+ <Link
+ className="navbar-brand opendc-brand"
+ to="/"
+ title="OpenDC"
+ onClick={() => window.scrollTo(0, 0)}
+ >
+ <img src="/img/logo.png" alt="OpenDC" />
+ </Link>
+
+ <div className="collapse navbar-collapse" id="navbarSupportedContent">
+ <ul className="navbar-nav mr-auto">{children}</ul>
+ <LoggedInSection />
+ </div>
+ </div>
+ </nav>
+);
+
+export default Navbar;
diff --git a/frontend/src/components/navigation/Navbar.sass b/frontend/src/components/navigation/Navbar.sass
new file mode 100644
index 00000000..94c52936
--- /dev/null
+++ b/frontend/src/components/navigation/Navbar.sass
@@ -0,0 +1,29 @@
+@import ../../style-globals/_mixins.sass
+@import ../../style-globals/_variables.sass
+
+.navbar
+ border-top: $blue 3px solid
+ border-bottom: $gray-semi-dark 1px solid
+ color: $gray-very-dark
+ background: #fafafb
+
+.opendc-brand
+ display: inline-block
+ color: $gray-very-dark
+
+ +transition(background, $transition-length)
+
+ img
+ position: relative
+ bottom: 3px
+ display: inline-block
+ width: 30px
+
+.login
+ height: 40px
+ background: $blue
+ border: none
+ +clickable
+
+ &:hover
+ background: $blue-dark