225 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 | 
						|
 | 
						|
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
 | 
						|
 | 
						|
// @inheritedComponent ButtonBase
 | 
						|
 | 
						|
import React from 'react';
 | 
						|
 | 
						|
import classNames from 'classnames';
 | 
						|
import withStyles from '../styles/withStyles';
 | 
						|
import ButtonBase from '../ButtonBase';
 | 
						|
import { capitalizeFirstLetter } from '../utils/helpers';
 | 
						|
import Icon from '../Icon';
 | 
						|
 | 
						|
export const styles = theme => ({
 | 
						|
  root: _extends({}, theme.typography.button, {
 | 
						|
    maxWidth: 264,
 | 
						|
    position: 'relative',
 | 
						|
    minWidth: 72,
 | 
						|
    padding: 0,
 | 
						|
    height: 48,
 | 
						|
    flex: 'none',
 | 
						|
    overflow: 'hidden',
 | 
						|
    [theme.breakpoints.up('md')]: {
 | 
						|
      minWidth: 160
 | 
						|
    }
 | 
						|
  }),
 | 
						|
  rootLabelIcon: {
 | 
						|
    height: 72
 | 
						|
  },
 | 
						|
  rootAccent: {
 | 
						|
    color: theme.palette.text.secondary
 | 
						|
  },
 | 
						|
  rootAccentSelected: {
 | 
						|
    color: theme.palette.secondary.A200
 | 
						|
  },
 | 
						|
  rootAccentDisabled: {
 | 
						|
    color: theme.palette.text.disabled
 | 
						|
  },
 | 
						|
  rootPrimary: {
 | 
						|
    color: theme.palette.text.secondary
 | 
						|
  },
 | 
						|
  rootPrimarySelected: {
 | 
						|
    color: theme.palette.primary[500]
 | 
						|
  },
 | 
						|
  rootPrimaryDisabled: {
 | 
						|
    color: theme.palette.text.disabled
 | 
						|
  },
 | 
						|
  rootInherit: {
 | 
						|
    color: 'inherit',
 | 
						|
    opacity: 0.7
 | 
						|
  },
 | 
						|
  rootInheritSelected: {
 | 
						|
    opacity: 1
 | 
						|
  },
 | 
						|
  rootInheritDisabled: {
 | 
						|
    opacity: 0.4
 | 
						|
  },
 | 
						|
  fullWidth: {
 | 
						|
    flexGrow: 1
 | 
						|
  },
 | 
						|
  wrapper: {
 | 
						|
    display: 'inline-flex',
 | 
						|
    alignItems: 'center',
 | 
						|
    justifyContent: 'center',
 | 
						|
    width: '100%',
 | 
						|
    flexDirection: 'column'
 | 
						|
  },
 | 
						|
  labelContainer: {
 | 
						|
    paddingTop: 6,
 | 
						|
    paddingBottom: 6,
 | 
						|
    paddingLeft: 12,
 | 
						|
    paddingRight: 12,
 | 
						|
    [theme.breakpoints.up('md')]: {
 | 
						|
      paddingLeft: theme.spacing.unit * 3,
 | 
						|
      paddingRight: theme.spacing.unit * 3
 | 
						|
    }
 | 
						|
  },
 | 
						|
  label: {
 | 
						|
    fontSize: theme.typography.pxToRem(theme.typography.fontSize),
 | 
						|
    whiteSpace: 'normal',
 | 
						|
    [theme.breakpoints.up('md')]: {
 | 
						|
      fontSize: theme.typography.pxToRem(theme.typography.fontSize - 1)
 | 
						|
    }
 | 
						|
  },
 | 
						|
  labelWrapped: {
 | 
						|
    [theme.breakpoints.down('md')]: {
 | 
						|
      fontSize: theme.typography.pxToRem(theme.typography.fontSize - 2)
 | 
						|
    }
 | 
						|
  }
 | 
						|
});
 | 
						|
 | 
						|
