UNPKG

accessible-react-tabs

Version:

Accessible tab component for React

128 lines (103 loc) 4.12 kB
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } import React from 'react'; import Tab from './Tab'; import Tabpanel from './Tabpanel'; var Tabs = function (_React$Component) { _inherits(Tabs, _React$Component); function Tabs(props) { _classCallCheck(this, Tabs); var _this = _possibleConstructorReturn(this, _React$Component.call(this, props)); _this.tabsLength = _this.props.data.length; _this.keys = { esc: 27, up: 38, down: 40, space: 32, enter: 13, left: 37, right: 39 }; _this.state = { selected: 0 }; _this.buildClassList = _this.buildClassList.bind(_this); _this.handleClick = _this.handleClick.bind(_this); _this.handleKeyDown = _this.handleKeyDown.bind(_this); return _this; } Tabs.prototype.buildClassList = function buildClassList() { var classList = ['dz0-wrapper-tabs']; if (this.props.classes) { classList.push(this.props.classes); } return classList.join(' '); }; Tabs.prototype.handleClick = function handleClick(event, index) { event.preventDefault(); if (this.state.selected === index) { return; } this.setState({ selected: index }); if (this.props.data[index].callback) { this.props.data[index].callback(); } }; Tabs.prototype.handleKeyDown = function handleKeyDown(event) { if (event.keyCode === this.keys.up || event.keyCode === this.keys.down || event.keyCode === this.keys.left || event.keyCode === this.keys.right) { event.preventDefault(); } else { return true; } var targetIndex = void 0; if ((event.keyCode === this.keys.up || event.keyCode === this.keys.left) && this.state.selected > 0) { targetIndex = this.state.selected - 1; } else if ((event.keyCode === this.keys.down || event.keyCode === this.keys.right) && this.state.selected < this.tabsLength - 1) { targetIndex = this.state.selected + 1; } else { return; } this.setState({ selected: targetIndex }); if (this.props.callback) { this.props.callback(); } }; Tabs.prototype.render = function render() { var _this2 = this; var _props = this.props, data = _props.data, loading = _props.loading; if (!data.length) { return null; } return React.createElement( 'div', { className: this.buildClassList() }, React.createElement( 'div', { className: 'dz0-tabs', role: 'tablist' }, data.map(function (tab, index) { var label = tab.label; var cb = tab.callback; return React.createElement(Tab, { key: index, index: index, selectedIndex: _this2.state.selected, label: label, onClick: _this2.handleClick, onKeyDown: _this2.handleKeyDown }); }) ), React.createElement( 'div', { className: 'dz0-tabpanels' }, data.map(function (tab, index) { var label = tab.label; var content = tab.content; return React.createElement(Tabpanel, { key: index, index: index, selectedIndex: _this2.state.selected, label: label, comp: content }); }) ) ); }; return Tabs; }(React.Component); export { Tabs as default };