Skip to content

Commit 4e919dd

Browse files
committed
Merge pull request react-bootstrap#591 from AlexKVal/refactoring425
Collapsable* => Collapsible* renaming of components
2 parents 779365c + 0105127 commit 4e919dd

20 files changed

+698
-329
lines changed

docs/examples/.eslintrc

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
"Button",
1414
"ButtonGroup",
1515
"ButtonToolbar",
16-
"CollapsableNav",
17-
"CollapsableMixin",
16+
"CollapsibleNav",
17+
"CollapsibleMixin",
1818
"Carousel",
1919
"CarouselItem",
2020
"Col",

docs/examples/CollapsableNav.js docs/examples/CollapsibleNav.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const navbarInstance = (
22
<Navbar brand='React-Bootstrap' toggleNavKey={0}>
3-
<CollapsableNav eventKey={0}> {/* This is the eventKey referenced */}
3+
<CollapsibleNav eventKey={0}> {/* This is the eventKey referenced */}
44
<Nav navbar>
55
<NavItem eventKey={1} href='#'>Link</NavItem>
66
<NavItem eventKey={2} href='#'>Link</NavItem>
@@ -16,7 +16,7 @@ const navbarInstance = (
1616
<NavItem eventKey={1} href='#'>Link Right</NavItem>
1717
<NavItem eventKey={2} href='#'>Link Right</NavItem>
1818
</Nav>
19-
</CollapsableNav>
19+
</CollapsibleNav>
2020
</Navbar>
2121
);
2222

docs/examples/CollapsableParagraph.js docs/examples/CollapsibleParagraph.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
const CollapsableParagraph = React.createClass({
2-
mixins: [CollapsableMixin],
1+
const CollapsibleParagraph = React.createClass({
2+
mixins: [CollapsibleMixin],
33

4-
getCollapsableDOMNode: function(){
4+
getCollapsibleDOMNode: function(){
55
return this.refs.panel.getDOMNode();
66
},
77

8-
getCollapsableDimensionValue: function(){
8+
getCollapsibleDimensionValue: function(){
99
return this.refs.panel.getDOMNode().scrollHeight;
1010
},
1111

@@ -15,7 +15,7 @@ const CollapsableParagraph = React.createClass({
1515
},
1616

1717
render: function(){
18-
let styles = this.getCollapsableClassSet();
18+
let styles = this.getCollapsibleClassSet();
1919
let text = this.isExpanded() ? 'Hide' : 'Show';
2020
return (
2121
<div>
@@ -29,9 +29,9 @@ const CollapsableParagraph = React.createClass({
2929
});
3030

3131
const panelInstance = (
32-
<CollapsableParagraph>
32+
<CollapsibleParagraph>
3333
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
34-
</CollapsableParagraph>
34+
</CollapsibleParagraph>
3535
);
3636

3737
React.render(panelInstance, mountNode);
File renamed without changes.

docs/src/ComponentsPage.js

+8-8
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,9 @@ const ComponentsPage = React.createClass({
208208
<p><code>&lt;Accordion /&gt;</code> aliases <code>&lt;PanelGroup accordion /&gt;</code>.</p>
209209
<ReactPlayground codeText={Samples.PanelGroupAccordion} />
210210

211-
<h3 id='panels-collapsable'>Collapsable Mixin</h3>
212-
<p><code>CollapsableMixin</code> can be used to create your own components with collapse functionality.</p>
213-
<ReactPlayground codeText={Samples.CollapsableParagraph} />
211+
<h3 id='panels-collapsible'>Collapsible Mixin</h3>
212+
<p><code>CollapsibleMixin</code> can be used to create your own components with collapse functionality.</p>
213+
<ReactPlayground codeText={Samples.CollapsibleParagraph} />
214214
</div>
215215

216216
<div className='bs-docs-section'>
@@ -351,7 +351,7 @@ const ComponentsPage = React.createClass({
351351
<p>By setting the property {React.DOM.code(null, 'defaultNavExpanded={true}')} the Navbar will start expanded by default.</p>
352352
<div className='bs-callout bs-callout-info'>
353353
<h4>Scrollbar overflow</h4>
354-
<p>The height of the collapsable is slightly smaller than the real height. To hide the scroll bar, add the following css to your style files.</p>
354+
<p>The height of the collapsible is slightly smaller than the real height. To hide the scroll bar, add the following css to your style files.</p>
355355
<pre>
356356
{React.DOM.code(null,
357357
'.navbar-collapse {\n' +
@@ -360,17 +360,17 @@ const ComponentsPage = React.createClass({
360360
)}
361361
</pre>
362362
</div>
363-
<ReactPlayground codeText={Samples.NavbarCollapsable} />
363+
<ReactPlayground codeText={Samples.NavbarCollapsible} />
364364

365365
<h3>Mobile Friendly (Multiple Nav Components)</h3>
366-
<p>To have a mobile friendly Navbar that handles multiple <code>Nav</code> components use <code>CollapsableNav</code>. The <code>toggleNavKey</code> must still be set, however, the corresponding <code>eventKey</code> must now be on the <code>CollapsableNav</code> component.</p>
366+
<p>To have a mobile friendly Navbar that handles multiple <code>Nav</code> components use <code>CollapsibleNav</code>. The <code>toggleNavKey</code> must still be set, however, the corresponding <code>eventKey</code> must now be on the <code>CollapsibleNav</code> component.</p>
367367
<div className="bs-callout bs-callout-info">
368368
<h4>Div collapse</h4>
369-
<p>The <code>navbar-collapse</code> div gets created as the collapsable element which follows the <a href="http://getbootstrap.com/components/#navbar-default">bootstrap</a> collapsable navbar documentation.</p>
369+
<p>The <code>navbar-collapse</code> div gets created as the collapsible element which follows the <a href="http://getbootstrap.com/components/#navbar-default">bootstrap</a> collapsible navbar documentation.</p>
370370
<pre>&lt;div class="collapse navbar-collapse"&gt;&lt;/div&gt;</pre>
371371
</div>
372372

373-
<ReactPlayground codeText={Samples.CollapsableNav} />
373+
<ReactPlayground codeText={Samples.CollapsibleNav} />
374374
</div>
375375

376376
{/* Tabbed Areas */}

docs/src/ReactPlayground.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import * as modBadge from '../../src/Badge';
66
import * as modmodButton from '../../src/Button';
77
import * as modButtonGroup from '../../src/ButtonGroup';
88
import * as modmodButtonToolbar from '../../src/ButtonToolbar';
9-
import * as modCollapsableNav from '../../src/CollapsableNav';
10-
import * as modCollapsableMixin from '../../src/CollapsableMixin';
9+
import * as modCollapsibleNav from '../../src/CollapsibleNav';
10+
import * as modCollapsibleMixin from '../../src/CollapsibleMixin';
1111
import * as modCarousel from '../../src/Carousel';
1212
import * as modCarouselItem from '../../src/CarouselItem';
1313
import * as modCol from '../../src/Col';
@@ -53,8 +53,8 @@ const Badge = modBadge.default;
5353
const Button = modmodButton.default;
5454
const ButtonGroup = modButtonGroup.default;
5555
const ButtonToolbar = modmodButtonToolbar.default;
56-
const CollapsableNav = modCollapsableNav.default;
57-
const CollapsableMixin = modCollapsableMixin.default;
56+
const CollapsibleNav = modCollapsibleNav.default;
57+
const CollapsibleMixin = modCollapsibleMixin.default;
5858
const Carousel = modCarousel.default;
5959
const CarouselItem = modCarouselItem.default;
6060
const Col = modCol.default;

docs/src/Samples.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export default {
2828
PanelGroupControlled: require('fs').readFileSync(__dirname + '/../examples/PanelGroupControlled.js', 'utf8'),
2929
PanelGroupUncontrolled: require('fs').readFileSync(__dirname + '/../examples/PanelGroupUncontrolled.js', 'utf8'),
3030
PanelGroupAccordion: require('fs').readFileSync(__dirname + '/../examples/PanelGroupAccordion.js', 'utf8'),
31-
CollapsableParagraph: require('fs').readFileSync(__dirname + '/../examples/CollapsableParagraph.js', 'utf8'),
31+
CollapsibleParagraph: require('fs').readFileSync(__dirname + '/../examples/CollapsibleParagraph.js', 'utf8'),
3232
ModalStatic: require('fs').readFileSync(__dirname + '/../examples/ModalStatic.js', 'utf8'),
3333
ModalTrigger: require('fs').readFileSync(__dirname + '/../examples/ModalTrigger.js', 'utf8'),
3434
ModalOverlayMixin: require('fs').readFileSync(__dirname + '/../examples/ModalOverlayMixin.js', 'utf8'),
@@ -52,8 +52,8 @@ export default {
5252
NavJustified: require('fs').readFileSync(__dirname + '/../examples/NavJustified.js', 'utf8'),
5353
NavbarBasic: require('fs').readFileSync(__dirname + '/../examples/NavbarBasic.js', 'utf8'),
5454
NavbarBrand: require('fs').readFileSync(__dirname + '/../examples/NavbarBrand.js', 'utf8'),
55-
NavbarCollapsable: require('fs').readFileSync(__dirname + '/../examples/NavbarCollapsable.js', 'utf8'),
56-
CollapsableNav: require('fs').readFileSync(__dirname + '/../examples/CollapsableNav.js', 'utf8'),
55+
NavbarCollapsible: require('fs').readFileSync(__dirname + '/../examples/NavbarCollapsible.js', 'utf8'),
56+
CollapsibleNav: require('fs').readFileSync(__dirname + '/../examples/CollapsibleNav.js', 'utf8'),
5757
TabbedAreaUncontrolled: require('fs').readFileSync(__dirname + '/../examples/TabbedAreaUncontrolled.js', 'utf8'),
5858
TabbedAreaControlled: require('fs').readFileSync(__dirname + '/../examples/TabbedAreaControlled.js', 'utf8'),
5959
TabbedAreaNoAnimation: require('fs').readFileSync(__dirname + '/../examples/TabbedAreaNoAnimation.js', 'utf8'),

src/CollapsableMixin.js

+32-162
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,38 @@
1-
import React from 'react';
2-
import TransitionEvents from 'react/lib/ReactTransitionEvents';
1+
import assign from './utils/Object.assign';
2+
import deprecationWarning from './utils/deprecationWarning';
3+
import CollapsibleMixin from './CollapsibleMixin';
34

4-
const CollapsableMixin = {
5-
6-
propTypes: {
7-
defaultExpanded: React.PropTypes.bool,
8-
expanded: React.PropTypes.bool
9-
},
10-
11-
getInitialState(){
12-
let defaultExpanded = this.props.defaultExpanded != null ?
13-
this.props.defaultExpanded :
14-
this.props.expanded != null ?
15-
this.props.expanded :
16-
false;
17-
18-
return {
19-
expanded: defaultExpanded,
20-
collapsing: false
21-
};
22-
},
23-
24-
componentWillUpdate(nextProps, nextState){
25-
let willExpanded = nextProps.expanded != null ? nextProps.expanded : nextState.expanded;
26-
if (willExpanded === this.isExpanded()) {
27-
return;
28-
}
29-
30-
// if the expanded state is being toggled, ensure node has a dimension value
31-
// this is needed for the animation to work and needs to be set before
32-
// the collapsing class is applied (after collapsing is applied the in class
33-
// is removed and the node's dimension will be wrong)
34-
35-
let node = this.getCollapsableDOMNode();
36-
let dimension = this.dimension();
37-
let value = '0';
38-
39-
if(!willExpanded){
40-
value = this.getCollapsableDimensionValue();
41-
}
42-
43-
node.style[dimension] = value + 'px';
44-
45-
this._afterWillUpdate();
46-
},
47-
48-
componentDidUpdate(prevProps, prevState){
49-
// check if expanded is being toggled; if so, set collapsing
50-
this._checkToggleCollapsing(prevProps, prevState);
51-
52-
// check if collapsing was turned on; if so, start animation
53-
this._checkStartAnimation();
54-
},
55-
56-
// helps enable test stubs
57-
_afterWillUpdate(){
58-
},
59-
60-
_checkStartAnimation(){
61-
if(!this.state.collapsing) {
62-
return;
63-
}
64-
65-
let node = this.getCollapsableDOMNode();
66-
let dimension = this.dimension();
67-
let value = this.getCollapsableDimensionValue();
68-
69-
// setting the dimension here starts the transition animation
70-
let result;
71-
if(this.isExpanded()) {
72-
result = value + 'px';
73-
} else {
74-
result = '0px';
75-
}
76-
node.style[dimension] = result;
77-
},
78-
79-
_checkToggleCollapsing(prevProps, prevState){
80-
let wasExpanded = prevProps.expanded != null ? prevProps.expanded : prevState.expanded;
81-
let isExpanded = this.isExpanded();
82-
if(wasExpanded !== isExpanded){
83-
if(wasExpanded) {
84-
this._handleCollapse();
85-
} else {
86-
this._handleExpand();
87-
}
88-
}
89-
},
90-
91-
_handleExpand(){
92-
let node = this.getCollapsableDOMNode();
93-
let dimension = this.dimension();
94-
95-
let complete = () => {
96-
this._removeEndEventListener(node, complete);
97-
// remove dimension value - this ensures the collapsable item can grow
98-
// in dimension after initial display (such as an image loading)
99-
node.style[dimension] = '';
100-
this.setState({
101-
collapsing:false
102-
});
103-
};
104-
105-
this._addEndEventListener(node, complete);
106-
107-
this.setState({
108-
collapsing: true
109-
});
110-
},
111-
112-
_handleCollapse(){
113-
let node = this.getCollapsableDOMNode();
114-
115-
let complete = () => {
116-
this._removeEndEventListener(node, complete);
117-
this.setState({
118-
collapsing: false
119-
});
120-
};
121-
122-
this._addEndEventListener(node, complete);
123-
124-
this.setState({
125-
collapsing: true
126-
});
127-
},
128-
129-
// helps enable test stubs
130-
_addEndEventListener(node, complete){
131-
TransitionEvents.addEndEventListener(node, complete);
132-
},
133-
134-
// helps enable test stubs
135-
_removeEndEventListener(node, complete){
136-
TransitionEvents.removeEndEventListener(node, complete);
137-
},
138-
139-
dimension(){
140-
return (typeof this.getCollapsableDimension === 'function') ?
141-
this.getCollapsableDimension() :
142-
'height';
143-
},
144-
145-
isExpanded(){
146-
return this.props.expanded != null ? this.props.expanded : this.state.expanded;
147-
},
5+
let link = 'https://github.com/react-bootstrap/react-bootstrap/issues/425#issuecomment-97110963';
1486

7+
const CollapsableMixin = assign({}, CollapsibleMixin, {
1498
getCollapsableClassSet(className) {
150-
let classes = {};
151-
152-
if (typeof className === 'string') {
153-
className.split(' ').forEach(subClasses => {
154-
if (subClasses) {
155-
classes[subClasses] = true;
156-
}
157-
});
158-
}
159-
160-
classes.collapsing = this.state.collapsing;
161-
classes.collapse = !this.state.collapsing;
162-
classes.in = this.isExpanded() && !this.state.collapsing;
163-
164-
return classes;
9+
deprecationWarning(
10+
'CollapsableMixin.getCollapsableClassSet()',
11+
'CollapsibleMixin.getCollapsibleClassSet()',
12+
link
13+
);
14+
return CollapsibleMixin.getCollapsibleClassSet.call(this, className);
15+
},
16+
17+
getCollapsibleDOMNode() {
18+
deprecationWarning(
19+
'CollapsableMixin.getCollapsableDOMNode()',
20+
'CollapsibleMixin.getCollapsibleDOMNode()',
21+
link
22+
);
23+
return this.getCollapsableDOMNode();
24+
},
25+
26+
getCollapsibleDimensionValue() {
27+
deprecationWarning(
28+
'CollapsableMixin.getCollapsableDimensionValue()',
29+
'CollapsibleMixin.getCollapsibleDimensionValue()',
30+
link
31+
);
32+
return this.getCollapsableDimensionValue();
16533
}
166-
};
34+
});
35+
36+
deprecationWarning('CollapsableMixin', 'CollapsibleMixin', link);
16737

16838
export default CollapsableMixin;

0 commit comments

Comments
 (0)