@@ -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
@@ -169,7 +169,7 @@ const Trigger = createReactClass({
169
169
// https://github.com/react-component/trigger/issues/50
170
170
if ( state . popupVisible ) {
171
171
let currentDocument ;
172
- if ( ! this . clickOutsideHandler && this . isClickToHide ( ) ) {
172
+ if ( ! this . clickOutsideHandler && ( this . isClickToHide ( ) || this . isContextMenuToShow ( ) ) ) {
173
173
currentDocument = props . getDocument ( ) ;
174
174
this . clickOutsideHandler = addEventListener ( currentDocument ,
175
175
'mousedown' , this . onDocumentClick ) ;
@@ -180,6 +180,17 @@ const Trigger = createReactClass({
180
180
this . touchOutsideHandler = addEventListener ( currentDocument ,
181
181
'touchstart' , this . onDocumentClick ) ;
182
182
}
183
+ // close popup when trigger type contains 'onContextMenu' and document is scrolling.
184
+ if ( ! this . contextMenuOutsideHandler1 && this . isContextMenuToShow ( ) ) {
185
+ currentDocument = currentDocument || props . getDocument ( ) ;
186
+ this . contextMenuOutsideHandler1 = addEventListener ( currentDocument ,
187
+ 'scroll' , this . onContextMenuClose ) ;
188
+ }
189
+ // close popup when trigger type contains 'onContextMenu' and window is blur.
190
+ if ( ! this . contextMenuOutsideHandler2 && this . isContextMenuToShow ( ) ) {
191
+ this . contextMenuOutsideHandler2 = addEventListener ( window ,
192
+ 'blur' , this . onContextMenuClose ) ;
193
+ }
183
194
return ;
184
195
}
185
196
@@ -245,6 +256,18 @@ const Trigger = createReactClass({
245
256
}
246
257
} ,
247
258
259
+ onContextMenu ( e ) {
260
+ e . preventDefault ( ) ;
261
+ this . fireEvents ( 'onContextMenu' , e ) ;
262
+ this . setPopupVisible ( true ) ;
263
+ } ,
264
+
265
+ onContextMenuClose ( ) {
266
+ if ( this . isContextMenuToShow ( ) ) {
267
+ this . close ( ) ;
268
+ }
269
+ } ,
270
+
248
271
onClick ( event ) {
249
272
this . fireEvents ( 'onClick' , event ) ;
250
273
// focus will trigger click
@@ -405,6 +428,16 @@ const Trigger = createReactClass({
405
428
this . clickOutsideHandler = null ;
406
429
}
407
430
431
+ if ( this . contextMenuOutsideHandler1 ) {
432
+ this . contextMenuOutsideHandler1 . remove ( ) ;
433
+ this . contextMenuOutsideHandler1 = null ;
434
+ }
435
+
436
+ if ( this . contextMenuOutsideHandler2 ) {
437
+ this . contextMenuOutsideHandler2 . remove ( ) ;
438
+ this . contextMenuOutsideHandler2 = null ;
439
+ }
440
+
408
441
if ( this . touchOutsideHandler ) {
409
442
this . touchOutsideHandler . remove ( ) ;
410
443
this . touchOutsideHandler = null ;
@@ -425,6 +458,11 @@ const Trigger = createReactClass({
425
458
return action . indexOf ( 'click' ) !== - 1 || showAction . indexOf ( 'click' ) !== - 1 ;
426
459
} ,
427
460
461
+ isContextMenuToShow ( ) {
462
+ const { action, showAction } = this . props ;
463
+ return action . indexOf ( 'contextMenu' ) !== - 1 || showAction . indexOf ( 'contextMenu' ) !== - 1 ;
464
+ } ,
465
+
428
466
isClickToHide ( ) {
429
467
const { action, hideAction } = this . props ;
430
468
return action . indexOf ( 'click' ) !== - 1 || hideAction . indexOf ( 'click' ) !== - 1 ;
@@ -482,6 +520,13 @@ const Trigger = createReactClass({
482
520
const children = props . children ;
483
521
const child = React . Children . only ( children ) ;
484
522
const newChildProps = { key : 'trigger' } ;
523
+
524
+ if ( this . isContextMenuToShow ( ) ) {
525
+ newChildProps . onContextMenu = this . onContextMenu ;
526
+ } else {
527
+ newChildProps . onContextMenu = this . createTwoChains ( 'onContextMenu' ) ;
528
+ }
529
+
485
530
if ( this . isClickToHide ( ) || this . isClickToShow ( ) ) {
486
531
newChildProps . onClick = this . onClick ;
487
532
newChildProps . onMouseDown = this . onMouseDown ;
0 commit comments