@@ -21,7 +21,7 @@ function returnDocument() {
21
21
}
22
22
23
23
const ALL_HANDLERS = [ 'onClick' , 'onMouseDown' , 'onTouchStart' , 'onMouseEnter' ,
24
- 'onMouseLeave' , 'onFocus' , 'onBlur' ] ;
24
+ 'onMouseLeave' , 'onFocus' , 'onBlur' , 'onContextMenu' ] ;
25
25
26
26
const IS_REACT_16 = ! ! createPortal ;
27
27
@@ -173,7 +173,7 @@ const Trigger = createReactClass({
173
173
// https://github.com/react-component/trigger/issues/50
174
174
if ( state . popupVisible ) {
175
175
let currentDocument ;
176
- if ( ! this . clickOutsideHandler && this . isClickToHide ( ) ) {
176
+ if ( ! this . clickOutsideHandler && ( this . isClickToHide ( ) || this . isContextMenuToShow ( ) ) ) {
177
177
currentDocument = props . getDocument ( ) ;
178
178
this . clickOutsideHandler = addEventListener ( currentDocument ,
179
179
'mousedown' , this . onDocumentClick ) ;
@@ -187,6 +187,17 @@ const Trigger = createReactClass({
187
187
this . touchOutsideHandler = addEventListener ( currentDocument ,
188
188
'click' , this . onDocumentClick ) ;
189
189
}
190
+ // close popup when trigger type contains 'onContextMenu' and document is scrolling.
191
+ if ( ! this . contextMenuOutsideHandler1 && this . isContextMenuToShow ( ) ) {
192
+ currentDocument = currentDocument || props . getDocument ( ) ;
193
+ this . contextMenuOutsideHandler1 = addEventListener ( currentDocument ,
194
+ 'scroll' , this . onContextMenuClose ) ;
195
+ }
196
+ // close popup when trigger type contains 'onContextMenu' and window is blur.
197
+ if ( ! this . contextMenuOutsideHandler2 && this . isContextMenuToShow ( ) ) {
198
+ this . contextMenuOutsideHandler2 = addEventListener ( window ,
199
+ 'blur' , this . onContextMenuClose ) ;
200
+ }
190
201
return ;
191
202
}
192
203
@@ -252,6 +263,18 @@ const Trigger = createReactClass({
252
263
}
253
264
} ,
254
265
266
+ onContextMenu ( e ) {
267
+ e . preventDefault ( ) ;
268
+ this . fireEvents ( 'onContextMenu' , e ) ;
269
+ this . setPopupVisible ( true ) ;
270
+ } ,
271
+
272
+ onContextMenuClose ( ) {
273
+ if ( this . isContextMenuToShow ( ) ) {
274
+ this . close ( ) ;
275
+ }
276
+ } ,
277
+
255
278
onClick ( event ) {
256
279
this . fireEvents ( 'onClick' , event ) ;
257
280
// focus will trigger click
@@ -412,6 +435,16 @@ const Trigger = createReactClass({
412
435
this . clickOutsideHandler = null ;
413
436
}
414
437
438
+ if ( this . contextMenuOutsideHandler1 ) {
439
+ this . contextMenuOutsideHandler1 . remove ( ) ;
440
+ this . contextMenuOutsideHandler1 = null ;
441
+ }
442
+
443
+ if ( this . contextMenuOutsideHandler2 ) {
444
+ this . contextMenuOutsideHandler2 . remove ( ) ;
445
+ this . contextMenuOutsideHandler2 = null ;
446
+ }
447
+
415
448
if ( this . touchOutsideHandler ) {
416
449
this . touchOutsideHandler . remove ( ) ;
417
450
this . touchOutsideHandler = null ;
@@ -432,6 +465,11 @@ const Trigger = createReactClass({
432
465
return action . indexOf ( 'click' ) !== - 1 || showAction . indexOf ( 'click' ) !== - 1 ;
433
466
} ,
434
467
468
+ isContextMenuToShow ( ) {
469
+ const { action, showAction } = this . props ;
470
+ return action . indexOf ( 'contextMenu' ) !== - 1 || showAction . indexOf ( 'contextMenu' ) !== - 1 ;
471
+ } ,
472
+
435
473
isClickToHide ( ) {
436
474
const { action, hideAction } = this . props ;
437
475
return action . indexOf ( 'click' ) !== - 1 || hideAction . indexOf ( 'click' ) !== - 1 ;
@@ -489,6 +527,13 @@ const Trigger = createReactClass({
489
527
const children = props . children ;
490
528
const child = React . Children . only ( children ) ;
491
529
const newChildProps = { key : 'trigger' } ;
530
+
531
+ if ( this . isContextMenuToShow ( ) ) {
532
+ newChildProps . onContextMenu = this . onContextMenu ;
533
+ } else {
534
+ newChildProps . onContextMenu = this . createTwoChains ( 'onContextMenu' ) ;
535
+ }
536
+
492
537
if ( this . isClickToHide ( ) || this . isClickToShow ( ) ) {
493
538
newChildProps . onClick = this . onClick ;
494
539
newChildProps . onMouseDown = this . onMouseDown ;
0 commit comments