From 540ddb36644ddaafd95ae3bcd35e380ddd4de30f Mon Sep 17 00:00:00 2001 From: danieldeng2 <danieldeng223@gmail.com> Date: Mon, 3 Aug 2020 13:58:22 +0100 Subject: [PATCH] Refactor bottom and top bar --- frontend/src/components/atoms/.gitkeep | 0 .../components/atoms/BottomBarItem/index.tsx | 34 ++++++++++++++ .../components/atoms/NavBarTabItem/index.tsx | 29 ++++++++++++ .../molecules/NavBarBrand/index.tsx | 34 ++++++++++++++ .../molecules/NavBarTabGroup/index.tsx | 27 +++++++++++ .../components/organisms/BottomBar/index.tsx | 19 +------- .../src/components/organisms/TopBar/index.tsx | 45 +++---------------- frontend/src/components/templates/.gitkeep | 0 .../ExampleButtons.tsx} | 0 .../src/components/templates/ExamplePage.tsx | 4 +- .../ExampleToasts.tsx} | 0 11 files changed, 133 insertions(+), 59 deletions(-) delete mode 100644 frontend/src/components/atoms/.gitkeep create mode 100644 frontend/src/components/atoms/BottomBarItem/index.tsx create mode 100644 frontend/src/components/atoms/NavBarTabItem/index.tsx create mode 100644 frontend/src/components/molecules/NavBarBrand/index.tsx create mode 100644 frontend/src/components/molecules/NavBarTabGroup/index.tsx delete mode 100644 frontend/src/components/templates/.gitkeep rename frontend/src/components/{molecules/Buttons.tsx => templates/ExampleButtons.tsx} (100%) rename frontend/src/components/{molecules/Toasts.tsx => templates/ExampleToasts.tsx} (100%) diff --git a/frontend/src/components/atoms/.gitkeep b/frontend/src/components/atoms/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/src/components/atoms/BottomBarItem/index.tsx b/frontend/src/components/atoms/BottomBarItem/index.tsx new file mode 100644 index 000000000..5758739b9 --- /dev/null +++ b/frontend/src/components/atoms/BottomBarItem/index.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import Button from "react-bootstrap/Button"; +import { + IconDefinition +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { NavLink } from "react-router-dom"; + +export interface BottomBarItemProps { + page: { + name: string; + path: string; + icon: IconDefinition; + }; +} + +const BottomBarItem: React.FC<BottomBarItemProps> = ({ page }: BottomBarItemProps) => { + + return ( + <Button + activeClassName="active" + as={NavLink} + to={page.path} + id={"bottom-" + page.name} + key={page.name} + > + <div className="button-holder"> + <FontAwesomeIcon icon={page.icon} size="lg" /> + </div> + </Button> + ); +}; + +export default BottomBarItem; diff --git a/frontend/src/components/atoms/NavBarTabItem/index.tsx b/frontend/src/components/atoms/NavBarTabItem/index.tsx new file mode 100644 index 000000000..cde151d20 --- /dev/null +++ b/frontend/src/components/atoms/NavBarTabItem/index.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import Nav from "react-bootstrap/Nav"; +import { NavLink } from "react-router-dom"; + +export interface NavBarItemProps { + page: { + name: string; + path: string; + }; +} + +const NavBarTabItem: React.FC<NavBarItemProps> = ({ + page, +}: NavBarItemProps) => { + return ( + <Nav.Item key={page.name}> + <Nav.Link + as={NavLink} + activeClassName="active" + to={page.path} + className="page-button" + > + {page.name} + </Nav.Link> + </Nav.Item> + ); +}; + +export default NavBarTabItem; diff --git a/frontend/src/components/molecules/NavBarBrand/index.tsx b/frontend/src/components/molecules/NavBarBrand/index.tsx new file mode 100644 index 000000000..4fa3f7c5d --- /dev/null +++ b/frontend/src/components/molecules/NavBarBrand/index.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import Navbar from "react-bootstrap/Navbar"; +import logo from "images/logo.svg"; +import { Link } from "react-router-dom"; + +const NavBarBrand: React.FC = () => { + + return ( + <Navbar.Brand className="brand-container"> + <img + src={logo} + width="30" + height="30" + className="d-inline-block align-center brand-image" + alt="React Bootstrap logo" + onClick={(e) => { + // TODO: change to using react states + e.preventDefault(); + const wrapper = document.querySelector("#wrapper") || document.createElement("div"); + if (wrapper.classList.contains("toggled")) { + wrapper.classList.remove("toggled"); + } else { + wrapper.classList.add("toggled"); + } + }} + />{" "} + <Link to="/" style={{ textDecoration: "none" }}> + Scientia + </Link> + </Navbar.Brand> + ); +}; + +export default NavBarBrand; diff --git a/frontend/src/components/molecules/NavBarTabGroup/index.tsx b/frontend/src/components/molecules/NavBarTabGroup/index.tsx new file mode 100644 index 000000000..dd7cbdd7e --- /dev/null +++ b/frontend/src/components/molecules/NavBarTabGroup/index.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import Navbar from "react-bootstrap/Navbar"; +import Nav from "react-bootstrap/Nav"; +import NavBarTabItem from "components/atoms/NavBarTabItem"; + +export interface NavBarTabGroupProps { + pages: { + name: string; + path: string; + }[]; +} + +const NavBarTabGroup: React.FC<NavBarTabGroupProps> = ({ + pages, +}: NavBarTabGroupProps) => { + return ( + <Navbar className="page-button-group m-auto" id="responsive-navbar-nav"> + <Nav variant="pills"> + {pages.map((page) => ( + <NavBarTabItem page={page} /> + ))} + </Nav> + </Navbar> + ); +}; + +export default NavBarTabGroup; diff --git a/frontend/src/components/organisms/BottomBar/index.tsx b/frontend/src/components/organisms/BottomBar/index.tsx index c84d30d21..85f043c19 100644 --- a/frontend/src/components/organisms/BottomBar/index.tsx +++ b/frontend/src/components/organisms/BottomBar/index.tsx @@ -1,12 +1,10 @@ import React from "react"; import Navbar from "react-bootstrap/Navbar"; -import Button from "react-bootstrap/Button"; import ButtonGroup from "react-bootstrap/ButtonGroup"; import { IconDefinition } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { NavLink } from "react-router-dom"; +import BottomBarItem from "components/atoms/BottomBarItem" export interface BottomBarProps { pages: { @@ -17,24 +15,11 @@ export interface BottomBarProps { } const BottomBar: React.FC<BottomBarProps> = ({ pages }: BottomBarProps) => { - const BottomBarItems = pages.map(({ name, path, icon }) => ( - <Button - activeClassName="active" - as={NavLink} - to={path} - id={"bottom-" + name} - key={name} - > - <div className="button-holder"> - <FontAwesomeIcon icon={icon} size="lg" /> - </div> - </Button> - )); return ( <Navbar className="bottom-bar footer"> <ButtonGroup aria-label="Basic example" className="bottom-bar-buttons"> - {BottomBarItems} + {pages.map((page => <BottomBarItem page={page}/>))} </ButtonGroup> </Navbar> ); diff --git a/frontend/src/components/organisms/TopBar/index.tsx b/frontend/src/components/organisms/TopBar/index.tsx index 2704b81ce..494e168b1 100644 --- a/frontend/src/components/organisms/TopBar/index.tsx +++ b/frontend/src/components/organisms/TopBar/index.tsx @@ -1,10 +1,9 @@ import React from "react"; import Container from "react-bootstrap/Container"; import Navbar from "react-bootstrap/Navbar"; -import Nav from "react-bootstrap/Nav"; -import logo from "images/logo.svg"; import userPic from "images/user.png"; -import { Link, NavLink } from "react-router-dom"; +import NavBarTabGroup from "components/molecules/NavBarTabGroup"; +import NavBarBrand from "components/molecules/NavBarBrand"; export interface TopBarProps { pages: { @@ -14,48 +13,14 @@ export interface TopBarProps { } const TopBar: React.FC<TopBarProps> = ({ pages }: TopBarProps) => { - const NavItems = pages.map(({ name, path }) => ( - <Nav.Item key={name}> - <Nav.Link - as={NavLink} - activeClassName="active" - to={path} - className="page-button" - > - {name} - </Nav.Link> - </Nav.Item> - )); return ( <Navbar className="top-bar" sticky="top" expand="lg" variant="light"> <Container fluid> - <Navbar.Brand className="brand-container"> - <img - src={logo} - width="30" - height="30" - className="d-inline-block align-center brand-image" - alt="React Bootstrap logo" - onClick={(e) => { - // TODO: change to using react states - e.preventDefault(); - const wrapper = document.querySelector("#wrapper") || document.createElement("div"); - if (wrapper.classList.contains("toggled")) { - wrapper.classList.remove("toggled"); - } else { - wrapper.classList.add("toggled"); - } - }} - />{" "} - <Link to="/" style={{ textDecoration: "none" }}> - Scientia - </Link> - </Navbar.Brand> - <Navbar className="page-button-group m-auto" id="responsive-navbar-nav"> - <Nav variant="pills">{NavItems}</Nav> - </Navbar> + <NavBarBrand/> + + <NavBarTabGroup pages={pages}/> <img src={userPic} diff --git a/frontend/src/components/templates/.gitkeep b/frontend/src/components/templates/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/frontend/src/components/molecules/Buttons.tsx b/frontend/src/components/templates/ExampleButtons.tsx similarity index 100% rename from frontend/src/components/molecules/Buttons.tsx rename to frontend/src/components/templates/ExampleButtons.tsx diff --git a/frontend/src/components/templates/ExamplePage.tsx b/frontend/src/components/templates/ExamplePage.tsx index 44b976578..77d9e7e9e 100644 --- a/frontend/src/components/templates/ExamplePage.tsx +++ b/frontend/src/components/templates/ExamplePage.tsx @@ -3,8 +3,8 @@ import React from "react"; import Jumbotron from "react-bootstrap/Jumbotron"; import Container from "react-bootstrap/Container"; -import ButtonsShowcase from "components/molecules/Buttons"; -import ToastsShowcase from "components/molecules/Toasts"; +import ButtonsShowcase from "components/templates/ExampleButtons"; +import ToastsShowcase from "components/templates/ExampleToasts"; export interface ExamplePageProps { name: string; diff --git a/frontend/src/components/molecules/Toasts.tsx b/frontend/src/components/templates/ExampleToasts.tsx similarity index 100% rename from frontend/src/components/molecules/Toasts.tsx rename to frontend/src/components/templates/ExampleToasts.tsx -- GitLab