Skip to content
Snippets Groups Projects
PerspectiveTabs.js 3.11 KiB
Newer Older
import React from 'react'
import PropTypes from 'prop-types'
import { withStyles } from '@material-ui/core/styles'
esikkala's avatar
esikkala committed
import Grow from '@material-ui/core/Grow'
import Tabs from '@material-ui/core/Tabs'
import Tab from '@material-ui/core/Tab'
import { Link } from 'react-router-dom'
import Paper from '@material-ui/core/Paper'
import intl from 'react-intl-universal'
esikkala's avatar
esikkala committed

esikkala's avatar
esikkala committed
const styles = theme => ({
esikkala's avatar
esikkala committed
  root: {
esikkala's avatar
esikkala committed
    flexGrow: 1,
esikkala's avatar
esikkala committed
    borderBottomLeftRadius: 0,
    borderBottomRightRadius: 0
esikkala's avatar
esikkala committed
  },
  tabRoot: {
    paddingTop: theme.spacing(0.5),
    paddingBottom: theme.spacing(0.5)
  },
  tabLabelIcon: props => ({
    minHeight: props.layoutConfig.tabHeight
  })
esikkala's avatar
esikkala committed

esikkala's avatar
esikkala committed
/**
 * A component for generating view tabs for a faceted search perspective or an entity landing page.
 */
esikkala's avatar
esikkala committed
class PerspectiveTabs extends React.Component {
  constructor (props) {
    super(props)
    const value = this.pathnameToValue(this.props.routeProps.location.pathname)
    this.state = { value }
    const newPath = this.props.routeProps.location.pathname
    const oldPath = prevProps.routeProps.location.pathname
    if (newPath !== oldPath) {
      this.setState({ value: this.pathnameToValue(newPath) })
esikkala's avatar
esikkala committed

    // Fix tabs indicator not showing on first load
    // https://stackoverflow.com/a/61205108
    const evt = document.createEvent('UIEvents')
    evt.initUIEvent('resize', true, false, window, 0)
    window.dispatchEvent(evt)
    const activeID = pathname.split('/').pop()
    let value = 0
    this.props.tabs.forEach(tab => {
      if (tab.id === activeID) {
        value = tab.value
esikkala's avatar
esikkala committed
      }
    })
    return value
esikkala's avatar
esikkala committed
  handleChange = (event, value) => {
    this.setState({ value })
esikkala's avatar
esikkala committed
  };

  render () {
esikkala's avatar
esikkala committed
    const { classes, tabs } = this.props
    // const largeScreen = screenSize === 'xl'
    const variant = tabs.length > 3 ? 'scrollable' : 'fullWidth'
    const scrollButtons = tabs.length > 3 ? 'auto' : 'on'
esikkala's avatar
esikkala committed
    return (
esikkala's avatar
esikkala committed
      <Paper className={classes.root}>
esikkala's avatar
esikkala committed
        <Grow in>
          <Tabs
            value={this.state.value}
            onChange={this.handleChange}
            indicatorColor='secondary'
            textColor='secondary'
            variant={variant}
            scrollButtons={scrollButtons}
          >
            {tabs.map(tab =>
              <Tab
                classes={{
                  root: classes.tabRoot,
                  labelIcon: classes.tabLabelIcon,
                  wrapper: classes.tabWrapper
                }}
                key={tab.id}
                icon={tab.icon}
                label={intl.get(`tabs.${tab.id}`)}
                component={Link}
                to={tab.id}
                wrapped
              />
            )}
          </Tabs>

        </Grow>

esikkala's avatar
esikkala committed
      </Paper>
esikkala's avatar
esikkala committed
PerspectiveTabs.propTypes = {
esikkala's avatar
esikkala committed
  classes: PropTypes.object.isRequired,
esikkala's avatar
esikkala committed
  routeProps: PropTypes.object.isRequired,
  tabs: PropTypes.array.isRequired,
esikkala's avatar
esikkala committed
  screenSize: PropTypes.string.isRequired,
  layoutConfig: PropTypes.object.isRequired
esikkala's avatar
esikkala committed

esikkala's avatar
esikkala committed
export const PerspectiveTabsComponent = PerspectiveTabs

export default withStyles(styles)(PerspectiveTabs)