2016-07-13 12:44:24 -08:00
|
|
|
import React from 'react';
|
2016-09-21 06:27:11 -08:00
|
|
|
|
2016-07-13 12:44:24 -08:00
|
|
|
import Component from '../component';
|
2016-09-21 06:27:11 -08:00
|
|
|
import {decorate, getTabProps} from '../utils/plugins';
|
|
|
|
|
|
|
|
|
|
import Tab_ from './tab';
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
const Tab = decorate(Tab_, 'Tab');
|
2016-09-18 22:47:33 -08:00
|
|
|
const isMac = /Mac/.test(navigator.userAgent);
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
export default class Tabs extends Component {
|
|
|
|
|
|
2016-09-21 06:27:11 -08:00
|
|
|
template(css) {
|
2016-07-13 12:44:24 -08:00
|
|
|
const {
|
|
|
|
|
tabs = [],
|
|
|
|
|
borderColor,
|
|
|
|
|
onChange,
|
|
|
|
|
onClose
|
|
|
|
|
} = this.props;
|
|
|
|
|
|
2016-11-11 08:18:04 -09:00
|
|
|
const hide = !isMac && tabs.length === 1;
|
|
|
|
|
|
|
|
|
|
return (<nav className={css('nav', hide && 'hiddenNav')}>
|
2016-08-17 00:13:32 -08:00
|
|
|
{ this.props.customChildrenBefore }
|
2016-07-13 12:44:24 -08:00
|
|
|
{
|
2016-11-11 08:18:04 -09:00
|
|
|
tabs.length === 1 && isMac ?
|
|
|
|
|
<div className={css('title')}>{tabs[0].title}</div> :
|
|
|
|
|
null
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
tabs.length > 1 ?
|
2017-01-09 12:32:15 -09:00
|
|
|
[
|
|
|
|
|
<ul
|
|
|
|
|
key="list"
|
|
|
|
|
className={css('list')}
|
|
|
|
|
>
|
|
|
|
|
{
|
|
|
|
|
tabs.map((tab, i) => {
|
|
|
|
|
const {uid, title, isActive, hasActivity} = tab;
|
|
|
|
|
const props = getTabProps(tab, this.props, {
|
|
|
|
|
text: title === '' ? 'Shell' : title,
|
|
|
|
|
isFirst: i === 0,
|
|
|
|
|
isLast: tabs.length - 1 === i,
|
|
|
|
|
borderColor,
|
|
|
|
|
isActive,
|
|
|
|
|
hasActivity,
|
|
|
|
|
onSelect: onChange.bind(null, uid),
|
|
|
|
|
onClose: onClose.bind(null, uid)
|
|
|
|
|
});
|
|
|
|
|
return <Tab key={`tab-${uid}`} {...props}/>;
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
</ul>,
|
|
|
|
|
isMac && <div
|
|
|
|
|
key="shim"
|
|
|
|
|
style={{borderColor}}
|
|
|
|
|
className={css('borderShim')}
|
|
|
|
|
/>
|
|
|
|
|
] :
|
|
|
|
|
null
|
2016-07-13 12:44:24 -08:00
|
|
|
}
|
|
|
|
|
{ this.props.customChildren }
|
2016-09-21 06:27:11 -08:00
|
|
|
</nav>);
|
2016-07-13 12:44:24 -08:00
|
|
|
}
|
|
|
|
|
|
2016-09-21 06:27:11 -08:00
|
|
|
styles() {
|
2016-07-13 12:44:24 -08:00
|
|
|
return {
|
|
|
|
|
nav: {
|
|
|
|
|
fontSize: '12px',
|
|
|
|
|
height: '34px',
|
|
|
|
|
lineHeight: '34px',
|
|
|
|
|
verticalAlign: 'middle',
|
|
|
|
|
color: '#9B9B9B',
|
|
|
|
|
cursor: 'default',
|
2016-09-18 22:47:33 -08:00
|
|
|
position: 'relative',
|
2016-07-13 12:44:24 -08:00
|
|
|
WebkitUserSelect: 'none',
|
2016-11-11 08:18:04 -09:00
|
|
|
WebkitAppRegion: isMac ? 'drag' : '',
|
|
|
|
|
top: isMac ? '' : '34px'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
hiddenNav: {
|
|
|
|
|
display: 'none'
|
2016-07-13 12:44:24 -08:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
title: {
|
|
|
|
|
textAlign: 'center',
|
|
|
|
|
color: '#fff'
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
list: {
|
|
|
|
|
maxHeight: '34px',
|
|
|
|
|
display: 'flex',
|
2016-09-18 22:47:33 -08:00
|
|
|
flexFlow: 'row',
|
|
|
|
|
marginLeft: isMac ? 76 : 0
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
borderShim: {
|
|
|
|
|
position: 'absolute',
|
|
|
|
|
width: '76px',
|
|
|
|
|
bottom: 0,
|
|
|
|
|
borderColor: '#ccc',
|
|
|
|
|
borderBottomStyle: 'solid',
|
|
|
|
|
borderBottomWidth: '1px'
|
2016-07-13 12:44:24 -08:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|