accessible-react-tabs
Version:
Accessible tab component for React
128 lines (103 loc) • 4.12 kB
JavaScript
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 };