Skip to content

Commit f10e619

Browse files
committed
Change handling of active/disabled class names
They are all toplevel now
1 parent e5fab6b commit f10e619

File tree

5 files changed

+31
-44
lines changed

5 files changed

+31
-44
lines changed

src/components/Tab.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,15 @@ import cx from 'classnames';
55
export default class Tab extends Component {
66

77
static defaultProps = {
8-
activeTabClassName: 'ReactTabs__Tab--selected',
9-
disabledTabClassName: 'ReactTabs__Tab--disabled',
108
focus: false,
119
id: null,
1210
panelId: null,
1311
selected: false,
1412
};
1513

1614
static propTypes = {
17-
activeTabClassName: PropTypes.string,
18-
disabledTabClassName: PropTypes.string,
15+
activeClassName: PropTypes.string, // private
16+
disabledClassName: PropTypes.string, // private
1917
children: PropTypes.oneOfType([
2018
PropTypes.array,
2119
PropTypes.object,
@@ -46,11 +44,11 @@ export default class Tab extends Component {
4644

4745
render() {
4846
const {
49-
activeTabClassName,
47+
activeClassName,
5048
children,
5149
className,
5250
disabled,
53-
disabledTabClassName,
51+
disabledClassName,
5452
focus, // eslint-disable-line no-unused-vars
5553
id,
5654
panelId,
@@ -65,8 +63,8 @@ export default class Tab extends Component {
6563
'ReactTabs__Tab',
6664
className,
6765
{
68-
[activeTabClassName]: selected,
69-
[disabledTabClassName]: disabled,
66+
[activeClassName]: selected,
67+
[disabledClassName]: disabled,
7068
},
7169
)}
7270
ref={(node) => { this.node = node; if (tabRef) tabRef(node); }}

src/components/TabList.js

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,21 @@
11
import PropTypes from 'prop-types';
22
import React, { Component } from 'react';
33
import cx from 'classnames';
4-
import Tab from './Tab';
54

65
export default class TabList extends Component {
76

87
static propTypes = {
9-
activeTabClassName: PropTypes.string,
108
children: PropTypes.oneOfType([
119
PropTypes.object,
1210
PropTypes.array,
1311
]),
1412
className: PropTypes.string,
15-
disabledTabClassName: PropTypes.string,
1613
};
1714

18-
renderChildren() {
19-
const {
20-
activeTabClassName,
21-
children,
22-
disabledTabClassName,
23-
} = this.props;
24-
25-
return React.Children.map(children, (child) => {
26-
// if child is not a tab we don't need to clone it
27-
// since we don't need to add custom props
28-
29-
if (child.type === Tab) {
30-
return React.cloneElement(child, {
31-
activeTabClassName,
32-
disabledTabClassName,
33-
});
34-
}
35-
36-
return child;
37-
});
38-
}
39-
4015
render() {
4116
const {
42-
activeTabClassName, // eslint-disable-line no-unused-vars
43-
children, // eslint-disable-line no-unused-vars
17+
children,
4418
className,
45-
disabledTabClassName, // eslint-disable-line no-unused-vars
4619
...attributes } = this.props;
4720

4821
return (
@@ -54,7 +27,7 @@ export default class TabList extends Component {
5427
)}
5528
role="tablist"
5629
>
57-
{this.renderChildren()}
30+
{children}
5831
</ul>
5932
);
6033
}

src/components/TabPanel.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export default class TabPanel extends Component {
99
};
1010

1111
static propTypes = {
12+
activeClassName: PropTypes.string, // private
1213
children: PropTypes.node,
1314
className: PropTypes.string,
1415
forceRenderTabPanel: PropTypes.bool, // private
@@ -20,6 +21,7 @@ export default class TabPanel extends Component {
2021

2122
render() {
2223
const {
24+
activeClassName,
2325
children,
2426
className,
2527
forceRenderTabPanel,
@@ -36,7 +38,7 @@ export default class TabPanel extends Component {
3638
'ReactTabs__TabPanel',
3739
className,
3840
{
39-
'ReactTabs__TabPanel--selected': selected,
41+
[activeClassName]: selected,
4042
},
4143
)}
4244
role="tabpanel"

src/components/Tabs.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@ export default class Tabs extends Component {
1414
};
1515

1616
static propTypes = {
17+
activeTabClassName: PropTypes.string,
18+
activeTabPanelClassName: PropTypes.string,
1719
children: childrenPropType,
1820
className: PropTypes.string,
1921
defaultFocus: PropTypes.bool,
2022
defaultIndex: PropTypes.number,
23+
disabledTabClassName: PropTypes.string,
2124
forceRenderTabPanel: PropTypes.bool,
2225
onSelect: onSelectPropType,
2326
selectedIndex: selectedIndexPropType,
@@ -50,17 +53,17 @@ For more information about controlled and uncontrolled mode of react-tabs see th
5053
}
5154

5255
handleSelected = (index, last, event) => {
53-
const state = {
54-
// Set focus if the change was triggered from the keyboard
55-
focus: event.type === 'keydown',
56-
};
57-
5856
// Call change event handler
5957
if (typeof this.props.onSelect === 'function') {
6058
// Check if the change event handler cancels the tab change
6159
if (this.props.onSelect(index, last, event) === false) return;
6260
}
6361

62+
const state = {
63+
// Set focus if the change was triggered from the keyboard
64+
focus: event.type === 'keydown',
65+
};
66+
6467
if (Tabs.inUncontrolledMode(this.props)) {
6568
// Update selected index
6669
state.selectedIndex = index;

src/components/UncontrolledTabs.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,20 @@ function isTabDisabled(node) {
2121
export default class UncontrolledTabs extends Component {
2222

2323
static defaultProps = {
24+
activeTabClassName: 'ReactTabs__Tab--selected',
25+
activeTabPanelClassName: 'ReactTabs__TabPanel--selected',
2426
className: '',
27+
disabledTabClassName: 'ReactTabs__Tab--disabled',
2528
focus: false,
2629
forceRenderTabPanel: false,
2730
};
2831

2932
static propTypes = {
33+
activeTabClassName: PropTypes.string,
34+
activeTabPanelClassName: PropTypes.string,
3035
children: childrenPropType,
3136
className: PropTypes.string,
37+
disabledTabClassName: PropTypes.string,
3238
focus: PropTypes.bool,
3339
forceRenderTabPanel: PropTypes.bool,
3440
onSelect: PropTypes.func.isRequired,
@@ -149,6 +155,8 @@ export default class UncontrolledTabs extends Component {
149155
const panelId = this.panelIds[listIndex];
150156
const selected = this.props.selectedIndex === listIndex;
151157
const focus = selected && this.props.focus;
158+
const activeClassName = this.props.activeTabClassName;
159+
const disabledClassName = this.props.disabledTabClassName;
152160

153161
listIndex++;
154162

@@ -158,6 +166,8 @@ export default class UncontrolledTabs extends Component {
158166
panelId,
159167
selected,
160168
focus,
169+
activeClassName,
170+
disabledClassName,
161171
});
162172
}),
163173
});
@@ -166,6 +176,7 @@ export default class UncontrolledTabs extends Component {
166176
const tabId = this.tabIds[index];
167177
const selected = this.props.selectedIndex === index;
168178
const forceRenderTabPanel = this.props.forceRenderTabPanel;
179+
const activeClassName = this.props.activeTabPanelClassName;
169180

170181
index++;
171182

@@ -174,6 +185,7 @@ export default class UncontrolledTabs extends Component {
174185
tabId,
175186
selected,
176187
forceRenderTabPanel,
188+
activeClassName,
177189
});
178190
}
179191

@@ -260,7 +272,6 @@ export default class UncontrolledTabs extends Component {
260272
{...attributes}
261273
className={cx(
262274
'ReactTabs',
263-
'react-tabs',
264275
className,
265276
)}
266277
onClick={this.handleClick}

0 commit comments

Comments
 (0)