2018-11-13 07:41:12 +01:00
/ * !
2019-02-13 17:01:40 +01:00
* Bootstrap modal . js v4 . 3.1 ( https : //getbootstrap.com/)
2020-03-28 11:29:08 +01:00
* Copyright 2011 - 2020 The Bootstrap Authors ( https : //github.com/twbs/bootstrap/graphs/contributors)
2018-11-13 07:41:12 +01:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* /
2018-07-24 02:51:14 +02:00
( function ( global , factory ) {
2019-10-08 08:39:10 +02:00
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( require ( './dom/data.js' ) , require ( './dom/event-handler.js' ) , require ( './dom/manipulator.js' ) , require ( './dom/selector-engine.js' ) ) :
typeof define === 'function' && define . amd ? define ( [ './dom/data.js' , './dom/event-handler.js' , './dom/manipulator.js' , './dom/selector-engine.js' ] , factory ) :
2019-03-01 17:31:34 +01:00
( global = global || self , global . Modal = factory ( global . Data , global . EventHandler , global . Manipulator , global . SelectorEngine ) ) ;
2019-11-08 09:11:23 +01:00
} ( this , ( function ( Data , EventHandler , Manipulator , SelectorEngine ) { 'use strict' ;
2018-07-24 02:51:14 +02:00
2020-03-28 11:29:08 +01:00
Data = Data && Object . prototype . hasOwnProperty . call ( Data , 'default' ) ? Data [ 'default' ] : Data ;
EventHandler = EventHandler && Object . prototype . hasOwnProperty . call ( EventHandler , 'default' ) ? EventHandler [ 'default' ] : EventHandler ;
Manipulator = Manipulator && Object . prototype . hasOwnProperty . call ( Manipulator , 'default' ) ? Manipulator [ 'default' ] : Manipulator ;
SelectorEngine = SelectorEngine && Object . prototype . hasOwnProperty . call ( SelectorEngine , 'default' ) ? SelectorEngine [ 'default' ] : SelectorEngine ;
2018-07-24 02:51:14 +02:00
function _defineProperties ( target , props ) {
for ( var i = 0 ; i < props . length ; i ++ ) {
var descriptor = props [ i ] ;
descriptor . enumerable = descriptor . enumerable || false ;
descriptor . configurable = true ;
if ( "value" in descriptor ) descriptor . writable = true ;
Object . defineProperty ( target , descriptor . key , descriptor ) ;
}
}
function _createClass ( Constructor , protoProps , staticProps ) {
if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ;
if ( staticProps ) _defineProperties ( Constructor , staticProps ) ;
return Constructor ;
}
function _defineProperty ( obj , key , value ) {
if ( key in obj ) {
Object . defineProperty ( obj , key , {
value : value ,
enumerable : true ,
configurable : true ,
writable : true
} ) ;
} else {
obj [ key ] = value ;
}
2018-03-31 22:59:37 +02:00
2018-07-24 02:51:14 +02:00
return obj ;
}
2017-12-23 01:21:54 +01:00
2019-07-24 08:13:50 +02:00
function ownKeys ( object , enumerableOnly ) {
var keys = Object . keys ( object ) ;
if ( Object . getOwnPropertySymbols ) {
var symbols = Object . getOwnPropertySymbols ( object ) ;
if ( enumerableOnly ) symbols = symbols . filter ( function ( sym ) {
return Object . getOwnPropertyDescriptor ( object , sym ) . enumerable ;
} ) ;
keys . push . apply ( keys , symbols ) ;
}
return keys ;
}
function _objectSpread2 ( target ) {
2018-07-24 02:51:14 +02:00
for ( var i = 1 ; i < arguments . length ; i ++ ) {
var source = arguments [ i ] != null ? arguments [ i ] : { } ;
2017-09-06 06:05:12 +02:00
2019-07-24 08:13:50 +02:00
if ( i % 2 ) {
2020-03-28 11:29:08 +01:00
ownKeys ( Object ( source ) , true ) . forEach ( function ( key ) {
2019-07-24 08:13:50 +02:00
_defineProperty ( target , key , source [ key ] ) ;
} ) ;
} else if ( Object . getOwnPropertyDescriptors ) {
Object . defineProperties ( target , Object . getOwnPropertyDescriptors ( source ) ) ;
} else {
2020-03-28 11:29:08 +01:00
ownKeys ( Object ( source ) ) . forEach ( function ( key ) {
2019-07-24 08:13:50 +02:00
Object . defineProperty ( target , key , Object . getOwnPropertyDescriptor ( source , key ) ) ;
} ) ;
2018-07-24 02:51:14 +02:00
}
}
return target ;
}
2015-05-11 04:45:38 +02:00
2019-03-01 17:31:34 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : util / index . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var MILLISECONDS _MULTIPLIER = 1000 ;
2019-08-27 15:03:21 +02:00
var TRANSITION _END = 'transitionend' ; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
2019-03-01 17:31:34 +01:00
var toType = function toType ( obj ) {
2020-03-28 11:29:08 +01:00
if ( obj === null || obj === undefined ) {
return "" + obj ;
}
2019-03-01 17:31:34 +01:00
return { } . toString . call ( obj ) . match ( /\s([a-z]+)/i ) [ 1 ] . toLowerCase ( ) ;
} ;
2019-08-27 15:03:21 +02:00
var getSelector = function getSelector ( element ) {
2019-03-01 17:31:34 +01:00
var selector = element . getAttribute ( 'data-target' ) ;
if ( ! selector || selector === '#' ) {
var hrefAttr = element . getAttribute ( 'href' ) ;
2019-08-27 15:03:21 +02:00
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr . trim ( ) : null ;
2019-03-01 17:31:34 +01:00
}
2019-08-27 15:03:21 +02:00
return selector ;
} ;
var getElementFromSelector = function getElementFromSelector ( element ) {
var selector = getSelector ( element ) ;
return selector ? document . querySelector ( selector ) : null ;
2019-03-01 17:31:34 +01:00
} ;
var getTransitionDurationFromElement = function getTransitionDurationFromElement ( element ) {
if ( ! element ) {
return 0 ;
} // Get transition-duration of the element
var _window$getComputedSt = window . getComputedStyle ( element ) ,
transitionDuration = _window$getComputedSt . transitionDuration ,
transitionDelay = _window$getComputedSt . transitionDelay ;
var floatTransitionDuration = parseFloat ( transitionDuration ) ;
var floatTransitionDelay = parseFloat ( transitionDelay ) ; // Return 0 if element or transition duration is not found
if ( ! floatTransitionDuration && ! floatTransitionDelay ) {
return 0 ;
} // If multiple durations are defined, take the first
transitionDuration = transitionDuration . split ( ',' ) [ 0 ] ;
transitionDelay = transitionDelay . split ( ',' ) [ 0 ] ;
return ( parseFloat ( transitionDuration ) + parseFloat ( transitionDelay ) ) * MILLISECONDS _MULTIPLIER ;
} ;
var triggerTransitionEnd = function triggerTransitionEnd ( element ) {
2020-03-28 11:29:08 +01:00
element . dispatchEvent ( new Event ( TRANSITION _END ) ) ;
2019-03-01 17:31:34 +01:00
} ;
var isElement = function isElement ( obj ) {
return ( obj [ 0 ] || obj ) . nodeType ;
} ;
var emulateTransitionEnd = function emulateTransitionEnd ( element , duration ) {
var called = false ;
var durationPadding = 5 ;
var emulatedDuration = duration + durationPadding ;
function listener ( ) {
called = true ;
element . removeEventListener ( TRANSITION _END , listener ) ;
}
element . addEventListener ( TRANSITION _END , listener ) ;
setTimeout ( function ( ) {
if ( ! called ) {
triggerTransitionEnd ( element ) ;
}
} , emulatedDuration ) ;
} ;
var typeCheckConfig = function typeCheckConfig ( componentName , config , configTypes ) {
Object . keys ( configTypes ) . forEach ( function ( property ) {
var expectedTypes = configTypes [ property ] ;
var value = config [ property ] ;
var valueType = value && isElement ( value ) ? 'element' : toType ( value ) ;
if ( ! new RegExp ( expectedTypes ) . test ( valueType ) ) {
throw new Error ( componentName . toUpperCase ( ) + ": " + ( "Option \"" + property + "\" provided type \"" + valueType + "\" " ) + ( "but expected type \"" + expectedTypes + "\"." ) ) ;
}
} ) ;
} ;
var isVisible = function isVisible ( element ) {
if ( ! element ) {
return false ;
}
if ( element . style && element . parentNode && element . parentNode . style ) {
2019-11-08 09:11:23 +01:00
var elementStyle = getComputedStyle ( element ) ;
var parentNodeStyle = getComputedStyle ( element . parentNode ) ;
return elementStyle . display !== 'none' && parentNodeStyle . display !== 'none' && elementStyle . visibility !== 'hidden' ;
2019-03-01 17:31:34 +01:00
}
return false ;
} ;
var reflow = function reflow ( element ) {
return element . offsetHeight ;
} ;
2019-08-27 15:03:21 +02:00
var getjQuery = function getjQuery ( ) {
var _window = window ,
jQuery = _window . jQuery ;
if ( jQuery && ! document . body . hasAttribute ( 'data-no-jquery' ) ) {
return jQuery ;
}
return null ;
} ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = 'modal' ;
2019-02-13 17:01:40 +01:00
var VERSION = '4.3.1' ;
2018-11-13 07:41:12 +01:00
var DATA _KEY = 'bs.modal' ;
var EVENT _KEY = "." + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
2020-05-13 20:53:43 +02:00
var ESCAPE _KEY = 'Escape' ;
2018-11-13 07:41:12 +01:00
var Default = {
backdrop : true ,
keyboard : true ,
focus : true ,
show : true
} ;
var DefaultType = {
backdrop : '(boolean|string)' ,
keyboard : 'boolean' ,
focus : 'boolean' ,
show : 'boolean'
} ;
2020-03-28 11:29:08 +01:00
var EVENT _HIDE = "hide" + EVENT _KEY ;
var EVENT _HIDE _PREVENTED = "hidePrevented" + EVENT _KEY ;
var EVENT _HIDDEN = "hidden" + EVENT _KEY ;
var EVENT _SHOW = "show" + EVENT _KEY ;
var EVENT _SHOWN = "shown" + EVENT _KEY ;
var EVENT _FOCUSIN = "focusin" + EVENT _KEY ;
var EVENT _RESIZE = "resize" + EVENT _KEY ;
var EVENT _CLICK _DISMISS = "click.dismiss" + EVENT _KEY ;
var EVENT _KEYDOWN _DISMISS = "keydown.dismiss" + EVENT _KEY ;
var EVENT _MOUSEUP _DISMISS = "mouseup.dismiss" + EVENT _KEY ;
var EVENT _MOUSEDOWN _DISMISS = "mousedown.dismiss" + EVENT _KEY ;
var EVENT _CLICK _DATA _API = "click" + EVENT _KEY + DATA _API _KEY ;
var CLASS _NAME _SCROLLBAR _MEASURER = 'modal-scrollbar-measure' ;
var CLASS _NAME _BACKDROP = 'modal-backdrop' ;
var CLASS _NAME _OPEN = 'modal-open' ;
var CLASS _NAME _FADE = 'fade' ;
var CLASS _NAME _SHOW = 'show' ;
var CLASS _NAME _STATIC = 'modal-static' ;
var SELECTOR _DIALOG = '.modal-dialog' ;
var SELECTOR _MODAL _BODY = '.modal-body' ;
var SELECTOR _DATA _TOGGLE = '[data-toggle="modal"]' ;
var SELECTOR _DATA _DISMISS = '[data-dismiss="modal"]' ;
var SELECTOR _FIXED _CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' ;
var SELECTOR _STICKY _CONTENT = '.sticky-top' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-11-13 07:41:12 +01:00
2020-03-28 11:29:08 +01:00
var Modal = /*#__PURE__*/ function ( ) {
2018-11-13 07:41:12 +01:00
function Modal ( element , config ) {
this . _config = this . _getConfig ( config ) ;
this . _element = element ;
2020-03-28 11:29:08 +01:00
this . _dialog = SelectorEngine . findOne ( SELECTOR _DIALOG , element ) ;
2018-11-13 07:41:12 +01:00
this . _backdrop = null ;
this . _isShown = false ;
this . _isBodyOverflowing = false ;
this . _ignoreBackdropClick = false ;
this . _isTransitioning = false ;
this . _scrollbarWidth = 0 ;
2019-03-01 17:31:34 +01:00
Data . setData ( element , DATA _KEY , this ) ;
2018-11-13 07:41:12 +01:00
} // Getters
var _proto = Modal . prototype ;
// Public
_proto . toggle = function toggle ( relatedTarget ) {
return this . _isShown ? this . hide ( ) : this . show ( relatedTarget ) ;
2018-07-24 02:51:14 +02:00
} ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
_proto . show = function show ( relatedTarget ) {
var _this = this ;
2015-08-13 06:12:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isShown || this . _isTransitioning ) {
return ;
}
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _FADE ) ) {
2018-11-13 07:41:12 +01:00
this . _isTransitioning = true ;
}
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
var showEvent = EventHandler . trigger ( this . _element , EVENT _SHOW , {
2018-11-13 07:41:12 +01:00
relatedTarget : relatedTarget
} ) ;
2016-10-10 02:26:51 +02:00
2019-03-01 17:31:34 +01:00
if ( this . _isShown || showEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _isShown = true ;
2016-11-01 05:14:23 +01:00
2018-11-13 07:41:12 +01:00
this . _checkScrollbar ( ) ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _setScrollbar ( ) ;
2016-12-02 19:13:36 +01:00
2018-11-13 07:41:12 +01:00
this . _adjustDialog ( ) ;
2017-04-02 04:18:29 +02:00
2018-11-13 07:41:12 +01:00
this . _setEscapeEvent ( ) ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _setResizeEvent ( ) ;
2017-04-02 04:18:29 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _CLICK _DISMISS , SELECTOR _DATA _DISMISS , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this . hide ( event ) ;
} ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _dialog , EVENT _MOUSEDOWN _DISMISS , function ( ) {
EventHandler . one ( _this . _element , EVENT _MOUSEUP _DISMISS , function ( event ) {
2019-03-01 17:31:34 +01:00
if ( event . target === _this . _element ) {
2018-11-13 07:41:12 +01:00
_this . _ignoreBackdropClick = true ;
}
2018-07-24 02:51:14 +02:00
} ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _showBackdrop ( function ( ) {
return _this . _showElement ( relatedTarget ) ;
} ) ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . hide = function hide ( event ) {
var _this2 = this ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
if ( event ) {
event . preventDefault ( ) ;
}
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _isShown || this . _isTransitioning ) {
return ;
}
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( this . _element , EVENT _HIDE ) ;
2015-05-11 04:45:38 +02:00
2019-07-24 08:13:50 +02:00
if ( hideEvent . defaultPrevented ) {
2018-11-13 07:41:12 +01:00
return ;
}
2017-10-16 00:51:44 +02:00
2018-11-13 07:41:12 +01:00
this . _isShown = false ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
var transition = this . _element . classList . contains ( CLASS _NAME _FADE ) ;
2017-04-02 04:18:29 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
this . _isTransitioning = true ;
}
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _setEscapeEvent ( ) ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _setResizeEvent ( ) ;
2016-10-10 02:26:51 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( document , EVENT _FOCUSIN ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
this . _element . classList . remove ( CLASS _NAME _SHOW ) ;
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( this . _element , EVENT _CLICK _DISMISS ) ;
EventHandler . off ( this . _dialog , EVENT _MOUSEDOWN _DISMISS ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , function ( event ) {
2018-11-13 07:41:12 +01:00
return _this2 . _hideModal ( event ) ;
2019-03-01 17:31:34 +01:00
} ) ;
emulateTransitionEnd ( this . _element , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
this . _hideModal ( ) ;
}
} ;
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
_proto . dispose = function dispose ( ) {
[ window , this . _element , this . _dialog ] . forEach ( function ( htmlElement ) {
2019-03-01 17:31:34 +01:00
return EventHandler . off ( htmlElement , EVENT _KEY ) ;
2018-11-13 07:41:12 +01:00
} ) ;
/ * *
2020-03-28 11:29:08 +01:00
* ` document ` has 2 events ` EVENT_FOCUSIN ` and ` EVENT_CLICK_DATA_API `
2018-11-13 07:41:12 +01:00
* Do not move ` document ` in ` htmlElements ` array
2020-03-28 11:29:08 +01:00
* It will remove ` EVENT_CLICK_DATA_API ` event that should remain
2018-11-13 07:41:12 +01:00
* /
2017-03-26 20:26:31 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( document , EVENT _FOCUSIN ) ;
2019-03-01 17:31:34 +01:00
Data . removeData ( this . _element , DATA _KEY ) ;
2018-11-13 07:41:12 +01:00
this . _config = null ;
this . _element = null ;
this . _dialog = null ;
this . _backdrop = null ;
this . _isShown = null ;
this . _isBodyOverflowing = null ;
this . _ignoreBackdropClick = null ;
this . _isTransitioning = null ;
this . _scrollbarWidth = null ;
} ;
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
_proto . handleUpdate = function handleUpdate ( ) {
this . _adjustDialog ( ) ;
2019-01-04 17:29:45 +01:00
} // Private
;
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getConfig = function _getConfig ( config ) {
2020-05-13 20:53:43 +02:00
config = _objectSpread2 ( _objectSpread2 ( { } , Default ) , config ) ;
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME , config , DefaultType ) ;
2018-11-13 07:41:12 +01:00
return config ;
} ;
2016-10-10 02:26:51 +02:00
2018-11-13 07:41:12 +01:00
_proto . _showElement = function _showElement ( relatedTarget ) {
var _this3 = this ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
var transition = this . _element . classList . contains ( CLASS _NAME _FADE ) ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
var modalBody = SelectorEngine . findOne ( SELECTOR _MODAL _BODY , this . _dialog ) ;
2019-08-27 15:03:21 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _element . parentNode || this . _element . parentNode . nodeType !== Node . ELEMENT _NODE ) {
// Don't move modal's DOM position
document . body . appendChild ( this . _element ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _element . style . display = 'block' ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _element . removeAttribute ( 'aria-hidden' ) ;
2015-05-11 04:45:38 +02:00
2018-12-16 00:13:22 +01:00
this . _element . setAttribute ( 'aria-modal' , true ) ;
2020-05-13 20:53:43 +02:00
this . _element . scrollTop = 0 ;
if ( modalBody ) {
2019-08-27 15:03:21 +02:00
modalBody . scrollTop = 0 ;
2019-02-11 20:15:34 +01:00
}
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
2019-03-01 17:31:34 +01:00
reflow ( this . _element ) ;
2018-11-13 07:41:12 +01:00
}
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _SHOW ) ;
2018-07-24 02:51:14 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _config . focus ) {
this . _enforceFocus ( ) ;
}
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
var transitionComplete = function transitionComplete ( ) {
if ( _this3 . _config . focus ) {
_this3 . _element . focus ( ) ;
2017-09-06 06:05:12 +02:00
}
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
_this3 . _isTransitioning = false ;
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this3 . _element , EVENT _SHOWN , {
2019-03-01 17:31:34 +01:00
relatedTarget : relatedTarget
} ) ;
2017-09-30 23:28:03 +02:00
} ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
if ( transition ) {
2019-03-01 17:31:34 +01:00
var transitionDuration = getTransitionDurationFromElement ( this . _dialog ) ;
EventHandler . one ( this . _dialog , TRANSITION _END , transitionComplete ) ;
emulateTransitionEnd ( this . _dialog , transitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
transitionComplete ( ) ;
}
} ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
_proto . _enforceFocus = function _enforceFocus ( ) {
var _this4 = this ;
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . off ( document , EVENT _FOCUSIN ) ; // guard against infinite focus loop
2019-03-01 17:31:34 +01:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _FOCUSIN , function ( event ) {
2019-03-01 17:31:34 +01:00
if ( document !== event . target && _this4 . _element !== event . target && ! _this4 . _element . contains ( event . target ) ) {
2018-11-13 07:41:12 +01:00
_this4 . _element . focus ( ) ;
2015-05-11 04:45:38 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
_proto . _setEscapeEvent = function _setEscapeEvent ( ) {
var _this5 = this ;
2016-10-10 02:26:51 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _isShown ) {
EventHandler . on ( this . _element , EVENT _KEYDOWN _DISMISS , function ( event ) {
2020-05-13 20:53:43 +02:00
if ( _this5 . _config . keyboard && event . key === ESCAPE _KEY ) {
2020-03-28 11:29:08 +01:00
event . preventDefault ( ) ;
_this5 . hide ( ) ;
2020-05-13 20:53:43 +02:00
} else if ( ! _this5 . _config . keyboard && event . key === ESCAPE _KEY ) {
2019-11-08 09:11:23 +01:00
_this5 . _triggerBackdropTransition ( ) ;
2018-11-13 07:41:12 +01:00
}
} ) ;
2019-07-24 08:13:50 +02:00
} else {
2020-03-28 11:29:08 +01:00
EventHandler . off ( this . _element , EVENT _KEYDOWN _DISMISS ) ;
2018-11-13 07:41:12 +01:00
}
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _setResizeEvent = function _setResizeEvent ( ) {
var _this6 = this ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isShown ) {
2020-03-28 11:29:08 +01:00
EventHandler . on ( window , EVENT _RESIZE , function ( ) {
2019-07-24 08:13:50 +02:00
return _this6 . _adjustDialog ( ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} else {
2020-03-28 11:29:08 +01:00
EventHandler . off ( window , EVENT _RESIZE ) ;
2018-11-13 07:41:12 +01:00
}
} ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
_proto . _hideModal = function _hideModal ( ) {
var _this7 = this ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _element . style . display = 'none' ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
this . _element . setAttribute ( 'aria-hidden' , true ) ;
2015-05-11 04:45:38 +02:00
2018-12-16 00:13:22 +01:00
this . _element . removeAttribute ( 'aria-modal' ) ;
2018-11-13 07:41:12 +01:00
this . _isTransitioning = false ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
this . _showBackdrop ( function ( ) {
2020-03-28 11:29:08 +01:00
document . body . classList . remove ( CLASS _NAME _OPEN ) ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
_this7 . _resetAdjustments ( ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_this7 . _resetScrollbar ( ) ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . trigger ( _this7 . _element , EVENT _HIDDEN ) ;
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _removeBackdrop = function _removeBackdrop ( ) {
2019-07-24 08:13:50 +02:00
this . _backdrop . parentNode . removeChild ( this . _backdrop ) ;
2019-03-01 17:31:34 +01:00
2019-07-24 08:13:50 +02:00
this . _backdrop = null ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _showBackdrop = function _showBackdrop ( callback ) {
var _this8 = this ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
var animate = this . _element . classList . contains ( CLASS _NAME _FADE ) ? CLASS _NAME _FADE : '' ;
2018-11-13 07:41:12 +01:00
if ( this . _isShown && this . _config . backdrop ) {
this . _backdrop = document . createElement ( 'div' ) ;
2020-03-28 11:29:08 +01:00
this . _backdrop . className = CLASS _NAME _BACKDROP ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( animate ) {
this . _backdrop . classList . add ( animate ) ;
}
2015-05-11 04:45:38 +02:00
2019-03-01 17:31:34 +01:00
document . body . appendChild ( this . _backdrop ) ;
2020-03-28 11:29:08 +01:00
EventHandler . on ( this . _element , EVENT _CLICK _DISMISS , function ( event ) {
2018-11-13 07:41:12 +01:00
if ( _this8 . _ignoreBackdropClick ) {
_this8 . _ignoreBackdropClick = false ;
2015-05-11 04:45:38 +02:00
return ;
}
2017-09-06 06:05:12 +02:00
2018-11-13 07:41:12 +01:00
if ( event . target !== event . currentTarget ) {
2015-05-11 04:45:38 +02:00
return ;
}
2019-11-08 09:11:23 +01:00
_this8 . _triggerBackdropTransition ( ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( animate ) {
2019-03-01 17:31:34 +01:00
reflow ( this . _backdrop ) ;
2018-11-13 07:41:12 +01:00
}
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
this . _backdrop . classList . add ( CLASS _NAME _SHOW ) ;
2015-05-11 04:45:38 +02:00
2018-11-13 07:41:12 +01:00
if ( ! animate ) {
2017-09-30 23:28:03 +02:00
callback ( ) ;
2018-11-13 07:41:12 +01:00
return ;
2015-05-11 04:45:38 +02:00
}
2016-10-10 02:26:51 +02:00
2019-03-01 17:31:34 +01:00
var backdropTransitionDuration = getTransitionDurationFromElement ( this . _backdrop ) ;
EventHandler . one ( this . _backdrop , TRANSITION _END , callback ) ;
emulateTransitionEnd ( this . _backdrop , backdropTransitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else if ( ! this . _isShown && this . _backdrop ) {
2020-03-28 11:29:08 +01:00
this . _backdrop . classList . remove ( CLASS _NAME _SHOW ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
var callbackRemove = function callbackRemove ( ) {
_this8 . _removeBackdrop ( ) ;
2017-09-30 23:28:03 +02:00
2019-07-24 08:13:50 +02:00
callback ( ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-09-30 23:28:03 +02:00
2020-03-28 11:29:08 +01:00
if ( this . _element . classList . contains ( CLASS _NAME _FADE ) ) {
2019-03-01 17:31:34 +01:00
var _backdropTransitionDuration = getTransitionDurationFromElement ( this . _backdrop ) ;
2018-11-13 07:41:12 +01:00
2019-03-01 17:31:34 +01:00
EventHandler . one ( this . _backdrop , TRANSITION _END , callbackRemove ) ;
emulateTransitionEnd ( this . _backdrop , _backdropTransitionDuration ) ;
2018-11-13 07:41:12 +01:00
} else {
callbackRemove ( ) ;
2018-07-24 02:51:14 +02:00
}
2019-07-24 08:13:50 +02:00
} else {
2018-11-13 07:41:12 +01:00
callback ( ) ;
}
2019-11-08 09:11:23 +01:00
} ;
_proto . _triggerBackdropTransition = function _triggerBackdropTransition ( ) {
var _this9 = this ;
if ( this . _config . backdrop === 'static' ) {
2020-03-28 11:29:08 +01:00
var hideEvent = EventHandler . trigger ( this . _element , EVENT _HIDE _PREVENTED ) ;
2019-11-08 09:11:23 +01:00
if ( hideEvent . defaultPrevented ) {
return ;
}
2020-03-28 11:29:08 +01:00
this . _element . classList . add ( CLASS _NAME _STATIC ) ;
2019-11-08 09:11:23 +01:00
var modalTransitionDuration = getTransitionDurationFromElement ( this . _element ) ;
EventHandler . one ( this . _element , TRANSITION _END , function ( ) {
2020-03-28 11:29:08 +01:00
_this9 . _element . classList . remove ( CLASS _NAME _STATIC ) ;
2019-11-08 09:11:23 +01:00
} ) ;
emulateTransitionEnd ( this . _element , modalTransitionDuration ) ;
this . _element . focus ( ) ;
} else {
this . hide ( ) ;
}
2019-01-04 17:29:45 +01:00
} // ----------------------------------------------------------------------
2018-11-13 07:41:12 +01:00
// the following methods are used to handle overflowing modals
// ----------------------------------------------------------------------
2019-01-04 17:29:45 +01:00
;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
_proto . _adjustDialog = function _adjustDialog ( ) {
var isModalOverflowing = this . _element . scrollHeight > document . documentElement . clientHeight ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( ! this . _isBodyOverflowing && isModalOverflowing ) {
this . _element . style . paddingLeft = this . _scrollbarWidth + "px" ;
}
if ( this . _isBodyOverflowing && ! isModalOverflowing ) {
this . _element . style . paddingRight = this . _scrollbarWidth + "px" ;
}
} ;
_proto . _resetAdjustments = function _resetAdjustments ( ) {
this . _element . style . paddingLeft = '' ;
this . _element . style . paddingRight = '' ;
} ;
_proto . _checkScrollbar = function _checkScrollbar ( ) {
var rect = document . body . getBoundingClientRect ( ) ;
2020-05-13 20:53:43 +02:00
this . _isBodyOverflowing = Math . round ( rect . left + rect . right ) < window . innerWidth ;
2018-11-13 07:41:12 +01:00
this . _scrollbarWidth = this . _getScrollbarWidth ( ) ;
} ;
_proto . _setScrollbar = function _setScrollbar ( ) {
2019-11-08 09:11:23 +01:00
var _this10 = this ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( this . _isBodyOverflowing ) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
// while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
2019-03-01 17:31:34 +01:00
// Adjust fixed content padding
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _FIXED _CONTENT ) . forEach ( function ( element ) {
2018-11-13 07:41:12 +01:00
var actualPadding = element . style . paddingRight ;
2019-03-01 17:31:34 +01:00
var calculatedPadding = window . getComputedStyle ( element ) [ 'padding-right' ] ;
Manipulator . setDataAttribute ( element , 'padding-right' , actualPadding ) ;
2019-11-08 09:11:23 +01:00
element . style . paddingRight = parseFloat ( calculatedPadding ) + _this10 . _scrollbarWidth + "px" ;
2018-11-13 07:41:12 +01:00
} ) ; // Adjust sticky content margin
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _STICKY _CONTENT ) . forEach ( function ( element ) {
2018-11-13 07:41:12 +01:00
var actualMargin = element . style . marginRight ;
2019-03-01 17:31:34 +01:00
var calculatedMargin = window . getComputedStyle ( element ) [ 'margin-right' ] ;
Manipulator . setDataAttribute ( element , 'margin-right' , actualMargin ) ;
2019-11-08 09:11:23 +01:00
element . style . marginRight = parseFloat ( calculatedMargin ) - _this10 . _scrollbarWidth + "px" ;
2018-11-13 07:41:12 +01:00
} ) ; // Adjust body padding
var actualPadding = document . body . style . paddingRight ;
2019-03-01 17:31:34 +01:00
var calculatedPadding = window . getComputedStyle ( document . body ) [ 'padding-right' ] ;
Manipulator . setDataAttribute ( document . body , 'padding-right' , actualPadding ) ;
document . body . style . paddingRight = parseFloat ( calculatedPadding ) + this . _scrollbarWidth + "px" ;
2018-11-13 07:41:12 +01:00
}
2018-11-24 17:22:59 +01:00
2020-03-28 11:29:08 +01:00
document . body . classList . add ( CLASS _NAME _OPEN ) ;
2018-11-13 07:41:12 +01:00
} ;
2017-04-08 22:22:53 +02:00
2018-11-13 07:41:12 +01:00
_proto . _resetScrollbar = function _resetScrollbar ( ) {
// Restore fixed content padding
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( SELECTOR _FIXED _CONTENT ) . forEach ( function ( element ) {
2019-03-01 17:31:34 +01:00
var padding = Manipulator . getDataAttribute ( element , 'padding-right' ) ;
2018-11-13 07:41:12 +01:00
2019-03-01 17:31:34 +01:00
if ( typeof padding !== 'undefined' ) {
Manipulator . removeDataAttribute ( element , 'padding-right' ) ;
element . style . paddingRight = padding ;
}
} ) ; // Restore sticky content and navbar-toggler margin
2020-03-28 11:29:08 +01:00
SelectorEngine . find ( "" + SELECTOR _STICKY _CONTENT ) . forEach ( function ( element ) {
2019-03-01 17:31:34 +01:00
var margin = Manipulator . getDataAttribute ( element , 'margin-right' ) ;
2018-11-13 07:41:12 +01:00
if ( typeof margin !== 'undefined' ) {
2019-03-01 17:31:34 +01:00
Manipulator . removeDataAttribute ( element , 'margin-right' ) ;
element . style . marginRight = margin ;
2018-11-13 07:41:12 +01:00
}
} ) ; // Restore body padding
2017-09-30 23:28:03 +02:00
2019-03-01 17:31:34 +01:00
var padding = Manipulator . getDataAttribute ( document . body , 'padding-right' ) ;
2019-03-11 16:13:30 +01:00
if ( typeof padding === 'undefined' ) {
document . body . style . paddingRight = '' ;
} else {
2019-03-01 17:31:34 +01:00
Manipulator . removeDataAttribute ( document . body , 'padding-right' ) ;
document . body . style . paddingRight = padding ;
}
2018-11-13 07:41:12 +01:00
} ;
2017-04-08 22:22:53 +02:00
2018-11-13 07:41:12 +01:00
_proto . _getScrollbarWidth = function _getScrollbarWidth ( ) {
// thx d.walsh
var scrollDiv = document . createElement ( 'div' ) ;
2020-03-28 11:29:08 +01:00
scrollDiv . className = CLASS _NAME _SCROLLBAR _MEASURER ;
2018-11-13 07:41:12 +01:00
document . body . appendChild ( scrollDiv ) ;
var scrollbarWidth = scrollDiv . getBoundingClientRect ( ) . width - scrollDiv . clientWidth ;
document . body . removeChild ( scrollDiv ) ;
return scrollbarWidth ;
2019-01-04 17:29:45 +01:00
} // Static
;
2016-10-10 02:26:51 +02:00
2019-08-27 15:03:21 +02:00
Modal . jQueryInterface = function jQueryInterface ( config , relatedTarget ) {
2018-11-13 07:41:12 +01:00
return this . each ( function ( ) {
2019-03-01 17:31:34 +01:00
var data = Data . getData ( this , DATA _KEY ) ;
2016-10-10 02:26:51 +02:00
2020-05-13 20:53:43 +02:00
var _config = _objectSpread2 ( _objectSpread2 ( _objectSpread2 ( { } , Default ) , Manipulator . getDataAttributes ( this ) ) , typeof config === 'object' && config ? config : { } ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( ! data ) {
data = new Modal ( this , _config ) ;
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
throw new TypeError ( "No method named \"" + config + "\"" ) ;
2017-09-06 06:05:12 +02:00
}
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
data [ config ] ( relatedTarget ) ;
} else if ( _config . show ) {
data . show ( relatedTarget ) ;
2018-07-24 02:51:14 +02:00
}
2018-11-13 07:41:12 +01:00
} ) ;
} ;
2015-05-11 04:45:38 +02:00
2019-08-27 15:03:21 +02:00
Modal . getInstance = function getInstance ( element ) {
2019-03-01 17:31:34 +01:00
return Data . getData ( element , DATA _KEY ) ;
} ;
2018-11-13 07:41:12 +01:00
_createClass ( Modal , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default ;
}
} ] ) ;
2017-09-30 23:28:03 +02:00
2018-11-13 07:41:12 +01:00
return Modal ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2015-05-11 04:45:38 +02:00
2020-03-28 11:29:08 +01:00
EventHandler . on ( document , EVENT _CLICK _DATA _API , SELECTOR _DATA _TOGGLE , function ( event ) {
2019-11-08 09:11:23 +01:00
var _this11 = this ;
2015-05-11 04:45:38 +02:00
2019-08-27 15:03:21 +02:00
var target = getElementFromSelector ( this ) ;
2018-11-13 07:41:12 +01:00
if ( this . tagName === 'A' || this . tagName === 'AREA' ) {
event . preventDefault ( ) ;
}
2020-03-28 11:29:08 +01:00
EventHandler . one ( target , EVENT _SHOW , function ( showEvent ) {
2019-03-01 17:31:34 +01:00
if ( showEvent . defaultPrevented ) {
// only register focus restorer if modal will actually get shown
2018-11-13 07:41:12 +01:00
return ;
2015-05-11 04:45:38 +02:00
}
2020-03-28 11:29:08 +01:00
EventHandler . one ( target , EVENT _HIDDEN , function ( ) {
2019-11-08 09:11:23 +01:00
if ( isVisible ( _this11 ) ) {
_this11 . focus ( ) ;
2015-05-11 04:45:38 +02:00
}
} ) ;
} ) ;
2019-03-01 17:31:34 +01:00
var data = Data . getData ( target , DATA _KEY ) ;
if ( ! data ) {
2020-05-13 20:53:43 +02:00
var config = _objectSpread2 ( _objectSpread2 ( { } , Manipulator . getDataAttributes ( target ) ) , Manipulator . getDataAttributes ( this ) ) ;
2019-07-24 08:13:50 +02:00
2019-03-01 17:31:34 +01:00
data = new Modal ( target , config ) ;
}
2015-05-11 04:45:38 +02:00
2019-03-01 17:31:34 +01:00
data . show ( this ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2019-08-27 15:03:21 +02:00
var $ = getjQuery ( ) ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2019-07-24 08:13:50 +02:00
* add . modal to jQuery only if jQuery is present
2018-11-13 07:41:12 +01:00
* /
2015-05-11 04:45:38 +02:00
2019-07-24 08:13:50 +02:00
/* istanbul ignore if */
2019-08-27 15:03:21 +02:00
if ( $ ) {
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
$ . fn [ NAME ] = Modal . jQueryInterface ;
$ . fn [ NAME ] . Constructor = Modal ;
2017-09-30 23:28:03 +02:00
2019-08-27 15:03:21 +02:00
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Modal . jQueryInterface ;
2019-03-01 17:31:34 +01:00
} ;
}
2015-05-11 04:45:38 +02:00
return Modal ;
2018-07-24 02:51:14 +02:00
2019-11-08 09:11:23 +01:00
} ) ) ) ;
2018-07-24 02:51:14 +02:00
//# sourceMappingURL=modal.js.map