Skip to content

Commit

Permalink
[grid] Breaking Grid UI into components
Browse files Browse the repository at this point in the history
This simplifies the use of the React
Router component.
  • Loading branch information
diemol committed Jan 30, 2021
1 parent cfea6be commit c8daf2c
Show file tree
Hide file tree
Showing 6 changed files with 280 additions and 364 deletions.
5 changes: 0 additions & 5 deletions javascript/grid-ui/src/App.css

This file was deleted.

70 changes: 52 additions & 18 deletions javascript/grid-ui/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import {ApolloClient, ApolloProvider, InMemoryCache} from "@apollo/client";
// import { HashRouter as Router, Route, Switch } from "react-router-dom";
import {HashRouter as Router, Route, Switch} from "react-router-dom";
import React from "react";
import ReactModal from "react-modal";
// css import order is important
/* 1 */
// import "./css/theme.css";
/* 2 */
// import "./css/theme-selenium.css";
/* 3 */
// import "./App.css";
// import HelpPage from "./screens/HelpPage/HelpPage";
// import NavBar from "./components/NavBar/NavBar";
import {GridConfig} from "./config";
import NodeType from "./models/node";
import TopBar from "./components/TopBar/TopBar";
import Overview from "./screens/Overview/Overview";
import {Box, Link, makeStyles} from "@material-ui/core";
import Container from "@material-ui/core/Container";
import Typography from "@material-ui/core/Typography";

