From 7994cf583d4624272fb08fccfd5a35a8819b6f47 Mon Sep 17 00:00:00 2001 From: Olivier Tassinari Date: Fri, 20 Jul 2018 23:58:45 +0200 Subject: [PATCH] [Popper] Fix update logic --- .../pages/utils/popper/PositionedPopper.js | 2 +- packages/material-ui/src/Popper/Popper.js | 17 +++++++------- .../material-ui/src/Popper/Popper.test.js | 22 +++++++++++++++++++ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/docs/src/pages/utils/popper/PositionedPopper.js b/docs/src/pages/utils/popper/PositionedPopper.js index 4cb88a1dd08f86..4f9a5a92af1098 100644 --- a/docs/src/pages/utils/popper/PositionedPopper.js +++ b/docs/src/pages/utils/popper/PositionedPopper.js @@ -28,7 +28,7 @@ class PositionedPopper extends React.Component { const { currentTarget } = event; this.setState(state => ({ anchorEl: currentTarget, - open: !state.placement === placement || !state.open, + open: state.placement !== placement || !state.open, placement, })); }; diff --git a/packages/material-ui/src/Popper/Popper.js b/packages/material-ui/src/Popper/Popper.js index fcefbea7f6ee57..21dec20181ab1c 100644 --- a/packages/material-ui/src/Popper/Popper.js +++ b/packages/material-ui/src/Popper/Popper.js @@ -43,20 +43,21 @@ class Popper extends React.Component { } componentDidUpdate(prevProps) { - if (prevProps.open && !this.props.open && !this.props.transition) { + if (prevProps.open !== this.props.open && !this.props.open && !this.props.transition) { // Otherwise handleExited will call this. this.handleClose(); } // Let's update the popper position. if ( + prevProps.open !== this.props.open || prevProps.anchorEl !== this.props.anchorEl || prevProps.popperOptions !== this.props.popperOptions || prevProps.modifiers !== this.props.modifiers || prevProps.disablePortal !== this.props.disablePortal || prevProps.placement !== this.props.placement ) { - this.handleRendered(); + this.handleOpen(); } } @@ -81,7 +82,7 @@ class Popper extends React.Component { return null; } - handleRendered = () => { + handleOpen = () => { const { anchorEl, modifiers, @@ -93,15 +94,15 @@ class Popper extends React.Component { } = this.props; const popperNode = ReactDOM.findDOMNode(this); + if (!popperNode || !anchorEl || !open) { + return; + } + if (this.popper) { this.popper.destroy(); this.popper = null; } - if (!popperNode || !anchorEl || !open) { - return; - } - this.popper = new PopperJS(getAnchorEl(anchorEl), popperNode, { placement: flipPlacement(theme, placement), ...popperOptions, @@ -178,7 +179,7 @@ class Popper extends React.Component { } return ( - +
', () => { wrapper.setProps({ open: false }); assert.strictEqual(wrapper.find('span').length, 0); }); + + it('should position the popper when opening', () => { + const wrapper = mount(); + const instance = wrapper.instance(); + assert.strictEqual(instance.popper, null); + wrapper.setProps({ open: true }); + assert.strictEqual(instance.popper !== null, true); + }); + + it('should not position the popper when closing', () => { + const wrapper = mount(); + const instance = wrapper.instance(); + assert.strictEqual(instance.popper !== null, true); + wrapper.setProps({ open: false }); + assert.strictEqual(instance.popper, null); + }); }); describe('prop: transition', () => { @@ -124,6 +140,12 @@ describe('', () => { assert.strictEqual(wrapper.find('span').text(), 'Hello World'); assert.strictEqual(instance.popper !== null, true); wrapper.setProps({ anchorEl: null }); + assert.strictEqual(instance.popper !== null, true); + wrapper.setProps({ open: false }); + wrapper + .find(Grow) + .props() + .onExited(); assert.strictEqual(instance.popper, null); }); });