@@ -3486,6 +3486,76 @@ var directive = {
34863486 }
34873487} ;
34883488
3489+ function addListeners ( el ) {
3490+ el . addEventListener ( 'click' , onClick ) ;
3491+ el . addEventListener ( 'touchstart' , onTouchStart , supportsPassive ? {
3492+ passive : true
3493+ } : false ) ;
3494+ }
3495+
3496+ function removeListeners ( el ) {
3497+ el . removeEventListener ( 'click' , onClick ) ;
3498+ el . removeEventListener ( 'touchstart' , onTouchStart ) ;
3499+ el . removeEventListener ( 'touchend' , onTouchEnd ) ;
3500+ el . removeEventListener ( 'touchcancel' , onTouchCancel ) ;
3501+ }
3502+
3503+ function onClick ( event ) {
3504+ var el = event . currentTarget ;
3505+ event . closePopover = ! el . $_vclosepopover_touch ;
3506+ }
3507+
3508+ function onTouchStart ( event ) {
3509+ if ( event . changedTouches . length === 1 ) {
3510+ var el = event . currentTarget ;
3511+ el . $_vclosepopover_touch = true ;
3512+ var touch = event . changedTouches [ 0 ] ;
3513+ el . $_vclosepopover_touchPoint = touch ;
3514+ el . addEventListener ( 'touchend' , onTouchEnd ) ;
3515+ el . addEventListener ( 'touchcancel' , onTouchCancel ) ;
3516+ }
3517+ }
3518+
3519+ function onTouchEnd ( event ) {
3520+ var el = event . currentTarget ;
3521+ el . $_vclosepopover_touch = false ;
3522+ if ( event . changedTouches . length === 1 ) {
3523+ var touch = event . changedTouches [ 0 ] ;
3524+ var firstTouch = el . $_vclosepopover_touchPoint ;
3525+ event . closePopover = Math . abs ( touch . screenY - firstTouch . screenY ) < 20 && Math . abs ( touch . screenX - firstTouch . screenX ) < 20 ;
3526+ }
3527+ }
3528+
3529+ function onTouchCancel ( event ) {
3530+ var el = event . currentTarget ;
3531+ el . $_vclosepopover_touch = false ;
3532+ }
3533+
3534+ var vclosepopover = {
3535+ bind : function bind ( el , _ref ) {
3536+ var value = _ref . value ;
3537+
3538+ if ( typeof value === 'undefined' || value ) {
3539+ addListeners ( el ) ;
3540+ }
3541+ } ,
3542+ update : function update ( el , _ref2 ) {
3543+ var value = _ref2 . value ,
3544+ oldValue = _ref2 . oldValue ;
3545+
3546+ if ( value !== oldValue ) {
3547+ if ( typeof value === 'undefined' || value ) {
3548+ addListeners ( el ) ;
3549+ } else {
3550+ removeListeners ( el ) ;
3551+ }
3552+ }
3553+ } ,
3554+ unbind : function unbind ( el ) {
3555+ removeListeners ( el ) ;
3556+ }
3557+ } ;
3558+
34893559function getInternetExplorerVersion ( ) {
34903560 var ua = window . navigator . userAgent ;
34913561
@@ -3613,6 +3683,8 @@ if (typeof window !== 'undefined' && typeof navigator !== 'undefined') {
36133683 isIOS = / i P a d | i P h o n e | i P o d / . test ( navigator . userAgent ) && ! window . MSStream ;
36143684}
36153685
3686+ var openPopovers = [ ] ;
3687+
36163688var Popover = { render : function render ( ) {
36173689 var _vm = this ; var _h = _vm . $createElement ; var _c = _vm . _self . _c || _h ; return _c ( 'div' , { staticClass : "v-popover" , class : _vm . cssClass } , [ _c ( 'span' , { ref : "trigger" , staticClass : "trigger" , staticStyle : { "display" : "inline-block" } , attrs : { "aria-describedby" : _vm . popoverId } } , [ _vm . _t ( "default" ) ] , 2 ) , _vm . _v ( " " ) , _c ( 'div' , { ref : "popover" , class : [ _vm . popoverBaseClass , _vm . popoverClass , _vm . cssClass ] , style : {
36183690 display : _vm . isOpen ? '' : 'none'
@@ -3853,9 +3925,8 @@ var Popover = { render: function render() {
38533925 dispose : function dispose ( ) {
38543926 this . $_isDisposed = true ;
38553927 this . $_removeEventListeners ( ) ;
3856- this . $_removeGlobalEvents ( ) ;
3928+ this . hide ( { skipDelay : true } ) ;
38573929 if ( this . popperInstance ) {
3858- this . hide ( ) ;
38593930 this . popperInstance . destroy ( ) ;
38603931
38613932 // destroy tooltipNode if removeOnDestroy is not set, as popperInstance.destroy() already removes the element
@@ -3891,7 +3962,6 @@ var Popover = { render: function render() {
38913962 this . isOpen = true ;
38923963 this . popperInstance . enableEventListeners ( ) ;
38933964 this . popperInstance . update ( ) ;
3894- this . $_addGlobalEvents ( ) ;
38953965 }
38963966
38973967 if ( ! this . $_mounted ) {
@@ -3940,7 +4010,6 @@ var Popover = { render: function render() {
39404010 requestAnimationFrame ( function ( ) {
39414011 if ( ! _this3 . $_isDisposed ) {
39424012 _this3 . isOpen = true ;
3943- _this3 . $_addGlobalEvents ( ) ;
39444013 } else {
39454014 _this3 . dispose ( ) ;
39464015 }
@@ -3950,6 +4019,8 @@ var Popover = { render: function render() {
39504019 }
39514020 } ) ;
39524021 }
4022+
4023+ openPopovers . push ( this ) ;
39534024 } ,
39544025 $_hide : function $_hide ( ) {
39554026 var _this4 = this ;
@@ -3959,9 +4030,15 @@ var Popover = { render: function render() {
39594030 return ;
39604031 }
39614032
4033+ var index = openPopovers . indexOf ( this ) ;
4034+ if ( index !== - 1 ) {
4035+ openPopovers . splice ( index , 1 ) ;
4036+ }
4037+
39624038 this . isOpen = false ;
3963- this . popperInstance . disableEventListeners ( ) ;
3964- this . $_removeGlobalEvents ( ) ;
4039+ if ( this . popperInstance ) {
4040+ this . popperInstance . disableEventListeners ( ) ;
4041+ }
39654042
39664043 clearTimeout ( this . $_disposeTimer ) ;
39674044 var disposeTime = directive . options . popover . disposeTimeout || directive . options . disposeTimeout ;
@@ -4134,24 +4211,6 @@ var Popover = { render: function render() {
41344211 } ) ;
41354212 this . $_events = [ ] ;
41364213 } ,
4137- $_addGlobalEvents : function $_addGlobalEvents ( ) {
4138- if ( this . autoHide ) {
4139- if ( isIOS ) {
4140- document . addEventListener ( 'touchstart' , this . $_handleWindowTouchstart , supportsPassive ? {
4141- passive : true
4142- } : false ) ;
4143- } else {
4144- window . addEventListener ( 'click' , this . $_handleWindowClick ) ;
4145- }
4146- }
4147- } ,
4148- $_removeGlobalEvents : function $_removeGlobalEvents ( ) {
4149- if ( isIOS ) {
4150- document . removeEventListener ( 'touchstart' , this . $_handleWindowTouchstart ) ;
4151- } else {
4152- window . removeEventListener ( 'click' , this . $_handleWindowClick ) ;
4153- }
4154- } ,
41554214 $_updatePopper : function $_updatePopper ( cb ) {
41564215 if ( this . isOpen && this . popperInstance ) {
41574216 cb ( ) ;
@@ -4168,34 +4227,30 @@ var Popover = { render: function render() {
41684227 }
41694228 }
41704229 } ,
4171- $_handleWindowClick : function $_handleWindowClick ( event ) {
4230+ $_handleGlobalClose : function $_handleGlobalClose ( event ) {
4231+ var _this8 = this ;
4232+
41724233 var touch = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : false ;
41734234
41744235 var popoverNode = this . $refs . popover ;
41754236
4176- if ( event . closePopover || ! popoverNode . contains ( event . target ) ) {
4177- this . $_scheduleHide ( { event : event } ) ;
4178- this . $emit ( 'auto-hide' ) ;
4237+ if ( event . closePopover || this . autoHide && ! popoverNode . contains ( event . target ) ) {
4238+ this . hide ( { event : event } ) ;
4239+
4240+ if ( event . closePopover ) {
4241+ this . $emit ( 'close-directive' ) ;
4242+ } else {
4243+ this . $emit ( 'auto-hide' ) ;
4244+ }
41794245
41804246 if ( touch ) {
41814247 this . $_preventOpen = true ;
4182- document . addEventListener ( 'touchend' , this . $_handleWindowTouchend , supportsPassive ? {
4183- passive : true
4184- } : false ) ;
4248+ setTimeout ( function ( ) {
4249+ _this8 . $_preventOpen = false ;
4250+ } , 300 ) ;
41854251 }
41864252 }
41874253 } ,
4188- $_handleWindowTouchstart : function $_handleWindowTouchstart ( event ) {
4189- this . $_handleWindowClick ( event , true ) ;
4190- } ,
4191- $_handleWindowTouchend : function $_handleWindowTouchend ( event ) {
4192- var _this8 = this ;
4193-
4194- document . removeEventListener ( 'touchend' , this . $_handleWindowTouchend ) ;
4195- setTimeout ( function ( ) {
4196- _this8 . $_preventOpen = false ;
4197- } , 300 ) ;
4198- } ,
41994254 $_handleResize : function $_handleResize ( ) {
42004255 if ( this . isOpen && this . popperInstance ) {
42014256 this . popperInstance . update ( ) ;
@@ -4205,6 +4260,32 @@ var Popover = { render: function render() {
42054260 }
42064261} ;
42074262
4263+ if ( typeof document !== 'undefined' && typeof window !== 'undefined' ) {
4264+ if ( isIOS ) {
4265+ document . addEventListener ( 'touchend' , handleGlobalTouchend , supportsPassive ? {
4266+ passive : true
4267+ } : false ) ;
4268+ } else {
4269+ window . addEventListener ( 'click' , handleGlobalClick ) ;
4270+ }
4271+ }
4272+
4273+ function handleGlobalClick ( event ) {
4274+ handleGlobalClose ( event ) ;
4275+ }
4276+
4277+ function handleGlobalTouchend ( event ) {
4278+ handleGlobalClose ( event , true ) ;
4279+ }
4280+
4281+ function handleGlobalClose ( event ) {
4282+ var touch = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : false ;
4283+
4284+ for ( var i = 0 ; i < openPopovers . length ; i ++ ) {
4285+ openPopovers [ i ] . $_handleGlobalClose ( event , touch ) ;
4286+ }
4287+ }
4288+
42084289var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : { } ;
42094290
42104291
@@ -6434,13 +6515,16 @@ function install(Vue) {
64346515 var finalOptions = { } ;
64356516 lodash_merge ( finalOptions , defaultOptions , options ) ;
64366517
6518+ plugin . options = finalOptions ;
64376519 directive . options = finalOptions ;
64386520
64396521 Vue . directive ( 'tooltip' , directive ) ;
6522+ Vue . directive ( 'close-popover' , vclosepopover ) ;
64406523 Vue . component ( 'v-popover' , Popover ) ;
64416524}
64426525
64436526var VTooltip = directive ;
6527+ var VClosePopover = vclosepopover ;
64446528var VPopover = Popover ;
64456529
64466530var plugin = {
@@ -6466,5 +6550,5 @@ if (GlobalVue) {
64666550 GlobalVue . use ( plugin ) ;
64676551}
64686552
6469- export { install , VTooltip , VPopover } ;
6553+ export { install , VTooltip , VClosePopover , VPopover } ;
64706554export default plugin ;
0 commit comments