2018-01-23 15:38:38 +03:00
( function ( global , factory ) {
2019-10-04 16:46:05 +03:00
typeof exports === 'object' && typeof module !== 'undefined' ? factory ( require ( 'jquery' ) , require ( 'popper.js' ) ) :
typeof define === 'function' && define . amd ? define ( [ 'jquery' , 'popper.js' ] , factory ) :
( global = global || self , factory ( global . jQuery , global . Popper ) ) ;
} ( this , function ( $ , Popper$1 ) { 'use strict' ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ = $ && $ . hasOwnProperty ( 'default' ) ? $ [ 'default' ] : $ ;
Popper$1 = Popper$1 && Popper$1 . hasOwnProperty ( 'default' ) ? Popper$1 [ 'default' ] : Popper$1 ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : util . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Private TransitionEnd Helpers
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const TRANSITION _END = 'transitionend' ;
const MAX _UID = 1000000 ;
const MILLISECONDS _MULTIPLIER = 1000 ;
// Shoutout AngusCroll (https://goo.gl/pxwQGp)
2018-01-23 17:40:57 +03:00
function toType ( obj ) {
2019-10-04 16:46:05 +03:00
return { } . toString . call ( obj ) . match ( /\s([a-z]+)/i ) [ 1 ] . toLowerCase ( )
2018-01-23 17:40:57 +03:00
}
function getSpecialTransitionEndEvent ( ) {
return {
2019-10-04 16:46:05 +03:00
bindType : TRANSITION _END ,
delegateType : TRANSITION _END ,
handle ( event ) {
if ( $ ( event . target ) . is ( this ) ) {
return event . handleObj . handler . apply ( this , arguments ) // eslint-disable-line prefer-rest-params
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
return undefined // eslint-disable-line no-undefined
2018-01-23 17:40:57 +03:00
}
}
}
function transitionEndEmulator ( duration ) {
2019-10-04 16:46:05 +03:00
let called = false ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( this ) . one ( Util . TRANSITION _END , ( ) => {
2018-01-23 17:40:57 +03:00
called = true ;
} ) ;
2019-10-04 16:46:05 +03:00
setTimeout ( ( ) => {
2018-01-23 17:40:57 +03:00
if ( ! called ) {
2019-10-04 16:46:05 +03:00
Util . triggerTransitionEnd ( this ) ;
2018-01-23 17:40:57 +03:00
}
} , duration ) ;
2019-10-04 16:46:05 +03:00
return this
2018-01-23 17:40:57 +03:00
}
function setTransitionEndSupport ( ) {
2019-10-04 16:46:05 +03:00
$ . fn . emulateTransitionEnd = transitionEndEmulator ;
$ . event . special [ Util . TRANSITION _END ] = getSpecialTransitionEndEvent ( ) ;
2018-01-23 17:40:57 +03:00
}
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Public Util Api
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const Util = {
2018-01-23 17:40:57 +03:00
TRANSITION _END : 'bsTransitionEnd' ,
2019-10-04 16:46:05 +03:00
getUID ( prefix ) {
2018-01-23 17:40:57 +03:00
do {
// eslint-disable-next-line no-bitwise
prefix += ~ ~ ( Math . random ( ) * MAX _UID ) ; // "~~" acts like a faster Math.floor() here
2019-10-04 16:46:05 +03:00
} while ( document . getElementById ( prefix ) )
return prefix
2018-01-23 17:40:57 +03:00
} ,
2019-10-04 16:46:05 +03:00
getSelectorFromElement ( element ) {
let selector = element . getAttribute ( 'data-target' ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( ! selector || selector === '#' ) {
const hrefAttr = element . getAttribute ( 'href' ) ;
selector = hrefAttr && hrefAttr !== '#' ? hrefAttr . trim ( ) : '' ;
2018-01-23 17:40:57 +03:00
}
try {
2019-10-04 16:46:05 +03:00
return document . querySelector ( selector ) ? selector : null
2018-01-23 17:40:57 +03:00
} catch ( err ) {
2019-10-04 16:46:05 +03:00
return null
}
} ,
getTransitionDurationFromElement ( element ) {
if ( ! element ) {
return 0
}
// Get transition-duration of the element
let transitionDuration = $ ( element ) . css ( 'transition-duration' ) ;
let transitionDelay = $ ( element ) . css ( 'transition-delay' ) ;
const floatTransitionDuration = parseFloat ( transitionDuration ) ;
const floatTransitionDelay = parseFloat ( transitionDelay ) ;
// Return 0 if element or transition duration is not found
if ( ! floatTransitionDuration && ! floatTransitionDelay ) {
return 0
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
// If multiple durations are defined, take the first
transitionDuration = transitionDuration . split ( ',' ) [ 0 ] ;
transitionDelay = transitionDelay . split ( ',' ) [ 0 ] ;
return ( parseFloat ( transitionDuration ) + parseFloat ( transitionDelay ) ) * MILLISECONDS _MULTIPLIER
2018-01-23 17:40:57 +03:00
} ,
2019-10-04 16:46:05 +03:00
reflow ( element ) {
return element . offsetHeight
2018-01-23 17:40:57 +03:00
} ,
2019-10-04 16:46:05 +03:00
triggerTransitionEnd ( element ) {
$ ( element ) . trigger ( TRANSITION _END ) ;
2018-01-23 17:40:57 +03:00
} ,
2019-10-04 16:46:05 +03:00
// TODO: Remove in v5
supportsTransitionEnd ( ) {
return Boolean ( TRANSITION _END )
2018-01-23 17:40:57 +03:00
} ,
2019-10-04 16:46:05 +03:00
isElement ( obj ) {
return ( obj [ 0 ] || obj ) . nodeType
2018-01-23 17:40:57 +03:00
} ,
2019-10-04 16:46:05 +03:00
typeCheckConfig ( componentName , config , configTypes ) {
for ( const property in configTypes ) {
2018-01-23 17:40:57 +03:00
if ( Object . prototype . hasOwnProperty . call ( configTypes , property ) ) {
2019-10-04 16:46:05 +03:00
const expectedTypes = configTypes [ property ] ;
const value = config [ property ] ;
const valueType = value && Util . isElement ( value )
? 'element' : toType ( value ) ;
2018-01-23 17:40:57 +03:00
if ( ! new RegExp ( expectedTypes ) . test ( valueType ) ) {
2019-10-04 16:46:05 +03:00
throw new Error (
` ${ componentName . toUpperCase ( ) } : ` +
` Option " ${ property } " provided type " ${ valueType } " ` +
` but expected type " ${ expectedTypes } ". ` )
2018-01-23 17:40:57 +03:00
}
}
}
2019-10-04 16:46:05 +03:00
} ,
findShadowRoot ( element ) {
if ( ! document . documentElement . attachShadow ) {
return null
}
// Can find the shadow root otherwise it'll return the document
if ( typeof element . getRootNode === 'function' ) {
const root = element . getRootNode ( ) ;
return root instanceof ShadowRoot ? root : null
}
if ( element instanceof ShadowRoot ) {
return element
}
// when we don't find a shadow root
if ( ! element . parentNode ) {
return null
}
return Util . findShadowRoot ( element . parentNode )
2018-01-23 17:40:57 +03:00
}
} ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
setTransitionEndSupport ( ) ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : alert . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME = 'alert' ;
const VERSION = '4.3.1' ;
const DATA _KEY = 'bs.alert' ;
const EVENT _KEY = ` . ${ DATA _KEY } ` ;
const DATA _API _KEY = '.data-api' ;
const JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
const Selector = {
DISMISS : '[data-dismiss="alert"]'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event = {
CLOSE : ` close ${ EVENT _KEY } ` ,
CLOSED : ` closed ${ EVENT _KEY } ` ,
CLICK _DATA _API : ` click ${ EVENT _KEY } ${ DATA _API _KEY } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName = {
ALERT : 'alert' ,
FADE : 'fade' ,
SHOW : 'show'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class Alert {
constructor ( element ) {
2018-01-23 17:40:57 +03:00
this . _element = element ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
close ( element ) {
let rootElement = this . _element ;
if ( element ) {
rootElement = this . _getRootElement ( element ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const customEvent = this . _triggerCloseEvent ( rootElement ) ;
2018-01-23 17:40:57 +03:00
if ( customEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
this . _removeElement ( rootElement ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
2018-01-23 17:40:57 +03:00
this . _element = null ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getRootElement ( element ) {
const selector = Util . getSelectorFromElement ( element ) ;
let parent = false ;
2018-01-23 17:40:57 +03:00
if ( selector ) {
2019-10-04 16:46:05 +03:00
parent = document . querySelector ( selector ) ;
2018-01-23 17:40:57 +03:00
}
if ( ! parent ) {
2019-10-04 16:46:05 +03:00
parent = $ ( element ) . closest ( ` . ${ ClassName . ALERT } ` ) [ 0 ] ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
return parent
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_triggerCloseEvent ( element ) {
const closeEvent = $ . Event ( Event . CLOSE ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( element ) . trigger ( closeEvent ) ;
return closeEvent
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_removeElement ( element ) {
$ ( element ) . removeClass ( ClassName . SHOW ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( ! $ ( element ) . hasClass ( ClassName . FADE ) ) {
2018-01-23 17:40:57 +03:00
this . _destroyElement ( element ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const transitionDuration = Util . getTransitionDurationFromElement ( element ) ;
$ ( element )
. one ( Util . TRANSITION _END , ( event ) => this . _destroyElement ( element , event ) )
. emulateTransitionEnd ( transitionDuration ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_destroyElement ( element ) {
$ ( element )
. detach ( )
. trigger ( Event . CLOSED )
. remove ( ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
const $element = $ ( this ) ;
let data = $element . data ( DATA _KEY ) ;
2018-01-23 17:40:57 +03:00
if ( ! data ) {
data = new Alert ( this ) ;
$element . data ( DATA _KEY , data ) ;
}
if ( config === 'close' ) {
data [ config ] ( this ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _handleDismiss ( alertInstance ) {
2018-01-23 17:40:57 +03:00
return function ( event ) {
if ( event ) {
event . preventDefault ( ) ;
}
alertInstance . close ( this ) ;
}
2019-10-04 16:46:05 +03:00
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( document ) . on (
Event . CLICK _DATA _API ,
Selector . DISMISS ,
Alert . _handleDismiss ( new Alert ( ) )
) ;
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME ] = Alert . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Alert ;
$ . fn [ NAME ] . noConflict = ( ) => {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Alert . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : button . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$1 = 'button' ;
const VERSION$1 = '4.3.1' ;
const DATA _KEY$1 = 'bs.button' ;
const EVENT _KEY$1 = ` . ${ DATA _KEY$1 } ` ;
const DATA _API _KEY$1 = '.data-api' ;
const JQUERY _NO _CONFLICT$1 = $ . fn [ NAME$1 ] ;
const ClassName$1 = {
ACTIVE : 'active' ,
BUTTON : 'btn' ,
FOCUS : 'focus'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$1 = {
DATA _TOGGLE _CARROT : '[data-toggle^="button"]' ,
DATA _TOGGLE : '[data-toggle="buttons"]' ,
INPUT : 'input:not([type="hidden"])' ,
ACTIVE : '.active' ,
BUTTON : '.btn'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event$1 = {
CLICK _DATA _API : ` click ${ EVENT _KEY$1 } ${ DATA _API _KEY$1 } ` ,
FOCUS _BLUR _DATA _API : ` focus ${ EVENT _KEY$1 } ${ DATA _API _KEY$1 } ` +
` blur ${ EVENT _KEY$1 } ${ DATA _API _KEY$1 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class Button {
constructor ( element ) {
2018-01-23 17:40:57 +03:00
this . _element = element ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$1
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
toggle ( ) {
let triggerChangeEvent = true ;
let addAriaPressed = true ;
const rootElement = $ ( this . _element ) . closest (
Selector$1 . DATA _TOGGLE
) [ 0 ] ;
2018-01-23 17:40:57 +03:00
if ( rootElement ) {
2019-10-04 16:46:05 +03:00
const input = this . _element . querySelector ( Selector$1 . INPUT ) ;
2018-01-23 17:40:57 +03:00
if ( input ) {
if ( input . type === 'radio' ) {
2019-10-04 16:46:05 +03:00
if ( input . checked &&
this . _element . classList . contains ( ClassName$1 . ACTIVE ) ) {
2018-01-23 17:40:57 +03:00
triggerChangeEvent = false ;
} else {
2019-10-04 16:46:05 +03:00
const activeElement = rootElement . querySelector ( Selector$1 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
if ( activeElement ) {
2019-10-04 16:46:05 +03:00
$ ( activeElement ) . removeClass ( ClassName$1 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
}
}
}
if ( triggerChangeEvent ) {
2019-10-04 16:46:05 +03:00
if ( input . hasAttribute ( 'disabled' ) ||
rootElement . hasAttribute ( 'disabled' ) ||
input . classList . contains ( 'disabled' ) ||
rootElement . classList . contains ( 'disabled' ) ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
input . checked = ! this . _element . classList . contains ( ClassName$1 . ACTIVE ) ;
$ ( input ) . trigger ( 'change' ) ;
2018-01-23 17:40:57 +03:00
}
input . focus ( ) ;
addAriaPressed = false ;
}
}
if ( addAriaPressed ) {
2019-10-04 16:46:05 +03:00
this . _element . setAttribute ( 'aria-pressed' ,
! this . _element . classList . contains ( ClassName$1 . ACTIVE ) ) ;
2018-01-23 17:40:57 +03:00
}
if ( triggerChangeEvent ) {
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . toggleClass ( ClassName$1 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
$ . removeData ( this . _element , DATA _KEY$1 ) ;
2018-01-23 17:40:57 +03:00
this . _element = null ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
let data = $ ( this ) . data ( DATA _KEY$1 ) ;
2018-01-23 17:40:57 +03:00
if ( ! data ) {
data = new Button ( this ) ;
2019-10-04 16:46:05 +03:00
$ ( this ) . data ( DATA _KEY$1 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( config === 'toggle' ) {
data [ config ] ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( document )
. on ( Event$1 . CLICK _DATA _API , Selector$1 . DATA _TOGGLE _CARROT , ( event ) => {
event . preventDefault ( ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
let button = event . target ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( ! $ ( button ) . hasClass ( ClassName$1 . BUTTON ) ) {
button = $ ( button ) . closest ( Selector$1 . BUTTON ) ;
}
Button . _jQueryInterface . call ( $ ( button ) , 'toggle' ) ;
} )
. on ( Event$1 . FOCUS _BLUR _DATA _API , Selector$1 . DATA _TOGGLE _CARROT , ( event ) => {
const button = $ ( event . target ) . closest ( Selector$1 . BUTTON ) [ 0 ] ;
$ ( button ) . toggleClass ( ClassName$1 . FOCUS , /^focus(in)?$/ . test ( event . type ) ) ;
} ) ;
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$1 ] = Button . _jQueryInterface ;
$ . fn [ NAME$1 ] . Constructor = Button ;
$ . fn [ NAME$1 ] . noConflict = ( ) => {
$ . fn [ NAME$1 ] = JQUERY _NO _CONFLICT$1 ;
return Button . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : carousel . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$2 = 'carousel' ;
const VERSION$2 = '4.3.1' ;
const DATA _KEY$2 = 'bs.carousel' ;
const EVENT _KEY$2 = ` . ${ DATA _KEY$2 } ` ;
const DATA _API _KEY$2 = '.data-api' ;
const JQUERY _NO _CONFLICT$2 = $ . fn [ NAME$2 ] ;
const ARROW _LEFT _KEYCODE = 37 ; // KeyboardEvent.which value for left arrow key
const ARROW _RIGHT _KEYCODE = 39 ; // KeyboardEvent.which value for right arrow key
const TOUCHEVENT _COMPAT _WAIT = 500 ; // Time for mouse compat events to fire after touch
const SWIPE _THRESHOLD = 40 ;
const Default = {
interval : 5000 ,
keyboard : true ,
slide : false ,
pause : 'hover' ,
wrap : true ,
touch : true
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const DefaultType = {
interval : '(number|boolean)' ,
keyboard : 'boolean' ,
slide : '(boolean|string)' ,
pause : '(string|boolean)' ,
wrap : 'boolean' ,
touch : 'boolean'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Direction = {
NEXT : 'next' ,
PREV : 'prev' ,
LEFT : 'left' ,
RIGHT : 'right'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event$2 = {
SLIDE : ` slide ${ EVENT _KEY$2 } ` ,
SLID : ` slid ${ EVENT _KEY$2 } ` ,
KEYDOWN : ` keydown ${ EVENT _KEY$2 } ` ,
MOUSEENTER : ` mouseenter ${ EVENT _KEY$2 } ` ,
MOUSELEAVE : ` mouseleave ${ EVENT _KEY$2 } ` ,
TOUCHSTART : ` touchstart ${ EVENT _KEY$2 } ` ,
TOUCHMOVE : ` touchmove ${ EVENT _KEY$2 } ` ,
TOUCHEND : ` touchend ${ EVENT _KEY$2 } ` ,
POINTERDOWN : ` pointerdown ${ EVENT _KEY$2 } ` ,
POINTERUP : ` pointerup ${ EVENT _KEY$2 } ` ,
DRAG _START : ` dragstart ${ EVENT _KEY$2 } ` ,
LOAD _DATA _API : ` load ${ EVENT _KEY$2 } ${ DATA _API _KEY$2 } ` ,
CLICK _DATA _API : ` click ${ EVENT _KEY$2 } ${ DATA _API _KEY$2 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$2 = {
CAROUSEL : 'carousel' ,
ACTIVE : 'active' ,
SLIDE : 'slide' ,
RIGHT : 'carousel-item-right' ,
LEFT : 'carousel-item-left' ,
NEXT : 'carousel-item-next' ,
PREV : 'carousel-item-prev' ,
ITEM : 'carousel-item' ,
POINTER _EVENT : 'pointer-event'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$2 = {
ACTIVE : '.active' ,
ACTIVE _ITEM : '.active.carousel-item' ,
ITEM : '.carousel-item' ,
ITEM _IMG : '.carousel-item img' ,
NEXT _PREV : '.carousel-item-next, .carousel-item-prev' ,
INDICATORS : '.carousel-indicators' ,
DATA _SLIDE : '[data-slide], [data-slide-to]' ,
DATA _RIDE : '[data-ride="carousel"]'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const PointerType = {
TOUCH : 'touch' ,
PEN : 'pen'
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class Carousel {
constructor ( element , config ) {
this . _items = null ;
this . _interval = null ;
2018-01-23 17:40:57 +03:00
this . _activeElement = null ;
2019-10-04 16:46:05 +03:00
this . _isPaused = false ;
this . _isSliding = false ;
this . touchTimeout = null ;
this . touchStartX = 0 ;
this . touchDeltaX = 0 ;
this . _config = this . _getConfig ( config ) ;
this . _element = element ;
this . _indicatorsElement = this . _element . querySelector ( Selector$2 . INDICATORS ) ;
this . _touchSupported = 'ontouchstart' in document . documentElement || navigator . maxTouchPoints > 0 ;
this . _pointerEvent = Boolean ( window . PointerEvent || window . MSPointerEvent ) ;
2018-01-23 17:40:57 +03:00
this . _addEventListeners ( ) ;
2019-10-04 16:46:05 +03:00
}
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$2
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get Default ( ) {
return Default
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
next ( ) {
2018-01-23 17:40:57 +03:00
if ( ! this . _isSliding ) {
this . _slide ( Direction . NEXT ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
nextWhenVisible ( ) {
2018-01-23 17:40:57 +03:00
// Don't call next when the page isn't visible
// or the carousel or its parent isn't visible
2019-10-04 16:46:05 +03:00
if ( ! document . hidden &&
( $ ( this . _element ) . is ( ':visible' ) && $ ( this . _element ) . css ( 'visibility' ) !== 'hidden' ) ) {
2018-01-23 17:40:57 +03:00
this . next ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
prev ( ) {
2018-01-23 17:40:57 +03:00
if ( ! this . _isSliding ) {
this . _slide ( Direction . PREV ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
pause ( event ) {
2018-01-23 17:40:57 +03:00
if ( ! event ) {
this . _isPaused = true ;
}
2019-10-04 16:46:05 +03:00
if ( this . _element . querySelector ( Selector$2 . NEXT _PREV ) ) {
2018-01-23 17:40:57 +03:00
Util . triggerTransitionEnd ( this . _element ) ;
this . cycle ( true ) ;
}
clearInterval ( this . _interval ) ;
this . _interval = null ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
cycle ( event ) {
2018-01-23 17:40:57 +03:00
if ( ! event ) {
this . _isPaused = false ;
}
if ( this . _interval ) {
clearInterval ( this . _interval ) ;
this . _interval = null ;
}
if ( this . _config . interval && ! this . _isPaused ) {
2019-10-04 16:46:05 +03:00
this . _interval = setInterval (
( document . visibilityState ? this . nextWhenVisible : this . next ) . bind ( this ) ,
this . _config . interval
) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
to ( index ) {
this . _activeElement = this . _element . querySelector ( Selector$2 . ACTIVE _ITEM ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const activeIndex = this . _getItemIndex ( this . _activeElement ) ;
2018-01-23 17:40:57 +03:00
if ( index > this . _items . length - 1 || index < 0 ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
if ( this . _isSliding ) {
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . one ( Event$2 . SLID , ( ) => this . to ( index ) ) ;
return
2018-01-23 17:40:57 +03:00
}
if ( activeIndex === index ) {
this . pause ( ) ;
this . cycle ( ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const direction = index > activeIndex
? Direction . NEXT
: Direction . PREV ;
2018-01-23 17:40:57 +03:00
this . _slide ( direction , this . _items [ index ] ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
$ ( this . _element ) . off ( EVENT _KEY$2 ) ;
$ . removeData ( this . _element , DATA _KEY$2 ) ;
this . _items = null ;
this . _config = null ;
this . _element = null ;
this . _interval = null ;
this . _isPaused = null ;
this . _isSliding = null ;
this . _activeElement = null ;
2018-01-23 17:40:57 +03:00
this . _indicatorsElement = null ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getConfig ( config ) {
config = {
... Default ,
... config
} ;
Util . typeCheckConfig ( NAME$2 , config , DefaultType ) ;
return config
}
_handleSwipe ( ) {
const absDeltax = Math . abs ( this . touchDeltaX ) ;
if ( absDeltax <= SWIPE _THRESHOLD ) {
return
}
const direction = absDeltax / this . touchDeltaX ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// swipe left
if ( direction > 0 ) {
this . prev ( ) ;
}
// swipe right
if ( direction < 0 ) {
this . next ( ) ;
}
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_addEventListeners ( ) {
2018-01-23 17:40:57 +03:00
if ( this . _config . keyboard ) {
2019-10-04 16:46:05 +03:00
$ ( this . _element )
. on ( Event$2 . KEYDOWN , ( event ) => this . _keydown ( event ) ) ;
2018-01-23 17:40:57 +03:00
}
if ( this . _config . pause === 'hover' ) {
2019-10-04 16:46:05 +03:00
$ ( this . _element )
. on ( Event$2 . MOUSEENTER , ( event ) => this . pause ( event ) )
. on ( Event$2 . MOUSELEAVE , ( event ) => this . cycle ( event ) ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( this . _config . touch ) {
this . _addTouchEventListeners ( ) ;
}
}
_addTouchEventListeners ( ) {
if ( ! this . _touchSupported ) {
return
}
const start = ( event ) => {
if ( this . _pointerEvent && PointerType [ event . originalEvent . pointerType . toUpperCase ( ) ] ) {
this . touchStartX = event . originalEvent . clientX ;
} else if ( ! this . _pointerEvent ) {
this . touchStartX = event . originalEvent . touches [ 0 ] . clientX ;
}
} ;
const move = ( event ) => {
// ensure swiping with one touch and not pinching
if ( event . originalEvent . touches && event . originalEvent . touches . length > 1 ) {
this . touchDeltaX = 0 ;
} else {
this . touchDeltaX = event . originalEvent . touches [ 0 ] . clientX - this . touchStartX ;
}
} ;
const end = ( event ) => {
if ( this . _pointerEvent && PointerType [ event . originalEvent . pointerType . toUpperCase ( ) ] ) {
this . touchDeltaX = event . originalEvent . clientX - this . touchStartX ;
}
this . _handleSwipe ( ) ;
if ( this . _config . pause === 'hover' ) {
2018-01-23 17:40:57 +03:00
// If it's a touch-enabled device, mouseenter/leave are fired as
// part of the mouse compatibility events on first tap - the carousel
// would stop cycling until user tapped out of it;
// here, we listen for touchend, explicitly pause the carousel
// (as if it's the second time we tap on it, mouseenter compat event
// is NOT fired) and after a timeout (to allow for mouse compatibility
// events to fire) we explicitly restart cycling
2019-10-04 16:46:05 +03:00
this . pause ( ) ;
if ( this . touchTimeout ) {
clearTimeout ( this . touchTimeout ) ;
}
this . touchTimeout = setTimeout ( ( event ) => this . cycle ( event ) , TOUCHEVENT _COMPAT _WAIT + this . _config . interval ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
} ;
$ ( this . _element . querySelectorAll ( Selector$2 . ITEM _IMG ) ) . on ( Event$2 . DRAG _START , ( e ) => e . preventDefault ( ) ) ;
if ( this . _pointerEvent ) {
$ ( this . _element ) . on ( Event$2 . POINTERDOWN , ( event ) => start ( event ) ) ;
$ ( this . _element ) . on ( Event$2 . POINTERUP , ( event ) => end ( event ) ) ;
this . _element . classList . add ( ClassName$2 . POINTER _EVENT ) ;
} else {
$ ( this . _element ) . on ( Event$2 . TOUCHSTART , ( event ) => start ( event ) ) ;
$ ( this . _element ) . on ( Event$2 . TOUCHMOVE , ( event ) => move ( event ) ) ;
$ ( this . _element ) . on ( Event$2 . TOUCHEND , ( event ) => end ( event ) ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_keydown ( event ) {
2018-01-23 17:40:57 +03:00
if ( /input|textarea/i . test ( event . target . tagName ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
switch ( event . which ) {
case ARROW _LEFT _KEYCODE :
event . preventDefault ( ) ;
this . prev ( ) ;
2019-10-04 16:46:05 +03:00
break
2018-01-23 17:40:57 +03:00
case ARROW _RIGHT _KEYCODE :
event . preventDefault ( ) ;
this . next ( ) ;
2019-10-04 16:46:05 +03:00
break
2018-01-23 17:40:57 +03:00
default :
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getItemIndex ( element ) {
this . _items = element && element . parentNode
? [ ] . slice . call ( element . parentNode . querySelectorAll ( Selector$2 . ITEM ) )
: [ ] ;
return this . _items . indexOf ( element )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getItemByDirection ( direction , activeElement ) {
const isNextDirection = direction === Direction . NEXT ;
const isPrevDirection = direction === Direction . PREV ;
const activeIndex = this . _getItemIndex ( activeElement ) ;
const lastItemIndex = this . _items . length - 1 ;
const isGoingToWrap = isPrevDirection && activeIndex === 0 ||
isNextDirection && activeIndex === lastItemIndex ;
2018-01-23 17:40:57 +03:00
if ( isGoingToWrap && ! this . _config . wrap ) {
2019-10-04 16:46:05 +03:00
return activeElement
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const delta = direction === Direction . PREV ? - 1 : 1 ;
const itemIndex = ( activeIndex + delta ) % this . _items . length ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
return itemIndex === - 1
? this . _items [ this . _items . length - 1 ] : this . _items [ itemIndex ]
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_triggerSlideEvent ( relatedTarget , eventDirectionName ) {
const targetIndex = this . _getItemIndex ( relatedTarget ) ;
const fromIndex = this . _getItemIndex ( this . _element . querySelector ( Selector$2 . ACTIVE _ITEM ) ) ;
const slideEvent = $ . Event ( Event$2 . SLIDE , {
relatedTarget ,
2018-01-23 17:40:57 +03:00
direction : eventDirectionName ,
from : fromIndex ,
to : targetIndex
} ) ;
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . trigger ( slideEvent ) ;
return slideEvent
}
_setActiveIndicatorElement ( element ) {
2018-01-23 17:40:57 +03:00
if ( this . _indicatorsElement ) {
2019-10-04 16:46:05 +03:00
const indicators = [ ] . slice . call ( this . _indicatorsElement . querySelectorAll ( Selector$2 . ACTIVE ) ) ;
$ ( indicators )
. removeClass ( ClassName$2 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const nextIndicator = this . _indicatorsElement . children [
this . _getItemIndex ( element )
] ;
2018-01-23 17:40:57 +03:00
if ( nextIndicator ) {
2019-10-04 16:46:05 +03:00
$ ( nextIndicator ) . addClass ( ClassName$2 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
}
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_slide ( direction , element ) {
const activeElement = this . _element . querySelector ( Selector$2 . ACTIVE _ITEM ) ;
const activeElementIndex = this . _getItemIndex ( activeElement ) ;
const nextElement = element || activeElement &&
this . _getItemByDirection ( direction , activeElement ) ;
const nextElementIndex = this . _getItemIndex ( nextElement ) ;
const isCycling = Boolean ( this . _interval ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
let directionalClassName ;
let orderClassName ;
let eventDirectionName ;
2018-01-23 17:40:57 +03:00
if ( direction === Direction . NEXT ) {
2019-10-04 16:46:05 +03:00
directionalClassName = ClassName$2 . LEFT ;
orderClassName = ClassName$2 . NEXT ;
2018-01-23 17:40:57 +03:00
eventDirectionName = Direction . LEFT ;
} else {
2019-10-04 16:46:05 +03:00
directionalClassName = ClassName$2 . RIGHT ;
orderClassName = ClassName$2 . PREV ;
2018-01-23 17:40:57 +03:00
eventDirectionName = Direction . RIGHT ;
}
2019-10-04 16:46:05 +03:00
if ( nextElement && $ ( nextElement ) . hasClass ( ClassName$2 . ACTIVE ) ) {
2018-01-23 17:40:57 +03:00
this . _isSliding = false ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const slideEvent = this . _triggerSlideEvent ( nextElement , eventDirectionName ) ;
2018-01-23 17:40:57 +03:00
if ( slideEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
if ( ! activeElement || ! nextElement ) {
// Some weirdness is happening, so we bail
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
this . _isSliding = true ;
if ( isCycling ) {
this . pause ( ) ;
}
this . _setActiveIndicatorElement ( nextElement ) ;
2019-10-04 16:46:05 +03:00
const slidEvent = $ . Event ( Event$2 . SLID , {
2018-01-23 17:40:57 +03:00
relatedTarget : nextElement ,
direction : eventDirectionName ,
from : activeElementIndex ,
to : nextElementIndex
} ) ;
2019-10-04 16:46:05 +03:00
if ( $ ( this . _element ) . hasClass ( ClassName$2 . SLIDE ) ) {
$ ( nextElement ) . addClass ( orderClassName ) ;
2018-01-23 17:40:57 +03:00
Util . reflow ( nextElement ) ;
2019-10-04 16:46:05 +03:00
$ ( activeElement ) . addClass ( directionalClassName ) ;
$ ( nextElement ) . addClass ( directionalClassName ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const nextElementInterval = parseInt ( nextElement . getAttribute ( 'data-interval' ) , 10 ) ;
if ( nextElementInterval ) {
this . _config . defaultInterval = this . _config . defaultInterval || this . _config . interval ;
this . _config . interval = nextElementInterval ;
} else {
this . _config . interval = this . _config . defaultInterval || this . _config . interval ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const transitionDuration = Util . getTransitionDurationFromElement ( activeElement ) ;
$ ( activeElement )
. one ( Util . TRANSITION _END , ( ) => {
$ ( nextElement )
. removeClass ( ` ${ directionalClassName } ${ orderClassName } ` )
. addClass ( ClassName$2 . ACTIVE ) ;
$ ( activeElement ) . removeClass ( ` ${ ClassName$2 . ACTIVE } ${ orderClassName } ${ directionalClassName } ` ) ;
this . _isSliding = false ;
setTimeout ( ( ) => $ ( this . _element ) . trigger ( slidEvent ) , 0 ) ;
} )
. emulateTransitionEnd ( transitionDuration ) ;
} else {
$ ( activeElement ) . removeClass ( ClassName$2 . ACTIVE ) ;
$ ( nextElement ) . addClass ( ClassName$2 . ACTIVE ) ;
this . _isSliding = false ;
$ ( this . _element ) . trigger ( slidEvent ) ;
}
if ( isCycling ) {
this . cycle ( ) ;
}
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
static _jQueryInterface ( config ) {
return this . each ( function ( ) {
let data = $ ( this ) . data ( DATA _KEY$2 ) ;
let _config = {
... Default ,
... $ ( this ) . data ( )
} ;
2018-01-23 17:40:57 +03:00
if ( typeof config === 'object' ) {
2019-10-04 16:46:05 +03:00
_config = {
... _config ,
... config
} ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const action = typeof config === 'string' ? config : _config . slide ;
2018-01-23 17:40:57 +03:00
if ( ! data ) {
data = new Carousel ( this , _config ) ;
2019-10-04 16:46:05 +03:00
$ ( this ) . data ( DATA _KEY$2 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'number' ) {
data . to ( config ) ;
} else if ( typeof action === 'string' ) {
if ( typeof data [ action ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ action } " ` )
2018-01-23 17:40:57 +03:00
}
data [ action ] ( ) ;
2019-10-04 16:46:05 +03:00
} else if ( _config . interval && _config . ride ) {
2018-01-23 17:40:57 +03:00
data . pause ( ) ;
data . cycle ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _dataApiClickHandler ( event ) {
const selector = Util . getSelectorFromElement ( this ) ;
2018-01-23 17:40:57 +03:00
if ( ! selector ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const target = $ ( selector ) [ 0 ] ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( ! target || ! $ ( target ) . hasClass ( ClassName$2 . CAROUSEL ) ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const config = {
... $ ( target ) . data ( ) ,
... $ ( this ) . data ( )
} ;
const slideIndex = this . getAttribute ( 'data-slide-to' ) ;
2018-01-23 17:40:57 +03:00
if ( slideIndex ) {
config . interval = false ;
}
2019-10-04 16:46:05 +03:00
Carousel . _jQueryInterface . call ( $ ( target ) , config ) ;
2018-01-23 17:40:57 +03:00
if ( slideIndex ) {
2019-10-04 16:46:05 +03:00
$ ( target ) . data ( DATA _KEY$2 ) . to ( slideIndex ) ;
2018-01-23 17:40:57 +03:00
}
event . preventDefault ( ) ;
2019-10-04 16:46:05 +03:00
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( document )
. on ( Event$2 . CLICK _DATA _API , Selector$2 . DATA _SLIDE , Carousel . _dataApiClickHandler ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( window ) . on ( Event$2 . LOAD _DATA _API , ( ) => {
const carousels = [ ] . slice . call ( document . querySelectorAll ( Selector$2 . DATA _RIDE ) ) ;
for ( let i = 0 , len = carousels . length ; i < len ; i ++ ) {
const $carousel = $ ( carousels [ i ] ) ;
2018-01-23 17:40:57 +03:00
Carousel . _jQueryInterface . call ( $carousel , $carousel . data ( ) ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$2 ] = Carousel . _jQueryInterface ;
$ . fn [ NAME$2 ] . Constructor = Carousel ;
$ . fn [ NAME$2 ] . noConflict = ( ) => {
$ . fn [ NAME$2 ] = JQUERY _NO _CONFLICT$2 ;
return Carousel . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : collapse . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$3 = 'collapse' ;
const VERSION$3 = '4.3.1' ;
const DATA _KEY$3 = 'bs.collapse' ;
const EVENT _KEY$3 = ` . ${ DATA _KEY$3 } ` ;
const DATA _API _KEY$3 = '.data-api' ;
const JQUERY _NO _CONFLICT$3 = $ . fn [ NAME$3 ] ;
const Default$1 = {
toggle : true ,
parent : ''
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const DefaultType$1 = {
toggle : 'boolean' ,
parent : '(string|element)'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event$3 = {
SHOW : ` show ${ EVENT _KEY$3 } ` ,
SHOWN : ` shown ${ EVENT _KEY$3 } ` ,
HIDE : ` hide ${ EVENT _KEY$3 } ` ,
HIDDEN : ` hidden ${ EVENT _KEY$3 } ` ,
CLICK _DATA _API : ` click ${ EVENT _KEY$3 } ${ DATA _API _KEY$3 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$3 = {
SHOW : 'show' ,
COLLAPSE : 'collapse' ,
COLLAPSING : 'collapsing' ,
COLLAPSED : 'collapsed'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Dimension = {
WIDTH : 'width' ,
HEIGHT : 'height'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$3 = {
ACTIVES : '.show, .collapsing' ,
DATA _TOGGLE : '[data-toggle="collapse"]'
} ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
class Collapse {
constructor ( element , config ) {
this . _isTransitioning = false ;
this . _element = element ;
this . _config = this . _getConfig ( config ) ;
this . _triggerArray = [ ] . slice . call ( document . querySelectorAll (
` [data-toggle="collapse"][href="# ${ element . id } "], ` +
` [data-toggle="collapse"][data-target="# ${ element . id } "] `
) ) ;
const toggleList = [ ] . slice . call ( document . querySelectorAll ( Selector$3 . DATA _TOGGLE ) ) ;
for ( let i = 0 , len = toggleList . length ; i < len ; i ++ ) {
const elem = toggleList [ i ] ;
const selector = Util . getSelectorFromElement ( elem ) ;
const filterElement = [ ] . slice . call ( document . querySelectorAll ( selector ) )
. filter ( ( foundElem ) => foundElem === element ) ;
if ( selector !== null && filterElement . length > 0 ) {
2018-01-23 17:40:57 +03:00
this . _selector = selector ;
this . _triggerArray . push ( elem ) ;
}
}
this . _parent = this . _config . parent ? this . _getParent ( ) : null ;
if ( ! this . _config . parent ) {
this . _addAriaAndCollapsedClass ( this . _element , this . _triggerArray ) ;
}
if ( this . _config . toggle ) {
this . toggle ( ) ;
}
2019-10-04 16:46:05 +03:00
}
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$3
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get Default ( ) {
return Default$1
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
toggle ( ) {
if ( $ ( this . _element ) . hasClass ( ClassName$3 . SHOW ) ) {
2018-01-23 17:40:57 +03:00
this . hide ( ) ;
} else {
this . show ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
show ( ) {
if ( this . _isTransitioning ||
$ ( this . _element ) . hasClass ( ClassName$3 . SHOW ) ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
let actives ;
let activesData ;
2018-01-23 17:40:57 +03:00
if ( this . _parent ) {
2019-10-04 16:46:05 +03:00
actives = [ ] . slice . call ( this . _parent . querySelectorAll ( Selector$3 . ACTIVES ) )
. filter ( ( elem ) => {
if ( typeof this . _config . parent === 'string' ) {
return elem . getAttribute ( 'data-parent' ) === this . _config . parent
}
return elem . classList . contains ( ClassName$3 . COLLAPSE )
} ) ;
2018-01-23 17:40:57 +03:00
if ( actives . length === 0 ) {
actives = null ;
}
}
if ( actives ) {
2019-10-04 16:46:05 +03:00
activesData = $ ( actives ) . not ( this . _selector ) . data ( DATA _KEY$3 ) ;
2018-01-23 17:40:57 +03:00
if ( activesData && activesData . _isTransitioning ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
}
2019-10-04 16:46:05 +03:00
const startEvent = $ . Event ( Event$3 . SHOW ) ;
$ ( this . _element ) . trigger ( startEvent ) ;
2018-01-23 17:40:57 +03:00
if ( startEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
if ( actives ) {
2019-10-04 16:46:05 +03:00
Collapse . _jQueryInterface . call ( $ ( actives ) . not ( this . _selector ) , 'hide' ) ;
2018-01-23 17:40:57 +03:00
if ( ! activesData ) {
2019-10-04 16:46:05 +03:00
$ ( actives ) . data ( DATA _KEY$3 , null ) ;
2018-01-23 17:40:57 +03:00
}
}
2019-10-04 16:46:05 +03:00
const dimension = this . _getDimension ( ) ;
$ ( this . _element )
. removeClass ( ClassName$3 . COLLAPSE )
. addClass ( ClassName$3 . COLLAPSING ) ;
2018-01-23 17:40:57 +03:00
this . _element . style [ dimension ] = 0 ;
2019-10-04 16:46:05 +03:00
if ( this . _triggerArray . length ) {
$ ( this . _triggerArray )
. removeClass ( ClassName$3 . COLLAPSED )
. attr ( 'aria-expanded' , true ) ;
2018-01-23 17:40:57 +03:00
}
this . setTransitioning ( true ) ;
2019-10-04 16:46:05 +03:00
const complete = ( ) => {
$ ( this . _element )
. removeClass ( ClassName$3 . COLLAPSING )
. addClass ( ClassName$3 . COLLAPSE )
. addClass ( ClassName$3 . SHOW ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
this . _element . style [ dimension ] = '' ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
this . setTransitioning ( false ) ;
$ ( this . _element ) . trigger ( Event$3 . SHOWN ) ;
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const capitalizedDimension = dimension [ 0 ] . toUpperCase ( ) + dimension . slice ( 1 ) ;
const scrollSize = ` scroll ${ capitalizedDimension } ` ;
const transitionDuration = Util . getTransitionDurationFromElement ( this . _element ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . _element )
. one ( Util . TRANSITION _END , complete )
. emulateTransitionEnd ( transitionDuration ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
this . _element . style [ dimension ] = ` ${ this . _element [ scrollSize ] } px ` ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
hide ( ) {
if ( this . _isTransitioning ||
! $ ( this . _element ) . hasClass ( ClassName$3 . SHOW ) ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const startEvent = $ . Event ( Event$3 . HIDE ) ;
$ ( this . _element ) . trigger ( startEvent ) ;
2018-01-23 17:40:57 +03:00
if ( startEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const dimension = this . _getDimension ( ) ;
this . _element . style [ dimension ] = ` ${ this . _element . getBoundingClientRect ( ) [ dimension ] } px ` ;
2018-01-23 17:40:57 +03:00
Util . reflow ( this . _element ) ;
2019-10-04 16:46:05 +03:00
$ ( this . _element )
. addClass ( ClassName$3 . COLLAPSING )
. removeClass ( ClassName$3 . COLLAPSE )
. removeClass ( ClassName$3 . SHOW ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const triggerArrayLength = this . _triggerArray . length ;
if ( triggerArrayLength > 0 ) {
for ( let i = 0 ; i < triggerArrayLength ; i ++ ) {
const trigger = this . _triggerArray [ i ] ;
const selector = Util . getSelectorFromElement ( trigger ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( selector !== null ) {
const $elem = $ ( [ ] . slice . call ( document . querySelectorAll ( selector ) ) ) ;
if ( ! $elem . hasClass ( ClassName$3 . SHOW ) ) {
$ ( trigger ) . addClass ( ClassName$3 . COLLAPSED )
. attr ( 'aria-expanded' , false ) ;
2018-01-23 17:40:57 +03:00
}
}
}
}
this . setTransitioning ( true ) ;
2019-10-04 16:46:05 +03:00
const complete = ( ) => {
this . setTransitioning ( false ) ;
$ ( this . _element )
. removeClass ( ClassName$3 . COLLAPSING )
. addClass ( ClassName$3 . COLLAPSE )
. trigger ( Event$3 . HIDDEN ) ;
2018-01-23 17:40:57 +03:00
} ;
this . _element . style [ dimension ] = '' ;
2019-10-04 16:46:05 +03:00
const transitionDuration = Util . getTransitionDurationFromElement ( this . _element ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . _element )
. one ( Util . TRANSITION _END , complete )
. emulateTransitionEnd ( transitionDuration ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
setTransitioning ( isTransitioning ) {
2018-01-23 17:40:57 +03:00
this . _isTransitioning = isTransitioning ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
$ . removeData ( this . _element , DATA _KEY$3 ) ;
this . _config = null ;
this . _parent = null ;
this . _element = null ;
this . _triggerArray = null ;
2018-01-23 17:40:57 +03:00
this . _isTransitioning = null ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getConfig ( config ) {
config = {
... Default$1 ,
... config
} ;
2018-01-23 17:40:57 +03:00
config . toggle = Boolean ( config . toggle ) ; // Coerce string values
2019-10-04 16:46:05 +03:00
Util . typeCheckConfig ( NAME$3 , config , DefaultType$1 ) ;
return config
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getDimension ( ) {
const hasWidth = $ ( this . _element ) . hasClass ( Dimension . WIDTH ) ;
return hasWidth ? Dimension . WIDTH : Dimension . HEIGHT
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getParent ( ) {
let parent ;
2018-01-23 17:40:57 +03:00
if ( Util . isElement ( this . _config . parent ) ) {
2019-10-04 16:46:05 +03:00
parent = this . _config . parent ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// It's a jQuery object
2018-01-23 17:40:57 +03:00
if ( typeof this . _config . parent . jquery !== 'undefined' ) {
parent = this . _config . parent [ 0 ] ;
}
} else {
2019-10-04 16:46:05 +03:00
parent = document . querySelector ( this . _config . parent ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const selector =
` [data-toggle="collapse"][data-parent=" ${ this . _config . parent } "] ` ;
const children = [ ] . slice . call ( parent . querySelectorAll ( selector ) ) ;
$ ( children ) . each ( ( i , element ) => {
this . _addAriaAndCollapsedClass (
Collapse . _getTargetFromElement ( element ) ,
[ element ]
) ;
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
return parent
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_addAriaAndCollapsedClass ( element , triggerArray ) {
const isOpen = $ ( element ) . hasClass ( ClassName$3 . SHOW ) ;
if ( triggerArray . length ) {
$ ( triggerArray )
. toggleClass ( ClassName$3 . COLLAPSED , ! isOpen )
. attr ( 'aria-expanded' , isOpen ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _getTargetFromElement ( element ) {
const selector = Util . getSelectorFromElement ( element ) ;
return selector ? document . querySelector ( selector ) : null
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
const $this = $ ( this ) ;
let data = $this . data ( DATA _KEY$3 ) ;
const _config = {
... Default$1 ,
... $this . data ( ) ,
... typeof config === 'object' && config ? config : { }
} ;
2018-01-23 17:40:57 +03:00
if ( ! data && _config . toggle && /show|hide/ . test ( config ) ) {
_config . toggle = false ;
}
if ( ! data ) {
data = new Collapse ( this , _config ) ;
2019-10-04 16:46:05 +03:00
$this . data ( DATA _KEY$3 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ config } " ` )
2018-01-23 17:40:57 +03:00
}
data [ config ] ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( document ) . on ( Event$3 . CLICK _DATA _API , Selector$3 . DATA _TOGGLE , function ( event ) {
2018-01-23 17:40:57 +03:00
// preventDefault only for <a> elements (which change the URL) not inside the collapsible element
if ( event . currentTarget . tagName === 'A' ) {
event . preventDefault ( ) ;
}
2019-10-04 16:46:05 +03:00
const $trigger = $ ( this ) ;
const selector = Util . getSelectorFromElement ( this ) ;
const selectors = [ ] . slice . call ( document . querySelectorAll ( selector ) ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( selectors ) . each ( function ( ) {
const $target = $ ( this ) ;
const data = $target . data ( DATA _KEY$3 ) ;
const config = data ? 'toggle' : $trigger . data ( ) ;
2018-01-23 17:40:57 +03:00
Collapse . _jQueryInterface . call ( $target , config ) ;
} ) ;
} ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$3 ] = Collapse . _jQueryInterface ;
$ . fn [ NAME$3 ] . Constructor = Collapse ;
$ . fn [ NAME$3 ] . noConflict = ( ) => {
$ . fn [ NAME$3 ] = JQUERY _NO _CONFLICT$3 ;
return Collapse . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : modal . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$4 = 'modal' ;
const VERSION$4 = '4.3.1' ;
const DATA _KEY$4 = 'bs.modal' ;
const EVENT _KEY$4 = ` . ${ DATA _KEY$4 } ` ;
const DATA _API _KEY$4 = '.data-api' ;
const JQUERY _NO _CONFLICT$4 = $ . fn [ NAME$4 ] ;
const ESCAPE _KEYCODE = 27 ; // KeyboardEvent.which value for Escape (Esc) key
const Default$2 = {
backdrop : true ,
keyboard : true ,
focus : true ,
show : true
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const DefaultType$2 = {
backdrop : '(boolean|string)' ,
keyboard : 'boolean' ,
focus : 'boolean' ,
show : 'boolean'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event$4 = {
HIDE : ` hide ${ EVENT _KEY$4 } ` ,
HIDDEN : ` hidden ${ EVENT _KEY$4 } ` ,
SHOW : ` show ${ EVENT _KEY$4 } ` ,
SHOWN : ` shown ${ EVENT _KEY$4 } ` ,
FOCUSIN : ` focusin ${ EVENT _KEY$4 } ` ,
RESIZE : ` resize ${ EVENT _KEY$4 } ` ,
CLICK _DISMISS : ` click.dismiss ${ EVENT _KEY$4 } ` ,
KEYDOWN _DISMISS : ` keydown.dismiss ${ EVENT _KEY$4 } ` ,
MOUSEUP _DISMISS : ` mouseup.dismiss ${ EVENT _KEY$4 } ` ,
MOUSEDOWN _DISMISS : ` mousedown.dismiss ${ EVENT _KEY$4 } ` ,
CLICK _DATA _API : ` click ${ EVENT _KEY$4 } ${ DATA _API _KEY$4 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$4 = {
SCROLLABLE : 'modal-dialog-scrollable' ,
SCROLLBAR _MEASURER : 'modal-scrollbar-measure' ,
BACKDROP : 'modal-backdrop' ,
OPEN : 'modal-open' ,
FADE : 'fade' ,
SHOW : 'show'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$4 = {
DIALOG : '.modal-dialog' ,
MODAL _BODY : '.modal-body' ,
DATA _TOGGLE : '[data-toggle="modal"]' ,
DATA _DISMISS : '[data-dismiss="modal"]' ,
FIXED _CONTENT : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' ,
STICKY _CONTENT : '.sticky-top'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class Modal {
constructor ( element , config ) {
this . _config = this . _getConfig ( config ) ;
this . _element = element ;
this . _dialog = element . querySelector ( Selector$4 . DIALOG ) ;
this . _backdrop = null ;
this . _isShown = false ;
this . _isBodyOverflowing = false ;
2018-01-23 17:40:57 +03:00
this . _ignoreBackdropClick = false ;
2019-10-04 16:46:05 +03:00
this . _isTransitioning = false ;
this . _scrollbarWidth = 0 ;
}
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$4
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get Default ( ) {
return Default$2
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
toggle ( relatedTarget ) {
return this . _isShown ? this . hide ( ) : this . show ( relatedTarget )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
show ( relatedTarget ) {
if ( this . _isShown || this . _isTransitioning ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
if ( $ ( this . _element ) . hasClass ( ClassName$4 . FADE ) ) {
2018-01-23 17:40:57 +03:00
this . _isTransitioning = true ;
}
2019-10-04 16:46:05 +03:00
const showEvent = $ . Event ( Event$4 . SHOW , {
relatedTarget
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . trigger ( showEvent ) ;
2018-01-23 17:40:57 +03:00
if ( this . _isShown || showEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
this . _isShown = true ;
this . _checkScrollbar ( ) ;
this . _setScrollbar ( ) ;
this . _adjustDialog ( ) ;
this . _setEscapeEvent ( ) ;
this . _setResizeEvent ( ) ;
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . on (
Event$4 . CLICK _DISMISS ,
Selector$4 . DATA _DISMISS ,
( event ) => this . hide ( event )
) ;
$ ( this . _dialog ) . on ( Event$4 . MOUSEDOWN _DISMISS , ( ) => {
$ ( this . _element ) . one ( Event$4 . MOUSEUP _DISMISS , ( event ) => {
if ( $ ( event . target ) . is ( this . _element ) ) {
this . _ignoreBackdropClick = true ;
2018-01-23 17:40:57 +03:00
}
} ) ;
} ) ;
2019-10-04 16:46:05 +03:00
this . _showBackdrop ( ( ) => this . _showElement ( relatedTarget ) ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
hide ( event ) {
2018-01-23 17:40:57 +03:00
if ( event ) {
event . preventDefault ( ) ;
}
2019-10-04 16:46:05 +03:00
if ( ! this . _isShown || this . _isTransitioning ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const hideEvent = $ . Event ( Event$4 . HIDE ) ;
$ ( this . _element ) . trigger ( hideEvent ) ;
2018-01-23 17:40:57 +03:00
if ( ! this . _isShown || hideEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
this . _isShown = false ;
2019-10-04 16:46:05 +03:00
const transition = $ ( this . _element ) . hasClass ( ClassName$4 . FADE ) ;
2018-01-23 17:40:57 +03:00
if ( transition ) {
this . _isTransitioning = true ;
}
this . _setEscapeEvent ( ) ;
this . _setResizeEvent ( ) ;
2019-10-04 16:46:05 +03:00
$ ( document ) . off ( Event$4 . FOCUSIN ) ;
$ ( this . _element ) . removeClass ( ClassName$4 . SHOW ) ;
$ ( this . _element ) . off ( Event$4 . CLICK _DISMISS ) ;
$ ( this . _dialog ) . off ( Event$4 . MOUSEDOWN _DISMISS ) ;
2018-01-23 17:40:57 +03:00
if ( transition ) {
2019-10-04 16:46:05 +03:00
const transitionDuration = Util . getTransitionDurationFromElement ( this . _element ) ;
$ ( this . _element )
. one ( Util . TRANSITION _END , ( event ) => this . _hideModal ( event ) )
. emulateTransitionEnd ( transitionDuration ) ;
2018-01-23 17:40:57 +03:00
} else {
this . _hideModal ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
[ window , this . _element , this . _dialog ]
. forEach ( ( htmlElement ) => $ ( htmlElement ) . off ( EVENT _KEY$4 ) ) ;
/ * *
* ` document ` has 2 events ` Event.FOCUSIN ` and ` Event.CLICK_DATA_API `
* Do not move ` document ` in ` htmlElements ` array
* It will remove ` Event.CLICK_DATA_API ` event that should remain
* /
$ ( document ) . off ( Event$4 . FOCUSIN ) ;
$ . removeData ( this . _element , DATA _KEY$4 ) ;
this . _config = null ;
this . _element = null ;
this . _dialog = null ;
this . _backdrop = null ;
this . _isShown = null ;
this . _isBodyOverflowing = null ;
2018-01-23 17:40:57 +03:00
this . _ignoreBackdropClick = null ;
2019-10-04 16:46:05 +03:00
this . _isTransitioning = null ;
this . _scrollbarWidth = null ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
handleUpdate ( ) {
2018-01-23 17:40:57 +03:00
this . _adjustDialog ( ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getConfig ( config ) {
config = {
... Default$2 ,
... config
} ;
Util . typeCheckConfig ( NAME$4 , config , DefaultType$2 ) ;
return config
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_showElement ( relatedTarget ) {
const transition = $ ( this . _element ) . hasClass ( ClassName$4 . FADE ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( ! this . _element . parentNode ||
this . _element . parentNode . nodeType !== Node . ELEMENT _NODE ) {
2018-01-23 17:40:57 +03:00
// Don't move modal's DOM position
document . body . appendChild ( this . _element ) ;
}
this . _element . style . display = 'block' ;
this . _element . removeAttribute ( 'aria-hidden' ) ;
2019-10-04 16:46:05 +03:00
this . _element . setAttribute ( 'aria-modal' , true ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( $ ( this . _dialog ) . hasClass ( ClassName$4 . SCROLLABLE ) ) {
this . _dialog . querySelector ( Selector$4 . MODAL _BODY ) . scrollTop = 0 ;
} else {
this . _element . scrollTop = 0 ;
}
2018-01-23 17:40:57 +03:00
if ( transition ) {
Util . reflow ( this . _element ) ;
}
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . addClass ( ClassName$4 . SHOW ) ;
2018-01-23 17:40:57 +03:00
if ( this . _config . focus ) {
this . _enforceFocus ( ) ;
}
2019-10-04 16:46:05 +03:00
const shownEvent = $ . Event ( Event$4 . SHOWN , {
relatedTarget
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
const transitionComplete = ( ) => {
if ( this . _config . focus ) {
this . _element . focus ( ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
this . _isTransitioning = false ;
$ ( this . _element ) . trigger ( shownEvent ) ;
2018-01-23 17:40:57 +03:00
} ;
if ( transition ) {
2019-10-04 16:46:05 +03:00
const transitionDuration = Util . getTransitionDurationFromElement ( this . _dialog ) ;
$ ( this . _dialog )
. one ( Util . TRANSITION _END , transitionComplete )
. emulateTransitionEnd ( transitionDuration ) ;
2018-01-23 17:40:57 +03:00
} else {
transitionComplete ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_enforceFocus ( ) {
$ ( document )
. off ( Event$4 . FOCUSIN ) // Guard against infinite focus loop
. on ( Event$4 . FOCUSIN , ( event ) => {
if ( document !== event . target &&
this . _element !== event . target &&
$ ( this . _element ) . has ( event . target ) . length === 0 ) {
this . _element . focus ( ) ;
}
} ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_setEscapeEvent ( ) {
2018-01-23 17:40:57 +03:00
if ( this . _isShown && this . _config . keyboard ) {
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . on ( Event$4 . KEYDOWN _DISMISS , ( event ) => {
2018-01-23 17:40:57 +03:00
if ( event . which === ESCAPE _KEYCODE ) {
event . preventDefault ( ) ;
2019-10-04 16:46:05 +03:00
this . hide ( ) ;
2018-01-23 17:40:57 +03:00
}
} ) ;
} else if ( ! this . _isShown ) {
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . off ( Event$4 . KEYDOWN _DISMISS ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_setResizeEvent ( ) {
2018-01-23 17:40:57 +03:00
if ( this . _isShown ) {
2019-10-04 16:46:05 +03:00
$ ( window ) . on ( Event$4 . RESIZE , ( event ) => this . handleUpdate ( event ) ) ;
2018-01-23 17:40:57 +03:00
} else {
2019-10-04 16:46:05 +03:00
$ ( window ) . off ( Event$4 . RESIZE ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_hideModal ( ) {
2018-01-23 17:40:57 +03:00
this . _element . style . display = 'none' ;
this . _element . setAttribute ( 'aria-hidden' , true ) ;
2019-10-04 16:46:05 +03:00
this . _element . removeAttribute ( 'aria-modal' ) ;
2018-01-23 17:40:57 +03:00
this . _isTransitioning = false ;
2019-10-04 16:46:05 +03:00
this . _showBackdrop ( ( ) => {
$ ( document . body ) . removeClass ( ClassName$4 . OPEN ) ;
this . _resetAdjustments ( ) ;
this . _resetScrollbar ( ) ;
$ ( this . _element ) . trigger ( Event$4 . HIDDEN ) ;
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_removeBackdrop ( ) {
2018-01-23 17:40:57 +03:00
if ( this . _backdrop ) {
2019-10-04 16:46:05 +03:00
$ ( this . _backdrop ) . remove ( ) ;
2018-01-23 17:40:57 +03:00
this . _backdrop = null ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_showBackdrop ( callback ) {
const animate = $ ( this . _element ) . hasClass ( ClassName$4 . FADE )
? ClassName$4 . FADE : '' ;
2018-01-23 17:40:57 +03:00
if ( this . _isShown && this . _config . backdrop ) {
this . _backdrop = document . createElement ( 'div' ) ;
2019-10-04 16:46:05 +03:00
this . _backdrop . className = ClassName$4 . BACKDROP ;
2018-01-23 17:40:57 +03:00
if ( animate ) {
2019-10-04 16:46:05 +03:00
this . _backdrop . classList . add ( animate ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$ ( this . _backdrop ) . appendTo ( document . body ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . on ( Event$4 . CLICK _DISMISS , ( event ) => {
if ( this . _ignoreBackdropClick ) {
this . _ignoreBackdropClick = false ;
return
}
2018-01-23 17:40:57 +03:00
if ( event . target !== event . currentTarget ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
if ( this . _config . backdrop === 'static' ) {
this . _element . focus ( ) ;
2018-01-23 17:40:57 +03:00
} else {
2019-10-04 16:46:05 +03:00
this . hide ( ) ;
2018-01-23 17:40:57 +03:00
}
} ) ;
2019-10-04 16:46:05 +03:00
if ( animate ) {
2018-01-23 17:40:57 +03:00
Util . reflow ( this . _backdrop ) ;
}
2019-10-04 16:46:05 +03:00
$ ( this . _backdrop ) . addClass ( ClassName$4 . SHOW ) ;
2018-01-23 17:40:57 +03:00
if ( ! callback ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
if ( ! animate ) {
2018-01-23 17:40:57 +03:00
callback ( ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const backdropTransitionDuration = Util . getTransitionDurationFromElement ( this . _backdrop ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . _backdrop )
. one ( Util . TRANSITION _END , callback )
. emulateTransitionEnd ( backdropTransitionDuration ) ;
} else if ( ! this . _isShown && this . _backdrop ) {
$ ( this . _backdrop ) . removeClass ( ClassName$4 . SHOW ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const callbackRemove = ( ) => {
this . _removeBackdrop ( ) ;
2018-01-23 17:40:57 +03:00
if ( callback ) {
callback ( ) ;
}
} ;
2019-10-04 16:46:05 +03:00
if ( $ ( this . _element ) . hasClass ( ClassName$4 . FADE ) ) {
const backdropTransitionDuration = Util . getTransitionDurationFromElement ( this . _backdrop ) ;
$ ( this . _backdrop )
. one ( Util . TRANSITION _END , callbackRemove )
. emulateTransitionEnd ( backdropTransitionDuration ) ;
2018-01-23 17:40:57 +03:00
} else {
callbackRemove ( ) ;
}
} else if ( callback ) {
callback ( ) ;
}
2019-10-04 16:46:05 +03:00
}
// ----------------------------------------------------------------------
2018-01-23 17:40:57 +03:00
// the following methods are used to handle overflowing modals
// todo (fat): these should probably be refactored out of modal.js
// ----------------------------------------------------------------------
2019-10-04 16:46:05 +03:00
_adjustDialog ( ) {
const isModalOverflowing =
this . _element . scrollHeight > document . documentElement . clientHeight ;
2018-01-23 17:40:57 +03:00
if ( ! this . _isBodyOverflowing && isModalOverflowing ) {
2019-10-04 16:46:05 +03:00
this . _element . style . paddingLeft = ` ${ this . _scrollbarWidth } px ` ;
2018-01-23 17:40:57 +03:00
}
if ( this . _isBodyOverflowing && ! isModalOverflowing ) {
2019-10-04 16:46:05 +03:00
this . _element . style . paddingRight = ` ${ this . _scrollbarWidth } px ` ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_resetAdjustments ( ) {
2018-01-23 17:40:57 +03:00
this . _element . style . paddingLeft = '' ;
this . _element . style . paddingRight = '' ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_checkScrollbar ( ) {
const rect = document . body . getBoundingClientRect ( ) ;
2018-01-23 17:40:57 +03:00
this . _isBodyOverflowing = rect . left + rect . right < window . innerWidth ;
this . _scrollbarWidth = this . _getScrollbarWidth ( ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_setScrollbar ( ) {
2018-01-23 17:40:57 +03: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-10-04 16:46:05 +03:00
const fixedContent = [ ] . slice . call ( document . querySelectorAll ( Selector$4 . FIXED _CONTENT ) ) ;
const stickyContent = [ ] . slice . call ( document . querySelectorAll ( Selector$4 . STICKY _CONTENT ) ) ;
2018-01-23 17:40:57 +03:00
// Adjust fixed content padding
2019-10-04 16:46:05 +03:00
$ ( fixedContent ) . each ( ( index , element ) => {
const actualPadding = element . style . paddingRight ;
const calculatedPadding = $ ( element ) . css ( 'padding-right' ) ;
$ ( element )
. data ( 'padding-right' , actualPadding )
. css ( 'padding-right' , ` ${ parseFloat ( calculatedPadding ) + this . _scrollbarWidth } px ` ) ;
} ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Adjust sticky content margin
$ ( stickyContent ) . each ( ( index , element ) => {
const actualMargin = element . style . marginRight ;
const calculatedMargin = $ ( element ) . css ( 'margin-right' ) ;
$ ( element )
. data ( 'margin-right' , actualMargin )
. css ( 'margin-right' , ` ${ parseFloat ( calculatedMargin ) - this . _scrollbarWidth } px ` ) ;
} ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Adjust body padding
const actualPadding = document . body . style . paddingRight ;
const calculatedPadding = $ ( document . body ) . css ( 'padding-right' ) ;
$ ( document . body )
. data ( 'padding-right' , actualPadding )
. css ( 'padding-right' , ` ${ parseFloat ( calculatedPadding ) + this . _scrollbarWidth } px ` ) ;
}
$ ( document . body ) . addClass ( ClassName$4 . OPEN ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_resetScrollbar ( ) {
// Restore fixed content padding
const fixedContent = [ ] . slice . call ( document . querySelectorAll ( Selector$4 . FIXED _CONTENT ) ) ;
$ ( fixedContent ) . each ( ( index , element ) => {
const padding = $ ( element ) . data ( 'padding-right' ) ;
$ ( element ) . removeData ( 'padding-right' ) ;
element . style . paddingRight = padding ? padding : '' ;
} ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Restore sticky content
const elements = [ ] . slice . call ( document . querySelectorAll ( ` ${ Selector$4 . STICKY _CONTENT } ` ) ) ;
$ ( elements ) . each ( ( index , element ) => {
const margin = $ ( element ) . data ( 'margin-right' ) ;
2018-01-23 17:40:57 +03:00
if ( typeof margin !== 'undefined' ) {
2019-10-04 16:46:05 +03:00
$ ( element ) . css ( 'margin-right' , margin ) . removeData ( 'margin-right' ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
} ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Restore body padding
const padding = $ ( document . body ) . data ( 'padding-right' ) ;
$ ( document . body ) . removeData ( 'padding-right' ) ;
document . body . style . paddingRight = padding ? padding : '' ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getScrollbarWidth ( ) { // thx d.walsh
const scrollDiv = document . createElement ( 'div' ) ;
scrollDiv . className = ClassName$4 . SCROLLBAR _MEASURER ;
2018-01-23 17:40:57 +03:00
document . body . appendChild ( scrollDiv ) ;
2019-10-04 16:46:05 +03:00
const scrollbarWidth = scrollDiv . getBoundingClientRect ( ) . width - scrollDiv . clientWidth ;
2018-01-23 17:40:57 +03:00
document . body . removeChild ( scrollDiv ) ;
2019-10-04 16:46:05 +03:00
return scrollbarWidth
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config , relatedTarget ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
let data = $ ( this ) . data ( DATA _KEY$4 ) ;
const _config = {
... Default$2 ,
... $ ( this ) . data ( ) ,
... typeof config === 'object' && config ? config : { }
} ;
2018-01-23 17:40:57 +03:00
if ( ! data ) {
data = new Modal ( this , _config ) ;
2019-10-04 16:46:05 +03:00
$ ( this ) . data ( DATA _KEY$4 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ config } " ` )
2018-01-23 17:40:57 +03:00
}
data [ config ] ( relatedTarget ) ;
} else if ( _config . show ) {
data . show ( relatedTarget ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( document ) . on ( Event$4 . CLICK _DATA _API , Selector$4 . DATA _TOGGLE , function ( event ) {
let target ;
const selector = Util . getSelectorFromElement ( this ) ;
2018-01-23 17:40:57 +03:00
if ( selector ) {
2019-10-04 16:46:05 +03:00
target = document . querySelector ( selector ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const config = $ ( target ) . data ( DATA _KEY$4 )
? 'toggle' : {
... $ ( target ) . data ( ) ,
... $ ( this ) . data ( )
} ;
2018-01-23 17:40:57 +03:00
if ( this . tagName === 'A' || this . tagName === 'AREA' ) {
event . preventDefault ( ) ;
}
2019-10-04 16:46:05 +03:00
const $target = $ ( target ) . one ( Event$4 . SHOW , ( showEvent ) => {
2018-01-23 17:40:57 +03:00
if ( showEvent . isDefaultPrevented ( ) ) {
// Only register focus restorer if modal will actually get shown
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$target . one ( Event$4 . HIDDEN , ( ) => {
if ( $ ( this ) . is ( ':visible' ) ) {
this . focus ( ) ;
2018-01-23 17:40:57 +03:00
}
} ) ;
} ) ;
2019-10-04 16:46:05 +03:00
Modal . _jQueryInterface . call ( $ ( target ) , config , this ) ;
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$4 ] = Modal . _jQueryInterface ;
$ . fn [ NAME$4 ] . Constructor = Modal ;
$ . fn [ NAME$4 ] . noConflict = ( ) => {
$ . fn [ NAME$4 ] = JQUERY _NO _CONFLICT$4 ;
return Modal . _jQueryInterface
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : tools / sanitizer . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const uriAttrs = [
'background' ,
'cite' ,
'href' ,
'itemtype' ,
'longdesc' ,
'poster' ,
'src' ,
'xlink:href'
] ;
const ARIA _ATTRIBUTE _PATTERN = /^aria-[\w-]*$/i ;
const DefaultWhitelist = {
// Global attributes allowed on any supplied element below.
'*' : [ 'class' , 'dir' , 'id' , 'lang' , 'role' , ARIA _ATTRIBUTE _PATTERN ] ,
a : [ 'target' , 'href' , 'title' , 'rel' ] ,
area : [ ] ,
b : [ ] ,
br : [ ] ,
col : [ ] ,
code : [ ] ,
div : [ ] ,
em : [ ] ,
hr : [ ] ,
h1 : [ ] ,
h2 : [ ] ,
h3 : [ ] ,
h4 : [ ] ,
h5 : [ ] ,
h6 : [ ] ,
i : [ ] ,
img : [ 'src' , 'alt' , 'title' , 'width' , 'height' ] ,
li : [ ] ,
ol : [ ] ,
p : [ ] ,
pre : [ ] ,
s : [ ] ,
small : [ ] ,
span : [ ] ,
sub : [ ] ,
sup : [ ] ,
strong : [ ] ,
u : [ ] ,
ul : [ ]
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* A pattern that recognizes a commonly useful subset of URLs that are safe .
*
* Shoutout to Angular 7 https : //github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
* /
const SAFE _URL _PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi ;
/ * *
* A pattern that matches safe data URLs . Only matches image , video and audio types .
*
* Shoutout to Angular 7 https : //github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
* /
const DATA _URL _PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i ;
function allowedAttribute ( attr , allowedAttributeList ) {
const attrName = attr . nodeName . toLowerCase ( ) ;
if ( allowedAttributeList . indexOf ( attrName ) !== - 1 ) {
if ( uriAttrs . indexOf ( attrName ) !== - 1 ) {
return Boolean ( attr . nodeValue . match ( SAFE _URL _PATTERN ) || attr . nodeValue . match ( DATA _URL _PATTERN ) )
}
return true
}
const regExp = allowedAttributeList . filter ( ( attrRegex ) => attrRegex instanceof RegExp ) ;
// Check if a regular expression validates the attribute.
for ( let i = 0 , l = regExp . length ; i < l ; i ++ ) {
if ( attrName . match ( regExp [ i ] ) ) {
return true
}
}
return false
}
function sanitizeHtml ( unsafeHtml , whiteList , sanitizeFn ) {
if ( unsafeHtml . length === 0 ) {
return unsafeHtml
}
if ( sanitizeFn && typeof sanitizeFn === 'function' ) {
return sanitizeFn ( unsafeHtml )
}
const domParser = new window . DOMParser ( ) ;
const createdDocument = domParser . parseFromString ( unsafeHtml , 'text/html' ) ;
const whitelistKeys = Object . keys ( whiteList ) ;
const elements = [ ] . slice . call ( createdDocument . body . querySelectorAll ( '*' ) ) ;
for ( let i = 0 , len = elements . length ; i < len ; i ++ ) {
const el = elements [ i ] ;
const elName = el . nodeName . toLowerCase ( ) ;
if ( whitelistKeys . indexOf ( el . nodeName . toLowerCase ( ) ) === - 1 ) {
el . parentNode . removeChild ( el ) ;
continue
}
const attributeList = [ ] . slice . call ( el . attributes ) ;
const whitelistedAttributes = [ ] . concat ( whiteList [ '*' ] || [ ] , whiteList [ elName ] || [ ] ) ;
attributeList . forEach ( ( attr ) => {
if ( ! allowedAttribute ( attr , whitelistedAttributes ) ) {
el . removeAttribute ( attr . nodeName ) ;
}
} ) ;
}
return createdDocument . body . innerHTML
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : tooltip . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$5 = 'tooltip' ;
const VERSION$5 = '4.3.1' ;
const DATA _KEY$5 = 'bs.tooltip' ;
const EVENT _KEY$5 = ` . ${ DATA _KEY$5 } ` ;
const JQUERY _NO _CONFLICT$5 = $ . fn [ NAME$5 ] ;
const CLASS _PREFIX = 'bs-tooltip' ;
const BSCLS _PREFIX _REGEX = new RegExp ( ` (^| \\ s) ${ CLASS _PREFIX } \\ S+ ` , 'g' ) ;
const DISALLOWED _ATTRIBUTES = [ 'sanitize' , 'whiteList' , 'sanitizeFn' ] ;
const DefaultType$3 = {
animation : 'boolean' ,
template : 'string' ,
title : '(string|element|function)' ,
trigger : 'string' ,
delay : '(number|object)' ,
html : 'boolean' ,
selector : '(string|boolean)' ,
placement : '(string|function)' ,
offset : '(number|string|function)' ,
container : '(string|element|boolean)' ,
fallbackPlacement : '(string|array)' ,
boundary : '(string|element)' ,
sanitize : 'boolean' ,
sanitizeFn : '(null|function)' ,
whiteList : 'object'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const AttachmentMap = {
AUTO : 'auto' ,
TOP : 'top' ,
RIGHT : 'right' ,
BOTTOM : 'bottom' ,
LEFT : 'left'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Default$3 = {
animation : true ,
template : '<div class="tooltip" role="tooltip">' +
'<div class="arrow"></div>' +
'<div class="tooltip-inner"></div></div>' ,
trigger : 'hover focus' ,
title : '' ,
delay : 0 ,
html : false ,
selector : false ,
placement : 'top' ,
offset : 0 ,
container : false ,
fallbackPlacement : 'flip' ,
boundary : 'scrollParent' ,
sanitize : true ,
sanitizeFn : null ,
whiteList : DefaultWhitelist
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const HoverState = {
SHOW : 'show' ,
OUT : 'out'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event$5 = {
HIDE : ` hide ${ EVENT _KEY$5 } ` ,
HIDDEN : ` hidden ${ EVENT _KEY$5 } ` ,
SHOW : ` show ${ EVENT _KEY$5 } ` ,
SHOWN : ` shown ${ EVENT _KEY$5 } ` ,
INSERTED : ` inserted ${ EVENT _KEY$5 } ` ,
CLICK : ` click ${ EVENT _KEY$5 } ` ,
FOCUSIN : ` focusin ${ EVENT _KEY$5 } ` ,
FOCUSOUT : ` focusout ${ EVENT _KEY$5 } ` ,
MOUSEENTER : ` mouseenter ${ EVENT _KEY$5 } ` ,
MOUSELEAVE : ` mouseleave ${ EVENT _KEY$5 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$5 = {
FADE : 'fade' ,
SHOW : 'show'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$5 = {
TOOLTIP : '.tooltip' ,
TOOLTIP _INNER : '.tooltip-inner' ,
ARROW : '.arrow'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Trigger = {
HOVER : 'hover' ,
FOCUS : 'focus' ,
CLICK : 'click' ,
MANUAL : 'manual'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class Tooltip {
constructor ( element , config ) {
2018-01-23 17:40:57 +03:00
/ * *
* Check for Popper dependency
* Popper - https : //popper.js.org
* /
if ( typeof Popper$1 === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( 'Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)' )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// private
this . _isEnabled = true ;
this . _timeout = 0 ;
this . _hoverState = '' ;
2018-01-23 17:40:57 +03:00
this . _activeTrigger = { } ;
2019-10-04 16:46:05 +03:00
this . _popper = null ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Protected
2018-01-23 17:40:57 +03:00
this . element = element ;
2019-10-04 16:46:05 +03:00
this . config = this . _getConfig ( config ) ;
this . tip = null ;
2018-01-23 17:40:57 +03:00
this . _setListeners ( ) ;
2019-10-04 16:46:05 +03:00
}
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$5
}
static get Default ( ) {
return Default$3
}
static get NAME ( ) {
return NAME$5
}
static get DATA _KEY ( ) {
return DATA _KEY$5
}
static get Event ( ) {
return Event$5
}
static get EVENT _KEY ( ) {
return EVENT _KEY$5
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get DefaultType ( ) {
return DefaultType$3
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
enable ( ) {
2018-01-23 17:40:57 +03:00
this . _isEnabled = true ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
disable ( ) {
2018-01-23 17:40:57 +03:00
this . _isEnabled = false ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
toggleEnabled ( ) {
2018-01-23 17:40:57 +03:00
this . _isEnabled = ! this . _isEnabled ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
toggle ( event ) {
2018-01-23 17:40:57 +03:00
if ( ! this . _isEnabled ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
if ( event ) {
2019-10-04 16:46:05 +03:00
const dataKey = this . constructor . DATA _KEY ;
let context = $ ( event . currentTarget ) . data ( dataKey ) ;
2018-01-23 17:40:57 +03:00
if ( ! context ) {
2019-10-04 16:46:05 +03:00
context = new this . constructor (
event . currentTarget ,
this . _getDelegateConfig ( )
) ;
$ ( event . currentTarget ) . data ( dataKey , context ) ;
2018-01-23 17:40:57 +03:00
}
context . _activeTrigger . click = ! context . _activeTrigger . click ;
if ( context . _isWithActiveTrigger ( ) ) {
context . _enter ( null , context ) ;
} else {
context . _leave ( null , context ) ;
}
} else {
2019-10-04 16:46:05 +03:00
if ( $ ( this . getTipElement ( ) ) . hasClass ( ClassName$5 . SHOW ) ) {
2018-01-23 17:40:57 +03:00
this . _leave ( null , this ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
this . _enter ( null , this ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
2018-01-23 17:40:57 +03:00
clearTimeout ( this . _timeout ) ;
2019-10-04 16:46:05 +03:00
$ . removeData ( this . element , this . constructor . DATA _KEY ) ;
$ ( this . element ) . off ( this . constructor . EVENT _KEY ) ;
$ ( this . element ) . closest ( '.modal' ) . off ( 'hide.bs.modal' ) ;
2018-01-23 17:40:57 +03:00
if ( this . tip ) {
2019-10-04 16:46:05 +03:00
$ ( this . tip ) . remove ( ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
this . _isEnabled = null ;
this . _timeout = null ;
this . _hoverState = null ;
2018-01-23 17:40:57 +03:00
this . _activeTrigger = null ;
if ( this . _popper !== null ) {
this . _popper . destroy ( ) ;
}
this . _popper = null ;
this . element = null ;
2019-10-04 16:46:05 +03:00
this . config = null ;
this . tip = null ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
show ( ) {
if ( $ ( this . element ) . css ( 'display' ) === 'none' ) {
throw new Error ( 'Please use show on visible elements' )
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const showEvent = $ . Event ( this . constructor . Event . SHOW ) ;
2018-01-23 17:40:57 +03:00
if ( this . isWithContent ( ) && this . _isEnabled ) {
2019-10-04 16:46:05 +03:00
$ ( this . element ) . trigger ( showEvent ) ;
const shadowRoot = Util . findShadowRoot ( this . element ) ;
const isInTheDom = $ . contains (
shadowRoot !== null ? shadowRoot : this . element . ownerDocument . documentElement ,
this . element
) ;
2018-01-23 17:40:57 +03:00
if ( showEvent . isDefaultPrevented ( ) || ! isInTheDom ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const tip = this . getTipElement ( ) ;
const tipId = Util . getUID ( this . constructor . NAME ) ;
2018-01-23 17:40:57 +03:00
tip . setAttribute ( 'id' , tipId ) ;
this . element . setAttribute ( 'aria-describedby' , tipId ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
this . setContent ( ) ;
if ( this . config . animation ) {
2019-10-04 16:46:05 +03:00
$ ( tip ) . addClass ( ClassName$5 . FADE ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const placement = typeof this . config . placement === 'function'
? this . config . placement . call ( this , tip , this . element )
: this . config . placement ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const attachment = this . _getAttachment ( placement ) ;
2018-01-23 17:40:57 +03:00
this . addAttachmentClass ( attachment ) ;
2019-10-04 16:46:05 +03:00
const container = this . _getContainer ( ) ;
$ ( tip ) . data ( this . constructor . DATA _KEY , this ) ;
if ( ! $ . contains ( this . element . ownerDocument . documentElement , this . tip ) ) {
$ ( tip ) . appendTo ( container ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$ ( this . element ) . trigger ( this . constructor . Event . INSERTED ) ;
2018-01-23 17:40:57 +03:00
this . _popper = new Popper$1 ( this . element , tip , {
placement : attachment ,
modifiers : {
2019-10-04 16:46:05 +03:00
offset : this . _getOffset ( ) ,
2018-01-23 17:40:57 +03:00
flip : {
behavior : this . config . fallbackPlacement
} ,
arrow : {
2019-10-04 16:46:05 +03:00
element : Selector$5 . ARROW
2018-01-23 17:40:57 +03:00
} ,
preventOverflow : {
boundariesElement : this . config . boundary
}
} ,
2019-10-04 16:46:05 +03:00
onCreate : ( data ) => {
2018-01-23 17:40:57 +03:00
if ( data . originalPlacement !== data . placement ) {
2019-10-04 16:46:05 +03:00
this . _handlePopperPlacementChange ( data ) ;
2018-01-23 17:40:57 +03:00
}
} ,
2019-10-04 16:46:05 +03:00
onUpdate : ( data ) => this . _handlePopperPlacementChange ( data )
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
$ ( tip ) . addClass ( ClassName$5 . SHOW ) ;
// If this is a touch-enabled device we add extra
2018-01-23 17:40:57 +03:00
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
if ( 'ontouchstart' in document . documentElement ) {
2019-10-04 16:46:05 +03:00
$ ( document . body ) . children ( ) . on ( 'mouseover' , null , $ . noop ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const complete = ( ) => {
if ( this . config . animation ) {
this . _fixTransition ( ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const prevHoverState = this . _hoverState ;
this . _hoverState = null ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . element ) . trigger ( this . constructor . Event . SHOWN ) ;
2018-01-23 17:40:57 +03:00
if ( prevHoverState === HoverState . OUT ) {
2019-10-04 16:46:05 +03:00
this . _leave ( null , this ) ;
2018-01-23 17:40:57 +03:00
}
} ;
2019-10-04 16:46:05 +03:00
if ( $ ( this . tip ) . hasClass ( ClassName$5 . FADE ) ) {
const transitionDuration = Util . getTransitionDurationFromElement ( this . tip ) ;
$ ( this . tip )
. one ( Util . TRANSITION _END , complete )
. emulateTransitionEnd ( transitionDuration ) ;
2018-01-23 17:40:57 +03:00
} else {
complete ( ) ;
}
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
hide ( callback ) {
const tip = this . getTipElement ( ) ;
const hideEvent = $ . Event ( this . constructor . Event . HIDE ) ;
const complete = ( ) => {
if ( this . _hoverState !== HoverState . SHOW && tip . parentNode ) {
2018-01-23 17:40:57 +03:00
tip . parentNode . removeChild ( tip ) ;
}
2019-10-04 16:46:05 +03:00
this . _cleanTipClass ( ) ;
this . element . removeAttribute ( 'aria-describedby' ) ;
$ ( this . element ) . trigger ( this . constructor . Event . HIDDEN ) ;
if ( this . _popper !== null ) {
this . _popper . destroy ( ) ;
2018-01-23 17:40:57 +03:00
}
if ( callback ) {
callback ( ) ;
}
} ;
2019-10-04 16:46:05 +03:00
$ ( this . element ) . trigger ( hideEvent ) ;
2018-01-23 17:40:57 +03:00
if ( hideEvent . isDefaultPrevented ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$ ( tip ) . removeClass ( ClassName$5 . SHOW ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// If this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support
2018-01-23 17:40:57 +03:00
if ( 'ontouchstart' in document . documentElement ) {
2019-10-04 16:46:05 +03:00
$ ( document . body ) . children ( ) . off ( 'mouseover' , null , $ . noop ) ;
2018-01-23 17:40:57 +03:00
}
this . _activeTrigger [ Trigger . CLICK ] = false ;
this . _activeTrigger [ Trigger . FOCUS ] = false ;
this . _activeTrigger [ Trigger . HOVER ] = false ;
2019-10-04 16:46:05 +03:00
if ( $ ( this . tip ) . hasClass ( ClassName$5 . FADE ) ) {
const transitionDuration = Util . getTransitionDurationFromElement ( tip ) ;
$ ( tip )
. one ( Util . TRANSITION _END , complete )
. emulateTransitionEnd ( transitionDuration ) ;
2018-01-23 17:40:57 +03:00
} else {
complete ( ) ;
}
this . _hoverState = '' ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
update ( ) {
2018-01-23 17:40:57 +03:00
if ( this . _popper !== null ) {
this . _popper . scheduleUpdate ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Protected
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
isWithContent ( ) {
return Boolean ( this . getTitle ( ) )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
addAttachmentClass ( attachment ) {
$ ( this . getTipElement ( ) ) . addClass ( ` ${ CLASS _PREFIX } - ${ attachment } ` ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
getTipElement ( ) {
this . tip = this . tip || $ ( this . config . template ) [ 0 ] ;
return this . tip
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
setContent ( ) {
const tip = this . getTipElement ( ) ;
this . setElementContent ( $ ( tip . querySelectorAll ( Selector$5 . TOOLTIP _INNER ) ) , this . getTitle ( ) ) ;
$ ( tip ) . removeClass ( ` ${ ClassName$5 . FADE } ${ ClassName$5 . SHOW } ` ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
setElementContent ( $element , content ) {
2018-01-23 17:40:57 +03:00
if ( typeof content === 'object' && ( content . nodeType || content . jquery ) ) {
// Content is a DOM node or a jQuery
2019-10-04 16:46:05 +03:00
if ( this . config . html ) {
if ( ! $ ( content ) . parent ( ) . is ( $element ) ) {
2018-01-23 17:40:57 +03:00
$element . empty ( ) . append ( content ) ;
}
} else {
2019-10-04 16:46:05 +03:00
$element . text ( $ ( content ) . text ( ) ) ;
}
return
}
if ( this . config . html ) {
if ( this . config . sanitize ) {
content = sanitizeHtml ( content , this . config . whiteList , this . config . sanitizeFn ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$element . html ( content ) ;
2018-01-23 17:40:57 +03:00
} else {
2019-10-04 16:46:05 +03:00
$element . text ( content ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
getTitle ( ) {
let title = this . element . getAttribute ( 'data-original-title' ) ;
2018-01-23 17:40:57 +03:00
if ( ! title ) {
2019-10-04 16:46:05 +03:00
title = typeof this . config . title === 'function'
? this . config . title . call ( this . element )
: this . config . title ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
return title
}
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getOffset ( ) {
const offset = { } ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( typeof this . config . offset === 'function' ) {
offset . fn = ( data ) => {
data . offsets = {
... data . offsets ,
... this . config . offset ( data . offsets , this . element ) || { }
} ;
return data
} ;
} else {
offset . offset = this . config . offset ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
return offset
}
_getContainer ( ) {
if ( this . config . container === false ) {
return document . body
}
if ( Util . isElement ( this . config . container ) ) {
return $ ( this . config . container )
}
return $ ( document ) . find ( this . config . container )
}
_getAttachment ( placement ) {
return AttachmentMap [ placement . toUpperCase ( ) ]
}
_setListeners ( ) {
const triggers = this . config . trigger . split ( ' ' ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
triggers . forEach ( ( trigger ) => {
2018-01-23 17:40:57 +03:00
if ( trigger === 'click' ) {
2019-10-04 16:46:05 +03:00
$ ( this . element ) . on (
this . constructor . Event . CLICK ,
this . config . selector ,
( event ) => this . toggle ( event )
) ;
2018-01-23 17:40:57 +03:00
} else if ( trigger !== Trigger . MANUAL ) {
2019-10-04 16:46:05 +03:00
const eventIn = trigger === Trigger . HOVER
? this . constructor . Event . MOUSEENTER
: this . constructor . Event . FOCUSIN ;
const eventOut = trigger === Trigger . HOVER
? this . constructor . Event . MOUSELEAVE
: this . constructor . Event . FOCUSOUT ;
$ ( this . element )
. on (
eventIn ,
this . config . selector ,
( event ) => this . _enter ( event )
)
. on (
eventOut ,
this . config . selector ,
( event ) => this . _leave ( event )
) ;
2018-01-23 17:40:57 +03:00
}
} ) ;
2019-10-04 16:46:05 +03:00
$ ( this . element ) . closest ( '.modal' ) . on (
'hide.bs.modal' ,
( ) => {
if ( this . element ) {
this . hide ( ) ;
}
}
) ;
2018-01-23 17:40:57 +03:00
if ( this . config . selector ) {
2019-10-04 16:46:05 +03:00
this . config = {
... this . config ,
2018-01-23 17:40:57 +03:00
trigger : 'manual' ,
selector : ''
2019-10-04 16:46:05 +03:00
} ;
2018-01-23 17:40:57 +03:00
} else {
this . _fixTitle ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_fixTitle ( ) {
const titleType = typeof this . element . getAttribute ( 'data-original-title' ) ;
2018-01-23 17:40:57 +03:00
if ( this . element . getAttribute ( 'title' ) || titleType !== 'string' ) {
2019-10-04 16:46:05 +03:00
this . element . setAttribute (
'data-original-title' ,
this . element . getAttribute ( 'title' ) || ''
) ;
2018-01-23 17:40:57 +03:00
this . element . setAttribute ( 'title' , '' ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_enter ( event , context ) {
const dataKey = this . constructor . DATA _KEY ;
context = context || $ ( event . currentTarget ) . data ( dataKey ) ;
2018-01-23 17:40:57 +03:00
if ( ! context ) {
2019-10-04 16:46:05 +03:00
context = new this . constructor (
event . currentTarget ,
this . _getDelegateConfig ( )
) ;
$ ( event . currentTarget ) . data ( dataKey , context ) ;
2018-01-23 17:40:57 +03:00
}
if ( event ) {
2019-10-04 16:46:05 +03:00
context . _activeTrigger [
event . type === 'focusin' ? Trigger . FOCUS : Trigger . HOVER
] = true ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
if ( $ ( context . getTipElement ( ) ) . hasClass ( ClassName$5 . SHOW ) || context . _hoverState === HoverState . SHOW ) {
2018-01-23 17:40:57 +03:00
context . _hoverState = HoverState . SHOW ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
clearTimeout ( context . _timeout ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
context . _hoverState = HoverState . SHOW ;
if ( ! context . config . delay || ! context . config . delay . show ) {
context . show ( ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
context . _timeout = setTimeout ( ( ) => {
2018-01-23 17:40:57 +03:00
if ( context . _hoverState === HoverState . SHOW ) {
context . show ( ) ;
}
} , context . config . delay . show ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_leave ( event , context ) {
const dataKey = this . constructor . DATA _KEY ;
context = context || $ ( event . currentTarget ) . data ( dataKey ) ;
2018-01-23 17:40:57 +03:00
if ( ! context ) {
2019-10-04 16:46:05 +03:00
context = new this . constructor (
event . currentTarget ,
this . _getDelegateConfig ( )
) ;
$ ( event . currentTarget ) . data ( dataKey , context ) ;
2018-01-23 17:40:57 +03:00
}
if ( event ) {
2019-10-04 16:46:05 +03:00
context . _activeTrigger [
event . type === 'focusout' ? Trigger . FOCUS : Trigger . HOVER
] = false ;
2018-01-23 17:40:57 +03:00
}
if ( context . _isWithActiveTrigger ( ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
clearTimeout ( context . _timeout ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
context . _hoverState = HoverState . OUT ;
if ( ! context . config . delay || ! context . config . delay . hide ) {
context . hide ( ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
context . _timeout = setTimeout ( ( ) => {
2018-01-23 17:40:57 +03:00
if ( context . _hoverState === HoverState . OUT ) {
context . hide ( ) ;
}
} , context . config . delay . hide ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_isWithActiveTrigger ( ) {
for ( const trigger in this . _activeTrigger ) {
2018-01-23 17:40:57 +03:00
if ( this . _activeTrigger [ trigger ] ) {
2019-10-04 16:46:05 +03:00
return true
2018-01-23 17:40:57 +03:00
}
}
2019-10-04 16:46:05 +03:00
return false
}
_getConfig ( config ) {
const dataAttributes = $ ( this . element ) . data ( ) ;
Object . keys ( dataAttributes )
. forEach ( ( dataAttr ) => {
if ( DISALLOWED _ATTRIBUTES . indexOf ( dataAttr ) !== - 1 ) {
delete dataAttributes [ dataAttr ] ;
}
} ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
config = {
... this . constructor . Default ,
... dataAttributes ,
... typeof config === 'object' && config ? config : { }
} ;
2018-01-23 17:40:57 +03:00
if ( typeof config . delay === 'number' ) {
config . delay = {
show : config . delay ,
hide : config . delay
} ;
}
if ( typeof config . title === 'number' ) {
config . title = config . title . toString ( ) ;
}
if ( typeof config . content === 'number' ) {
config . content = config . content . toString ( ) ;
}
2019-10-04 16:46:05 +03:00
Util . typeCheckConfig (
NAME$5 ,
config ,
this . constructor . DefaultType
) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( config . sanitize ) {
config . template = sanitizeHtml ( config . template , config . whiteList , config . sanitizeFn ) ;
}
return config
}
_getDelegateConfig ( ) {
const config = { } ;
2018-01-23 17:40:57 +03:00
if ( this . config ) {
2019-10-04 16:46:05 +03:00
for ( const key in this . config ) {
2018-01-23 17:40:57 +03:00
if ( this . constructor . Default [ key ] !== this . config [ key ] ) {
config [ key ] = this . config [ key ] ;
}
}
}
2019-10-04 16:46:05 +03:00
return config
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_cleanTipClass ( ) {
const $tip = $ ( this . getTipElement ( ) ) ;
const tabClass = $tip . attr ( 'class' ) . match ( BSCLS _PREFIX _REGEX ) ;
if ( tabClass !== null && tabClass . length ) {
2018-01-23 17:40:57 +03:00
$tip . removeClass ( tabClass . join ( '' ) ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_handlePopperPlacementChange ( popperData ) {
const popperInstance = popperData . instance ;
this . tip = popperInstance . popper ;
2018-01-23 17:40:57 +03:00
this . _cleanTipClass ( ) ;
2019-10-04 16:46:05 +03:00
this . addAttachmentClass ( this . _getAttachment ( popperData . placement ) ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_fixTransition ( ) {
const tip = this . getTipElement ( ) ;
const initConfigAnimation = this . config . animation ;
2018-01-23 17:40:57 +03:00
if ( tip . getAttribute ( 'x-placement' ) !== null ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$ ( tip ) . removeClass ( ClassName$5 . FADE ) ;
2018-01-23 17:40:57 +03:00
this . config . animation = false ;
this . hide ( ) ;
this . show ( ) ;
this . config . animation = initConfigAnimation ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
let data = $ ( this ) . data ( DATA _KEY$5 ) ;
const _config = typeof config === 'object' && config ;
2018-01-23 17:40:57 +03:00
if ( ! data && /dispose|hide/ . test ( config ) ) {
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
if ( ! data ) {
data = new Tooltip ( this , _config ) ;
2019-10-04 16:46:05 +03:00
$ ( this ) . data ( DATA _KEY$5 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ config } " ` )
2018-01-23 17:40:57 +03:00
}
data [ config ] ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$5 ] = Tooltip . _jQueryInterface ;
$ . fn [ NAME$5 ] . Constructor = Tooltip ;
$ . fn [ NAME$5 ] . noConflict = ( ) => {
$ . fn [ NAME$5 ] = JQUERY _NO _CONFLICT$5 ;
return Tooltip . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : popover . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$6 = 'popover' ;
const VERSION$6 = '4.3.1' ;
const DATA _KEY$6 = 'bs.popover' ;
const EVENT _KEY$6 = ` . ${ DATA _KEY$6 } ` ;
const JQUERY _NO _CONFLICT$6 = $ . fn [ NAME$6 ] ;
const CLASS _PREFIX$1 = 'bs-popover' ;
const BSCLS _PREFIX _REGEX$1 = new RegExp ( ` (^| \\ s) ${ CLASS _PREFIX$1 } \\ S+ ` , 'g' ) ;
const Default$4 = {
... Tooltip . Default ,
placement : 'right' ,
trigger : 'click' ,
content : '' ,
template : '<div class="popover" role="tooltip">' +
'<div class="arrow"></div>' +
'<h3 class="popover-header"></h3>' +
'<div class="popover-body"></div></div>'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const DefaultType$4 = {
... Tooltip . DefaultType ,
content : '(string|element|function)'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$6 = {
FADE : 'fade' ,
SHOW : 'show'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$6 = {
TITLE : '.popover-header' ,
CONTENT : '.popover-body'
} ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const Event$6 = {
HIDE : ` hide ${ EVENT _KEY$6 } ` ,
HIDDEN : ` hidden ${ EVENT _KEY$6 } ` ,
SHOW : ` show ${ EVENT _KEY$6 } ` ,
SHOWN : ` shown ${ EVENT _KEY$6 } ` ,
INSERTED : ` inserted ${ EVENT _KEY$6 } ` ,
CLICK : ` click ${ EVENT _KEY$6 } ` ,
FOCUSIN : ` focusin ${ EVENT _KEY$6 } ` ,
FOCUSOUT : ` focusout ${ EVENT _KEY$6 } ` ,
MOUSEENTER : ` mouseenter ${ EVENT _KEY$6 } ` ,
MOUSELEAVE : ` mouseleave ${ EVENT _KEY$6 } `
} ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
class Popover extends Tooltip {
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$6
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get Default ( ) {
return Default$4
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get NAME ( ) {
return NAME$6
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get DATA _KEY ( ) {
return DATA _KEY$6
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get Event ( ) {
return Event$6
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get EVENT _KEY ( ) {
return EVENT _KEY$6
}
static get DefaultType ( ) {
return DefaultType$4
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Overrides
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
isWithContent ( ) {
return this . getTitle ( ) || this . _getContent ( )
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
addAttachmentClass ( attachment ) {
$ ( this . getTipElement ( ) ) . addClass ( ` ${ CLASS _PREFIX$1 } - ${ attachment } ` ) ;
}
getTipElement ( ) {
this . tip = this . tip || $ ( this . config . template ) [ 0 ] ;
return this . tip
}
setContent ( ) {
const $tip = $ ( this . getTipElement ( ) ) ;
// We use append for html objects to maintain js events
this . setElementContent ( $tip . find ( Selector$6 . TITLE ) , this . getTitle ( ) ) ;
let content = this . _getContent ( ) ;
if ( typeof content === 'function' ) {
content = content . call ( this . element ) ;
}
this . setElementContent ( $tip . find ( Selector$6 . CONTENT ) , content ) ;
$tip . removeClass ( ` ${ ClassName$6 . FADE } ${ ClassName$6 . SHOW } ` ) ;
}
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getContent ( ) {
return this . element . getAttribute ( 'data-content' ) ||
this . config . content
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_cleanTipClass ( ) {
const $tip = $ ( this . getTipElement ( ) ) ;
const tabClass = $tip . attr ( 'class' ) . match ( BSCLS _PREFIX _REGEX$1 ) ;
2018-01-23 17:40:57 +03:00
if ( tabClass !== null && tabClass . length > 0 ) {
$tip . removeClass ( tabClass . join ( '' ) ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
let data = $ ( this ) . data ( DATA _KEY$6 ) ;
const _config = typeof config === 'object' ? config : null ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( ! data && /dispose|hide/ . test ( config ) ) {
return
2018-01-23 17:40:57 +03:00
}
if ( ! data ) {
data = new Popover ( this , _config ) ;
2019-10-04 16:46:05 +03:00
$ ( this ) . data ( DATA _KEY$6 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ config } " ` )
2018-01-23 17:40:57 +03:00
}
data [ config ] ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$6 ] = Popover . _jQueryInterface ;
$ . fn [ NAME$6 ] . Constructor = Popover ;
$ . fn [ NAME$6 ] . noConflict = ( ) => {
$ . fn [ NAME$6 ] = JQUERY _NO _CONFLICT$6 ;
return Popover . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : scrollspy . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$7 = 'scrollspy' ;
const VERSION$7 = '4.3.1' ;
const DATA _KEY$7 = 'bs.scrollspy' ;
const EVENT _KEY$7 = ` . ${ DATA _KEY$7 } ` ;
const DATA _API _KEY$5 = '.data-api' ;
const JQUERY _NO _CONFLICT$7 = $ . fn [ NAME$7 ] ;
const Default$5 = {
offset : 10 ,
method : 'auto' ,
target : ''
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const DefaultType$5 = {
offset : 'number' ,
method : 'string' ,
target : '(string|element)'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Event$7 = {
ACTIVATE : ` activate ${ EVENT _KEY$7 } ` ,
SCROLL : ` scroll ${ EVENT _KEY$7 } ` ,
LOAD _DATA _API : ` load ${ EVENT _KEY$7 } ${ DATA _API _KEY$5 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$7 = {
DROPDOWN _ITEM : 'dropdown-item' ,
DROPDOWN _MENU : 'dropdown-menu' ,
ACTIVE : 'active'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$7 = {
DATA _SPY : '[data-spy="scroll"]' ,
ACTIVE : '.active' ,
NAV _LIST _GROUP : '.nav, .list-group' ,
NAV _LINKS : '.nav-link' ,
NAV _ITEMS : '.nav-item' ,
LIST _ITEMS : '.list-group-item' ,
DROPDOWN : '.dropdown' ,
DROPDOWN _ITEMS : '.dropdown-item' ,
DROPDOWN _TOGGLE : '.dropdown-toggle'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const OffsetMethod = {
OFFSET : 'offset' ,
POSITION : 'position'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
class ScrollSpy {
constructor ( element , config ) {
this . _element = element ;
2018-01-23 17:40:57 +03:00
this . _scrollElement = element . tagName === 'BODY' ? window : element ;
2019-10-04 16:46:05 +03:00
this . _config = this . _getConfig ( config ) ;
this . _selector = ` ${ this . _config . target } ${ Selector$7 . NAV _LINKS } , ` +
` ${ this . _config . target } ${ Selector$7 . LIST _ITEMS } , ` +
` ${ this . _config . target } ${ Selector$7 . DROPDOWN _ITEMS } ` ;
this . _offsets = [ ] ;
this . _targets = [ ] ;
this . _activeTarget = null ;
this . _scrollHeight = 0 ;
$ ( this . _scrollElement ) . on ( Event$7 . SCROLL , ( event ) => this . _process ( event ) ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
this . refresh ( ) ;
2018-01-23 17:40:57 +03:00
this . _process ( ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Getters
static get VERSION ( ) {
return VERSION$7
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get Default ( ) {
return Default$5
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
refresh ( ) {
const autoMethod = this . _scrollElement === this . _scrollElement . window
? OffsetMethod . OFFSET : OffsetMethod . POSITION ;
const offsetMethod = this . _config . method === 'auto'
? autoMethod : this . _config . method ;
const offsetBase = offsetMethod === OffsetMethod . POSITION
? this . _getScrollTop ( ) : 0 ;
2018-01-23 17:40:57 +03:00
this . _offsets = [ ] ;
this . _targets = [ ] ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
this . _scrollHeight = this . _getScrollHeight ( ) ;
2019-10-04 16:46:05 +03:00
const targets = [ ] . slice . call ( document . querySelectorAll ( this . _selector ) ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
targets
. map ( ( element ) => {
let target ;
const targetSelector = Util . getSelectorFromElement ( element ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( targetSelector ) {
target = document . querySelector ( targetSelector ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
if ( target ) {
const targetBCR = target . getBoundingClientRect ( ) ;
if ( targetBCR . width || targetBCR . height ) {
// TODO (fat): remove sketch reliance on jQuery position/offset
return [
$ ( target ) [ offsetMethod ] ( ) . top + offsetBase ,
targetSelector
]
}
}
return null
} )
. filter ( ( item ) => item )
. sort ( ( a , b ) => a [ 0 ] - b [ 0 ] )
. forEach ( ( item ) => {
this . _offsets . push ( item [ 0 ] ) ;
this . _targets . push ( item [ 1 ] ) ;
} ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
$ . removeData ( this . _element , DATA _KEY$7 ) ;
$ ( this . _scrollElement ) . off ( EVENT _KEY$7 ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
this . _element = null ;
2018-01-23 17:40:57 +03:00
this . _scrollElement = null ;
2019-10-04 16:46:05 +03:00
this . _config = null ;
this . _selector = null ;
this . _offsets = null ;
this . _targets = null ;
this . _activeTarget = null ;
this . _scrollHeight = null ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getConfig ( config ) {
config = {
... Default$5 ,
... typeof config === 'object' && config ? config : { }
} ;
2018-01-23 17:40:57 +03:00
if ( typeof config . target !== 'string' ) {
2019-10-04 16:46:05 +03:00
let id = $ ( config . target ) . attr ( 'id' ) ;
2018-01-23 17:40:57 +03:00
if ( ! id ) {
2019-10-04 16:46:05 +03:00
id = Util . getUID ( NAME$7 ) ;
$ ( config . target ) . attr ( 'id' , id ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
config . target = ` # ${ id } ` ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
Util . typeCheckConfig ( NAME$7 , config , DefaultType$5 ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
return config
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getScrollTop ( ) {
return this . _scrollElement === window
? this . _scrollElement . pageYOffset : this . _scrollElement . scrollTop
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getScrollHeight ( ) {
return this . _scrollElement . scrollHeight || Math . max (
document . body . scrollHeight ,
document . documentElement . scrollHeight
)
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_getOffsetHeight ( ) {
return this . _scrollElement === window
? window . innerHeight : this . _scrollElement . getBoundingClientRect ( ) . height
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_process ( ) {
const scrollTop = this . _getScrollTop ( ) + this . _config . offset ;
const scrollHeight = this . _getScrollHeight ( ) ;
const maxScroll = this . _config . offset +
scrollHeight -
this . _getOffsetHeight ( ) ;
2018-01-23 17:40:57 +03:00
if ( this . _scrollHeight !== scrollHeight ) {
this . refresh ( ) ;
}
if ( scrollTop >= maxScroll ) {
2019-10-04 16:46:05 +03:00
const target = this . _targets [ this . _targets . length - 1 ] ;
2018-01-23 17:40:57 +03:00
if ( this . _activeTarget !== target ) {
this . _activate ( target ) ;
}
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
if ( this . _activeTarget && scrollTop < this . _offsets [ 0 ] && this . _offsets [ 0 ] > 0 ) {
this . _activeTarget = null ;
this . _clear ( ) ;
2019-10-04 16:46:05 +03:00
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
const offsetLength = this . _offsets . length ;
for ( let i = offsetLength ; i -- ; ) {
const isActiveTarget = this . _activeTarget !== this . _targets [ i ] &&
scrollTop >= this . _offsets [ i ] &&
( typeof this . _offsets [ i + 1 ] === 'undefined' ||
scrollTop < this . _offsets [ i + 1 ] ) ;
2018-01-23 17:40:57 +03:00
if ( isActiveTarget ) {
this . _activate ( this . _targets [ i ] ) ;
}
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_activate ( target ) {
2018-01-23 17:40:57 +03:00
this . _activeTarget = target ;
this . _clear ( ) ;
2019-10-04 16:46:05 +03:00
const queries = this . _selector
. split ( ',' )
. map ( ( selector ) => ` ${ selector } [data-target=" ${ target } "], ${ selector } [href=" ${ target } "] ` ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const $link = $ ( [ ] . slice . call ( document . querySelectorAll ( queries . join ( ',' ) ) ) ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( $link . hasClass ( ClassName$7 . DROPDOWN _ITEM ) ) {
$link . closest ( Selector$7 . DROPDOWN ) . find ( Selector$7 . DROPDOWN _TOGGLE ) . addClass ( ClassName$7 . ACTIVE ) ;
$link . addClass ( ClassName$7 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
} else {
// Set triggered link as active
2019-10-04 16:46:05 +03:00
$link . addClass ( ClassName$7 . ACTIVE ) ;
// Set triggered links parents as active
2018-01-23 17:40:57 +03:00
// With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
2019-10-04 16:46:05 +03:00
$link . parents ( Selector$7 . NAV _LIST _GROUP ) . prev ( ` ${ Selector$7 . NAV _LINKS } , ${ Selector$7 . LIST _ITEMS } ` ) . addClass ( ClassName$7 . ACTIVE ) ;
// Handle special case when .nav-link is inside .nav-item
$link . parents ( Selector$7 . NAV _LIST _GROUP ) . prev ( Selector$7 . NAV _ITEMS ) . children ( Selector$7 . NAV _LINKS ) . addClass ( ClassName$7 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$ ( this . _scrollElement ) . trigger ( Event$7 . ACTIVATE , {
2018-01-23 17:40:57 +03:00
relatedTarget : target
} ) ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_clear ( ) {
[ ] . slice . call ( document . querySelectorAll ( this . _selector ) )
. filter ( ( node ) => node . classList . contains ( ClassName$7 . ACTIVE ) )
. forEach ( ( node ) => node . classList . remove ( ClassName$7 . ACTIVE ) ) ;
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
let data = $ ( this ) . data ( DATA _KEY$7 ) ;
const _config = typeof config === 'object' && config ;
2018-01-23 17:40:57 +03:00
if ( ! data ) {
data = new ScrollSpy ( this , _config ) ;
2019-10-04 16:46:05 +03:00
$ ( this ) . data ( DATA _KEY$7 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ config } " ` )
2018-01-23 17:40:57 +03:00
}
data [ config ] ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( window ) . on ( Event$7 . LOAD _DATA _API , ( ) => {
const scrollSpys = [ ] . slice . call ( document . querySelectorAll ( Selector$7 . DATA _SPY ) ) ;
const scrollSpysLength = scrollSpys . length ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
for ( let i = scrollSpysLength ; i -- ; ) {
const $spy = $ ( scrollSpys [ i ] ) ;
2018-01-23 17:40:57 +03:00
ScrollSpy . _jQueryInterface . call ( $spy , $spy . data ( ) ) ;
}
} ) ;
2019-10-04 16:46:05 +03:00
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$7 ] = ScrollSpy . _jQueryInterface ;
$ . fn [ NAME$7 ] . Constructor = ScrollSpy ;
$ . fn [ NAME$7 ] . noConflict = ( ) => {
$ . fn [ NAME$7 ] = JQUERY _NO _CONFLICT$7 ;
return ScrollSpy . _jQueryInterface
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 3.1 ) : tab . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
const NAME$8 = 'tab' ;
const VERSION$8 = '4.3.1' ;
const DATA _KEY$8 = 'bs.tab' ;
const EVENT _KEY$8 = ` . ${ DATA _KEY$8 } ` ;
const DATA _API _KEY$6 = '.data-api' ;
const JQUERY _NO _CONFLICT$8 = $ . fn [ NAME$8 ] ;
const Event$8 = {
HIDE : ` hide ${ EVENT _KEY$8 } ` ,
HIDDEN : ` hidden ${ EVENT _KEY$8 } ` ,
SHOW : ` show ${ EVENT _KEY$8 } ` ,
SHOWN : ` shown ${ EVENT _KEY$8 } ` ,
CLICK _DATA _API : ` click ${ EVENT _KEY$8 } ${ DATA _API _KEY$6 } `
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const ClassName$8 = {
DROPDOWN _MENU : 'dropdown-menu' ,
ACTIVE : 'active' ,
DISABLED : 'disabled' ,
FADE : 'fade' ,
SHOW : 'show'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
const Selector$8 = {
DROPDOWN : '.dropdown' ,
NAV _LIST _GROUP : '.nav, .list-group' ,
ACTIVE : '.active' ,
ACTIVE _UL : '> li > .active' ,
DATA _TOGGLE : '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]' ,
DROPDOWN _TOGGLE : '.dropdown-toggle' ,
DROPDOWN _ACTIVE _CHILD : '> .dropdown-menu .active'
2018-01-23 17:40:57 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class Tab {
constructor ( element ) {
2018-01-23 17:40:57 +03:00
this . _element = element ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Getters
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static get VERSION ( ) {
return VERSION$8
}
2018-01-23 17:40:57 +03:00
// Public
2019-10-04 16:46:05 +03:00
show ( ) {
if ( this . _element . parentNode &&
this . _element . parentNode . nodeType === Node . ELEMENT _NODE &&
$ ( this . _element ) . hasClass ( ClassName$8 . ACTIVE ) ||
$ ( this . _element ) . hasClass ( ClassName$8 . DISABLED ) ) {
return
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
let target ;
let previous ;
const listElement = $ ( this . _element ) . closest ( Selector$8 . NAV _LIST _GROUP ) [ 0 ] ;
const selector = Util . getSelectorFromElement ( this . _element ) ;
2018-01-23 17:40:57 +03:00
if ( listElement ) {
2019-10-04 16:46:05 +03:00
const itemSelector = listElement . nodeName === 'UL' || listElement . nodeName === 'OL' ? Selector$8 . ACTIVE _UL : Selector$8 . ACTIVE ;
previous = $ . makeArray ( $ ( listElement ) . find ( itemSelector ) ) ;
2018-01-23 17:40:57 +03:00
previous = previous [ previous . length - 1 ] ;
}
2019-10-04 16:46:05 +03:00
const hideEvent = $ . Event ( Event$8 . HIDE , {
2018-01-23 17:40:57 +03:00
relatedTarget : this . _element
} ) ;
2019-10-04 16:46:05 +03:00
const showEvent = $ . Event ( Event$8 . SHOW , {
2018-01-23 17:40:57 +03:00
relatedTarget : previous
} ) ;
if ( previous ) {
2019-10-04 16:46:05 +03:00
$ ( previous ) . trigger ( hideEvent ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . trigger ( showEvent ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
if ( showEvent . isDefaultPrevented ( ) ||
hideEvent . isDefaultPrevented ( ) ) {
return
2018-01-23 17:40:57 +03:00
}
if ( selector ) {
2019-10-04 16:46:05 +03:00
target = document . querySelector ( selector ) ;
2018-01-23 17:40:57 +03:00
}
2019-10-04 16:46:05 +03:00
this . _activate (
this . _element ,
listElement
) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const complete = ( ) => {
const hiddenEvent = $ . Event ( Event$8 . HIDDEN , {
relatedTarget : this . _element
2018-01-23 17:40:57 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
const shownEvent = $ . Event ( Event$8 . SHOWN , {
2018-01-23 17:40:57 +03:00
relatedTarget : previous
} ) ;
2019-10-04 16:46:05 +03:00
$ ( previous ) . trigger ( hiddenEvent ) ;
$ ( this . _element ) . trigger ( shownEvent ) ;
2018-01-23 17:40:57 +03:00
} ;
if ( target ) {
this . _activate ( target , target . parentNode , complete ) ;
} else {
complete ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
dispose ( ) {
$ . removeData ( this . _element , DATA _KEY$8 ) ;
2018-01-23 17:40:57 +03:00
this . _element = null ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Private
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_activate ( element , container , callback ) {
const activeElements = container && ( container . nodeName === 'UL' || container . nodeName === 'OL' )
? $ ( container ) . find ( Selector$8 . ACTIVE _UL )
: $ ( container ) . children ( Selector$8 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
const active = activeElements [ 0 ] ;
const isTransitioning = callback && ( active && $ ( active ) . hasClass ( ClassName$8 . FADE ) ) ;
const complete = ( ) => this . _transitionComplete (
element ,
active ,
callback
) ;
2018-01-23 17:40:57 +03:00
if ( active && isTransitioning ) {
2019-10-04 16:46:05 +03:00
const transitionDuration = Util . getTransitionDurationFromElement ( active ) ;
$ ( active )
. removeClass ( ClassName$8 . SHOW )
. one ( Util . TRANSITION _END , complete )
. emulateTransitionEnd ( transitionDuration ) ;
2018-01-23 17:40:57 +03:00
} else {
complete ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
_transitionComplete ( element , active , callback ) {
2018-01-23 17:40:57 +03:00
if ( active ) {
2019-10-04 16:46:05 +03:00
$ ( active ) . removeClass ( ClassName$8 . ACTIVE ) ;
const dropdownChild = $ ( active . parentNode ) . find (
Selector$8 . DROPDOWN _ACTIVE _CHILD
) [ 0 ] ;
2018-01-23 17:40:57 +03:00
if ( dropdownChild ) {
2019-10-04 16:46:05 +03:00
$ ( dropdownChild ) . removeClass ( ClassName$8 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
}
if ( active . getAttribute ( 'role' ) === 'tab' ) {
active . setAttribute ( 'aria-selected' , false ) ;
}
}
2019-10-04 16:46:05 +03:00
$ ( element ) . addClass ( ClassName$8 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
if ( element . getAttribute ( 'role' ) === 'tab' ) {
element . setAttribute ( 'aria-selected' , true ) ;
}
Util . reflow ( element ) ;
2019-10-04 16:46:05 +03:00
if ( element . classList . contains ( ClassName$8 . FADE ) ) {
element . classList . add ( ClassName$8 . SHOW ) ;
}
if ( element . parentNode && $ ( element . parentNode ) . hasClass ( ClassName$8 . DROPDOWN _MENU ) ) {
const dropdownElement = $ ( element ) . closest ( Selector$8 . DROPDOWN ) [ 0 ] ;
2018-01-23 17:40:57 +03:00
if ( dropdownElement ) {
2019-10-04 16:46:05 +03:00
const dropdownToggleList = [ ] . slice . call ( dropdownElement . querySelectorAll ( Selector$8 . DROPDOWN _TOGGLE ) ) ;
$ ( dropdownToggleList ) . addClass ( ClassName$8 . ACTIVE ) ;
2018-01-23 17:40:57 +03:00
}
element . setAttribute ( 'aria-expanded' , true ) ;
}
if ( callback ) {
callback ( ) ;
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
// Static
2018-01-23 17:40:57 +03:00
2019-10-04 16:46:05 +03:00
static _jQueryInterface ( config ) {
2018-01-23 17:40:57 +03:00
return this . each ( function ( ) {
2019-10-04 16:46:05 +03:00
const $this = $ ( this ) ;
let data = $this . data ( DATA _KEY$8 ) ;
2018-01-23 17:40:57 +03:00
if ( ! data ) {
data = new Tab ( this ) ;
2019-10-04 16:46:05 +03:00
$this . data ( DATA _KEY$8 , data ) ;
2018-01-23 17:40:57 +03:00
}
if ( typeof config === 'string' ) {
if ( typeof data [ config ] === 'undefined' ) {
2019-10-04 16:46:05 +03:00
throw new TypeError ( ` No method named " ${ config } " ` )
2018-01-23 17:40:57 +03:00
}
data [ config ] ( ) ;
}
2019-10-04 16:46:05 +03:00
} )
}
}
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ ( document )
. on ( Event$8 . CLICK _DATA _API , Selector$8 . DATA _TOGGLE , function ( event ) {
event . preventDefault ( ) ;
Tab . _jQueryInterface . call ( $ ( this ) , 'show' ) ;
} ) ;
2018-01-23 17:40:57 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
$ . fn [ NAME$8 ] = Tab . _jQueryInterface ;
$ . fn [ NAME$8 ] . Constructor = Tab ;
$ . fn [ NAME$8 ] . noConflict = ( ) => {
$ . fn [ NAME$8 ] = JQUERY _NO _CONFLICT$8 ;
return Tab . _jQueryInterface
2017-12-17 22:35:02 +03:00
} ;
2019-10-04 16:46:05 +03: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 ) ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function _createClass ( Constructor , protoProps , staticProps ) {
if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ;
if ( staticProps ) _defineProperties ( Constructor , staticProps ) ;
return Constructor ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function _inheritsLoose ( subClass , superClass ) {
subClass . prototype = Object . create ( superClass . prototype ) ;
subClass . prototype . constructor = subClass ;
subClass . _ _proto _ _ = superClass ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
var Util$1 = function ( ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Private TransitionEnd Helpers
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var transitionEnd = false ;
var _transitionEndSelector = "" ;
var TransitionEndEvent = {
WebkitTransition : "webkitTransitionEnd" ,
MozTransition : "transitionend" ,
OTransition : "oTransitionEnd otransitionend" ,
transition : "transitionend"
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function transitionEndTest ( ) {
if ( window . QUnit ) {
return false ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var el = document . createElement ( "bmd" ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
for ( var name in TransitionEndEvent ) {
if ( el . style [ name ] !== undefined ) {
return TransitionEndEvent [ name ] ; // { end: TransitionEndEvent[name] }
}
2017-12-17 22:35:02 +03:00
}
2018-01-23 15:38:38 +03:00
2017-12-17 22:35:02 +03:00
return false ;
2019-10-04 16:46:05 +03:00
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
function setTransitionEndSupport ( ) {
transitionEnd = transitionEndTest ( ) ; // generate a concatenated transition end event selector
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
for ( var name in TransitionEndEvent ) {
_transitionEndSelector += " " + TransitionEndEvent [ name ] ;
2017-12-17 22:35:02 +03:00
}
}
/ * *
2019-10-04 16:46:05 +03:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Public Util Api
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2017-12-17 22:35:02 +03:00
* /
2019-10-04 16:46:05 +03:00
var Util = {
transitionEndSupported : function transitionEndSupported ( ) {
return transitionEnd ;
} ,
transitionEndSelector : function transitionEndSelector ( ) {
return _transitionEndSelector ;
} ,
isChar : function isChar ( event ) {
if ( typeof event . which === "undefined" ) {
return true ;
} else if ( typeof event . which === "number" && event . which > 0 ) {
return ! event . ctrlKey && ! event . metaKey && ! event . altKey && event . which !== 8 && // backspace
event . which !== 9 && // tab
event . which !== 13 && // enter
event . which !== 16 && // shift
event . which !== 17 && // ctrl
event . which !== 20 && // caps lock
event . which !== 27 // escape
;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return false ;
} ,
assert : function assert ( $element , invalidTest , message ) {
if ( invalidTest ) {
if ( ! $element === undefined ) {
$element . css ( "border" , "1px solid red" ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
console . error ( message , $element ) ; // eslint-disable-line no-console
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
throw message ;
}
} ,
describe : function describe ( $element ) {
if ( $element === undefined ) {
return "undefined" ;
} else if ( $element . length === 0 ) {
return "(no matching elements)" ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return $element [ 0 ] . outerHTML . split ( ">" ) [ 0 ] + ">" ;
2017-12-17 22:35:02 +03:00
}
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
setTransitionEndSupport ( ) ;
return Util ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Base = function ( $ ) {
var ClassName = {
BMD _FORM _GROUP : "bmd-form-group" ,
IS _FILLED : "is-filled" ,
IS _FOCUSED : "is-focused"
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
var Selector = {
BMD _FORM _GROUP : "." + ClassName . BMD _FORM _GROUP
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
var Default = { } ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Base =
/*#__PURE__*/
function ( ) {
/ * *
*
* @ param element
* @ param config
* @ param properties - anything that needs to be set as this [ key ] = value . Works around the need to call ` super ` before using ` this `
* /
function Base ( $element , config , properties ) {
if ( properties === void 0 ) {
properties = { } ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $element = $element ;
this . config = $ . extend ( true , { } , Default , config ) ; // set properties for use in the constructor initialization
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
for ( var key in properties ) {
this [ key ] = properties [ key ] ;
}
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
var _proto = Base . prototype ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( dataKey ) {
this . $element . data ( dataKey , null ) ;
this . $element = null ;
this . config = null ;
} // ------------------------------------------------------------------------
// protected
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . addFormGroupFocus = function addFormGroupFocus ( ) {
if ( ! this . $element . prop ( "disabled" ) ) {
this . $bmdFormGroup . addClass ( ClassName . IS _FOCUSED ) ;
}
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . removeFormGroupFocus = function removeFormGroupFocus ( ) {
this . $bmdFormGroup . removeClass ( ClassName . IS _FOCUSED ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . removeIsFilled = function removeIsFilled ( ) {
this . $bmdFormGroup . removeClass ( ClassName . IS _FILLED ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . addIsFilled = function addIsFilled ( ) {
this . $bmdFormGroup . addClass ( ClassName . IS _FILLED ) ;
} // Find bmd-form-group
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . findMdbFormGroup = function findMdbFormGroup ( raiseError ) {
if ( raiseError === void 0 ) {
raiseError = true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var mfg = this . $element . closest ( Selector . BMD _FORM _GROUP ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( mfg . length === 0 && raiseError ) {
$ . error ( "Failed to find " + Selector . BMD _FORM _GROUP + " for " + Util$1 . describe ( this . $element ) ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return mfg ;
} // ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Base ;
} ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Base ;
} ( jQuery ) ;
var BaseInput = function ( $ ) {
var ClassName = {
FORM _GROUP : "form-group" ,
BMD _FORM _GROUP : "bmd-form-group" ,
BMD _LABEL : "bmd-label" ,
BMD _LABEL _STATIC : "bmd-label-static" ,
BMD _LABEL _PLACEHOLDER : "bmd-label-placeholder" ,
BMD _LABEL _FLOATING : "bmd-label-floating" ,
HAS _DANGER : "has-danger" ,
IS _FILLED : "is-filled" ,
IS _FOCUSED : "is-focused" ,
INPUT _GROUP : "input-group"
} ;
var Selector = {
FORM _GROUP : "." + ClassName . FORM _GROUP ,
BMD _FORM _GROUP : "." + ClassName . BMD _FORM _GROUP ,
BMD _LABEL _WILDCARD : "label[class^='" + ClassName . BMD _LABEL + "'], label[class*=' " + ClassName . BMD _LABEL + "']" // match any label variant if specified
} ;
var Default = {
validate : false ,
formGroup : {
required : false
} ,
bmdFormGroup : {
template : "<span class='" + ClassName . BMD _FORM _GROUP + "'></span>" ,
create : true ,
// create a wrapper if form-group not found
required : true // not recommended to turn this off, only used for inline components
} ,
label : {
required : false ,
// Prioritized find order for resolving the label to be used as an bmd-label if not specified in the markup
// - a function(thisComponent); or
// - a string selector used like $bmdFormGroup.find(selector)
//
// Note this only runs if $bmdFormGroup.find(Selector.BMD_LABEL_WILDCARD) fails to find a label (as authored in the markup)
//
selectors : [ ".form-control-label" , // in the case of horizontal or inline forms, this will be marked
"> label" // usual case for text inputs, first child. Deeper would find toggle labels so don't do that.
] ,
className : ClassName . BMD _LABEL _STATIC
} ,
requiredClasses : [ ] ,
invalidComponentMatches : [ ] ,
convertInputSizeVariations : true
} ;
var FormControlSizeMarkers = {
"form-control-lg" : "bmd-form-group-lg" ,
"form-control-sm" : "bmd-form-group-sm"
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var BaseInput =
/*#__PURE__*/
function ( _Base ) {
_inheritsLoose ( BaseInput , _Base ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
/ * *
*
* @ param element
* @ param config
* @ param properties - anything that needs to be set as this [ key ] = value . Works around the need to call ` super ` before using ` this `
* /
function BaseInput ( $element , config , properties ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( properties === void 0 ) {
properties = { } ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _Base . call ( this , $element , $ . extend ( true , { } , Default , config ) , properties ) || this ; // Enforce no overlap between components to prevent side effects
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this . _rejectInvalidComponentMatches ( ) ; // Enforce expected structure (if any)
2017-12-17 22:35:02 +03:00
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this . rejectWithoutRequiredStructure ( ) ; // Enforce required classes for a consistent rendering
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . _rejectWithoutRequiredClasses ( ) ; // Resolve the form-group first, it will be used for bmd-form-group if possible
// note: different components have different rules
2018-01-23 15:38:38 +03:00
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . $formGroup = _this . findFormGroup ( _this . config . formGroup . required ) ; // Will add bmd-form-group to form-group or create an bmd-form-group
// Performance Note: for those forms that are really performance driven, create the markup with the .bmd-form-group to avoid
// rendering changes once added.
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this . $bmdFormGroup = _this . resolveMdbFormGroup ( ) ; // Resolve and mark the bmdLabel if necessary as defined by the config
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . $bmdLabel = _this . resolveMdbLabel ( ) ; // Signal to the bmd-form-group that a form-control-* variation is being used
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . resolveMdbFormGroupSizing ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . addFocusListener ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . addChangeListener ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( _this . $element . val ( ) != "" ) {
_this . addIsFilled ( ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = BaseInput . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( dataKey ) {
_Base . prototype . dispose . call ( this , dataKey ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $bmdFormGroup = null ;
this . $formGroup = null ;
} // ------------------------------------------------------------------------
// protected
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . rejectWithoutRequiredStructure = function rejectWithoutRequiredStructure ( ) { // implement
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . addFocusListener = function addFocusListener ( ) {
var _this2 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $element . on ( "focus" , function ( ) {
_this2 . addFormGroupFocus ( ) ;
} ) . on ( "blur" , function ( ) {
_this2 . removeFormGroupFocus ( ) ;
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . addChangeListener = function addChangeListener ( ) {
var _this3 = this ;
this . $element . on ( "keydown paste" , function ( event ) {
if ( Util$1 . isChar ( event ) ) {
_this3 . addIsFilled ( ) ;
}
} ) . on ( "keyup change" , function ( ) {
// make sure empty is added back when there is a programmatic value change.
// NOTE: programmatic changing of value using $.val() must trigger the change event i.e. $.val('x').trigger('change')
if ( _this3 . isEmpty ( ) ) {
_this3 . removeIsFilled ( ) ;
} else {
_this3 . addIsFilled ( ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( _this3 . config . validate ) {
// Validation events do not bubble, so they must be attached directly to the text: http://jsfiddle.net/PEpRM/1/
// Further, even the bind method is being caught, but since we are already calling #checkValidity here, just alter
// the form-group on change.
//
// NOTE: I'm not sure we should be intervening regarding validation, this seems better as a README and snippet of code.
// BUT, I've left it here for backwards compatibility.
var isValid = typeof _this3 . $element [ 0 ] . checkValidity === "undefined" || _this3 . $element [ 0 ] . checkValidity ( ) ;
if ( isValid ) {
_this3 . removeHasDanger ( ) ;
} else {
_this3 . addHasDanger ( ) ;
}
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . addHasDanger = function addHasDanger ( ) {
this . $bmdFormGroup . addClass ( ClassName . HAS _DANGER ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . removeHasDanger = function removeHasDanger ( ) {
this . $bmdFormGroup . removeClass ( ClassName . HAS _DANGER ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . isEmpty = function isEmpty ( ) {
return this . $element . val ( ) === null || this . $element . val ( ) === undefined || this . $element . val ( ) === "" ;
} // Will add bmd-form-group to form-group or create a bmd-form-group if necessary
;
_proto . resolveMdbFormGroup = function resolveMdbFormGroup ( ) {
var mfg = this . findMdbFormGroup ( false ) ;
if ( mfg === undefined || mfg . length === 0 ) {
if ( this . config . bmdFormGroup . create && ( this . $formGroup === undefined || this . $formGroup . length === 0 ) ) {
// If a form-group doesn't exist (not recommended), take a guess and wrap the element (assuming no label).
// note: it's possible to make this smarter, but I need to see valid cases before adding any complexity.
// this may be an input-group, wrap that instead
if ( this . outerElement ( ) . parent ( ) . hasClass ( ClassName . INPUT _GROUP ) ) {
this . outerElement ( ) . parent ( ) . wrap ( this . config . bmdFormGroup . template ) ;
} else {
this . outerElement ( ) . wrap ( this . config . bmdFormGroup . template ) ;
}
2017-12-17 22:35:02 +03:00
} else {
2019-10-04 16:46:05 +03:00
// a form-group does exist, add our marker class to it
this . $formGroup . addClass ( ClassName . BMD _FORM _GROUP ) ; // OLD: may want to implement this after all, see how the styling turns out, but using an existing form-group is less manipulation of the dom and therefore preferable
// A form-group does exist, so add an bmd-form-group wrapping it's internal contents
//fg.wrapInner(this.config.bmdFormGroup.template)
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
mfg = this . findMdbFormGroup ( this . config . bmdFormGroup . required ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return mfg ;
} // Demarcation element (e.g. first child of a form-group)
// Subclasses such as file inputs may have different structures
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . outerElement = function outerElement ( ) {
return this . $element ;
} // Will add bmd-label to bmd-form-group if not already specified
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . resolveMdbLabel = function resolveMdbLabel ( ) {
var label = this . $bmdFormGroup . find ( Selector . BMD _LABEL _WILDCARD ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( label === undefined || label . length === 0 ) {
// we need to find it based on the configured selectors
label = this . findMdbLabel ( this . config . label . required ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( label === undefined || label . length === 0 ) ; else {
// a candidate label was found, add the configured default class name
label . addClass ( this . config . label . className ) ;
}
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
return label ;
} // Find bmd-label variant based on the config selectors
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . findMdbLabel = function findMdbLabel ( raiseError ) {
if ( raiseError === void 0 ) {
raiseError = true ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var label = null ; // use the specified selector order
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
for ( var _iterator = this . config . label . selectors , _isArray = Array . isArray ( _iterator ) , _i = 0 , _iterator = _isArray ? _iterator : _iterator [ Symbol . iterator ] ( ) ; ; ) {
var _ref ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( _isArray ) {
if ( _i >= _iterator . length ) break ;
_ref = _iterator [ _i ++ ] ;
} else {
_i = _iterator . next ( ) ;
if ( _i . done ) break ;
_ref = _i . value ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var selector = _ref ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( $ . isFunction ( selector ) ) {
label = selector ( this ) ;
} else {
label = this . $bmdFormGroup . find ( selector ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( label !== undefined && label . length > 0 ) {
break ;
}
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
if ( label . length === 0 && raiseError ) {
$ . error ( "Failed to find " + Selector . BMD _LABEL _WILDCARD + " within form-group for " + Util$1 . describe ( this . $element ) ) ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
return label ;
} // Find bmd-form-group
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . findFormGroup = function findFormGroup ( raiseError ) {
if ( raiseError === void 0 ) {
raiseError = true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var fg = this . $element . closest ( Selector . FORM _GROUP ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( fg . length === 0 && raiseError ) {
$ . error ( "Failed to find " + Selector . FORM _GROUP + " for " + Util$1 . describe ( this . $element ) ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return fg ;
} // Due to the interconnected nature of labels/inputs/help-blocks, signal the bmd-form-group-* size variation based on
// a found form-control-* size
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . resolveMdbFormGroupSizing = function resolveMdbFormGroupSizing ( ) {
if ( ! this . config . convertInputSizeVariations ) {
return ;
} // Modification - Change text-sm/lg to form-group-sm/lg instead (preferred standard and simpler css/less variants)
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
for ( var inputSize in FormControlSizeMarkers ) {
if ( this . $element . hasClass ( inputSize ) ) {
//this.$element.removeClass(inputSize)
this . $bmdFormGroup . addClass ( FormControlSizeMarkers [ inputSize ] ) ;
}
}
} // ------------------------------------------------------------------------
// private
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . _rejectInvalidComponentMatches = function _rejectInvalidComponentMatches ( ) {
for ( var _iterator2 = this . config . invalidComponentMatches , _isArray2 = Array . isArray ( _iterator2 ) , _i2 = 0 , _iterator2 = _isArray2 ? _iterator2 : _iterator2 [ Symbol . iterator ] ( ) ; ; ) {
var _ref2 ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( _isArray2 ) {
if ( _i2 >= _iterator2 . length ) break ;
_ref2 = _iterator2 [ _i2 ++ ] ;
} else {
_i2 = _iterator2 . next ( ) ;
if ( _i2 . done ) break ;
_ref2 = _i2 . value ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var otherComponent = _ref2 ;
otherComponent . rejectMatch ( this . constructor . name , this . $element ) ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . _rejectWithoutRequiredClasses = function _rejectWithoutRequiredClasses ( ) {
for ( var _iterator3 = this . config . requiredClasses , _isArray3 = Array . isArray ( _iterator3 ) , _i3 = 0 , _iterator3 = _isArray3 ? _iterator3 : _iterator3 [ Symbol . iterator ] ( ) ; ; ) {
var _ref3 ;
if ( _isArray3 ) {
if ( _i3 >= _iterator3 . length ) break ;
_ref3 = _iterator3 [ _i3 ++ ] ;
} else {
_i3 = _iterator3 . next ( ) ;
if ( _i3 . done ) break ;
_ref3 = _i3 . value ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var requiredClass = _ref3 ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( requiredClass . indexOf ( "||" ) !== - 1 ) {
var oneOf = requiredClass . split ( "||" ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
for ( var _iterator4 = oneOf , _isArray4 = Array . isArray ( _iterator4 ) , _i4 = 0 , _iterator4 = _isArray4 ? _iterator4 : _iterator4 [ Symbol . iterator ] ( ) ; ; ) {
var _ref4 ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( _isArray4 ) {
if ( _i4 >= _iterator4 . length ) break ;
_ref4 = _iterator4 [ _i4 ++ ] ;
} else {
_i4 = _iterator4 . next ( ) ;
if ( _i4 . done ) break ;
_ref4 = _i4 . value ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _requiredClass = _ref4 ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( this . $element . hasClass ( _requiredClass ) ) {
break ;
}
}
} else if ( this . $element . hasClass ( requiredClass ) ) ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
} // ------------------------------------------------------------------------
// static
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return BaseInput ;
} ( Base ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return BaseInput ;
} ( jQuery ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var BaseSelection = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var Default = {
label : {
required : false // Prioritized find order for resolving the label to be used as an bmd-label if not specified in the markup
// - a function(thisComponent); or
// - a string selector used like $bmdFormGroup.find(selector)
//
// Note this only runs if $bmdFormGroup.find(Selector.BMD_LABEL_WILDCARD) fails to find a label (as authored in the markup)
//
//selectors: [
// `.form-control-label`, // in the case of horizontal or inline forms, this will be marked
// `> label` // usual case for text inputs
//]
2018-01-23 15:38:38 +03:00
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
} ;
var Selector = {
LABEL : "label"
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var BaseSelection =
/*#__PURE__*/
function ( _BaseInput ) {
_inheritsLoose ( BaseSelection , _BaseInput ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function BaseSelection ( $element , config , properties ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
// properties = {inputType: checkbox, outerClass: checkbox-inline}
// '.checkbox|switch|radio > label > input[type=checkbox|radio]'
// '.${this.outerClass} > label > input[type=${this.inputType}]'
_this = _BaseInput . call ( this , $element , $ . extend ( true , { } , Default , config ) , properties ) || this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . decorateMarkup ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
} // ------------------------------------------------------------------------
// protected
2017-12-17 22:35:02 +03:00
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _proto = BaseSelection . prototype ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . decorateMarkup = function decorateMarkup ( ) {
var $decorator = $ ( this . config . template ) ;
this . $element . after ( $decorator ) ; // initialize ripples after decorator has been inserted into DOM
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( this . config . ripples !== false ) {
$decorator . bmdRipples ( ) ;
}
} // Demarcation element (e.g. first child of a form-group)
;
_proto . outerElement = function outerElement ( ) {
// .checkbox|switch|radio > label > input[type=checkbox|radio]
// label.checkbox-inline > input[type=checkbox|radio]
// .${this.outerClass} > label > input[type=${this.inputType}]
return this . $element . parent ( ) . closest ( "." + this . outerClass ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . rejectWithoutRequiredStructure = function rejectWithoutRequiredStructure ( ) {
// '.checkbox|switch|radio > label > input[type=checkbox|radio]'
// '.${this.outerClass} > label > input[type=${this.inputType}]'
Util$1 . assert ( this . $element , ! this . $element . parent ( ) . prop ( "tagName" ) === "label" , this . constructor . name + "'s " + Util$1 . describe ( this . $element ) + " parent element should be <label>." ) ;
Util$1 . assert ( this . $element , ! this . outerElement ( ) . hasClass ( this . outerClass ) , this . constructor . name + "'s " + Util$1 . describe ( this . $element ) + " outer element should have class " + this . outerClass + "." ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . addFocusListener = function addFocusListener ( ) {
var _this2 = this ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
// checkboxes didn't appear to bubble to the document, so we'll bind these directly
this . $element . closest ( Selector . LABEL ) . hover ( function ( ) {
_this2 . addFormGroupFocus ( ) ;
} , function ( ) {
_this2 . removeFormGroupFocus ( ) ;
} ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . addChangeListener = function addChangeListener ( ) {
var _this3 = this ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $element . change ( function ( ) {
_this3 . $element . blur ( ) ;
} ) ;
} // ------------------------------------------------------------------------
// private
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return BaseSelection ;
} ( BaseInput ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return BaseSelection ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Checkbox = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "checkbox" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = {
template : "<span class='checkbox-decorator'><span class='check'></span></span>"
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Checkbox =
/*#__PURE__*/
function ( _BaseSelection ) {
_inheritsLoose ( Checkbox , _BaseSelection ) ;
function Checkbox ( $element , config , properties ) {
if ( properties === void 0 ) {
properties = {
inputType : NAME ,
outerClass : NAME
} ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _BaseSelection . call ( this , $element , $ . extend ( true , //{invalidComponentMatches: [File, Radio, Text, Textarea, Select]},
Default , config ) , properties ) || this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Checkbox . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( dataKey ) {
if ( dataKey === void 0 ) {
dataKey = DATA _KEY ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_BaseSelection . prototype . dispose . call ( this , dataKey ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Checkbox . matches = function matches ( $element ) {
// '.checkbox > label > input[type=checkbox]'
if ( $element . attr ( "type" ) === "checkbox" ) {
return true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return false ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Checkbox . rejectMatch = function rejectMatch ( component , $element ) {
Util$1 . assert ( this . $element , this . matches ( $element ) , component + " component element " + Util$1 . describe ( $element ) + " is invalid for type='checkbox'." ) ;
} // ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
Checkbox . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Checkbox ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return Checkbox ;
} ( BaseSelection ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Checkbox . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Checkbox ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Checkbox . _jQueryInterface ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Checkbox ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var CheckboxInline = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "checkboxInline" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = {
bmdFormGroup : {
create : false ,
// no bmd-form-group creation if form-group not present. It messes with the layout.
required : false
2017-12-17 22:35:02 +03:00
}
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var CheckboxInline =
/*#__PURE__*/
function ( _Checkbox ) {
_inheritsLoose ( CheckboxInline , _Checkbox ) ;
function CheckboxInline ( $element , config , properties ) {
if ( properties === void 0 ) {
properties = {
inputType : "checkbox" ,
outerClass : "checkbox-inline"
} ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _Checkbox . call ( this , $element , $ . extend ( true , { } , Default , config ) , properties ) || this ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _proto = CheckboxInline . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_Checkbox . prototype . dispose . call ( this , DATA _KEY ) ;
} //static matches($element) {
// // '.checkbox-inline > input[type=checkbox]'
// if ($element.attr('type') === 'checkbox') {
// return true
// }
// return false
//}
//
//static rejectMatch(component, $element) {
// Util.assert(this.$element, this.matches($element), `${component} component element ${Util.describe($element)} is invalid for type='checkbox'.`)
//}
// ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
CheckboxInline . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new CheckboxInline ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return CheckboxInline ;
} ( Checkbox ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = CheckboxInline . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = CheckboxInline ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return CheckboxInline . _jQueryInterface ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return CheckboxInline ;
} ( jQuery ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var CollapseInline = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "collapseInline" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Selector = {
ANY _INPUT : "input, select, textarea"
} ;
var ClassName = {
IN : "in" ,
COLLAPSE : "collapse" ,
COLLAPSING : "collapsing" ,
COLLAPSED : "collapsed" ,
WIDTH : "width"
} ;
var Default = { } ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var CollapseInline =
/*#__PURE__*/
function ( _Base ) {
_inheritsLoose ( CollapseInline , _Base ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
// $element is expected to be the trigger
// i.e. <button class="btn bmd-btn-icon" for="search" data-toggle="collapse" data-target="#search-field" aria-expanded="false" aria-controls="search-field">
function CollapseInline ( $element , config ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _Base . call ( this , $element , $ . extend ( true , { } , Default , config ) ) || this ;
_this . $bmdFormGroup = _this . findMdbFormGroup ( true ) ;
var collapseSelector = $element . data ( "target" ) ;
_this . $collapse = $ ( collapseSelector ) ;
Util$1 . assert ( $element , _this . $collapse . length === 0 , "Cannot find collapse target for " + Util$1 . describe ( $element ) ) ;
Util$1 . assert ( _this . $collapse , ! _this . $collapse . hasClass ( ClassName . COLLAPSE ) , Util$1 . describe ( _this . $collapse ) + " is expected to have the '" + ClassName . COLLAPSE + "' class. It is being targeted by " + Util$1 . describe ( $element ) ) ; // find the first input for focusing
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var $inputs = _this . $bmdFormGroup . find ( Selector . ANY _INPUT ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( $inputs . length > 0 ) {
_this . $input = $inputs . first ( ) ;
} // automatically add the marker class to collapse width instead of height - nice convenience because it is easily forgotten
2017-12-17 22:35:02 +03:00
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! _this . $collapse . hasClass ( ClassName . WIDTH ) ) {
_this . $collapse . addClass ( ClassName . WIDTH ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( _this . $input ) {
// add a listener to set focus
_this . $collapse . on ( "shown.bs.collapse" , function ( ) {
_this . $input . focus ( ) ;
} ) ; // add a listener to collapse field
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . $input . blur ( function ( ) {
_this . $collapse . collapse ( "hide" ) ;
} ) ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = CollapseInline . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_Base . prototype . dispose . call ( this , DATA _KEY ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $bmdFormGroup = null ;
this . $collapse = null ;
this . $input = null ;
} // ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
CollapseInline . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( ! data ) {
data = new CollapseInline ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
2017-12-17 22:35:02 +03:00
} ) ;
2019-10-04 16:46:05 +03:00
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return CollapseInline ;
} ( Base ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = CollapseInline . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = CollapseInline ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return CollapseInline . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2017-12-17 22:35:02 +03:00
return CollapseInline ;
2019-10-04 16:46:05 +03:00
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var File = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "file" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = { } ;
var ClassName = {
FILE : NAME ,
IS _FILE : "is-file"
} ;
var Selector = {
FILENAMES : "input.form-control[readonly]"
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var File =
/*#__PURE__*/
function ( _BaseInput ) {
_inheritsLoose ( File , _BaseInput ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
function File ( $element , config ) {
var _this ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this = _BaseInput . call ( this , $element , $ . extend ( true , //{invalidComponentMatches: [Checkbox, Radio, Text, Textarea, Select, Switch]},
Default , config ) ) || this ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this . $bmdFormGroup . addClass ( ClassName . IS _FILE ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _proto = File . prototype ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_BaseInput . prototype . dispose . call ( this , DATA _KEY ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
File . matches = function matches ( $element ) {
if ( $element . attr ( "type" ) === "file" ) {
return true ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
return false ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
File . rejectMatch = function rejectMatch ( component , $element ) {
Util$1 . assert ( this . $element , this . matches ( $element ) , component + " component element " + Util$1 . describe ( $element ) + " is invalid for type='file'." ) ;
} // ------------------------------------------------------------------------
// protected
// Demarcation element (e.g. first child of a form-group)
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . outerElement = function outerElement ( ) {
// label.file > input[type=file]
return this . $element . parent ( ) . closest ( "." + ClassName . FILE ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . rejectWithoutRequiredStructure = function rejectWithoutRequiredStructure ( ) {
// label.file > input[type=file]
Util$1 . assert ( this . $element , ! this . outerElement ( ) . prop ( "tagName" ) === "label" , this . constructor . name + "'s " + Util$1 . describe ( this . $element ) + " parent element " + Util$1 . describe ( this . outerElement ( ) ) + " should be <label>." ) ;
Util$1 . assert ( this . $element , ! this . outerElement ( ) . hasClass ( ClassName . FILE ) , this . constructor . name + "'s " + Util$1 . describe ( this . $element ) + " parent element " + Util$1 . describe ( this . outerElement ( ) ) + " should have class ." + ClassName . FILE + "." ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . addFocusListener = function addFocusListener ( ) {
var _this2 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $bmdFormGroup . on ( "focus" , function ( ) {
_this2 . addFormGroupFocus ( ) ;
} ) . on ( "blur" , function ( ) {
_this2 . removeFormGroupFocus ( ) ;
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . addChangeListener = function addChangeListener ( ) {
var _this3 = this ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
// set the fileinput readonly field with the name of the file
this . $element . on ( "change" , function ( ) {
var value = "" ;
$ . each ( _this3 . $element . files , function ( i , file ) {
value += file . name + " , " ;
} ) ;
value = value . substring ( 0 , value . length - 2 ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( value ) {
_this3 . addIsFilled ( ) ;
} else {
_this3 . removeIsFilled ( ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this3 . $bmdFormGroup . find ( Selector . FILENAMES ) . val ( value ) ;
} ) ;
} // ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
File . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new File ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return File ;
} ( BaseInput ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = File . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = File ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return File . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
return File ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Radio = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "radio" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = {
template : "<span class='bmd-radio'></span>"
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Radio =
/*#__PURE__*/
function ( _BaseSelection ) {
_inheritsLoose ( Radio , _BaseSelection ) ;
function Radio ( $element , config , properties ) {
if ( properties === void 0 ) {
properties = {
inputType : NAME ,
outerClass : NAME
} ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _BaseSelection . call ( this , $element , $ . extend ( true , //{invalidComponentMatches: [Checkbox, File, Switch, Text]},
Default , config ) , properties ) || this ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
var _proto = Radio . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( dataKey ) {
if ( dataKey === void 0 ) {
dataKey = DATA _KEY ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
_BaseSelection . prototype . dispose . call ( this , dataKey ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
Radio . matches = function matches ( $element ) {
// '.radio > label > input[type=radio]'
if ( $element . attr ( "type" ) === "radio" ) {
return true ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return false ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Radio . rejectMatch = function rejectMatch ( component , $element ) {
Util$1 . assert ( this . $element , this . matches ( $element ) , component + " component element " + Util$1 . describe ( $element ) + " is invalid for type='radio'." ) ;
} // ------------------------------------------------------------------------
// protected
//decorateMarkup() {
// this.$element.after(this.config.template)
//}
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
Radio . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Radio ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Radio ;
} ( BaseSelection ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Radio . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Radio ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Radio . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Radio ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var RadioInline = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "radioInline" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = {
bmdFormGroup : {
create : false ,
// no bmd-form-group creation if form-group not present. It messes with the layout.
required : false
}
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var RadioInline =
/*#__PURE__*/
function ( _Radio ) {
_inheritsLoose ( RadioInline , _Radio ) ;
function RadioInline ( $element , config , properties ) {
if ( properties === void 0 ) {
properties = {
inputType : "radio" ,
outerClass : "radio-inline"
} ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return _Radio . call ( this , $element , $ . extend ( true , { } , Default , config ) , properties ) || this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = RadioInline . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_Radio . prototype . dispose . call ( this , DATA _KEY ) ;
} // ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
RadioInline . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( ! data ) {
data = new RadioInline ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return RadioInline ;
} ( Radio ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = RadioInline . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = RadioInline ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return RadioInline . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
return RadioInline ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var BaseFormControl = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var Default = {
requiredClasses : [ "form-control" ]
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var BaseFormControl =
/*#__PURE__*/
function ( _BaseInput ) {
_inheritsLoose ( BaseFormControl , _BaseInput ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function BaseFormControl ( $element , config ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _BaseInput . call ( this , $element , $ . extend ( true , Default , config ) ) || this ; // Initially mark as empty
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( _this . isEmpty ( ) ) {
_this . removeIsFilled ( ) ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return BaseFormControl ;
} ( BaseInput ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return BaseFormControl ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Select = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "select" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = {
requiredClasses : [ "form-control||custom-select" ]
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Select =
/*#__PURE__*/
function ( _BaseFormControl ) {
_inheritsLoose ( Select , _BaseFormControl ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
function Select ( $element , config ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _BaseFormControl . call ( this , $element , $ . extend ( true , //{invalidComponentMatches: [Checkbox, File, Radio, Switch, Text, Textarea]},
Default , config ) ) || this ; // floating labels will cover the options, so trigger them to be above (if used)
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . addIsFilled ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Select . prototype ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_BaseFormControl . prototype . dispose . call ( this , DATA _KEY ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Select . matches = function matches ( $element ) {
if ( $element . prop ( "tagName" ) === "select" ) {
return true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return false ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Select . rejectMatch = function rejectMatch ( component , $element ) {
Util$1 . assert ( this . $element , this . matches ( $element ) , component + " component element " + Util$1 . describe ( $element ) + " is invalid for <select>." ) ;
} // ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
Select . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Select ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Select ;
} ( BaseFormControl ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Select . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Select ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Select . _jQueryInterface ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Select ;
} ( jQuery ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var Switch = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "switch" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = {
template : "<span class='bmd-switch-track'></span>"
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Switch =
/*#__PURE__*/
function ( _Checkbox ) {
_inheritsLoose ( Switch , _Checkbox ) ;
function Switch ( $element , config , properties ) {
if ( properties === void 0 ) {
properties = {
inputType : "checkbox" ,
outerClass : "switch"
} ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _Checkbox . call ( this , $element , $ . extend ( true , { } , Default , config ) , properties ) || this ; // selector: '.switch > label > input[type=checkbox]'
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Switch . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_Checkbox . prototype . dispose . call ( this , DATA _KEY ) ;
} // ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Switch . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! data ) {
data = new Switch ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return Switch ;
} ( Checkbox ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Switch . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Switch ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Switch . _jQueryInterface ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return Switch ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Text = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "text" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = { } ;
2017-12-17 22:35:02 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2019-10-04 16:46:05 +03:00
var Text =
/*#__PURE__*/
function ( _BaseFormControl ) {
_inheritsLoose ( Text , _BaseFormControl ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function Text ( $element , config ) {
return _BaseFormControl . call ( this , $element , $ . extend ( true , //{invalidComponentMatches: [Checkbox, File, Radio, Switch, Select, Textarea]},
Default , config ) ) || this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Text . prototype ;
_proto . dispose = function dispose ( dataKey ) {
if ( dataKey === void 0 ) {
dataKey = DATA _KEY ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_BaseFormControl . prototype . dispose . call ( this , dataKey ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Text . matches = function matches ( $element ) {
if ( $element . attr ( "type" ) === "text" ) {
return true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return false ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Text . rejectMatch = function rejectMatch ( component , $element ) {
Util$1 . assert ( this . $element , this . matches ( $element ) , component + " component element " + Util$1 . describe ( $element ) + " is invalid for type='text'." ) ;
} // ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
Text . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Text ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Text ;
} ( BaseFormControl ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Text . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Text ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Text . _jQueryInterface ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Text ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Textarea = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "textarea" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Default = { } ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Textarea =
/*#__PURE__*/
function ( _BaseFormControl ) {
_inheritsLoose ( Textarea , _BaseFormControl ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function Textarea ( $element , config ) {
return _BaseFormControl . call ( this , $element , $ . extend ( true , //{invalidComponentMatches: [Checkbox, File, Radio, Text, Select, Switch]},
Default , config ) ) || this ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Textarea . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_BaseFormControl . prototype . dispose . call ( this , DATA _KEY ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Textarea . matches = function matches ( $element ) {
if ( $element . prop ( "tagName" ) === "textarea" ) {
return true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return false ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
Textarea . rejectMatch = function rejectMatch ( component , $element ) {
Util$1 . assert ( this . $element , this . matches ( $element ) , component + " component element " + Util$1 . describe ( $element ) + " is invalid for <textarea>." ) ;
} // ------------------------------------------------------------------------
// protected
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
Textarea . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Textarea ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Textarea ;
} ( BaseFormControl ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Textarea . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Textarea ;
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Textarea . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Textarea ;
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Bootstrap ( v4 . 1.0 ) : dropdown . js
* Licensed under MIT ( https : //github.com/twbs/bootstrap/blob/master/LICENSE)
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var Dropdown = function ( $ ) {
/ * *
* Check for Popper dependency
* Popper - https : //popper.js.org
* /
if ( typeof Popper === 'undefined' ) {
throw new Error ( 'Bootstrap dropdown require Popper.js (https://popper.js.org)' ) ;
}
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var NAME = 'dropdown' ;
var VERSION = '4.1.0' ;
var DATA _KEY = 'bs.dropdown' ;
var EVENT _KEY = "." + DATA _KEY ;
var DATA _API _KEY = '.data-api' ;
var JQUERY _NO _CONFLICT = $ . fn [ NAME ] ;
var ESCAPE _KEYCODE = 27 ; // KeyboardEvent.which value for Escape (Esc) key
var SPACE _KEYCODE = 32 ; // KeyboardEvent.which value for space key
var TAB _KEYCODE = 9 ; // KeyboardEvent.which value for tab key
var ARROW _UP _KEYCODE = 38 ; // KeyboardEvent.which value for up arrow key
var ARROW _DOWN _KEYCODE = 40 ; // KeyboardEvent.which value for down arrow key
var RIGHT _MOUSE _BUTTON _WHICH = 3 ; // MouseEvent.which value for the right button (assuming a right-handed mouse)
var REGEXP _KEYDOWN = new RegExp ( ARROW _UP _KEYCODE + "|" + ARROW _DOWN _KEYCODE + "|" + ESCAPE _KEYCODE ) ;
var Event = {
HIDE : "hide" + EVENT _KEY ,
HIDDEN : "hidden" + EVENT _KEY ,
SHOW : "show" + EVENT _KEY ,
SHOWN : "shown" + EVENT _KEY ,
CLICK : "click" + EVENT _KEY ,
CLICK _DATA _API : "click" + EVENT _KEY + DATA _API _KEY ,
KEYDOWN _DATA _API : "keydown" + EVENT _KEY + DATA _API _KEY ,
KEYUP _DATA _API : "keyup" + EVENT _KEY + DATA _API _KEY ,
TRANSITION _END : 'transitionend webkitTransitionEnd oTransitionEnd animationend webkitAnimationEnd oAnimationEnd'
} ;
var ClassName = {
DISABLED : 'disabled' ,
SHOW : 'show' ,
SHOWING : 'showing' ,
HIDING : 'hiding' ,
DROPUP : 'dropup' ,
MENURIGHT : 'dropdown-menu-right' ,
MENULEFT : 'dropdown-menu-left'
} ;
var Selector = {
DATA _TOGGLE : '[data-toggle="dropdown"]' ,
FORM _CHILD : '.dropdown form' ,
MENU : '.dropdown-menu' ,
NAVBAR _NAV : '.navbar-nav' ,
VISIBLE _ITEMS : '.dropdown-menu .dropdown-item:not(.disabled)'
} ;
var AttachmentMap = {
TOP : 'top-start' ,
TOPEND : 'top-end' ,
BOTTOM : 'bottom-start' ,
BOTTOMEND : 'bottom-end'
} ;
var Default = {
placement : AttachmentMap . BOTTOM ,
offset : 0 ,
flip : true
} ;
var DefaultType = {
placement : 'string' ,
offset : '(number|string)' ,
flip : 'boolean'
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
var Dropdown =
/*#__PURE__*/
function ( ) {
function Dropdown ( element , config ) {
this . _element = element ;
this . _popper = null ;
this . _config = this . _getConfig ( config ) ;
this . _menu = this . _getMenuElement ( ) ;
this . _inNavbar = this . _detectNavbar ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . _addEventListeners ( ) ;
} // getters
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Dropdown . prototype ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
// public
_proto . toggle = function toggle ( ) {
var _this = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( this . _element . disabled || $ ( this . _element ) . hasClass ( ClassName . DISABLED ) ) {
return ;
}
var parent = Dropdown . _getParentFromElement ( this . _element ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var isActive = $ ( this . _menu ) . hasClass ( ClassName . SHOW ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
Dropdown . _clearMenus ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( isActive ) {
return ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
var relatedTarget = {
relatedTarget : this . _element
} ;
var showEvent = $ . Event ( Event . SHOW , relatedTarget ) ;
$ ( parent ) . trigger ( showEvent ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( showEvent . isDefaultPrevented ( ) ) {
return ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var element = this . _element ; // for dropup with alignment we use the parent as popper container
if ( $ ( parent ) . hasClass ( ClassName . DROPUP ) ) {
if ( $ ( this . _menu ) . hasClass ( ClassName . MENULEFT ) || $ ( this . _menu ) . hasClass ( ClassName . MENURIGHT ) ) {
element = parent ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _popper = new Popper ( element , this . _menu , this . _getPopperConfig ( ) ) ; // if this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( 'ontouchstart' in document . documentElement && ! $ ( parent ) . closest ( Selector . NAVBAR _NAV ) . length ) {
$ ( 'body' ) . children ( ) . on ( 'mouseover' , null , $ . noop ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _element . focus ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _element . setAttribute ( 'aria-expanded' , true ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . _menu ) . one ( Event . TRANSITION _END , function ( ) {
$ ( parent ) . trigger ( $ . Event ( Event . SHOWN , relatedTarget ) ) ;
$ ( _this . _menu ) . removeClass ( ClassName . SHOWING ) ;
} ) ;
$ ( this . _menu ) . addClass ( ClassName . SHOW + " " + ClassName . SHOWING ) ;
$ ( parent ) . addClass ( ClassName . SHOW ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
$ . removeData ( this . _element , DATA _KEY ) ;
$ ( this . _element ) . off ( EVENT _KEY ) ;
this . _element = null ;
this . _menu = null ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( this . _popper !== null ) {
this . _popper . destroy ( ) ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _popper = null ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . update = function update ( ) {
this . _inNavbar = this . _detectNavbar ( ) ;
if ( this . _popper !== null ) {
this . _popper . scheduleUpdate ( ) ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
} // private
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . _addEventListeners = function _addEventListeners ( ) {
var _this2 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ ( this . _element ) . on ( Event . CLICK , function ( event ) {
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this2 . toggle ( ) ;
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getConfig = function _getConfig ( config ) {
var elementData = $ ( this . _element ) . data ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( elementData . placement !== undefined ) {
elementData . placement = AttachmentMap [ elementData . placement . toUpperCase ( ) ] ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
config = $ . extend ( { } , this . constructor . Default , $ ( this . _element ) . data ( ) , config ) ;
Util . typeCheckConfig ( NAME , config , this . constructor . DefaultType ) ;
return config ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getMenuElement = function _getMenuElement ( ) {
if ( ! this . _menu ) {
var parent = Dropdown . _getParentFromElement ( this . _element ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _menu = $ ( parent ) . find ( Selector . MENU ) [ 0 ] ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
return this . _menu ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getPlacement = function _getPlacement ( ) {
var $parentDropdown = $ ( this . _element ) . parent ( ) ;
var placement = this . _config . placement ; // Handle dropup
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( $parentDropdown . hasClass ( ClassName . DROPUP ) || this . _config . placement === AttachmentMap . TOP ) {
placement = AttachmentMap . TOP ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( $ ( this . _menu ) . hasClass ( ClassName . MENURIGHT ) ) {
placement = AttachmentMap . TOPEND ;
}
} else if ( $ ( this . _menu ) . hasClass ( ClassName . MENURIGHT ) ) {
placement = AttachmentMap . BOTTOMEND ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
return placement ;
2018-01-23 15:38:38 +03:00
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _detectNavbar = function _detectNavbar ( ) {
return $ ( this . _element ) . closest ( '.navbar' ) . length > 0 ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getPopperConfig = function _getPopperConfig ( ) {
var popperConfig = {
placement : this . _getPlacement ( ) ,
modifiers : {
offset : {
offset : this . _config . offset
} ,
flip : {
enabled : this . _config . flip
}
} // Disable Popper.js for Dropdown in Navbar
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( this . _inNavbar ) {
popperConfig . modifiers . applyStyle = {
enabled : ! this . _inNavbar
} ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return popperConfig ;
} // static
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Dropdown . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var data = $ ( this ) . data ( DATA _KEY ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _config = typeof config === 'object' ? config : null ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( ! data ) {
data = new Dropdown ( this , _config ) ;
$ ( this ) . data ( DATA _KEY , data ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( typeof config === 'string' ) {
if ( data [ config ] === undefined ) {
throw new Error ( "No method named \"" + config + "\"" ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
data [ config ] ( ) ;
}
} ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
Dropdown . _clearMenus = function _clearMenus ( event ) {
if ( event && ( event . which === RIGHT _MOUSE _BUTTON _WHICH || event . type === 'keyup' && event . which !== TAB _KEYCODE ) ) {
return ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
var toggles = $ . makeArray ( $ ( Selector . DATA _TOGGLE ) ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _loop = function _loop ( i ) {
var parent = Dropdown . _getParentFromElement ( toggles [ i ] ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var context = $ ( toggles [ i ] ) . data ( DATA _KEY ) ;
var relatedTarget = {
relatedTarget : toggles [ i ]
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! context ) {
return "continue" ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var dropdownMenu = context . _menu ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! $ ( parent ) . hasClass ( ClassName . SHOW ) ) {
return "continue" ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( event && ( event . type === 'click' && /input|textarea/i . test ( event . target . tagName ) || event . type === 'keyup' && event . which === TAB _KEYCODE ) && $ . contains ( parent , event . target ) ) {
return "continue" ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var hideEvent = $ . Event ( Event . HIDE , relatedTarget ) ;
$ ( parent ) . trigger ( hideEvent ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( hideEvent . isDefaultPrevented ( ) ) {
return "continue" ;
} // if this is a touch-enabled device we remove the extra
// empty mouseover listeners we added for iOS support
2017-12-17 22:35:02 +03:00
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( 'ontouchstart' in document . documentElement ) {
$ ( 'body' ) . children ( ) . off ( 'mouseover' , null , $ . noop ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
toggles [ i ] . setAttribute ( 'aria-expanded' , 'false' ) ;
$ ( dropdownMenu ) . addClass ( ClassName . HIDING ) . removeClass ( ClassName . SHOW ) ;
$ ( parent ) . removeClass ( ClassName . SHOW ) ;
$ ( dropdownMenu ) . one ( Event . TRANSITION _END , function ( ) {
$ ( parent ) . trigger ( $ . Event ( Event . HIDDEN , relatedTarget ) ) ;
$ ( dropdownMenu ) . removeClass ( ClassName . HIDING ) ;
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
for ( var i = 0 ; i < toggles . length ; i ++ ) {
var _ret = _loop ( i ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( _ret === "continue" ) continue ;
}
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Dropdown . _getParentFromElement = function _getParentFromElement ( element ) {
var parent ;
var selector = Util . getSelectorFromElement ( element ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( selector ) {
parent = $ ( selector ) [ 0 ] ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return parent || element . parentNode ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
Dropdown . _dataApiKeydownHandler = function _dataApiKeydownHandler ( event ) {
if ( ! REGEXP _KEYDOWN . test ( event . which ) || /button/i . test ( event . target . tagName ) && event . which === SPACE _KEYCODE || /input|textarea/i . test ( event . target . tagName ) ) {
return ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( this . disabled || $ ( this ) . hasClass ( ClassName . DISABLED ) ) {
return ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var parent = Dropdown . _getParentFromElement ( this ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var isActive = $ ( parent ) . hasClass ( ClassName . SHOW ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( ! isActive && ( event . which !== ESCAPE _KEYCODE || event . which !== SPACE _KEYCODE ) || isActive && ( event . which === ESCAPE _KEYCODE || event . which === SPACE _KEYCODE ) ) {
if ( event . which === ESCAPE _KEYCODE ) {
var toggle = $ ( parent ) . find ( Selector . DATA _TOGGLE ) [ 0 ] ;
$ ( toggle ) . trigger ( 'focus' ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ ( this ) . trigger ( 'click' ) ;
return ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var items = $ ( parent ) . find ( Selector . VISIBLE _ITEMS ) . get ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! items . length ) {
return ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var index = items . indexOf ( event . target ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( event . which === ARROW _UP _KEYCODE && index > 0 ) {
// up
index -- ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
if ( event . which === ARROW _DOWN _KEYCODE && index < items . length - 1 ) {
// down
index ++ ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( index < 0 ) {
index = 0 ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
items [ index ] . focus ( ) ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_createClass ( Dropdown , null , [ {
key : "VERSION" ,
get : function get ( ) {
return VERSION ;
}
} , {
key : "Default" ,
get : function get ( ) {
return Default ;
}
} , {
key : "DefaultType" ,
get : function get ( ) {
return DefaultType ;
}
} ] ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return Dropdown ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Data Api implementation
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ ( document ) . on ( Event . KEYDOWN _DATA _API , Selector . DATA _TOGGLE , Dropdown . _dataApiKeydownHandler ) . on ( Event . KEYDOWN _DATA _API , Selector . MENU , Dropdown . _dataApiKeydownHandler ) . on ( Event . CLICK _DATA _API + " " + Event . KEYUP _DATA _API , Dropdown . _clearMenus ) . on ( Event . CLICK _DATA _API , Selector . DATA _TOGGLE , function ( event ) {
event . preventDefault ( ) ;
event . stopPropagation ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
Dropdown . _jQueryInterface . call ( $ ( this ) , 'toggle' ) ;
} ) . on ( Event . CLICK _DATA _API , Selector . FORM _CHILD , function ( e ) {
e . stopPropagation ( ) ;
} ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ NAME ] = Dropdown . _jQueryInterface ;
$ . fn [ NAME ] . Constructor = Dropdown ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ NAME ] . noConflict = function ( ) {
$ . fn [ NAME ] = JQUERY _NO _CONFLICT ;
return Dropdown . _jQueryInterface ;
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return Dropdown ;
} ( jQuery ) ;
var BaseLayout = function ( $ ) {
var ClassName = {
CANVAS : "bmd-layout-canvas" ,
CONTAINER : "bmd-layout-container" ,
BACKDROP : "bmd-layout-backdrop"
} ;
var Selector = {
CANVAS : "." + ClassName . CANVAS ,
CONTAINER : "." + ClassName . CONTAINER ,
BACKDROP : "." + ClassName . BACKDROP
} ;
var Default = {
canvas : {
create : true ,
required : true ,
template : "<div class=\"" + ClassName . CANVAS + "\"></div>"
} ,
backdrop : {
create : true ,
required : true ,
template : "<div class=\"" + ClassName . BACKDROP + "\"></div>"
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var BaseLayout =
/*#__PURE__*/
function ( _Base ) {
_inheritsLoose ( BaseLayout , _Base ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
function BaseLayout ( $element , config , properties ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( properties === void 0 ) {
properties = { } ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _Base . call ( this , $element , $ . extend ( true , { } , Default , config ) , properties ) || this ;
_this . $container = _this . findContainer ( true ) ;
_this . $backdrop = _this . resolveBackdrop ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . resolveCanvas ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
2018-01-23 15:38:38 +03:00
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = BaseLayout . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( dataKey ) {
_Base . prototype . dispose . call ( this , dataKey ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $container = null ;
this . $backdrop = null ;
} // ------------------------------------------------------------------------
// protected
// Will wrap container in bmd-layout-canvas if necessary
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . resolveCanvas = function resolveCanvas ( ) {
var bd = this . findCanvas ( false ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( bd === undefined || bd . length === 0 ) {
if ( this . config . canvas . create ) {
this . $container . wrap ( this . config . canvas . template ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
bd = this . findCanvas ( this . config . canvas . required ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return bd ;
} // Find closest bmd-layout-container based on the given context
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . findCanvas = function findCanvas ( raiseError , context ) {
if ( raiseError === void 0 ) {
raiseError = true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( context === void 0 ) {
context = this . $container ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var canvas = context . closest ( Selector . CANVAS ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( canvas . length === 0 && raiseError ) {
$ . error ( "Failed to find " + Selector . CANVAS + " for " + Util$1 . describe ( context ) ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return canvas ;
} // Will add bmd-layout-backdrop to bmd-layout-container if necessary
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . resolveBackdrop = function resolveBackdrop ( ) {
var bd = this . findBackdrop ( false ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( bd === undefined || bd . length === 0 ) {
if ( this . config . backdrop . create ) {
this . $container . append ( this . config . backdrop . template ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
bd = this . findBackdrop ( this . config . backdrop . required ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return bd ;
} // Find closest bmd-layout-container based on the given context
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . findBackdrop = function findBackdrop ( raiseError , context ) {
if ( raiseError === void 0 ) {
raiseError = true ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( context === void 0 ) {
context = this . $container ;
2017-12-17 22:35:02 +03:00
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var backdrop = context . find ( "> " + Selector . BACKDROP ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( backdrop . length === 0 && raiseError ) {
$ . error ( "Failed to find " + Selector . BACKDROP + " for " + Util$1 . describe ( context ) ) ;
2017-12-17 22:35:02 +03:00
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return backdrop ;
} // Find closest bmd-layout-container based on the given context
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . findContainer = function findContainer ( raiseError , context ) {
if ( raiseError === void 0 ) {
raiseError = true ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( context === void 0 ) {
context = this . $element ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var container = context . closest ( Selector . CONTAINER ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( container . length === 0 && raiseError ) {
$ . error ( "Failed to find " + Selector . CONTAINER + " for " + Util$1 . describe ( context ) ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return container ;
} // ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
;
return BaseLayout ;
} ( Base ) ;
return BaseLayout ;
} ( jQuery ) ;
var Drawer = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "drawer" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var Keycodes = {
ESCAPE : 27 //ENTER: 13,
//SPACE: 32
2018-01-23 15:38:38 +03:00
} ;
2019-10-04 16:46:05 +03:00
var ClassName = {
IN : "in" ,
DRAWER _IN : "bmd-drawer-in" ,
DRAWER _OUT : "bmd-drawer-out" ,
DRAWER : "bmd-layout-drawer" ,
CONTAINER : "bmd-layout-container"
} ;
var Default = {
focusSelector : "a, button, input"
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var Drawer =
/*#__PURE__*/
function ( _BaseLayout ) {
_inheritsLoose ( Drawer , _BaseLayout ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
// $element is expected to be the trigger
// i.e. <button class="btn bmd-btn-icon" for="search" data-toggle="drawer" data-target="#my-side-nav-drawer" aria-expanded="false" aria-controls="my-side-nav-drawer">
function Drawer ( $element , config ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _BaseLayout . call ( this , $element , $ . extend ( true , { } , Default , config ) ) || this ;
_this . $toggles = $ ( "[data-toggle=\"drawer\"][href=\"#" + _this . $element [ 0 ] . id + "\"], [data-toggle=\"drawer\"][data-target=\"#" + _this . $element [ 0 ] . id + "\"]" ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . _addAria ( ) ; // click or escape on the backdrop closes the drawer
2017-12-17 22:35:02 +03:00
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this . $backdrop . keydown ( function ( ev ) {
if ( ev . which === Keycodes . ESCAPE ) {
_this . hide ( ) ;
}
} ) . click ( function ( ) {
_this . hide ( ) ;
} ) ; // escape on the drawer closes it
_this . $element . keydown ( function ( ev ) {
if ( ev . which === Keycodes . ESCAPE ) {
_this . hide ( ) ;
}
} ) ; // any toggle button clicks
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . $toggles . click ( function ( ) {
_this . toggle ( ) ;
} ) ;
return _this ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
var _proto = Drawer . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_BaseLayout . prototype . dispose . call ( this , DATA _KEY ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $toggles = null ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . toggle = function toggle ( ) {
if ( this . _isOpen ( ) ) {
this . hide ( ) ;
} else {
this . show ( ) ;
}
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . show = function show ( ) {
if ( this . _isForcedClosed ( ) || this . _isOpen ( ) ) {
return ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $toggles . attr ( "aria-expanded" , true ) ;
this . $element . attr ( "aria-expanded" , true ) ;
this . $element . attr ( "aria-hidden" , false ) ; // focus on the first focusable item
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var $focusOn = this . $element . find ( this . config . focusSelector ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( $focusOn . length > 0 ) {
$focusOn . first ( ) . focus ( ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $container . addClass ( ClassName . DRAWER _IN ) ; // backdrop is responsively styled based on bmd-drawer-overlay, therefore style is none of our concern, simply add the marker class and let the scss determine if it should be displayed or not.
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $backdrop . addClass ( ClassName . IN ) ;
} ;
_proto . hide = function hide ( ) {
if ( ! this . _isOpen ( ) ) {
return ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
this . $toggles . attr ( "aria-expanded" , false ) ;
this . $element . attr ( "aria-expanded" , false ) ;
this . $element . attr ( "aria-hidden" , true ) ;
this . $container . removeClass ( ClassName . DRAWER _IN ) ;
this . $backdrop . removeClass ( ClassName . IN ) ;
} // ------------------------------------------------------------------------
// private
;
_proto . _isOpen = function _isOpen ( ) {
return this . $container . hasClass ( ClassName . DRAWER _IN ) ;
} ;
_proto . _isForcedClosed = function _isForcedClosed ( ) {
return this . $container . hasClass ( ClassName . DRAWER _OUT ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _addAria = function _addAria ( ) {
var isOpen = this . _isOpen ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $element . attr ( "aria-expanded" , isOpen ) ;
this . $element . attr ( "aria-hidden" , isOpen ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( this . $toggles . length ) {
this . $toggles . attr ( "aria-expanded" , isOpen ) ;
}
} // ------------------------------------------------------------------------
// static
;
Drawer . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Drawer ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Drawer ;
} ( BaseLayout ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Drawer . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Drawer ;
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Drawer . _jQueryInterface ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Drawer ;
} ( jQuery ) ;
var Ripples = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "ripples" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var ClassName = {
CONTAINER : "ripple-container" ,
DECORATOR : "ripple-decorator"
} ;
var Selector = {
CONTAINER : "." + ClassName . CONTAINER ,
DECORATOR : "." + ClassName . DECORATOR //,
} ;
var Default = {
container : {
template : "<div class='" + ClassName . CONTAINER + "'></div>"
} ,
decorator : {
template : "<div class='" + ClassName . DECORATOR + "'></div>"
} ,
trigger : {
start : "mousedown touchstart" ,
end : "mouseup mouseleave touchend"
} ,
touchUserAgentRegex : /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i ,
duration : 500
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var Ripples =
/*#__PURE__*/
function ( ) {
function Ripples ( $element , config ) {
var _this = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $element = $element ; // console.log(`Adding ripples to ${Util.describe(this.$element)}`) // eslint-disable-line no-console
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . config = $ . extend ( true , { } , Default , config ) ; // attach initial listener
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $element . on ( this . config . trigger . start , function ( event ) {
_this . _onStartRipple ( event ) ;
} ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Ripples . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
this . $element . data ( DATA _KEY , null ) ;
this . $element = null ;
this . $container = null ;
this . $decorator = null ;
this . config = null ;
} // ------------------------------------------------------------------------
// private
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _onStartRipple = function _onStartRipple ( event ) {
var _this2 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
// Verify if the user is just touching on a device and return if so
if ( this . _isTouch ( ) && event . type === "mousedown" ) {
return ;
} // Find or create the ripple container element
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _findOrCreateContainer ( ) ; // Get relY and relX positions of the container element
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var relY = this . _getRelY ( event ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var relX = this . _getRelX ( event ) ; // If relY and/or relX are false, return the event
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( ! relY && ! relX ) {
return ;
} // set the location and color each time (even if element is cached)
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $decorator . css ( {
left : relX ,
top : relY ,
"background-color" : this . _getRipplesColor ( )
} ) ; // Make sure the ripple has the styles applied (ugly hack but it works)
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . _forceStyleApplication ( ) ; // Turn on the ripple animation
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . rippleOn ( ) ; // Call the rippleEnd function when the transition 'on' ends
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
setTimeout ( function ( ) {
_this2 . rippleEnd ( ) ;
} , this . config . duration ) ; // Detect when the user leaves the element to cleanup if not already done?
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $element . on ( this . config . trigger . end , function ( ) {
if ( _this2 . $decorator ) {
// guard against race condition/mouse attack
_this2 . $decorator . data ( "mousedown" , "off" ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( _this2 . $decorator . data ( "animating" ) === "off" ) {
_this2 . rippleOut ( ) ;
}
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _findOrCreateContainer = function _findOrCreateContainer ( ) {
if ( ! this . $container || ! this . $container . length > 0 ) {
this . $element . append ( this . config . container . template ) ;
this . $container = this . $element . find ( Selector . CONTAINER ) ;
} // always add the rippleElement, it is always removed
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $container . append ( this . config . decorator . template ) ;
this . $decorator = this . $container . find ( Selector . DECORATOR ) ;
} // Make sure the ripple has the styles applied (ugly hack but it works)
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _forceStyleApplication = function _forceStyleApplication ( ) {
return window . getComputedStyle ( this . $decorator [ 0 ] ) . opacity ;
}
/ * *
* Get the relX
* /
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getRelX = function _getRelX ( event ) {
var wrapperOffset = this . $container . offset ( ) ;
var result = null ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! this . _isTouch ( ) ) {
// Get the mouse position relative to the ripple wrapper
result = event . pageX - wrapperOffset . left ;
} else {
// Make sure the user is using only one finger and then get the touch
// position relative to the ripple wrapper
event = event . originalEvent ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( event . touches . length === 1 ) {
result = event . touches [ 0 ] . pageX - wrapperOffset . left ;
} else {
result = false ;
}
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return result ;
}
/ * *
* Get the relY
* /
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getRelY = function _getRelY ( event ) {
var containerOffset = this . $container . offset ( ) ;
var result = null ;
if ( ! this . _isTouch ( ) ) {
/ * *
* Get the mouse position relative to the ripple wrapper
* /
result = event . pageY - containerOffset . top ;
2018-01-23 15:38:38 +03:00
} else {
2019-10-04 16:46:05 +03:00
/ * *
* Make sure the user is using only one finger and then get the touch
* position relative to the ripple wrapper
* /
event = event . originalEvent ;
if ( event . touches . length === 1 ) {
result = event . touches [ 0 ] . pageY - containerOffset . top ;
} else {
result = false ;
}
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
return result ;
2017-12-17 22:35:02 +03:00
}
2019-10-04 16:46:05 +03:00
/ * *
* Get the ripple color
* /
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _getRipplesColor = function _getRipplesColor ( ) {
var color = this . $element . data ( "ripple-color" ) ? this . $element . data ( "ripple-color" ) : window . getComputedStyle ( this . $element [ 0 ] ) . color ;
return color ;
}
/ * *
* Verify if the client is using a mobile device
* /
;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . _isTouch = function _isTouch ( ) {
return this . config . touchUserAgentRegex . test ( navigator . userAgent ) ;
}
/ * *
* End the animation of the ripple
* /
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . rippleEnd = function rippleEnd ( ) {
if ( this . $decorator ) {
// guard against race condition/mouse attack
this . $decorator . data ( "animating" , "off" ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( this . $decorator . data ( "mousedown" ) === "off" ) {
this . rippleOut ( this . $decorator ) ;
}
2017-12-17 22:35:02 +03:00
}
}
2019-10-04 16:46:05 +03:00
/ * *
* Turn off the ripple effect
* /
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . rippleOut = function rippleOut ( ) {
var _this3 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $decorator . off ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( Util$1 . transitionEndSupported ( ) ) {
this . $decorator . addClass ( "ripple-out" ) ;
} else {
this . $decorator . animate ( {
opacity : 0
} , 100 , function ( ) {
_this3 . $decorator . trigger ( "transitionend" ) ;
} ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
this . $decorator . on ( Util$1 . transitionEndSelector ( ) , function ( ) {
if ( _this3 . $decorator ) {
_this3 . $decorator . remove ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this3 . $decorator = null ;
}
} ) ;
}
/ * *
* Turn on the ripple effect
* /
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . rippleOn = function rippleOn ( ) {
var _this4 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var size = this . _getNewSize ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( Util$1 . transitionEndSupported ( ) ) {
this . $decorator . css ( {
"-ms-transform" : "scale(" + size + ")" ,
"-moz-transform" : "scale(" + size + ")" ,
"-webkit-transform" : "scale(" + size + ")" ,
transform : "scale(" + size + ")"
} ) . addClass ( "ripple-on" ) . data ( "animating" , "on" ) . data ( "mousedown" , "on" ) ;
} else {
this . $decorator . animate ( {
width : Math . max ( this . $element . outerWidth ( ) , this . $element . outerHeight ( ) ) * 2 ,
height : Math . max ( this . $element . outerWidth ( ) , this . $element . outerHeight ( ) ) * 2 ,
"margin-left" : Math . max ( this . $element . outerWidth ( ) , this . $element . outerHeight ( ) ) * - 1 ,
"margin-top" : Math . max ( this . $element . outerWidth ( ) , this . $element . outerHeight ( ) ) * - 1 ,
opacity : 0.2
} , this . config . duration , function ( ) {
_this4 . $decorator . trigger ( "transitionend" ) ;
} ) ;
2017-12-17 22:35:02 +03:00
}
}
2019-10-04 16:46:05 +03:00
/ * *
* Get the new size based on the element height / width and the ripple width
* /
;
_proto . _getNewSize = function _getNewSize ( ) {
return Math . max ( this . $element . outerWidth ( ) , this . $element . outerHeight ( ) ) / this . $decorator . outerWidth ( ) * 2.5 ;
} // ------------------------------------------------------------------------
// static
;
Ripples . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Ripples ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
return Ripples ;
} ( ) ;
2018-01-23 15:38:38 +03:00
/ * *
2019-10-04 16:46:05 +03:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2018-01-23 15:38:38 +03:00
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Ripples . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Ripples ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Ripples . _jQueryInterface ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return Ripples ;
} ( jQuery ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var Autofill = function ( $ ) {
2018-01-23 15:38:38 +03:00
/ * *
2019-10-04 16:46:05 +03:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2018-01-23 15:38:38 +03:00
* /
2019-10-04 16:46:05 +03:00
var NAME = "autofill" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = "bmd" + ( NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) ) ;
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
var LAST _VALUE _DATA _KEY = "bmd.last_value" ;
var Default = { } ;
2018-01-23 15:38:38 +03:00
/ * *
2019-10-04 16:46:05 +03:00
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
2018-01-23 15:38:38 +03:00
* /
2019-10-04 16:46:05 +03:00
var Autofill =
/*#__PURE__*/
function ( _Base ) {
_inheritsLoose ( Autofill , _Base ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
function Autofill ( $element , config ) {
var _this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this = _Base . call ( this , $element , $ . extend ( true , { } , Default , config ) ) || this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_this . _watchLoading ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_this . _attachEventHandlers ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return _this ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _proto = Autofill . prototype ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
_Base . prototype . dispose . call ( this , DATA _KEY ) ;
} // ------------------------------------------------------------------------
// private
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _watchLoading = function _watchLoading ( ) {
var _this2 = this ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
// After 10 seconds we are quite sure all the needed inputs are autofilled then we can stop checking them
setTimeout ( function ( ) {
clearInterval ( _this2 . _onLoading ) ;
} , 10000 ) ;
} // This part of code will detect autofill when the page is loading (username and password inputs for example)
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _onLoading = function _onLoading ( ) {
setInterval ( function ( ) {
$ ( "input[type!=checkbox]" ) . each ( function ( index , element ) {
var $element = $ ( element ) ;
var previousValue = $element . data ( LAST _VALUE _DATA _KEY ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( previousValue === undefined ) {
previousValue = $element . attr ( "value" ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( previousValue === undefined ) {
previousValue = "" ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var currentValue = $element . val ( ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( currentValue !== previousValue ) {
$element . trigger ( "change" ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$element . data ( LAST _VALUE _DATA _KEY , currentValue ) ;
} ) ;
} , 100 ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _attachEventHandlers = function _attachEventHandlers ( ) {
// Listen on inputs of the focused form
// (because user can select from the autofill dropdown only when the input has focus)
var focused = null ;
$ ( document ) . on ( "focus" , "input" , function ( event ) {
var $inputs = $ ( event . currentTarget ) . closest ( "form" ) . find ( "input" ) . not ( "[type=file], [type=date]" ) ;
focused = setInterval ( function ( ) {
$inputs . each ( function ( index , element ) {
var $element = $ ( element ) ;
var previousValue = $element . data ( LAST _VALUE _DATA _KEY ) ;
if ( previousValue === undefined ) {
previousValue = $element . attr ( "value" ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( previousValue === undefined ) {
previousValue = "" ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var currentValue = $element . val ( ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( currentValue !== previousValue ) {
$element . trigger ( "change" ) ;
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$element . data ( LAST _VALUE _DATA _KEY , currentValue ) ;
} ) ;
} , 100 ) ;
} ) . on ( "blur" , ".form-group input" , function ( ) {
clearInterval ( focused ) ;
} ) ;
} // ------------------------------------------------------------------------
// static
;
Autofill . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
if ( ! data ) {
data = new Autofill ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
2018-01-23 15:38:38 +03:00
}
} ) ;
2019-10-04 16:46:05 +03:00
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
return Autofill ;
} ( Base ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = Autofill . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = Autofill ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return Autofill . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2017-12-17 22:35:02 +03:00
return Autofill ;
2019-10-04 16:46:05 +03:00
} ( jQuery ) ;
/* globals Popper */
Popper . Defaults . modifiers . computeStyle . gpuAcceleration = false ;
2017-12-17 22:35:02 +03:00
/ * *
2019-10-04 16:46:05 +03:00
* $ . bootstrapMaterialDesign ( config ) is a macro class to configure the components generally
* used in Material Design for Bootstrap . You may pass overrides to the configurations
* which will be passed into each component , or you may omit use of this class and
* configure each component separately .
2017-12-17 22:35:02 +03:00
* /
2019-10-04 16:46:05 +03:00
var BootstrapMaterialDesign = function ( $ ) {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
var NAME = "bootstrapMaterialDesign" ;
var DATA _KEY = "bmd." + NAME ;
var JQUERY _NAME = NAME ; // retain this full name since it is long enough not to conflict
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ] ;
/ * *
* Global configuration :
* The global configuration hash will be mixed in to each components ' config .
* e . g . calling $ . bootstrapMaterialDesign ( { global : { validate : true } } ) would pass ` validate:true ` to every component
*
*
* Component configuration :
* - selector : may be a string or an array . Any array will be joined with a comma to generate the selector
* - disable any component by defining it as false with an override . e . g . $ . bootstrapMaterialDesign ( { autofill : false } )
*
* @ see each individual component for more configuration settings .
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var Default = {
global : {
validate : false ,
label : {
className : "bmd-label-static" // default style of label to be used if not specified in the html markup
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
}
} ,
autofill : {
selector : "body"
} ,
checkbox : {
selector : ".checkbox > label > input[type=checkbox]"
} ,
checkboxInline : {
selector : "label.checkbox-inline > input[type=checkbox]"
} ,
collapseInline : {
selector : '.bmd-collapse-inline [data-toggle="collapse"]'
} ,
drawer : {
selector : ".bmd-layout-drawer"
} ,
file : {
selector : "input[type=file]"
} ,
radio : {
selector : ".radio > label > input[type=radio]"
} ,
radioInline : {
selector : "label.radio-inline > input[type=radio]"
} ,
ripples : {
//selector: ['.btn:not(.btn-link):not(.ripple-none)'] // testing only
selector : [ ".btn:not(.btn-link):not(.ripple-none)" , ".card-image:not(.ripple-none)" , ".navbar a:not(.ripple-none)" , ".dropdown-menu a:not(.ripple-none)" , ".nav-tabs a:not(.ripple-none)" , ".pagination li:not(.active):not(.disabled) a:not(.ripple-none)" , ".ripple" // generic marker class to add ripple to elements
]
} ,
select : {
selector : [ "select" ]
} ,
"switch" : {
selector : ".switch > label > input[type=checkbox]"
} ,
text : {
// omit inputs we have specialized components to handle - we need to match text, email, etc. The easiest way to do this appears to be just omit the ones we don't want to match and let the rest fall through to this.
selector : [ "input:not([type=hidden]):not([type=checkbox]):not([type=radio]):not([type=file]):not([type=button]):not([type=submit]):not([type=reset])" ]
} ,
textarea : {
selector : [ "textarea" ]
} ,
arrive : true ,
// create an ordered component list for instantiation
instantiation : [ "ripples" , "checkbox" , "checkboxInline" , "collapseInline" , "drawer" , //'file',
"radio" , "radioInline" , "switch" , "text" , "textarea" , "select" , "autofill" ]
} ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var BootstrapMaterialDesign =
/*#__PURE__*/
function ( ) {
function BootstrapMaterialDesign ( $element , config ) {
var _this = this ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
this . $element = $element ;
this . config = $ . extend ( true , { } , Default , config ) ;
var $document = $ ( document ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var _loop = function _loop ( ) {
if ( _isArray ) {
if ( _i >= _iterator . length ) return "break" ;
_ref = _iterator [ _i ++ ] ;
} else {
_i = _iterator . next ( ) ;
if ( _i . done ) return "break" ;
_ref = _i . value ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
var component = _ref ;
// the component's config fragment is passed in directly, allowing users to override
var componentConfig = _this . config [ component ] ; // check to make sure component config is enabled (not `false`)
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( componentConfig ) {
// assemble the selector as it may be an array
var selector = _this . _resolveSelector ( componentConfig ) ; // mix in global options
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
componentConfig = $ . extend ( true , { } , _this . config . global , componentConfig ) ; // create the jquery fn name e.g. 'bmdText' for 'text'
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var componentName = "" + ( component . charAt ( 0 ) . toUpperCase ( ) + component . slice ( 1 ) ) ;
var jqueryFn = "bmd" + componentName ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
try {
// safely instantiate component on selector elements with config, report errors and move on.
// console.debug(`instantiating: $('${selector}')[${jqueryFn}](${componentConfig})`) // eslint-disable-line no-console
$ ( selector ) [ jqueryFn ] ( componentConfig ) ; // add to arrive if present and enabled
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( document . arrive && _this . config . arrive ) {
$document . arrive ( selector , function ( ) {
// eslint-disable-line no-loop-func
$ ( this ) [ jqueryFn ] ( componentConfig ) ;
} ) ;
}
} catch ( e ) {
var message = "Failed to instantiate component: $('" + selector + "')[" + jqueryFn + "](" + componentConfig + ")" ;
console . error ( message , e , "\nSelected elements: " , $ ( selector ) ) ; // eslint-disable-line no-console
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
throw e ;
2017-12-17 22:35:02 +03:00
}
}
2019-10-04 16:46:05 +03:00
} ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
for ( var _iterator = this . config . instantiation , _isArray = Array . isArray ( _iterator ) , _i = 0 , _iterator = _isArray ? _iterator : _iterator [ Symbol . iterator ] ( ) ; ; ) {
var _ref ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _ret = _loop ( ) ;
if ( _ret === "break" ) break ;
2018-01-23 15:38:38 +03:00
}
2019-10-04 16:46:05 +03:00
}
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
var _proto = BootstrapMaterialDesign . prototype ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
_proto . dispose = function dispose ( ) {
this . $element . data ( DATA _KEY , null ) ;
this . $element = null ;
this . config = null ;
} // ------------------------------------------------------------------------
// private
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
_proto . _resolveSelector = function _resolveSelector ( componentConfig ) {
var selector = componentConfig . selector ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
if ( Array . isArray ( selector ) ) {
selector = selector . join ( ", " ) ;
}
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return selector ;
} // ------------------------------------------------------------------------
// static
;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
BootstrapMaterialDesign . _jQueryInterface = function _jQueryInterface ( config ) {
return this . each ( function ( ) {
var $element = $ ( this ) ;
var data = $element . data ( DATA _KEY ) ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
if ( ! data ) {
data = new BootstrapMaterialDesign ( $element , config ) ;
$element . data ( DATA _KEY , data ) ;
}
} ) ;
} ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
return BootstrapMaterialDesign ;
} ( ) ;
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] = BootstrapMaterialDesign . _jQueryInterface ;
$ . fn [ JQUERY _NAME ] . Constructor = BootstrapMaterialDesign ;
2018-01-23 15:38:38 +03:00
2019-10-04 16:46:05 +03:00
$ . fn [ JQUERY _NAME ] . noConflict = function ( ) {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT ;
return BootstrapMaterialDesign . _jQueryInterface ;
2018-01-23 15:38:38 +03:00
} ;
2017-12-17 22:35:02 +03:00
return BootstrapMaterialDesign ;
2019-10-04 16:46:05 +03:00
} ( jQuery ) ;
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
/ *
* This is the main entry point .
*
* You can import other modules here , including external packages . When bundling using rollup you can mark those modules as external and have them excluded or , if they have a jsnext : main entry in their package . json ( like this package does ) , let rollup bundle them into your dist file .
*
* at your application entry point . This is necessary for browsers that do not yet support some ES2015 runtime necessities such as Symbol . We do this in ` index-iife.js ` for our iife rollup bundle .
* /
2017-12-17 22:35:02 +03:00
2019-10-04 16:46:05 +03:00
} ) ) ;
2017-12-17 22:35:02 +03:00
//# sourceMappingURL=bootstrap-material-design.js.map