export const client = new ApolloClient({
cache: new InMemoryCache(),
Expand All @@ -30,25 +30,59 @@ declare global {
}
}

function Copyright() {
return (
<Typography variant="body2" color="textSecondary" align="center">
{'All rights reserved - '}
<Link color="inherit" href="https://sfconservancy.org/" target={"_blank"}>
Software Freedom Conservancy
</Link>{' '}
{new Date().getFullYear()}
{'.'}
</Typography>
);
}


const useStyles = makeStyles((theme) => ({
root: {
display: "flex",
},
content: {
flexGrow: 1,
height: '100vh',
overflow: 'auto',
paddingTop: theme.spacing(8),
},
container: {
paddingTop: theme.spacing(4),
paddingBottom: theme.spacing(4),
},
}));


if (process.env.NODE_ENV !== 'test') ReactModal.setAppElement("#root");

function App() {
const classes = useStyles();
return (
<ApolloProvider client={client}>
<Overview/>
<Router>
<div className={classes.root}>
<TopBar/>
<main className={classes.content}>
<Container maxWidth={false} className={classes.container}>
<Switch>
<Route exact path={"/"} component={Overview}/>
</Switch>
</Container>
<Box pt={4}>
<Copyright/>
</Box>
</main>
</div>
</Router>
</ApolloProvider>
// <ApolloProvider client={client}>
// <Router>
// <NavBar />
// <Switch>
// <Route exact path="/" component={Console} />
// <Route exact path="/node/:id" component={NodePage} />
// <Route exact path="/home" component={HelpPage} />
// <Route exact path="/console" component={Console} />
// <Route component={HelpPage} />
// </Switch>
// </Router>
// </ApolloProvider>
);
}

Expand Down
215 changes: 80 additions & 135 deletions javascript/grid-ui/src/components/NavBar/NavBar.tsx
Original file line number Diff line number Diff line change
@@ -1,144 +1,89 @@
// https://github.com/vercel/next.js/issues/11230#issuecomment-643595034
import Divider from '@material-ui/core/Divider';
import Drawer from '@material-ui/core/Drawer';
import IconButton from '@material-ui/core/IconButton';
import List from '@material-ui/core/List';
import ListItem from "@material-ui/core/ListItem";
import ListItemIcon from "@material-ui/core/ListItemIcon";
import ListItemText from "@material-ui/core/ListItemText";
import {makeStyles} from '@material-ui/core/styles';
import ChevronLeftIcon from '@material-ui/icons/ChevronLeft';
import DashboardIcon from "@material-ui/icons/Dashboard";
import clsx from 'clsx';
import * as React from 'react';

import React, {useState} from "react";
import {Link} from "react-router-dom";
import {ReactComponent as SearchIcon} from "../../assets/icons/search2.svg";
import {ReactComponent as TimesIcon} from "../../assets/icons/times.svg";
import seleniumIcon from "../../assets/selenium.svg";
import "../../css/icons.css";
import styles from "./NavBar.module.css";
import searchHighlight from "../../core/Search";
import "./NavBar.css";
const drawerWidth = 240;

/**
* NavBar component, includes search bar and search functions
* Look at `core/Search.ts` for the highlight function
*/
export default function NavBar() {
let [prevSearch, setPrevSearch] = useState<any>();
let [prevTerm, setPrevTerm] = useState<string>("");
const useStyles = makeStyles((theme) => ({
root: {
display: 'flex',
},
toolbarIcon: {
display: 'flex',
alignItems: 'center',
justifyContent: 'flex-end',
padding: '0 8px',
...theme.mixins.toolbar,
backgroundColor: theme.palette.primary.main,
},
drawerPaper: {
position: 'relative',
whiteSpace: 'nowrap',
width: drawerWidth,
minHeight: '100vh',
transition: theme.transitions.create('width', {
easing: theme.transitions.easing.sharp,
duration: theme.transitions.duration.enteringScreen,
}),
},
drawerPaperClose: {
overflowX: 'hidden',
minHeight: '100vh',
transition: theme.transitions.create('width', {
easing: theme.transitions.easing.sharp,
duration: theme.transitions.duration.leavingScreen,
}),
width: theme.spacing(7),
[theme.breakpoints.up('sm')]: {
width: theme.spacing(9),
},
},
}));

const searchTerminDOM = (term: string) => {
if (prevSearch) {
prevSearch.revert();
}
if (term && term !== "") {
prevSearch = searchHighlight(term);
setPrevSearch(prevSearch);
}
setPrevTerm(term);
};

const rerunSearch = () => searchTerminDOM(prevTerm);
window.rerunSearch = rerunSearch;
function ListItemLink(props) {
return <ListItem button component="a" {...props} />;
}

const clearSearch = () => {
const searchBar = document.getElementById("search-by") as HTMLInputElement;
searchBar.value = "";
// revert prev search as well
searchTerminDOM("");
};
export default function NavBar(props) {
const classes = useStyles();
const open = props.open;

return (
<React.Fragment>
<nav id="sidebar">
<div id="header-wrapper">
<div id="header" style={{ height: "70px" }}>
<Link id="logo" to="/home">
<img
src={seleniumIcon}
alt="logo"
className={styles.iconDetails}
/>
<div
style={{
marginLeft: "60px",
marginTop: "5px",
}}
>
<h3 className={styles.h4}>Selenium Grid</h3>
</div>
</Link>
</div>

<div className="searchbox">
<label htmlFor="search-by">
<SearchIcon className="icon-green" />
</label>
<input
data-search-input=""
id="search-by"
type="search"
placeholder="Search..."
autoComplete="off"
onChange={(ev) => searchTerminDOM(ev.target.value)}
/>
<span data-search-clear="">
<TimesIcon className="icon-green" onClick={clearSearch} />
</span>
</div>
<Drawer
variant="permanent"
classes={{
paper: clsx(classes.drawerPaper, !open && classes.drawerPaperClose),
}}
open={open}
>
<div className={classes.toolbarIcon}>
<IconButton color={"secondary"}>
<ChevronLeftIcon/>
</IconButton>
</div>
<Divider/>
<List>
<div>
<ListItemLink href={"#"}>
<ListItemIcon>
<DashboardIcon/>
</ListItemIcon>
<ListItemText primary="Overview"/>
</ListItemLink>
</div>
<div className="highlightable ps-container ps-theme-default ps-active-y">
<ul className="topics">
<li data-nav-id="/console" title="Console" className="dd-item">
<Link to="/console">Console</Link>
</li>
<li data-nav-id="/docs/" title="Docs" className="dd-item parent">
<a href="https://www.selenium.dev/documentation/en/grid/">
Docs
<i className="fas fa-check read-icon"></i>
</a>

<ul>
<li
data-nav-id="/grid/purposes_and_main_functionalities/"
title="Purposes and main functionalities"
className="dd-item "
>
<a href="https://www.selenium.dev/documentation/en/grid/purposes_and_main_functionalities/">
Purposes and functionalities
<i className="fas fa-check read-icon"></i>
</a>
</li>

<li
data-nav-id="/grid/when_to_use_grid/"
title="When to use Grid"
className="dd-item "
>
<a href="https://www.selenium.dev/documentation/en/grid/when_to_use_grid/">
When to use Grid
<i className="fas fa-check read-icon"></i>
</a>
</li>

<li
data-nav-id="/grid/grid_4/"
title="Grid 4"
className="dd-item"
>
<a href="https://www.selenium.dev/documentation/en/grid/grid_4/">
Grid 4<i className="fas fa-check read-icon"></i>
</a>

<ul>
<li
data-nav-id="/grid/grid_4/components_of_a_grid/"
title="Components"
className="dd-item "
>
<a href="https://www.selenium.dev/documentation/en/grid/grid_4/components_of_a_grid/">
Components
<i className="fas fa-check read-icon"></i>
</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</nav>
</React.Fragment>
</List>
{/*<Divider/>*/}
{/*<List>{secondaryListItems}</List>*/}
</Drawer>
);
}

Loading

0 comments on commit c8daf2c

Please sign in to comment.