2018-11-13 07:41:12 +01:00
/ * !
2021-10-09 08:33:12 +02:00
* Bootstrap modal . js v5 . 1.3 ( https : //getbootstrap.com/)
2021-02-10 17:14:51 +01:00
* Copyright 2011 - 2021 The Bootstrap Authors ( https : //github.com/twbs/bootstrap/graphs/contributors)
2020-06-16 20:50:01 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2018-11-13 07:41:12 +01:00
* /
2018-07-24 02:51:14 +02:00
( function ( global , factory ) {
2021-08-04 17:41:51 +02:00
typeof exports === 'object' && typeof module !== 'undefined' ? module . exports = factory ( require ( './dom/event-handler.js' ) , require ( './dom/manipulator.js' ) , require ( './dom/selector-engine.js' ) , require ( './base-component.js' ) ) :
typeof define === 'function' && define . amd ? define ( [ './dom/event-handler' , './dom/manipulator' , './dom/selector-engine' , './base-component' ] , factory ) :
( global = typeof globalThis !== 'undefined' ? globalThis : global || self , global . Modal = factory ( global . EventHandler , global . Manipulator , global . SelectorEngine , global . Base ) ) ;
2021-10-05 17:50:18 +02:00
} ) ( this , ( function ( EventHandler , Manipulator , SelectorEngine , BaseComponent ) { 'use strict' ;
2018-07-24 02:51:14 +02:00
2021-10-05 17:50:18 +02:00
const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default : e } ;
2020-09-14 17:12:06 +02:00
2021-10-05 17:50:18 +02:00
const EventHandler _ _default = /*#__PURE__*/ _interopDefaultLegacy ( EventHandler ) ;
const Manipulator _ _default = /*#__PURE__*/ _interopDefaultLegacy ( Manipulator ) ;
const SelectorEngine _ _default = /*#__PURE__*/ _interopDefaultLegacy ( SelectorEngine ) ;
const BaseComponent _ _default = /*#__PURE__*/ _interopDefaultLegacy ( BaseComponent ) ;
2021-02-10 17:14:51 +01:00
2021-08-04 17:41:51 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2021-10-09 08:33:12 +02:00
* Bootstrap ( v5 . 1.3 ) : util / index . js
2021-08-04 17:41:51 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2021-03-23 17:26:54 +01:00
const MILLISECONDS _MULTIPLIER = 1000 ;
const TRANSITION _END = 'transitionend' ; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
2019-03-01 17:31:34 +01:00
2021-03-23 17:26:54 +01:00
const toType = obj => {
2020-03-28 11:29:08 +01:00
if ( obj === null || obj === undefined ) {
2021-03-23 17:26:54 +01:00
return ` ${ obj } ` ;
2020-03-28 11:29:08 +01:00
}
2019-03-01 17:31:34 +01:00
return { } . toString . call ( obj ) . match ( /\s([a-z]+)/i ) [ 1 ] . toLowerCase ( ) ;
} ;
2021-03-23 17:26:54 +01:00
const getSelector = element => {
let selector = element . getAttribute ( 'data-bs-target' ) ;
2019-03-01 17:31:34 +01:00
if ( ! selector || selector === '#' ) {
2021-03-23 17:26:54 +01:00
let hrefAttr = element . getAttribute ( 'href' ) ; // The only valid content that could double as a selector are IDs or classes,
2021-02-10 17:14:51 +01:00
// so everything starting with `#` or `.`. If a "real" URL is used as the selector,
// `document.querySelector` will rightfully complain it is invalid.
// See https://github.com/twbs/bootstrap/issues/32273
if ( ! hrefAttr || ! hrefAttr . includes ( '#' ) && ! hrefAttr . startsWith ( '.' ) ) {
return null ;
} // Just in case some CMS puts out a full URL with the anchor appended
if ( hrefAttr . includes ( '#' ) && ! hrefAttr . startsWith ( '#' ) ) {
2021-05-05 21:32:12 +02:00
hrefAttr = ` # ${ hrefAttr . split ( '#' ) [ 1 ] } ` ;
2021-02-10 17:14:51 +01:00
}
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 ;
} ;
2021-03-23 17:26:54 +01:00
const getElementFromSelector = element => {
const selector = getSelector ( element ) ;
2019-08-27 15:03:21 +02:00
return selector ? document . querySelector ( selector ) : null ;
2019-03-01 17:31:34 +01:00
} ;
2021-03-23 17:26:54 +01:00
const getTransitionDurationFromElement = element => {
2019-03-01 17:31:34 +01:00
if ( ! element ) {
return 0 ;
} // Get transition-duration of the element
2021-03-23 17:26:54 +01:00
let {
transitionDuration ,
transitionDelay
} = window . getComputedStyle ( element ) ;
const floatTransitionDuration = Number . parseFloat ( transitionDuration ) ;
const floatTransitionDelay = Number . parseFloat ( transitionDelay ) ; // Return 0 if element or transition duration is not found
2019-03-01 17:31:34 +01:00
if ( ! floatTransitionDuration && ! floatTransitionDelay ) {
return 0 ;
} // If multiple durations are defined, take the first
transitionDuration = transitionDuration . split ( ',' ) [ 0 ] ;
transitionDelay = transitionDelay . split ( ',' ) [ 0 ] ;
2020-11-23 14:17:16 +01:00
return ( Number . parseFloat ( transitionDuration ) + Number . parseFloat ( transitionDelay ) ) * MILLISECONDS _MULTIPLIER ;
2019-03-01 17:31:34 +01:00
} ;
2021-03-23 17:26:54 +01:00
const triggerTransitionEnd = element => {
2020-03-28 11:29:08 +01:00
element . dispatchEvent ( new Event ( TRANSITION _END ) ) ;
2019-03-01 17:31:34 +01:00
} ;
2021-05-13 18:22:20 +02:00
const isElement = obj => {
if ( ! obj || typeof obj !== 'object' ) {
return false ;
}
if ( typeof obj . jquery !== 'undefined' ) {
obj = obj [ 0 ] ;
}
return typeof obj . nodeType !== 'undefined' ;
} ;
2019-03-01 17:31:34 +01:00
2021-06-22 20:29:16 +02:00
const getElement = obj => {
if ( isElement ( obj ) ) {
// it's a jQuery object or a node element
return obj . jquery ? obj [ 0 ] : obj ;
}
2019-03-01 17:31:34 +01:00
2021-06-22 20:29:16 +02:00
if ( typeof obj === 'string' && obj . length > 0 ) {
2021-08-04 17:41:51 +02:00
return document . querySelector ( obj ) ;
2019-03-01 17:31:34 +01:00
}
2021-06-22 20:29:16 +02:00
return null ;
2019-03-01 17:31:34 +01:00
} ;
2021-03-23 17:26:54 +01:00
const typeCheckConfig = ( componentName , config , configTypes ) => {
Object . keys ( configTypes ) . forEach ( property => {
const expectedTypes = configTypes [ property ] ;
const value = config [ property ] ;
const valueType = value && isElement ( value ) ? 'element' : toType ( value ) ;
2019-03-01 17:31:34 +01:00
if ( ! new RegExp ( expectedTypes ) . test ( valueType ) ) {
2021-05-05 21:32:12 +02:00
throw new TypeError ( ` ${ componentName . toUpperCase ( ) } : Option " ${ property } " provided type " ${ valueType } " but expected type " ${ expectedTypes } ". ` ) ;
2019-03-01 17:31:34 +01:00
}
} ) ;
} ;
2021-03-23 17:26:54 +01:00
const isVisible = element => {
2021-06-22 20:29:16 +02:00
if ( ! isElement ( element ) || element . getClientRects ( ) . length === 0 ) {
2019-03-01 17:31:34 +01:00
return false ;
}
2021-06-22 20:29:16 +02:00
return getComputedStyle ( element ) . getPropertyValue ( 'visibility' ) === 'visible' ;
2019-03-01 17:31:34 +01:00
} ;
2021-08-04 17:41:51 +02:00
const isDisabled = element => {
if ( ! element || element . nodeType !== Node . ELEMENT _NODE ) {
return true ;
}
if ( element . classList . contains ( 'disabled' ) ) {
return true ;
}
if ( typeof element . disabled !== 'undefined' ) {
return element . disabled ;
}
return element . hasAttribute ( 'disabled' ) && element . getAttribute ( 'disabled' ) !== 'false' ;
} ;
/ * *
* Trick to restart an element ' s animation
*
* @ param { HTMLElement } element
* @ return void
*
* @ see https : //www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
* /
const reflow = element => {
// eslint-disable-next-line no-unused-expressions
element . offsetHeight ;
} ;
2019-03-01 17:31:34 +01:00
2021-03-23 17:26:54 +01:00
const getjQuery = ( ) => {
const {
jQuery
} = window ;
2019-08-27 15:03:21 +02:00
2020-11-23 14:17:16 +01:00
if ( jQuery && ! document . body . hasAttribute ( 'data-bs-no-jquery' ) ) {
2019-08-27 15:03:21 +02:00
return jQuery ;
}
return null ;
} ;
2021-06-22 20:29:16 +02:00
const DOMContentLoadedCallbacks = [ ] ;
2021-03-23 17:26:54 +01:00
const onDOMContentLoaded = callback => {
2020-11-11 18:07:37 +01:00
if ( document . readyState === 'loading' ) {
2021-06-22 20:29:16 +02:00
// add listener on the first call when the document is in loading state
if ( ! DOMContentLoadedCallbacks . length ) {
document . addEventListener ( 'DOMContentLoaded' , ( ) => {
DOMContentLoadedCallbacks . forEach ( callback => callback ( ) ) ;
} ) ;
}
DOMContentLoadedCallbacks . push ( callback ) ;
2020-11-11 18:07:37 +01:00
} else {
callback ( ) ;
}
} ;
2021-03-23 17:26:54 +01:00
const isRTL = ( ) => document . documentElement . dir === 'rtl' ;
2020-12-03 14:08:31 +01:00
2021-05-13 18:22:20 +02:00
const defineJQueryPlugin = plugin => {
2021-03-23 17:26:54 +01:00
onDOMContentLoaded ( ( ) => {
const $ = getjQuery ( ) ;
2021-02-10 17:14:51 +01:00
/* istanbul ignore if */
2020-12-03 15:18:59 +01:00
2021-02-10 17:14:51 +01:00
if ( $ ) {
2021-05-13 18:22:20 +02:00
const name = plugin . NAME ;
2021-03-23 17:26:54 +01:00
const JQUERY _NO _CONFLICT = $ . fn [ name ] ;
2021-02-10 17:14:51 +01:00
$ . fn [ name ] = plugin . jQueryInterface ;
$ . fn [ name ] . Constructor = plugin ;
2020-12-03 15:18:59 +01:00
2021-03-23 17:26:54 +01:00
$ . fn [ name ] . noConflict = ( ) => {
2021-02-10 17:14:51 +01:00
$ . fn [ name ] = JQUERY _NO _CONFLICT ;
return plugin . jQueryInterface ;
} ;
2020-12-03 15:18:59 +01:00
}
2021-02-10 17:14:51 +01:00
} ) ;
} ;
2020-12-03 15:18:59 +01:00
2021-05-05 21:32:12 +02:00
const execute = callback => {
if ( typeof callback === 'function' ) {
callback ( ) ;
}
} ;
2021-06-22 20:29:16 +02:00
const executeAfterTransition = ( callback , transitionElement , waitForTransition = true ) => {
if ( ! waitForTransition ) {
execute ( callback ) ;
return ;
}
const durationPadding = 5 ;
const emulatedDuration = getTransitionDurationFromElement ( transitionElement ) + durationPadding ;
let called = false ;
const handler = ( {
target
} ) => {
if ( target !== transitionElement ) {
return ;
}
called = true ;
transitionElement . removeEventListener ( TRANSITION _END , handler ) ;
execute ( callback ) ;
} ;
transitionElement . addEventListener ( TRANSITION _END , handler ) ;
setTimeout ( ( ) => {
if ( ! called ) {
triggerTransitionEnd ( transitionElement ) ;
}
} , emulatedDuration ) ;
} ;
2021-05-05 21:32:12 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2021-10-09 08:33:12 +02:00
* Bootstrap ( v5 . 1.3 ) : util / scrollBar . js
2021-05-05 21:32:12 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
const SELECTOR _FIXED _CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' ;
const SELECTOR _STICKY _CONTENT = '.sticky-top' ;
2021-06-22 20:29:16 +02:00
class ScrollBarHelper {
constructor ( ) {
this . _element = document . body ;
}
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
getWidth ( ) {
// https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
const documentWidth = document . documentElement . clientWidth ;
return Math . abs ( window . innerWidth - documentWidth ) ;
}
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
hide ( ) {
const width = this . getWidth ( ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _disableOverFlow ( ) ; // give padding to element to balance the hidden scrollbar width
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _setElementAttributes ( this . _element , 'paddingRight' , calculatedValue => calculatedValue + width ) ; // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _setElementAttributes ( SELECTOR _FIXED _CONTENT , 'paddingRight' , calculatedValue => calculatedValue + width ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _setElementAttributes ( SELECTOR _STICKY _CONTENT , 'marginRight' , calculatedValue => calculatedValue - width ) ;
2021-05-05 21:32:12 +02:00
}
2021-06-22 20:29:16 +02:00
_disableOverFlow ( ) {
this . _saveInitialAttribute ( this . _element , 'overflow' ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _element . style . overflow = 'hidden' ;
}
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
_setElementAttributes ( selector , styleProp , callback ) {
const scrollbarWidth = this . getWidth ( ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
const manipulationCallBack = element => {
if ( element !== this . _element && window . innerWidth > element . clientWidth + scrollbarWidth ) {
return ;
}
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _saveInitialAttribute ( element , styleProp ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
const calculatedValue = window . getComputedStyle ( element ) [ styleProp ] ;
element . style [ styleProp ] = ` ${ callback ( Number . parseFloat ( calculatedValue ) ) } px ` ;
} ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _applyManipulationCallback ( selector , manipulationCallBack ) ;
}
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
reset ( ) {
this . _resetElementAttributes ( this . _element , 'overflow' ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _resetElementAttributes ( this . _element , 'paddingRight' ) ;
this . _resetElementAttributes ( SELECTOR _FIXED _CONTENT , 'paddingRight' ) ;
this . _resetElementAttributes ( SELECTOR _STICKY _CONTENT , 'marginRight' ) ;
}
_saveInitialAttribute ( element , styleProp ) {
const actualValue = element . style [ styleProp ] ;
if ( actualValue ) {
2021-10-05 17:50:18 +02:00
Manipulator _ _default . default . setDataAttribute ( element , styleProp , actualValue ) ;
2021-06-22 20:29:16 +02:00
}
}
_resetElementAttributes ( selector , styleProp ) {
const manipulationCallBack = element => {
2021-10-05 17:50:18 +02:00
const value = Manipulator _ _default . default . getDataAttribute ( element , styleProp ) ;
2021-06-22 20:29:16 +02:00
if ( typeof value === 'undefined' ) {
element . style . removeProperty ( styleProp ) ;
} else {
2021-10-05 17:50:18 +02:00
Manipulator _ _default . default . removeDataAttribute ( element , styleProp ) ;
2021-06-22 20:29:16 +02:00
element . style [ styleProp ] = value ;
}
} ;
this . _applyManipulationCallback ( selector , manipulationCallBack ) ;
}
_applyManipulationCallback ( selector , callBack ) {
if ( isElement ( selector ) ) {
callBack ( selector ) ;
2021-05-05 21:32:12 +02:00
} else {
2021-10-05 17:50:18 +02:00
SelectorEngine _ _default . default . find ( selector , this . _element ) . forEach ( callBack ) ;
2021-05-05 21:32:12 +02:00
}
2021-06-22 20:29:16 +02:00
}
isOverflowing ( ) {
return this . getWidth ( ) > 0 ;
}
}
2021-05-05 21:32:12 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2021-10-09 08:33:12 +02:00
* Bootstrap ( v5 . 1.3 ) : util / backdrop . js
2021-10-05 17:50:18 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2021-05-05 21:32:12 +02:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2021-08-04 17:41:51 +02:00
const Default$2 = {
className : 'modal-backdrop' ,
2021-05-05 21:32:12 +02:00
isVisible : true ,
// if false, we use the backdrop helper without adding any element to the dom
isAnimated : false ,
2021-06-22 20:29:16 +02:00
rootElement : 'body' ,
2021-05-05 21:32:12 +02:00
// give the choice to place backdrop under different elements
clickCallback : null
} ;
2021-08-04 17:41:51 +02:00
const DefaultType$2 = {
className : 'string' ,
2021-05-05 21:32:12 +02:00
isVisible : 'boolean' ,
isAnimated : 'boolean' ,
2021-06-22 20:29:16 +02:00
rootElement : '(element|string)' ,
2021-05-05 21:32:12 +02:00
clickCallback : '(function|null)'
} ;
2021-08-04 17:41:51 +02:00
const NAME$2 = 'backdrop' ;
2021-05-05 21:32:12 +02:00
const CLASS _NAME _FADE$1 = 'fade' ;
const CLASS _NAME _SHOW$1 = 'show' ;
2021-08-04 17:41:51 +02:00
const EVENT _MOUSEDOWN = ` mousedown.bs. ${ NAME$2 } ` ;
2021-05-05 21:32:12 +02:00
class Backdrop {
constructor ( config ) {
this . _config = this . _getConfig ( config ) ;
this . _isAppended = false ;
this . _element = null ;
}
show ( callback ) {
if ( ! this . _config . isVisible ) {
execute ( callback ) ;
return ;
}
this . _append ( ) ;
if ( this . _config . isAnimated ) {
reflow ( this . _getElement ( ) ) ;
}
this . _getElement ( ) . classList . add ( CLASS _NAME _SHOW$1 ) ;
this . _emulateAnimation ( ( ) => {
execute ( callback ) ;
} ) ;
}
hide ( callback ) {
if ( ! this . _config . isVisible ) {
execute ( callback ) ;
return ;
}
this . _getElement ( ) . classList . remove ( CLASS _NAME _SHOW$1 ) ;
this . _emulateAnimation ( ( ) => {
this . dispose ( ) ;
execute ( callback ) ;
} ) ;
} // Private
_getElement ( ) {
if ( ! this . _element ) {
const backdrop = document . createElement ( 'div' ) ;
2021-08-04 17:41:51 +02:00
backdrop . className = this . _config . className ;
2021-05-05 21:32:12 +02:00
if ( this . _config . isAnimated ) {
backdrop . classList . add ( CLASS _NAME _FADE$1 ) ;
}
this . _element = backdrop ;
}
return this . _element ;
}
_getConfig ( config ) {
2021-08-04 17:41:51 +02:00
config = { ... Default$2 ,
2021-05-05 21:32:12 +02:00
... ( typeof config === 'object' ? config : { } )
2021-06-22 20:29:16 +02:00
} ; // use getElement() with the default "body" to get a fresh Element on each instantiation
config . rootElement = getElement ( config . rootElement ) ;
2021-08-04 17:41:51 +02:00
typeCheckConfig ( NAME$2 , config , DefaultType$2 ) ;
2021-05-05 21:32:12 +02:00
return config ;
}
_append ( ) {
if ( this . _isAppended ) {
return ;
}
2021-08-04 17:41:51 +02:00
this . _config . rootElement . append ( this . _getElement ( ) ) ;
2021-05-05 21:32:12 +02:00
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( this . _getElement ( ) , EVENT _MOUSEDOWN , ( ) => {
2021-05-05 21:32:12 +02:00
execute ( this . _config . clickCallback ) ;
} ) ;
this . _isAppended = true ;
}
dispose ( ) {
if ( ! this . _isAppended ) {
return ;
}
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . off ( this . _element , EVENT _MOUSEDOWN ) ;
2021-05-05 21:32:12 +02:00
2021-06-22 20:29:16 +02:00
this . _element . remove ( ) ;
2021-05-05 21:32:12 +02:00
this . _isAppended = false ;
}
_emulateAnimation ( callback ) {
2021-06-22 20:29:16 +02:00
executeAfterTransition ( callback , this . _getElement ( ) , this . _config . isAnimated ) ;
2021-05-05 21:32:12 +02:00
}
}
2021-03-23 17:26:54 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2021-10-09 08:33:12 +02:00
* Bootstrap ( v5 . 1.3 ) : util / focustrap . js
2021-10-05 17:50:18 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
2021-08-04 17:41:51 +02:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
const Default$1 = {
trapElement : null ,
// The element to trap focus inside of
autofocus : true
} ;
const DefaultType$1 = {
trapElement : 'element' ,
autofocus : 'boolean'
} ;
const NAME$1 = 'focustrap' ;
const DATA _KEY$1 = 'bs.focustrap' ;
const EVENT _KEY$1 = ` . ${ DATA _KEY$1 } ` ;
const EVENT _FOCUSIN = ` focusin ${ EVENT _KEY$1 } ` ;
const EVENT _KEYDOWN _TAB = ` keydown.tab ${ EVENT _KEY$1 } ` ;
const TAB _KEY = 'Tab' ;
const TAB _NAV _FORWARD = 'forward' ;
const TAB _NAV _BACKWARD = 'backward' ;
class FocusTrap {
constructor ( config ) {
this . _config = this . _getConfig ( config ) ;
this . _isActive = false ;
this . _lastTabNavDirection = null ;
}
activate ( ) {
const {
trapElement ,
autofocus
} = this . _config ;
if ( this . _isActive ) {
return ;
}
if ( autofocus ) {
trapElement . focus ( ) ;
}
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . off ( document , EVENT _KEY$1 ) ; // guard against infinite focus loop
2021-08-04 17:41:51 +02:00
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( document , EVENT _FOCUSIN , event => this . _handleFocusin ( event ) ) ;
EventHandler _ _default . default . on ( document , EVENT _KEYDOWN _TAB , event => this . _handleKeydown ( event ) ) ;
2021-08-04 17:41:51 +02:00
this . _isActive = true ;
}
deactivate ( ) {
if ( ! this . _isActive ) {
return ;
}
this . _isActive = false ;
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . off ( document , EVENT _KEY$1 ) ;
2021-08-04 17:41:51 +02:00
} // Private
_handleFocusin ( event ) {
const {
target
} = event ;
const {
trapElement
} = this . _config ;
if ( target === document || target === trapElement || trapElement . contains ( target ) ) {
return ;
}
2021-10-05 17:50:18 +02:00
const elements = SelectorEngine _ _default . default . focusableChildren ( trapElement ) ;
2021-08-04 17:41:51 +02:00
if ( elements . length === 0 ) {
trapElement . focus ( ) ;
} else if ( this . _lastTabNavDirection === TAB _NAV _BACKWARD ) {
elements [ elements . length - 1 ] . focus ( ) ;
} else {
elements [ 0 ] . focus ( ) ;
}
}
_handleKeydown ( event ) {
if ( event . key !== TAB _KEY ) {
return ;
}
this . _lastTabNavDirection = event . shiftKey ? TAB _NAV _BACKWARD : TAB _NAV _FORWARD ;
}
_getConfig ( config ) {
config = { ... Default$1 ,
... ( typeof config === 'object' ? config : { } )
} ;
typeCheckConfig ( NAME$1 , config , DefaultType$1 ) ;
return config ;
}
}
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2021-10-09 08:33:12 +02:00
* Bootstrap ( v5 . 1.3 ) : util / component - functions . js
2021-08-04 17:41:51 +02:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
const enableDismissTrigger = ( component , method = 'hide' ) => {
const clickEvent = ` click.dismiss ${ component . EVENT _KEY } ` ;
const name = component . NAME ;
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( document , clickEvent , ` [data-bs-dismiss=" ${ name } "] ` , function ( event ) {
2021-08-04 17:41:51 +02:00
if ( [ 'A' , 'AREA' ] . includes ( this . tagName ) ) {
event . preventDefault ( ) ;
}
if ( isDisabled ( this ) ) {
return ;
}
const target = getElementFromSelector ( this ) || this . closest ( ` . ${ name } ` ) ;
const instance = component . getOrCreateInstance ( target ) ; // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
instance [ method ] ( ) ;
} ) ;
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2021-10-09 08:33:12 +02:00
* Bootstrap ( v5 . 1.3 ) : modal . js
2021-03-23 17:26:54 +01:00
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/main/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2020-12-03 15:18:59 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2021-03-23 17:26:54 +01:00
const NAME = 'modal' ;
const DATA _KEY = 'bs.modal' ;
const EVENT _KEY = ` . ${ DATA _KEY } ` ;
const DATA _API _KEY = '.data-api' ;
const ESCAPE _KEY = 'Escape' ;
const Default = {
2018-11-13 07:41:12 +01:00
backdrop : true ,
keyboard : true ,
2020-12-03 15:18:59 +01:00
focus : true
2018-11-13 07:41:12 +01:00
} ;
2021-03-23 17:26:54 +01:00
const DefaultType = {
2018-11-13 07:41:12 +01:00
backdrop : '(boolean|string)' ,
keyboard : 'boolean' ,
2020-12-03 15:18:59 +01:00
focus : 'boolean'
2018-11-13 07:41:12 +01:00
} ;
2021-03-23 17:26:54 +01:00
const EVENT _HIDE = ` hide ${ EVENT _KEY } ` ;
const EVENT _HIDE _PREVENTED = ` hidePrevented ${ EVENT _KEY } ` ;
const EVENT _HIDDEN = ` hidden ${ EVENT _KEY } ` ;
const EVENT _SHOW = ` show ${ EVENT _KEY } ` ;
const EVENT _SHOWN = ` shown ${ EVENT _KEY } ` ;
const EVENT _RESIZE = ` resize ${ EVENT _KEY } ` ;
const EVENT _CLICK _DISMISS = ` click.dismiss ${ EVENT _KEY } ` ;
const EVENT _KEYDOWN _DISMISS = ` keydown.dismiss ${ EVENT _KEY } ` ;
const EVENT _MOUSEUP _DISMISS = ` mouseup.dismiss ${ EVENT _KEY } ` ;
const EVENT _MOUSEDOWN _DISMISS = ` mousedown.dismiss ${ EVENT _KEY } ` ;
const EVENT _CLICK _DATA _API = ` click ${ EVENT _KEY } ${ DATA _API _KEY } ` ;
const CLASS _NAME _OPEN = 'modal-open' ;
const CLASS _NAME _FADE = 'fade' ;
const CLASS _NAME _SHOW = 'show' ;
const CLASS _NAME _STATIC = 'modal-static' ;
2021-09-07 17:37:44 +02:00
const OPEN _SELECTOR = '.modal.show' ;
2021-03-23 17:26:54 +01:00
const SELECTOR _DIALOG = '.modal-dialog' ;
const SELECTOR _MODAL _BODY = '.modal-body' ;
const SELECTOR _DATA _TOGGLE = '[data-bs-toggle="modal"]' ;
2019-10-08 08:39:10 +02:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-11-13 07:41:12 +01:00
2021-10-05 17:50:18 +02:00
class Modal extends BaseComponent _ _default . default {
2021-03-23 17:26:54 +01:00
constructor ( element , config ) {
super ( element ) ;
this . _config = this . _getConfig ( config ) ;
2021-10-05 17:50:18 +02:00
this . _dialog = SelectorEngine _ _default . default . findOne ( SELECTOR _DIALOG , this . _element ) ;
2021-05-05 21:32:12 +02:00
this . _backdrop = this . _initializeBackDrop ( ) ;
2021-08-04 17:41:51 +02:00
this . _focustrap = this . _initializeFocusTrap ( ) ;
2021-03-23 17:26:54 +01:00
this . _isShown = false ;
this . _ignoreBackdropClick = false ;
this . _isTransitioning = false ;
2021-06-22 20:29:16 +02:00
this . _scrollBar = new ScrollBarHelper ( ) ;
2018-11-13 07:41:12 +01:00
} // Getters
2021-03-23 17:26:54 +01:00
static get Default ( ) {
return Default ;
}
2018-11-13 07:41:12 +01:00
2021-05-13 18:22:20 +02:00
static get NAME ( ) {
return NAME ;
2021-03-23 17:26:54 +01:00
} // Public
2015-05-11 04:45:38 +02:00
2015-08-13 06:12:03 +02:00
2021-03-23 17:26:54 +01:00
toggle ( relatedTarget ) {
return this . _isShown ? this . hide ( ) : this . show ( relatedTarget ) ;
}
show ( relatedTarget ) {
2018-11-13 07:41:12 +01:00
if ( this . _isShown || this . _isTransitioning ) {
return ;
}
2015-05-11 04:45:38 +02:00
2021-10-05 17:50:18 +02:00
const showEvent = EventHandler _ _default . default . trigger ( this . _element , EVENT _SHOW , {
2021-03-23 17:26:54 +01:00
relatedTarget
2018-11-13 07:41:12 +01:00
} ) ;
2016-10-10 02:26:51 +02:00
2021-06-22 20:29:16 +02:00
if ( 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 ;
2021-06-22 20:29:16 +02:00
if ( this . _isAnimated ( ) ) {
this . _isTransitioning = true ;
}
this . _scrollBar . hide ( ) ;
2021-05-05 21:32:12 +02:00
document . body . classList . add ( CLASS _NAME _OPEN ) ;
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
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( this . _dialog , EVENT _MOUSEDOWN _DISMISS , ( ) => {
EventHandler _ _default . default . one ( this . _element , EVENT _MOUSEUP _DISMISS , event => {
2021-03-23 17:26:54 +01:00
if ( event . target === this . _element ) {
this . _ignoreBackdropClick = true ;
2018-11-13 07:41:12 +01:00
}
2018-07-24 02:51:14 +02:00
} ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2015-05-11 04:45:38 +02:00
2021-03-23 17:26:54 +01:00
this . _showBackdrop ( ( ) => this . _showElement ( relatedTarget ) ) ;
}
2015-05-11 04:45:38 +02:00
2021-08-04 17:41:51 +02:00
hide ( ) {
2018-11-13 07:41:12 +01:00
if ( ! this . _isShown || this . _isTransitioning ) {
return ;
}
2015-05-11 04:45:38 +02:00
2021-10-05 17:50:18 +02:00
const hideEvent = EventHandler _ _default . default . 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
2021-03-23 17:26:54 +01:00
const isAnimated = this . _isAnimated ( ) ;
2017-04-02 04:18:29 +02:00
2021-03-23 17:26:54 +01:00
if ( isAnimated ) {
2018-11-13 07:41:12 +01:00
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
2021-08-04 17:41:51 +02:00
this . _focustrap . deactivate ( ) ;
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
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . off ( this . _element , EVENT _CLICK _DISMISS ) ;
EventHandler _ _default . default . off ( this . _dialog , EVENT _MOUSEDOWN _DISMISS ) ;
2017-09-30 23:28:03 +02:00
2021-05-13 18:22:20 +02:00
this . _queueCallback ( ( ) => this . _hideModal ( ) , this . _element , isAnimated ) ;
2021-03-23 17:26:54 +01:00
}
2020-12-03 15:18:59 +01:00
2021-03-23 17:26:54 +01:00
dispose ( ) {
2021-10-05 17:50:18 +02:00
[ window , this . _dialog ] . forEach ( htmlElement => EventHandler _ _default . default . off ( htmlElement , EVENT _KEY ) ) ;
2021-05-13 18:22:20 +02:00
this . _backdrop . dispose ( ) ;
2021-08-04 17:41:51 +02:00
this . _focustrap . deactivate ( ) ;
2017-03-26 20:26:31 +02:00
2021-08-04 17:41:51 +02:00
super . dispose ( ) ;
2021-03-23 17:26:54 +01:00
}
2016-10-10 02:26:51 +02:00
2021-03-23 17:26:54 +01:00
handleUpdate ( ) {
2018-11-13 07:41:12 +01:00
this . _adjustDialog ( ) ;
2019-01-04 17:29:45 +01:00
} // Private
2016-10-10 02:26:51 +02:00
2021-03-23 17:26:54 +01:00
2021-05-05 21:32:12 +02:00
_initializeBackDrop ( ) {
return new Backdrop ( {
isVisible : Boolean ( this . _config . backdrop ) ,
// 'static' option will be translated to true, and booleans will keep their value
isAnimated : this . _isAnimated ( )
} ) ;
}
2021-08-04 17:41:51 +02:00
_initializeFocusTrap ( ) {
return new FocusTrap ( {
trapElement : this . _element
} ) ;
}
2021-03-23 17:26:54 +01:00
_getConfig ( config ) {
config = { ... Default ,
2021-10-05 17:50:18 +02:00
... Manipulator _ _default . default . getDataAttributes ( this . _element ) ,
2021-06-22 20:29:16 +02:00
... ( typeof config === 'object' ? config : { } )
2021-03-23 17:26:54 +01:00
} ;
2019-03-01 17:31:34 +01:00
typeCheckConfig ( NAME , config , DefaultType ) ;
2018-11-13 07:41:12 +01:00
return config ;
2021-03-23 17:26:54 +01:00
}
2017-09-30 23:28:03 +02:00
2021-03-23 17:26:54 +01:00
_showElement ( relatedTarget ) {
const isAnimated = this . _isAnimated ( ) ;
2017-09-30 23:28:03 +02:00
2021-10-05 17:50:18 +02:00
const modalBody = SelectorEngine _ _default . default . 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
2021-08-04 17:41:51 +02:00
document . body . append ( this . _element ) ;
2018-11-13 07:41:12 +01:00
}
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-06-14 00:40:28 +02:00
this . _element . setAttribute ( 'role' , 'dialog' ) ;
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
2021-03-23 17:26:54 +01:00
if ( isAnimated ) {
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
2021-03-23 17:26:54 +01:00
const transitionComplete = ( ) => {
if ( this . _config . focus ) {
2021-08-04 17:41:51 +02:00
this . _focustrap . activate ( ) ;
2017-09-06 06:05:12 +02:00
}
2015-05-11 04:45:38 +02:00
2021-03-23 17:26:54 +01:00
this . _isTransitioning = false ;
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . trigger ( this . _element , EVENT _SHOWN , {
2021-03-23 17:26:54 +01:00
relatedTarget
2019-03-01 17:31:34 +01:00
} ) ;
2017-09-30 23:28:03 +02:00
} ;
2015-05-11 04:45:38 +02:00
2021-05-13 18:22:20 +02:00
this . _queueCallback ( transitionComplete , this . _dialog , isAnimated ) ;
2021-03-23 17:26:54 +01:00
}
2015-05-11 04:45:38 +02:00
2021-03-23 17:26:54 +01:00
_setEscapeEvent ( ) {
2020-03-28 11:29:08 +01:00
if ( this . _isShown ) {
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( this . _element , EVENT _KEYDOWN _DISMISS , event => {
2021-03-23 17:26:54 +01:00
if ( this . _config . keyboard && event . key === ESCAPE _KEY ) {
2020-03-28 11:29:08 +01:00
event . preventDefault ( ) ;
2021-03-23 17:26:54 +01:00
this . hide ( ) ;
} else if ( ! this . _config . keyboard && event . key === ESCAPE _KEY ) {
this . _triggerBackdropTransition ( ) ;
2018-11-13 07:41:12 +01:00
}
} ) ;
2019-07-24 08:13:50 +02:00
} else {
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . off ( this . _element , EVENT _KEYDOWN _DISMISS ) ;
2018-11-13 07:41:12 +01:00
}
2021-03-23 17:26:54 +01:00
}
2015-05-11 04:45:38 +02:00
2021-03-23 17:26:54 +01:00
_setResizeEvent ( ) {
2018-11-13 07:41:12 +01:00
if ( this . _isShown ) {
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( window , EVENT _RESIZE , ( ) => this . _adjustDialog ( ) ) ;
2018-11-13 07:41:12 +01:00
} else {
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . off ( window , EVENT _RESIZE ) ;
2018-11-13 07:41:12 +01:00
}
2021-03-23 17:26:54 +01:00
}
2015-05-11 04:45:38 +02:00
2021-03-23 17:26:54 +01:00
_hideModal ( ) {
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' ) ;
2020-06-14 00:40:28 +02:00
this . _element . removeAttribute ( 'role' ) ;
2018-11-13 07:41:12 +01:00
this . _isTransitioning = false ;
2017-09-30 23:28:03 +02:00
2021-05-05 21:32:12 +02:00
this . _backdrop . hide ( ( ) => {
2020-03-28 11:29:08 +01:00
document . body . classList . remove ( CLASS _NAME _OPEN ) ;
2015-05-11 04:45:38 +02:00
2021-03-23 17:26:54 +01:00
this . _resetAdjustments ( ) ;
2017-09-30 23:28:03 +02:00
2021-06-22 20:29:16 +02:00
this . _scrollBar . reset ( ) ;
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . trigger ( this . _element , EVENT _HIDDEN ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2021-03-23 17:26:54 +01:00
}
2017-09-30 23:28:03 +02:00
2021-03-23 17:26:54 +01:00
_showBackdrop ( callback ) {
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( this . _element , EVENT _CLICK _DISMISS , event => {
2021-05-05 21:32:12 +02:00
if ( this . _ignoreBackdropClick ) {
this . _ignoreBackdropClick = false ;
return ;
2018-11-13 07:41:12 +01:00
}
2015-05-11 04:45:38 +02:00
2021-05-05 21:32:12 +02:00
if ( event . target !== event . currentTarget ) {
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
2021-05-05 21:32:12 +02:00
if ( this . _config . backdrop === true ) {
this . hide ( ) ;
} else if ( this . _config . backdrop === 'static' ) {
this . _triggerBackdropTransition ( ) ;
2018-07-24 02:51:14 +02:00
}
2021-05-05 21:32:12 +02:00
} ) ;
this . _backdrop . show ( callback ) ;
2021-03-23 17:26:54 +01:00
}
2019-11-08 09:11:23 +01:00
2021-03-23 17:26:54 +01:00
_isAnimated ( ) {
return this . _element . classList . contains ( CLASS _NAME _FADE ) ;
}
2019-11-08 09:11:23 +01:00
2021-03-23 17:26:54 +01:00
_triggerBackdropTransition ( ) {
2021-10-05 17:50:18 +02:00
const hideEvent = EventHandler _ _default . default . trigger ( this . _element , EVENT _HIDE _PREVENTED ) ;
2019-11-08 09:11:23 +01:00
2020-11-23 14:17:16 +01:00
if ( hideEvent . defaultPrevented ) {
return ;
}
2019-11-08 09:11:23 +01:00
2021-06-22 20:29:16 +02:00
const {
classList ,
scrollHeight ,
style
} = this . _element ;
const isModalOverflowing = scrollHeight > document . documentElement . clientHeight ; // return if the following background transition hasn't yet completed
if ( ! isModalOverflowing && style . overflowY === 'hidden' || classList . contains ( CLASS _NAME _STATIC ) ) {
return ;
}
2020-09-14 17:12:06 +02:00
2020-11-23 14:17:16 +01:00
if ( ! isModalOverflowing ) {
2021-06-22 20:29:16 +02:00
style . overflowY = 'hidden' ;
2020-11-23 14:17:16 +01:00
}
2020-09-14 17:12:06 +02:00
2021-06-22 20:29:16 +02:00
classList . add ( CLASS _NAME _STATIC ) ;
2019-11-08 09:11:23 +01:00
2021-06-22 20:29:16 +02:00
this . _queueCallback ( ( ) => {
classList . remove ( CLASS _NAME _STATIC ) ;
2020-09-14 17:12:06 +02:00
2020-11-23 14:17:16 +01:00
if ( ! isModalOverflowing ) {
2021-06-22 20:29:16 +02:00
this . _queueCallback ( ( ) => {
style . overflowY = '' ;
} , this . _dialog ) ;
2020-11-23 14:17:16 +01:00
}
2021-06-22 20:29:16 +02:00
} , this . _dialog ) ;
2019-11-08 09:11:23 +01:00
2020-11-23 14:17:16 +01:00
this . _element . focus ( ) ;
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
// ----------------------------------------------------------------------
2017-09-30 23:28:03 +02:00
2021-03-23 17:26:54 +01:00
_adjustDialog ( ) {
const isModalOverflowing = this . _element . scrollHeight > document . documentElement . clientHeight ;
2021-06-22 20:29:16 +02:00
const scrollbarWidth = this . _scrollBar . getWidth ( ) ;
2021-05-05 21:32:12 +02:00
const isBodyOverflowing = scrollbarWidth > 0 ;
2021-03-23 17:26:54 +01:00
2021-05-05 21:32:12 +02:00
if ( ! isBodyOverflowing && isModalOverflowing && ! isRTL ( ) || isBodyOverflowing && ! isModalOverflowing && isRTL ( ) ) {
this . _element . style . paddingLeft = ` ${ scrollbarWidth } px ` ;
2018-11-13 07:41:12 +01:00
}
2021-05-05 21:32:12 +02:00
if ( isBodyOverflowing && ! isModalOverflowing && ! isRTL ( ) || ! isBodyOverflowing && isModalOverflowing && isRTL ( ) ) {
this . _element . style . paddingRight = ` ${ scrollbarWidth } px ` ;
2018-11-13 07:41:12 +01:00
}
2021-03-23 17:26:54 +01:00
}
2018-11-13 07:41:12 +01:00
2021-03-23 17:26:54 +01:00
_resetAdjustments ( ) {
2018-11-13 07:41:12 +01:00
this . _element . style . paddingLeft = '' ;
this . _element . style . paddingRight = '' ;
2019-01-04 17:29:45 +01:00
} // Static
2016-10-10 02:26:51 +02:00
2021-03-23 17:26:54 +01:00
static jQueryInterface ( config , relatedTarget ) {
return this . each ( function ( ) {
2021-06-22 20:29:16 +02:00
const data = Modal . getOrCreateInstance ( this , config ) ;
2017-09-30 23:28:03 +02:00
2021-05-05 21:32:12 +02:00
if ( typeof config !== 'string' ) {
return ;
2018-11-13 07:41:12 +01:00
}
2017-09-30 23:28:03 +02:00
2021-05-05 21:32:12 +02:00
if ( typeof data [ config ] === 'undefined' ) {
throw new TypeError ( ` No method named " ${ config } " ` ) ;
2018-07-24 02:51:14 +02:00
}
2021-05-05 21:32:12 +02:00
data [ config ] ( relatedTarget ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2021-03-23 17:26:54 +01:00
}
2017-09-30 23:28:03 +02:00
2021-03-23 17:26:54 +01:00
}
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2015-05-11 04:45:38 +02:00
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . on ( document , EVENT _CLICK _DATA _API , SELECTOR _DATA _TOGGLE , function ( event ) {
2021-03-23 17:26:54 +01:00
const target = getElementFromSelector ( this ) ;
2018-11-13 07:41:12 +01:00
2021-05-05 21:32:12 +02:00
if ( [ 'A' , 'AREA' ] . includes ( this . tagName ) ) {
2018-11-13 07:41:12 +01:00
event . preventDefault ( ) ;
}
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . one ( target , EVENT _SHOW , 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
}
2021-10-05 17:50:18 +02:00
EventHandler _ _default . default . one ( target , EVENT _HIDDEN , ( ) => {
2021-03-23 17:26:54 +01:00
if ( isVisible ( this ) ) {
this . focus ( ) ;
2015-05-11 04:45:38 +02:00
}
} ) ;
2021-09-07 17:37:44 +02:00
} ) ; // avoid conflict when clicking moddal toggler while another one is open
2021-10-05 17:50:18 +02:00
const allReadyOpen = SelectorEngine _ _default . default . findOne ( OPEN _SELECTOR ) ;
2021-09-07 17:37:44 +02:00
if ( allReadyOpen ) {
Modal . getInstance ( allReadyOpen ) . hide ( ) ;
}
2021-06-22 20:29:16 +02:00
const data = Modal . getOrCreateInstance ( target ) ;
2021-02-10 17:14:51 +01:00
data . toggle ( this ) ;
2018-11-13 07:41:12 +01:00
} ) ;
2021-08-04 17:41:51 +02:00
enableDismissTrigger ( Modal ) ;
2018-11-13 07:41:12 +01:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2020-11-11 18:07:37 +01: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
2021-05-13 18:22:20 +02:00
defineJQueryPlugin ( Modal ) ;
2015-05-11 04:45:38 +02:00
return Modal ;
2018-07-24 02:51:14 +02:00
2021-10-05 17:50:18 +02:00
} ) ) ;
2018-07-24 02:51:14 +02:00
//# sourceMappingURL=modal.js.map