Skip to content
Snippets Groups Projects
Commit 270a5edc authored by esikkala's avatar esikkala
Browse files

Top bar: use perspective config

parent 69ee4533
No related branches found
No related tags found
No related merge requests found
...@@ -11,6 +11,7 @@ import MoreIcon from '@material-ui/icons/MoreVert'; ...@@ -11,6 +11,7 @@ import MoreIcon from '@material-ui/icons/MoreVert';
import Button from '@material-ui/core/Button'; import Button from '@material-ui/core/Button';
import { Link, NavLink } from 'react-router-dom'; import { Link, NavLink } from 'react-router-dom';
import TopBarSearchField from './TopBarSearchField'; import TopBarSearchField from './TopBarSearchField';
import { has } from 'lodash';
const styles = theme => ({ const styles = theme => ({
root: { root: {
...@@ -28,6 +29,9 @@ const styles = theme => ({ ...@@ -28,6 +29,9 @@ const styles = theme => ({
display: 'flex', display: 'flex',
}, },
}, },
link: {
textDecoration: 'none'
},
sectionMobile: { sectionMobile: {
display: 'flex', display: 'flex',
[theme.breakpoints.up('md')]: { [theme.breakpoints.up('md')]: {
...@@ -66,43 +70,89 @@ class TopBar extends React.Component { ...@@ -66,43 +70,89 @@ class TopBar extends React.Component {
this.setState({ mobileMoreAnchorEl: null }); this.setState({ mobileMoreAnchorEl: null });
}; };
render() { // https://material-ui.com/components/buttons/#third-party-routing-library
const { mobileMoreAnchorEl } = this.state; AdapterLink = React.forwardRef((props, ref) => <Link innerRef={ref} {...props} />);
const { classes } = this.props; AdapterNavLink = React.forwardRef((props, ref) => <NavLink innerRef={ref} {...props} />);
const isMobileMenuOpen = Boolean(mobileMoreAnchorEl);
// https://material-ui.com/components/buttons/#third-party-routing-library
const AdapterLink = React.forwardRef((props, ref) => <Link innerRef={ref} {...props} />);
const AdapterNavLink = React.forwardRef((props, ref) => <NavLink innerRef={ref} {...props} />);
const perspectives = [ 'manuscripts', 'works', 'events', 'actors', 'places' ]; renderMobileMenuItem = perspective => {
if (has(perspective, 'externalUrl')) {
return(
<a className={this.props.classes.link}
key={perspective.id}
href={perspective.externalUrl}
target='_blank'
rel='noopener noreferrer'
>
<MenuItem>
{perspective.label.toUpperCase()}
</MenuItem>
</a>
);
} else {
return(
<MenuItem
key={perspective.id}
component={this.AdapterLink}
to={`/${perspective.id}/faceted-search`}
>
{perspective.label.toUpperCase()}
</MenuItem>
);
}
}
const renderMobileMenu = ( renderDesktopTopMenuItem = perspective => {
<Menu if (has(perspective, 'externalUrl')) {
anchorEl={mobileMoreAnchorEl} return(
anchorOrigin={{ vertical: 'top', horizontal: 'right' }} <a className={this.props.classes.link}
transformOrigin={{ vertical: 'top', horizontal: 'right' }} key={perspective.id}
open={isMobileMenuOpen} href={perspective.externalUrl}
onClose={this.handleMobileMenuClose} target='_blank'
> rel='noopener noreferrer'
{perspectives.map(perspective => >
<MenuItem <Button
key={perspective} className={this.props.classes.appBarButton}
component={AdapterLink}
to={`/${perspective}/faceted-search`}
> >
{perspective.toUpperCase()} {perspective.label}
</MenuItem> </Button>
)} </a>
</Menu> );
); } else {
return(
<Button
key={perspective.id}
className={this.props.classes.appBarButton}
component={this.AdapterNavLink}
to={`/${perspective.id}/faceted-search`}
isActive={(match, location) => location.pathname.startsWith(`/${perspective.id}`)}
activeClassName={this.props.classes.appBarButtonActive}
>
{perspective.label}
</Button>
);
}
}
renderMobileMenu = perspectives =>
<Menu
anchorEl={this.state.mobileMoreAnchorEl}
anchorOrigin={{ vertical: 'top', horizontal: 'right' }}
transformOrigin={{ vertical: 'top', horizontal: 'right' }}
open={Boolean(this.state.mobileMoreAnchorEl)}
onClose={this.handleMobileMenuClose}
>
{perspectives.map(perspective => this.renderMobileMenuItem(perspective))}
</Menu>
render() {
const { classes, perspectives } = this.props;
return ( return (
<div className={classes.root}> <div className={classes.root}>
<AppBar position="absolute"> <AppBar position="absolute">
<Toolbar> <Toolbar>
<Button <Button
className={classes.appBarButton} className={classes.appBarButton}
component={AdapterLink} component={this.AdapterLink}
to='/' to='/'
> >
<Typography className={classes.title} variant="h6" color="inherit"> <Typography className={classes.title} variant="h6" color="inherit">
...@@ -115,18 +165,7 @@ class TopBar extends React.Component { ...@@ -115,18 +165,7 @@ class TopBar extends React.Component {
/> />
<div className={classes.grow} /> <div className={classes.grow} />
<div className={classes.sectionDesktop}> <div className={classes.sectionDesktop}>
{perspectives.map(perspective => {perspectives.map(perspective => this.renderDesktopTopMenuItem(perspective))}
<Button
key={perspective}
className={classes.appBarButton}
component={AdapterNavLink}
to={`/${perspective}/faceted-search`}
isActive={(match, location) => location.pathname.startsWith(`/${perspective}`)}
activeClassName={classes.appBarButtonActive}
>
{perspective}
</Button>
)}
{/* <Button className={classes.appBarButton} aria-haspopup="true" onClick={this.handleInfoMenuOpen}> {/* <Button className={classes.appBarButton} aria-haspopup="true" onClick={this.handleInfoMenuOpen}>
<span>Info</span> <span>Info</span>
</Button> */} </Button> */}
...@@ -138,7 +177,7 @@ class TopBar extends React.Component { ...@@ -138,7 +177,7 @@ class TopBar extends React.Component {
</div> </div>
</Toolbar> </Toolbar>
</AppBar> </AppBar>
{renderMobileMenu} {this.renderMobileMenu(perspectives)}
</div> </div>
); );
} }
...@@ -148,6 +187,7 @@ TopBar.propTypes = { ...@@ -148,6 +187,7 @@ TopBar.propTypes = {
classes: PropTypes.object.isRequired, classes: PropTypes.object.isRequired,
fetchResultsClientSide: PropTypes.func.isRequired, fetchResultsClientSide: PropTypes.func.isRequired,
clearResults: PropTypes.func.isRequired, clearResults: PropTypes.func.isRequired,
perspectives: PropTypes.array.isRequired
}; };
export default withStyles(styles)(TopBar); export default withStyles(styles)(TopBar);
...@@ -3,6 +3,7 @@ export const perspectiveArr = [ ...@@ -3,6 +3,7 @@ export const perspectiveArr = [
id: 'manuscripts', id: 'manuscripts',
label: 'Manuscripts', label: 'Manuscripts',
desc: 'Physical manuscript objects.', desc: 'Physical manuscript objects.',
externalUrl: 'https://seco.cs.aalto.fi/',
tabs: [ tabs: [
{ {
id: 'table', id: 'table',
......
...@@ -191,6 +191,7 @@ let SemanticPortal = (props) => { ...@@ -191,6 +191,7 @@ let SemanticPortal = (props) => {
search={props.clientSideFacetedSearch} search={props.clientSideFacetedSearch}
fetchResultsClientSide={props.fetchResultsClientSide} fetchResultsClientSide={props.fetchResultsClientSide}
clearResults={props.clearResults} clearResults={props.clearResults}
perspectives={perspectiveArr}
/> />
<Grid container spacing={1} className={classes.mainContainer}> <Grid container spacing={1} className={classes.mainContainer}>
<Route <Route
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment