Skip to content

Commit 1e11c39

Browse files
committed
Merge pull request react-bootstrap#569 from teloo/issue-527
[fixed] It is possible to merge OverlayMixin components
2 parents d1a6ce2 + c832244 commit 1e11c39

4 files changed

Lines changed: 119 additions & 9 deletions

File tree

src/ModalTrigger.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,15 @@ const ModalTrigger = React.createClass({
4949

5050
render() {
5151
let child = React.Children.only(this.props.children);
52-
return cloneElement(
53-
child,
54-
{
55-
onClick: createChainedFunction(child.props.onClick, this.toggle)
56-
}
57-
);
52+
let props = {};
53+
54+
props.onClick = createChainedFunction(child.props.onClick, this.toggle);
55+
props.onMouseOver = createChainedFunction(child.props.onMouseOver, this.props.onMouseOver);
56+
props.onMouseOut = createChainedFunction(child.props.onMouseOut, this.props.onMouseOut);
57+
props.onFocus = createChainedFunction(child.props.onFocus, this.props.onFocus);
58+
props.onBlur = createChainedFunction(child.props.onBlur, this.props.onBlur);
59+
60+
return cloneElement(child, props);
5861
}
5962
});
6063

src/OverlayTrigger.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,16 @@ const OverlayTrigger = React.createClass({
9090
},
9191

9292
render() {
93+
let child = React.Children.only(this.props.children);
9394
if (this.props.trigger === 'manual') {
94-
return React.Children.only(this.props.children);
95+
return child;
9596
}
9697

9798
let props = {};
9899

100+
props.onClick = createChainedFunction(child.props.onClick, this.props.onClick);
99101
if (isOneOf('click', this.props.trigger)) {
100-
props.onClick = createChainedFunction(this.toggle, this.props.onClick);
102+
props.onClick = createChainedFunction(this.toggle, props.onClick);
101103
}
102104

103105
if (isOneOf('hover', this.props.trigger)) {
@@ -111,7 +113,7 @@ const OverlayTrigger = React.createClass({
111113
}
112114

113115
return cloneElement(
114-
React.Children.only(this.props.children),
116+
child,
115117
props
116118
);
117119
},

test/ModalTriggerSpec.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import React from 'react';
2+
import ReactTestUtils from 'react/lib/ReactTestUtils';
3+
import ModalTrigger from '../src/ModalTrigger';
4+
5+
describe('ModalTrigger', function() {
6+
it('Should create ModalTrigger element', function() {
7+
let instance = ReactTestUtils.renderIntoDocument(
8+
<ModalTrigger modal={<div>test</div>}>
9+
<button>button</button>
10+
</ModalTrigger>
11+
);
12+
let modalTrigger = instance.getDOMNode();
13+
assert.equal(modalTrigger.nodeName, 'BUTTON');
14+
});
15+
16+
it('Should pass ModalTrigger onMouseOver prop to child', function() {
17+
let called = false;
18+
let callback = function() {
19+
called = true;
20+
};
21+
let instance = ReactTestUtils.renderIntoDocument(
22+
<ModalTrigger modal={<div>test</div>} onMouseOver={callback}>
23+
<button>button</button>
24+
</ModalTrigger>
25+
);
26+
let modalTrigger = instance.getDOMNode();
27+
ReactTestUtils.Simulate.mouseOver(modalTrigger);
28+
assert.equal(called, true);
29+
});
30+
31+
it('Should pass ModalTrigger onMouseOut prop to child', function() {
32+
let called = false;
33+
let callback = function() {
34+
called = true;
35+
};
36+
let instance = ReactTestUtils.renderIntoDocument(
37+
<ModalTrigger modal={<div>test</div>} onMouseOut={callback}>
38+
<button>button</button>
39+
</ModalTrigger>
40+
);
41+
let modalTrigger = instance.getDOMNode();
42+
ReactTestUtils.Simulate.mouseOut(modalTrigger);
43+
assert.equal(called, true);
44+
});
45+
46+
it('Should pass ModalTrigger onFocus prop to child', function() {
47+
let called = false;
48+
let callback = function() {
49+
called = true;
50+
};
51+
let instance = ReactTestUtils.renderIntoDocument(
52+
<ModalTrigger modal={<div>test</div>} onFocus={callback}>
53+
<button>button</button>
54+
</ModalTrigger>
55+
);
56+
let modalTrigger = instance.getDOMNode();
57+
ReactTestUtils.Simulate.focus(modalTrigger);
58+
assert.equal(called, true);
59+
});
60+
61+
it('Should pass ModalTrigger onBlur prop to child', function() {
62+
let called = false;
63+
let callback = function() {
64+
called = true;
65+
};
66+
let instance = ReactTestUtils.renderIntoDocument(
67+
<ModalTrigger modal={<div>test</div>} onBlur={callback}>
68+
<button>button</button>
69+
</ModalTrigger>
70+
);
71+
let modalTrigger = instance.getDOMNode();
72+
ReactTestUtils.Simulate.blur(modalTrigger);
73+
assert.equal(called, true);
74+
});
75+
});

test/OverlayTriggerSpec.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import React from 'react';
2+
import ReactTestUtils from 'react/lib/ReactTestUtils';
3+
import OverlayTrigger from '../src/OverlayTrigger';
4+
5+
describe('OverlayTrigger', function() {
6+
it('Should create OverlayTrigger element', function() {
7+
let instance = ReactTestUtils.renderIntoDocument(
8+
<OverlayTrigger overlay={<div>test</div>}>
9+
<button>button</button>
10+
</OverlayTrigger>
11+
);
12+
let overlayTrigger = instance.getDOMNode();
13+
assert.equal(overlayTrigger.nodeName, 'BUTTON');
14+
});
15+
16+
it('Should pass OverlayTrigger onClick prop to child', function() {
17+
let called = false;
18+
let callback = function() {
19+
called = true;
20+
};
21+
let instance = ReactTestUtils.renderIntoDocument(
22+
<OverlayTrigger overlay={<div>test</div>} onClick={callback}>
23+
<button>button</button>
24+
</OverlayTrigger>
25+
);
26+
let overlayTrigger = instance.getDOMNode();
27+
ReactTestUtils.Simulate.click(overlayTrigger);
28+
assert.equal(called, true);
29+
});
30+
});

0 commit comments

Comments
 (0)