Skip to content

Commit d420159

Browse files
selvagszdanez
authored andcommitted
Feature/add custom active and disabled class (#108)
* Adds support for custom active/disabled class names * Add tests
1 parent 171f48d commit d420159

File tree

3 files changed

+74
-6
lines changed

3 files changed

+74
-6
lines changed

src/components/Tab.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ module.exports = React.createClass({
1111
focus: PropTypes.bool,
1212
selected: PropTypes.bool,
1313
disabled: PropTypes.bool,
14+
activeTabClassName: PropTypes.string,
15+
disabledTabClassName: PropTypes.string,
1416
panelId: PropTypes.string,
1517
children: PropTypes.oneOfType([
1618
PropTypes.array,
@@ -25,6 +27,8 @@ module.exports = React.createClass({
2527
selected: false,
2628
id: null,
2729
panelId: null,
30+
activeTabClassName: 'ReactTabs__Tab--selected',
31+
disabledTabClassName: 'ReactTabs__Tab--disabled',
2832
};
2933
},
3034

@@ -43,7 +47,16 @@ module.exports = React.createClass({
4347
},
4448

4549
render() {
46-
const { selected, disabled, panelId, className, children, id, ...attributes } = this.props;
50+
const {
51+
selected,
52+
disabled,
53+
panelId,
54+
activeTabClassName,
55+
disabledTabClassName,
56+
className,
57+
children,
58+
id,
59+
...attributes } = this.props;
4760

4861
return (
4962
<li
@@ -52,8 +65,8 @@ module.exports = React.createClass({
5265
'ReactTabs__Tab',
5366
className,
5467
{
55-
'ReactTabs__Tab--selected': selected,
56-
'ReactTabs__Tab--disabled': disabled,
68+
[activeTabClassName]: selected,
69+
[disabledTabClassName]: disabled,
5770
}
5871
)}
5972
role="tab"

src/components/TabList.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,35 @@
11
import React, { PropTypes } from 'react';
22
import cx from 'classnames';
33

4+
function renderChildren(props) {
5+
return React.Children.map(props.children, (child) =>
6+
React.cloneElement(child, {
7+
activeTabClassName: props.activeTabClassName,
8+
disabledTabClassName: props.disabledTabClassName,
9+
})
10+
);
11+
}
12+
413
module.exports = React.createClass({
514
displayName: 'TabList',
615

716
propTypes: {
817
className: PropTypes.string,
18+
activeTabClassName: PropTypes.string,
19+
disabledTabClassName: PropTypes.string,
920
children: PropTypes.oneOfType([
1021
PropTypes.object,
1122
PropTypes.array,
1223
]),
1324
},
1425

1526
render() {
16-
const { className, children, ...attributes } = this.props;
27+
const {
28+
className,
29+
activeTabClassName,
30+
disabledTabClassName,
31+
children,
32+
...attributes } = this.props;
1733

1834
return (
1935
<ul
@@ -24,7 +40,7 @@ module.exports = React.createClass({
2440
)}
2541
role="tablist"
2642
>
27-
{children}
43+
{renderChildren({ activeTabClassName, disabledTabClassName, children })}
2844
</ul>
2945
);
3046
},

src/components/__tests__/TabList-test.js

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
/* global jest, describe, it, expect */
22
import React from 'react';
3-
import { shallow } from 'enzyme';
3+
import { shallow, mount } from 'enzyme';
4+
import Tab from '../Tab';
45
import TabList from '../TabList';
6+
import Tabs from '../Tabs';
7+
8+
function hasClassAt(wrapper, index, className) {
9+
return wrapper.childAt(index).find('li').hasClass(className);
10+
}
511

612
describe('<TabList />', () => {
713
it('should have sane defaults', () => {
@@ -30,4 +36,37 @@ describe('<TabList />', () => {
3036

3137
expect(wrapper.prop('role')).toBe('tablist');
3238
});
39+
40+
it('should retain the default classnames for active and disabled tab', () => {
41+
const wrapper = mount(
42+
<Tabs selectedIndex={0}>
43+
<TabList>
44+
<Tab>Foo</Tab>
45+
<Tab disabled>Bar</Tab>
46+
</TabList>
47+
</Tabs>
48+
);
49+
50+
const tabsList = wrapper.childAt(0);
51+
expect(hasClassAt(tabsList, 0, 'ReactTabs__Tab--selected')).toBe(true);
52+
expect(hasClassAt(tabsList, 1, 'ReactTabs__Tab--disabled')).toBe(true);
53+
});
54+
55+
it('should display the custom classnames for active and disabled tab', () => {
56+
const wrapper = mount(
57+
<Tabs selectedIndex={0}>
58+
<TabList activeTabClassName="active" disabledTabClassName="disabled">
59+
<Tab>Foo</Tab>
60+
<Tab disabled>Bar</Tab>
61+
</TabList>
62+
</Tabs>
63+
);
64+
65+
const tabsList = wrapper.childAt(0);
66+
expect(hasClassAt(tabsList, 0, 'ReactTabs__Tab--selected')).toBe(false);
67+
expect(hasClassAt(tabsList, 1, 'ReactTabs__Tab--disabled')).toBe(false);
68+
69+
expect(hasClassAt(tabsList, 0, 'active')).toBe(true);
70+
expect(hasClassAt(tabsList, 1, 'disabled')).toBe(true);
71+
});
3372
});

0 commit comments

Comments
 (0)