From d6751d0db9d8b9b18a60ae59e16782845f963d41 Mon Sep 17 00:00:00 2001 From: Mihai Dinculescu Date: Sun, 5 May 2019 13:35:38 +0100 Subject: [PATCH] fix(Popup|Portal): do not close when mouse click was occurred inside (#3575) * Fix * Rework. * Rework of rework. * Fix typo. * fix path to PopupOffsetExample * fix path to PopupExampleHideOnScroll * naming update, set `null` instead of `delete` --- docs/src/examples/modules/Popup/Usage/index.js | 4 ++-- src/addons/Portal/Portal.js | 10 ++++++++++ test/specs/addons/Portal/Portal-test.js | 18 ++++++++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/src/examples/modules/Popup/Usage/index.js b/docs/src/examples/modules/Popup/Usage/index.js index 9bce71752d..07dbf2eb7a 100644 --- a/docs/src/examples/modules/Popup/Usage/index.js +++ b/docs/src/examples/modules/Popup/Usage/index.js @@ -9,7 +9,7 @@ const PopupUsageExamples = () => (

@@ -71,7 +71,7 @@ const PopupUsageExamples = () => ( { + this.latestDocumentMouseDownEvent = e + } + handleDocumentClick = (e) => { const { closeOnDocumentClick } = this.props + const currentMouseDownEvent = this.latestDocumentMouseDownEvent + this.latestDocumentMouseDownEvent = null if ( !this.contentRef.current || // no portal doesNodeContainClick(this.triggerRef.current, e) || // event happened in trigger (delegate to trigger handlers) + (currentMouseDownEvent && + doesNodeContainClick(this.contentRef.current, currentMouseDownEvent)) || // event originated in the portal but was ended outside doesNodeContainClick(this.contentRef.current, e) // event happened in the portal ) { return @@ -352,6 +361,7 @@ class Portal extends Component { pool={eventPool} target={this.contentRef} /> + diff --git a/test/specs/addons/Portal/Portal-test.js b/test/specs/addons/Portal/Portal-test.js index 6d1487b840..5fc08f1fb1 100644 --- a/test/specs/addons/Portal/Portal-test.js +++ b/test/specs/addons/Portal/Portal-test.js @@ -9,13 +9,13 @@ import PortalInner from 'src/addons/Portal/PortalInner' let wrapper -const createHandlingComponent = eventName => +const createHandlingComponent = (eventName) => class HandlingComponent extends Component { static propTypes = { handler: PropTypes.func, } - handleEvent = e => this.props.handler(e, this.props) + handleEvent = (e) => this.props.handler(e, this.props) render() { const buttonProps = { [eventName]: this.handleEvent } @@ -600,6 +600,20 @@ describe('Portal', () => { wrapper.update() wrapper.should.have.descendants(PortalInner) }) + + it('does not close on mousedown inside and mouseup outside', () => { + wrapperMount( + +

+ , + ) + wrapper.should.have.descendants(PortalInner) + + domEvent.mouseDown('#inner') + domEvent.click(document) + wrapper.update() + wrapper.should.have.descendants(PortalInner) + }) }) // Heads Up!