Skip to content

Commit cc70638

Browse files
committed
accept boundary and appendTo props
1 parent 474b487 commit cc70638

File tree

4 files changed

+29
-20
lines changed

4 files changed

+29
-20
lines changed

src/portal-popper.jsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class PortalPopper extends Component {
2727
static defaultProps = {
2828
Popper,
2929
className: '',
30+
boundary: document.body,
3031
}
3132

3233
constructor (...props) {
@@ -49,6 +50,7 @@ class PortalPopper extends Component {
4950
ref='portal'
5051
className={`${className} ${prefix}-${placement}${flippedClass}`}
5152
style={this._getPopperStyle()}
53+
appendTo={this.props.appendTo}
5254
>
5355
<span>{title}</span>
5456
<div
@@ -59,7 +61,7 @@ class PortalPopper extends Component {
5961
<svg xmlns='http://www.w3.org/2000/svg' version='1.1'>
6062
<polygon points='5,0 10,5 5,10 0,5' />
6163
</svg>
62-
</div>
64+
</div>
6365
</Portal>
6466
)
6567
}
@@ -69,8 +71,10 @@ class PortalPopper extends Component {
6971
content: this.props.title,
7072
placement: this.props.placement,
7173
modifiers: {
72-
applyStyle: { enabled: true },
7374
arrow: { element: this.refs.arrow },
75+
preventOverflow: {
76+
boundariesElement: this.props.boundary,
77+
},
7478
},
7579
onCreate: this._updateData,
7680
onUpdate: this._updateData,

src/portal-popper.spec.jsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,16 @@ describe('<PortalPopper />', () => {
6363

6464
it('creates Popper instance with the right props', () => {
6565
const Popper = popperStub(popperInstanceStub())
66-
const component = mount(<PortalPopper {...getProps({ Popper })} />)
66+
mount(<PortalPopper {...getProps({ Popper, boundary: 'boundary' })} />)
6767
expect(Popper).to.have.been.called
68-
expect(Popper.getCall(0).args[0]).to.equal('target node')
69-
expect(Popper.getCall(0).args[2]).to.eql({
70-
content: 'tooltip title',
71-
placement: 'top',
72-
modifiers: {
73-
applyStyle: { enabled: true },
74-
arrow: { element: component.ref('arrow').node },
75-
},
68+
expect(Popper.firstCall.args[0]).to.equal('target node')
69+
expect(Popper.firstCall.args[2].content).to.equal('tooltip title')
70+
expect(Popper.firstCall.args[2].placement).to.equal('top')
71+
expect(Popper.firstCall.args[2].modifiers.preventOverflow).to.eql({
72+
boundariesElement: 'boundary',
7673
})
74+
expect(Popper.firstCall.args[2].onCreate).to.be.a('function')
75+
expect(Popper.firstCall.args[2].onUpdate).to.be.a('function')
7776
})
7877

7978
it('calls scheduleUpdate() on the Popper instance', () => {

src/portal.jsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,33 @@ import React, { Component } from 'react'
33
import { render } from 'react-dom'
44

55
class Portal extends Component {
6+
static idNum = 0
7+
8+
static defaultProps = {
9+
appendTo: document.body,
10+
}
11+
612
componentDidMount () {
13+
const appendTo = this.props.appendTo
714
const id = `portal-${Portal.idNum++}`
8-
let element = document.getElementById(id)
15+
let element = appendTo.ownerDocument.getElementById(id)
916
if (!element) {
10-
element = document.createElement('div')
17+
element = appendTo.ownerDocument.createElement('div')
1118
element.id = id
12-
document.body.appendChild(element)
19+
appendTo.appendChild(element)
1320
}
1421
this._element = element
1522
this.componentDidUpdate()
1623
}
1724

1825
componentWillUnmount () {
19-
document.body.removeChild(this._element)
26+
const appendTo = this.props.appendTo
27+
appendTo.removeChild(this._element)
2028
}
2129

2230
componentDidUpdate () {
2331
render((
24-
<div ref={(node) => this.domNode = node} {..._.omit(this.props, 'children')}>
32+
<div ref={(node) => this.domNode = node} {..._.omit(this.props, 'children', 'appendTo')}>
2533
{this.props.children}
2634
</div>
2735
), this._element)
@@ -32,6 +40,4 @@ class Portal extends Component {
3240
}
3341
}
3442

35-
Portal.idNum = 0
36-
3743
export default Portal

src/tooltip.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ class Tooltip extends Component {
1414
}
1515

1616
static defaultProps = {
17-
placement: 'top',
1817
className: 'tooltip',
18+
placement: 'top',
1919
wrapperClassName: '',
2020
}
2121

@@ -47,7 +47,7 @@ class Tooltip extends Component {
4747
_popper () {
4848
if (this.props.visible !== true && (!this.state.shouldShow || this.props.visible === false)) return null
4949

50-
const props = _.pick(this.props, 'title', 'placement', 'className', 'updateCue')
50+
const props = _.omit(this.props, 'wrapperClassName', 'children')
5151

5252
return (
5353
<PortalPopper getTargetNode={() => this.refs.target} {...props} />

0 commit comments

Comments
 (0)