class Tab extends React.Component {
 | 
						|
  constructor(...args) {
 | 
						|
    var _temp;
 | 
						|
 | 
						|
    return _temp = super(...args), this.state = {
 | 
						|
      wrappedText: false
 | 
						|
    }, this.handleChange = event => {
 | 
						|
      const { onChange, value, onClick } = this.props;
 | 
						|
 | 
						|
      if (onChange) {
 | 
						|
        onChange(event, value);
 | 
						|
      }
 | 
						|
 | 
						|
      if (onClick) {
 | 
						|
        onClick(event);
 | 
						|
      }
 | 
						|
    }, this.label = undefined, this.checkTextWrap = () => {
 | 
						|
      if (this.label) {
 | 
						|
        const wrappedText = this.label.getClientRects().length > 1;
 | 
						|
        if (this.state.wrappedText !== wrappedText) {
 | 
						|
          this.setState({ wrappedText });
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }, _temp;
 | 
						|
  }
 | 
						|
 | 
						|
  componentDidMount() {
 | 
						|
    this.checkTextWrap();
 | 
						|
  }
 | 
						|
 | 
						|
  componentDidUpdate(prevProps, prevState) {
 | 
						|
    if (this.state.wrappedText === prevState.wrappedText) {
 | 
						|
      /**
 | 
						|
       * At certain text and tab lengths, a larger font size may wrap to two lines while the smaller
 | 
						|
       * font size still only requires one line.  This check will prevent an infinite render loop
 | 
						|
       * fron occurring in that scenario.
 | 
						|
       */
 | 
						|
      this.checkTextWrap();
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  render() {
 | 
						|
    const _props = this.props,
 | 
						|
          {
 | 
						|
      classes,
 | 
						|
      className: classNameProp,
 | 
						|
      disabled,
 | 
						|
      fullWidth,
 | 
						|
      icon: iconProp,
 | 
						|
      indicator,
 | 
						|
      label: labelProp,
 | 
						|
      onChange,
 | 
						|
      selected,
 | 
						|
      style: styleProp,
 | 
						|
      textColor,
 | 
						|
      value
 | 
						|
    } = _props,
 | 
						|
          other = _objectWithoutProperties(_props, ['classes', 'className', 'disabled', 'fullWidth', 'icon', 'indicator', 'label', 'onChange', 'selected', 'style', 'textColor', 'value']);
 | 
						|
 | 
						|
    let icon;
 | 
						|
 | 
						|
    if (iconProp !== undefined) {
 | 
						|
      icon = React.isValidElement(iconProp) ? iconProp : React.createElement(
 | 
						|
        Icon,
 | 
						|
        null,
 | 
						|
        iconProp
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    let label;
 | 
						|
 | 
						|
    if (labelProp !== undefined) {
 | 
						|
      label = React.createElement(
 | 
						|
        'div',
 | 
						|
        { className: classes.labelContainer },
 | 
						|
        React.createElement(
 | 
						|
          'span',
 | 
						|
          {
 | 
						|
            className: classNames(classes.label, {
 | 
						|
              [classes.labelWrapped]: this.state.wrappedText
 | 
						|
            }),
 | 
						|
            ref: node => {
 | 
						|
              this.label = node;
 | 
						|
            }
 | 
						|
          },
 | 
						|
          labelProp
 | 
						|
        )
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    const className = classNames(classes.root, {
 | 
						|
      [classes[`root${capitalizeFirstLetter(textColor)}`]]: true,
 | 
						|
      [classes[`root${capitalizeFirstLetter(textColor)}Disabled`]]: disabled,
 | 
						|
      [classes[`root${capitalizeFirstLetter(textColor)}Selected`]]: selected,
 | 
						|
      [classes.rootLabelIcon]: icon && label,
 | 
						|
      [classes.fullWidth]: fullWidth
 | 
						|
    }, classNameProp);
 | 
						|
 | 
						|
    let style = {};
 | 
						|
 | 
						|
    if (textColor !== 'accent' && textColor !== 'inherit') {
 | 
						|
      style.color = textColor;
 | 
						|
    }
 | 
						|
 | 
						|
    style = Object.keys(style).length > 0 ? _extends({}, style, styleProp) : styleProp;
 | 
						|
 | 
						|
    return React.createElement(
 | 
						|
      ButtonBase,
 | 
						|
      _extends({
 | 
						|
        focusRipple: true,
 | 
						|
        className: className,
 | 
						|
        style: style,
 | 
						|
        role: 'tab',
 | 
						|
        'aria-selected': selected,
 | 
						|
        disabled: disabled
 | 
						|
      }, other, {
 | 
						|
        onClick: this.handleChange
 | 
						|
      }),
 | 
						|
      React.createElement(
 | 
						|
        'span',
 | 
						|
        { className: classes.wrapper },
 | 
						|
        icon,
 | 
						|
        label
 | 
						|
      ),
 | 
						|
      indicator
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
Tab.defaultProps = {
 | 
						|
  disabled: false
 | 
						|
};
 | 
						|
export default withStyles(styles, { name: 'MuiTab' })(Tab); |