Comply to the new rules

This commit is contained in:
XhmikosR 2020-06-12 21:50:30 +03:00
parent 1c37a2ba77
commit 3be585990c
35 changed files with 606 additions and 574 deletions

View File

@ -39,7 +39,7 @@ const bsPlugins = {
} }
const rootPath = TEST ? '../js/coverage/dist/' : '../js/dist/' const rootPath = TEST ? '../js/coverage/dist/' : '../js/dist/'
const build = async (plugin) => { const build = async plugin => {
console.log(`Building ${plugin} plugin...`) console.log(`Building ${plugin} plugin...`)
const external = ['jquery', 'popper.js'] const external = ['jquery', 'popper.js']
@ -81,7 +81,7 @@ const build = async (plugin) => {
const main = async () => { const main = async () => {
try { try {
await Promise.all(Object.keys(bsPlugins).map((plugin) => build(plugin))) await Promise.all(Object.keys(bsPlugins).map(plugin => build(plugin)))
} catch (error) { } catch (error) {
console.error(error) console.error(error)

View File

@ -30,18 +30,21 @@ function walkAsync(directory, excludedDirectories, fileCallback, errback) {
if (excludedDirectories.has(path.parse(directory).base)) { if (excludedDirectories.has(path.parse(directory).base)) {
return return
} }
fs.readdir(directory, (err, names) => { fs.readdir(directory, (err, names) => {
if (err) { if (err) {
errback(err) errback(err)
return return
} }
names.forEach((name) => {
names.forEach(name => {
const filepath = path.join(directory, name) const filepath = path.join(directory, name)
fs.lstat(filepath, (err, stats) => { fs.lstat(filepath, (err, stats) => {
if (err) { if (err) {
process.nextTick(errback, err) process.nextTick(errback, err)
return return
} }
if (stats.isDirectory()) { if (stats.isDirectory()) {
process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback) process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback)
} else if (stats.isFile()) { } else if (stats.isFile()) {
@ -55,18 +58,19 @@ function walkAsync(directory, excludedDirectories, fileCallback, errback) {
function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) { function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
original = new RegExp(regExpQuote(original), 'g') original = new RegExp(regExpQuote(original), 'g')
replacement = regExpQuoteReplacement(replacement) replacement = regExpQuoteReplacement(replacement)
const updateFile = DRY_RUN ? (filepath) => { const updateFile = DRY_RUN ? filepath => {
if (allowedExtensions.has(path.parse(filepath).ext)) { if (allowedExtensions.has(path.parse(filepath).ext)) {
console.log(`FILE: ${filepath}`) console.log(`FILE: ${filepath}`)
} else { } else {
console.log(`EXCLUDED:${filepath}`) console.log(`EXCLUDED:${filepath}`)
} }
} : (filepath) => { } : filepath => {
if (allowedExtensions.has(path.parse(filepath).ext)) { if (allowedExtensions.has(path.parse(filepath).ext)) {
sh.sed('-i', original, replacement, filepath) sh.sed('-i', original, replacement, filepath)
} }
} }
walkAsync(directory, excludedDirectories, updateFile, (err) => {
walkAsync(directory, excludedDirectories, updateFile, err => {
console.error('ERROR while traversing directory!:') console.error('ERROR while traversing directory!:')
console.error(err) console.error(err)
process.exit(1) process.exit(1)
@ -79,6 +83,7 @@ function main(args) {
console.error('Got arguments:', args) console.error('Got arguments:', args)
process.exit(1) process.exit(1)
} }
const oldVersion = args[0] const oldVersion = args[0]
const newVersion = args[1] const newVersion = args[1]
const EXCLUDED_DIRS = new Set([ const EXCLUDED_DIRS = new Set([

View File

@ -49,7 +49,7 @@ const files = [
} }
] ]
files.forEach((file) => { files.forEach(file => {
fs.readFile(file.file, 'utf8', (err, data) => { fs.readFile(file.file, 'utf8', (err, data) => {
if (err) { if (err) {
throw err throw err

View File

@ -1,6 +1,6 @@
'use strict' 'use strict'
module.exports = (ctx) => ({ module.exports = ctx => ({
map: ctx.file.dirname.includes('examples') ? false : { map: ctx.file.dirname.includes('examples') ? false : {
inline: false, inline: false,
annotation: true, annotation: true,

View File

@ -43,7 +43,7 @@ sh.cp('-f', [
sh.rm(`${folderName}/index.html`) sh.rm(`${folderName}/index.html`)
// get all examples' HTML files // get all examples' HTML files
sh.find(`${folderName}/**/*.html`).forEach((file) => { sh.find(`${folderName}/**/*.html`).forEach(file => {
const fileContents = sh.cat(file) const fileContents = sh.cat(file)
.toString() .toString()
.replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../') .replace(new RegExp(`"/docs/${versionShort}/`, 'g'), '"../')

View File

@ -14,22 +14,22 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'alert' const NAME = 'alert'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.alert' const DATA_KEY = 'bs.alert'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const SELECTOR_DISMISS = '[data-dismiss="alert"]' const SELECTOR_DISMISS = '[data-dismiss="alert"]'
const EVENT_CLOSE = `close${EVENT_KEY}` const EVENT_CLOSE = `close${EVENT_KEY}`
const EVENT_CLOSED = `closed${EVENT_KEY}` const EVENT_CLOSED = `closed${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_ALERT = 'alert' const CLASS_NAME_ALERT = 'alert'
const CLASS_NAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
@ -74,7 +74,7 @@ class Alert {
_getRootElement(element) { _getRootElement(element) {
const selector = Util.getSelectorFromElement(element) const selector = Util.getSelectorFromElement(element)
let parent = false let parent = false
if (selector) { if (selector) {
parent = document.querySelector(selector) parent = document.querySelector(selector)
@ -105,7 +105,7 @@ class Alert {
const transitionDuration = Util.getTransitionDurationFromElement(element) const transitionDuration = Util.getTransitionDurationFromElement(element)
$(element) $(element)
.one(Util.TRANSITION_END, (event) => this._destroyElement(element, event)) .one(Util.TRANSITION_END, event => this._destroyElement(element, event))
.emulateTransitionEnd(transitionDuration) .emulateTransitionEnd(transitionDuration)
} }
@ -121,7 +121,7 @@ class Alert {
static _jQueryInterface(config) { static _jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const $element = $(this) const $element = $(this)
let data = $element.data(DATA_KEY) let data = $element.data(DATA_KEY)
if (!data) { if (!data) {
data = new Alert(this) data = new Alert(this)
@ -163,9 +163,9 @@ $(document).on(
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$.fn[NAME] = Alert._jQueryInterface $.fn[NAME] = Alert._jQueryInterface
$.fn[NAME].Constructor = Alert $.fn[NAME].Constructor = Alert
$.fn[NAME].noConflict = () => { $.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT $.fn[NAME] = JQUERY_NO_CONFLICT
return Alert._jQueryInterface return Alert._jQueryInterface
} }

View File

@ -13,29 +13,29 @@ import $ from 'jquery'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'button' const NAME = 'button'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.button' const DATA_KEY = 'bs.button'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_NAME_ACTIVE = 'active' const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_BUTTON = 'btn' const CLASS_NAME_BUTTON = 'btn'
const CLASS_NAME_FOCUS = 'focus' const CLASS_NAME_FOCUS = 'focus'
const SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]' const SELECTOR_DATA_TOGGLE_CARROT = '[data-toggle^="button"]'
const SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]' const SELECTOR_DATA_TOGGLES = '[data-toggle="buttons"]'
const SELECTOR_DATA_TOGGLE = '[data-toggle="button"]' const SELECTOR_DATA_TOGGLE = '[data-toggle="button"]'
const SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn' const SELECTOR_DATA_TOGGLES_BUTTONS = '[data-toggle="buttons"] .btn'
const SELECTOR_INPUT = 'input:not([type="hidden"])' const SELECTOR_INPUT = 'input:not([type="hidden"])'
const SELECTOR_ACTIVE = '.active' const SELECTOR_ACTIVE = '.active'
const SELECTOR_BUTTON = '.btn' const SELECTOR_BUTTON = '.btn'
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` + const EVENT_FOCUS_BLUR_DATA_API = `focus${EVENT_KEY}${DATA_API_KEY} ` +
`blur${EVENT_KEY}${DATA_API_KEY}` `blur${EVENT_KEY}${DATA_API_KEY}`
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
@ -85,6 +85,7 @@ class Button {
if (input.type === 'checkbox' || input.type === 'radio') { if (input.type === 'checkbox' || input.type === 'radio') {
input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE) input.checked = !this._element.classList.contains(CLASS_NAME_ACTIVE)
} }
$(input).trigger('change') $(input).trigger('change')
} }
@ -135,7 +136,7 @@ class Button {
*/ */
$(document) $(document)
.on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, (event) => { .on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {
let button = event.target let button = event.target
const initialButton = button const initialButton = button
@ -158,7 +159,7 @@ $(document)
} }
} }
}) })
.on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, (event) => { .on(EVENT_FOCUS_BLUR_DATA_API, SELECTOR_DATA_TOGGLE_CARROT, event => {
const button = $(event.target).closest(SELECTOR_BUTTON)[0] const button = $(event.target).closest(SELECTOR_BUTTON)[0]
$(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type)) $(button).toggleClass(CLASS_NAME_FOCUS, /^focus(in)?$/.test(event.type))
}) })

View File

@ -14,75 +14,75 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'carousel' const NAME = 'carousel'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.carousel' const DATA_KEY = 'bs.carousel'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const ARROW_LEFT_KEYCODE = 37 // KeyboardEvent.which value for left arrow key 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 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 TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch
const SWIPE_THRESHOLD = 40 const SWIPE_THRESHOLD = 40
const Default = { const Default = {
interval : 5000, interval: 5000,
keyboard : true, keyboard: true,
slide : false, slide: false,
pause : 'hover', pause: 'hover',
wrap : true, wrap: true,
touch : true touch: true
} }
const DefaultType = { const DefaultType = {
interval : '(number|boolean)', interval: '(number|boolean)',
keyboard : 'boolean', keyboard: 'boolean',
slide : '(boolean|string)', slide: '(boolean|string)',
pause : '(string|boolean)', pause: '(string|boolean)',
wrap : 'boolean', wrap: 'boolean',
touch : 'boolean' touch: 'boolean'
} }
const DIRECTION_NEXT = 'next' const DIRECTION_NEXT = 'next'
const DIRECTION_PREV = 'prev' const DIRECTION_PREV = 'prev'
const DIRECTION_LEFT = 'left' const DIRECTION_LEFT = 'left'
const DIRECTION_RIGHT = 'right' const DIRECTION_RIGHT = 'right'
const EVENT_SLIDE = `slide${EVENT_KEY}` const EVENT_SLIDE = `slide${EVENT_KEY}`
const EVENT_SLID = `slid${EVENT_KEY}` const EVENT_SLID = `slid${EVENT_KEY}`
const EVENT_KEYDOWN = `keydown${EVENT_KEY}` const EVENT_KEYDOWN = `keydown${EVENT_KEY}`
const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}` const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`
const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}` const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`
const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}` const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`
const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}` const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`
const EVENT_TOUCHEND = `touchend${EVENT_KEY}` const EVENT_TOUCHEND = `touchend${EVENT_KEY}`
const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}` const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`
const EVENT_POINTERUP = `pointerup${EVENT_KEY}` const EVENT_POINTERUP = `pointerup${EVENT_KEY}`
const EVENT_DRAG_START = `dragstart${EVENT_KEY}` const EVENT_DRAG_START = `dragstart${EVENT_KEY}`
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_CAROUSEL = 'carousel' const CLASS_NAME_CAROUSEL = 'carousel'
const CLASS_NAME_ACTIVE = 'active' const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_SLIDE = 'slide' const CLASS_NAME_SLIDE = 'slide'
const CLASS_NAME_RIGHT = 'carousel-item-right' const CLASS_NAME_RIGHT = 'carousel-item-right'
const CLASS_NAME_LEFT = 'carousel-item-left' const CLASS_NAME_LEFT = 'carousel-item-left'
const CLASS_NAME_NEXT = 'carousel-item-next' const CLASS_NAME_NEXT = 'carousel-item-next'
const CLASS_NAME_PREV = 'carousel-item-prev' const CLASS_NAME_PREV = 'carousel-item-prev'
const CLASS_NAME_POINTER_EVENT = 'pointer-event' const CLASS_NAME_POINTER_EVENT = 'pointer-event'
const SELECTOR_ACTIVE = '.active' const SELECTOR_ACTIVE = '.active'
const SELECTOR_ACTIVE_ITEM = '.active.carousel-item' const SELECTOR_ACTIVE_ITEM = '.active.carousel-item'
const SELECTOR_ITEM = '.carousel-item' const SELECTOR_ITEM = '.carousel-item'
const SELECTOR_ITEM_IMG = '.carousel-item img' const SELECTOR_ITEM_IMG = '.carousel-item img'
const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev' const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'
const SELECTOR_INDICATORS = '.carousel-indicators' const SELECTOR_INDICATORS = '.carousel-indicators'
const SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]' const SELECTOR_DATA_SLIDE = '[data-slide], [data-slide-to]'
const SELECTOR_DATA_RIDE = '[data-ride="carousel"]' const SELECTOR_DATA_RIDE = '[data-ride="carousel"]'
const PointerType = { const PointerType = {
TOUCH : 'touch', TOUCH: 'touch',
PEN : 'pen' PEN: 'pen'
} }
/** /**
@ -92,20 +92,20 @@ const PointerType = {
*/ */
class Carousel { class Carousel {
constructor(element, config) { constructor(element, config) {
this._items = null this._items = null
this._interval = null this._interval = null
this._activeElement = null this._activeElement = null
this._isPaused = false this._isPaused = false
this._isSliding = false this._isSliding = false
this.touchTimeout = null this.touchTimeout = null
this.touchStartX = 0 this.touchStartX = 0
this.touchDeltaX = 0 this.touchDeltaX = 0
this._config = this._getConfig(config) this._config = this._getConfig(config)
this._element = element this._element = element
this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS) this._indicatorsElement = this._element.querySelector(SELECTOR_INDICATORS)
this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0 this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0
this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent) this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent)
this._addEventListeners() this._addEventListeners()
} }
@ -195,9 +195,9 @@ class Carousel {
return return
} }
const direction = index > activeIndex const direction = index > activeIndex ?
? DIRECTION_NEXT DIRECTION_NEXT :
: DIRECTION_PREV DIRECTION_PREV
this._slide(direction, this._items[index]) this._slide(direction, this._items[index])
} }
@ -206,13 +206,13 @@ class Carousel {
$(this._element).off(EVENT_KEY) $(this._element).off(EVENT_KEY)
$.removeData(this._element, DATA_KEY) $.removeData(this._element, DATA_KEY)
this._items = null this._items = null
this._config = null this._config = null
this._element = null this._element = null
this._interval = null this._interval = null
this._isPaused = null this._isPaused = null
this._isSliding = null this._isSliding = null
this._activeElement = null this._activeElement = null
this._indicatorsElement = null this._indicatorsElement = null
} }
@ -251,13 +251,13 @@ class Carousel {
_addEventListeners() { _addEventListeners() {
if (this._config.keyboard) { if (this._config.keyboard) {
$(this._element).on(EVENT_KEYDOWN, (event) => this._keydown(event)) $(this._element).on(EVENT_KEYDOWN, event => this._keydown(event))
} }
if (this._config.pause === 'hover') { if (this._config.pause === 'hover') {
$(this._element) $(this._element)
.on(EVENT_MOUSEENTER, (event) => this.pause(event)) .on(EVENT_MOUSEENTER, event => this.pause(event))
.on(EVENT_MOUSELEAVE, (event) => this.cycle(event)) .on(EVENT_MOUSELEAVE, event => this.cycle(event))
} }
if (this._config.touch) { if (this._config.touch) {
@ -270,7 +270,7 @@ class Carousel {
return return
} }
const start = (event) => { const start = event => {
if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
this.touchStartX = event.originalEvent.clientX this.touchStartX = event.originalEvent.clientX
} else if (!this._pointerEvent) { } else if (!this._pointerEvent) {
@ -278,7 +278,7 @@ class Carousel {
} }
} }
const move = (event) => { const move = event => {
// ensure swiping with one touch and not pinching // ensure swiping with one touch and not pinching
if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {
this.touchDeltaX = 0 this.touchDeltaX = 0
@ -287,7 +287,7 @@ class Carousel {
} }
} }
const end = (event) => { const end = event => {
if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {
this.touchDeltaX = event.originalEvent.clientX - this.touchStartX this.touchDeltaX = event.originalEvent.clientX - this.touchStartX
} }
@ -306,22 +306,23 @@ class Carousel {
if (this.touchTimeout) { if (this.touchTimeout) {
clearTimeout(this.touchTimeout) clearTimeout(this.touchTimeout)
} }
this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)
} }
} }
$(this._element.querySelectorAll(SELECTOR_ITEM_IMG)) $(this._element.querySelectorAll(SELECTOR_ITEM_IMG))
.on(EVENT_DRAG_START, (e) => e.preventDefault()) .on(EVENT_DRAG_START, e => e.preventDefault())
if (this._pointerEvent) { if (this._pointerEvent) {
$(this._element).on(EVENT_POINTERDOWN, (event) => start(event)) $(this._element).on(EVENT_POINTERDOWN, event => start(event))
$(this._element).on(EVENT_POINTERUP, (event) => end(event)) $(this._element).on(EVENT_POINTERUP, event => end(event))
this._element.classList.add(CLASS_NAME_POINTER_EVENT) this._element.classList.add(CLASS_NAME_POINTER_EVENT)
} else { } else {
$(this._element).on(EVENT_TOUCHSTART, (event) => start(event)) $(this._element).on(EVENT_TOUCHSTART, event => start(event))
$(this._element).on(EVENT_TOUCHMOVE, (event) => move(event)) $(this._element).on(EVENT_TOUCHMOVE, event => move(event))
$(this._element).on(EVENT_TOUCHEND, (event) => end(event)) $(this._element).on(EVENT_TOUCHEND, event => end(event))
} }
} }
@ -344,29 +345,29 @@ class Carousel {
} }
_getItemIndex(element) { _getItemIndex(element) {
this._items = element && element.parentNode this._items = element && element.parentNode ?
? [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) [].slice.call(element.parentNode.querySelectorAll(SELECTOR_ITEM)) :
: [] []
return this._items.indexOf(element) return this._items.indexOf(element)
} }
_getItemByDirection(direction, activeElement) { _getItemByDirection(direction, activeElement) {
const isNextDirection = direction === DIRECTION_NEXT const isNextDirection = direction === DIRECTION_NEXT
const isPrevDirection = direction === DIRECTION_PREV const isPrevDirection = direction === DIRECTION_PREV
const activeIndex = this._getItemIndex(activeElement) const activeIndex = this._getItemIndex(activeElement)
const lastItemIndex = this._items.length - 1 const lastItemIndex = this._items.length - 1
const isGoingToWrap = isPrevDirection && activeIndex === 0 || const isGoingToWrap = isPrevDirection && activeIndex === 0 ||
isNextDirection && activeIndex === lastItemIndex isNextDirection && activeIndex === lastItemIndex
if (isGoingToWrap && !this._config.wrap) { if (isGoingToWrap && !this._config.wrap) {
return activeElement return activeElement
} }
const delta = direction === DIRECTION_PREV ? -1 : 1 const delta = direction === DIRECTION_PREV ? -1 : 1
const itemIndex = (activeIndex + delta) % this._items.length const itemIndex = (activeIndex + delta) % this._items.length
return itemIndex === -1 return itemIndex === -1 ?
? this._items[this._items.length - 1] : this._items[itemIndex] this._items[this._items.length - 1] : this._items[itemIndex]
} }
_triggerSlideEvent(relatedTarget, eventDirectionName) { _triggerSlideEvent(relatedTarget, eventDirectionName) {
@ -402,7 +403,7 @@ class Carousel {
_slide(direction, element) { _slide(direction, element) {
const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM) const activeElement = this._element.querySelector(SELECTOR_ACTIVE_ITEM)
const activeElementIndex = this._getItemIndex(activeElement) const activeElementIndex = this._getItemIndex(activeElement)
const nextElement = element || activeElement && const nextElement = element || activeElement &&
this._getItemByDirection(direction, activeElement) this._getItemByDirection(direction, activeElement)
const nextElementIndex = this._getItemIndex(nextElement) const nextElementIndex = this._getItemIndex(nextElement)
const isCycling = Boolean(this._interval) const isCycling = Boolean(this._interval)
@ -525,6 +526,7 @@ class Carousel {
if (typeof data[action] === 'undefined') { if (typeof data[action] === 'undefined') {
throw new TypeError(`No method named "${action}"`) throw new TypeError(`No method named "${action}"`)
} }
data[action]() data[action]()
} else if (_config.interval && _config.ride) { } else if (_config.interval && _config.ride) {
data.pause() data.pause()

View File

@ -14,38 +14,38 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'collapse' const NAME = 'collapse'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.collapse' const DATA_KEY = 'bs.collapse'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const Default = { const Default = {
toggle : true, toggle: true,
parent : '' parent: ''
} }
const DefaultType = { const DefaultType = {
toggle : 'boolean', toggle: 'boolean',
parent : '(string|element)' parent: '(string|element)'
} }
const EVENT_SHOW = `show${EVENT_KEY}` const EVENT_SHOW = `show${EVENT_KEY}`
const EVENT_SHOWN = `shown${EVENT_KEY}` const EVENT_SHOWN = `shown${EVENT_KEY}`
const EVENT_HIDE = `hide${EVENT_KEY}` const EVENT_HIDE = `hide${EVENT_KEY}`
const EVENT_HIDDEN = `hidden${EVENT_KEY}` const EVENT_HIDDEN = `hidden${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_COLLAPSE = 'collapse' const CLASS_NAME_COLLAPSE = 'collapse'
const CLASS_NAME_COLLAPSING = 'collapsing' const CLASS_NAME_COLLAPSING = 'collapsing'
const CLASS_NAME_COLLAPSED = 'collapsed' const CLASS_NAME_COLLAPSED = 'collapsed'
const DIMENSION_WIDTH = 'width' const DIMENSION_WIDTH = 'width'
const DIMENSION_HEIGHT = 'height' const DIMENSION_HEIGHT = 'height'
const SELECTOR_ACTIVES = '.show, .collapsing' const SELECTOR_ACTIVES = '.show, .collapsing'
const SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]' const SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]'
/** /**
@ -57,9 +57,9 @@ const SELECTOR_DATA_TOGGLE = '[data-toggle="collapse"]'
class Collapse { class Collapse {
constructor(element, config) { constructor(element, config) {
this._isTransitioning = false this._isTransitioning = false
this._element = element this._element = element
this._config = this._getConfig(config) this._config = this._getConfig(config)
this._triggerArray = [].slice.call(document.querySelectorAll( this._triggerArray = [].slice.call(document.querySelectorAll(
`[data-toggle="collapse"][href="#${element.id}"],` + `[data-toggle="collapse"][href="#${element.id}"],` +
`[data-toggle="collapse"][data-target="#${element.id}"]` `[data-toggle="collapse"][data-target="#${element.id}"]`
)) ))
@ -69,7 +69,7 @@ class Collapse {
const elem = toggleList[i] const elem = toggleList[i]
const selector = Util.getSelectorFromElement(elem) const selector = Util.getSelectorFromElement(elem)
const filterElement = [].slice.call(document.querySelectorAll(selector)) const filterElement = [].slice.call(document.querySelectorAll(selector))
.filter((foundElem) => foundElem === element) .filter(foundElem => foundElem === element)
if (selector !== null && filterElement.length > 0) { if (selector !== null && filterElement.length > 0) {
this._selector = selector this._selector = selector
@ -119,7 +119,7 @@ class Collapse {
if (this._parent) { if (this._parent) {
actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES)) actives = [].slice.call(this._parent.querySelectorAll(SELECTOR_ACTIVES))
.filter((elem) => { .filter(elem => {
if (typeof this._config.parent === 'string') { if (typeof this._config.parent === 'string') {
return elem.getAttribute('data-parent') === this._config.parent return elem.getAttribute('data-parent') === this._config.parent
} }
@ -254,10 +254,10 @@ class Collapse {
dispose() { dispose() {
$.removeData(this._element, DATA_KEY) $.removeData(this._element, DATA_KEY)
this._config = null this._config = null
this._parent = null this._parent = null
this._element = null this._element = null
this._triggerArray = null this._triggerArray = null
this._isTransitioning = null this._isTransitioning = null
} }
@ -324,8 +324,8 @@ class Collapse {
static _jQueryInterface(config) { static _jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const $this = $(this) const $this = $(this)
let data = $this.data(DATA_KEY) let data = $this.data(DATA_KEY)
const _config = { const _config = {
...Default, ...Default,
...$this.data(), ...$this.data(),
@ -345,6 +345,7 @@ class Collapse {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config]() data[config]()
} }
}) })
@ -369,8 +370,8 @@ $(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
$(selectors).each(function () { $(selectors).each(function () {
const $target = $(this) const $target = $(this)
const data = $target.data(DATA_KEY) const data = $target.data(DATA_KEY)
const config = data ? 'toggle' : $trigger.data() const config = data ? 'toggle' : $trigger.data()
Collapse._jQueryInterface.call($target, config) Collapse._jQueryInterface.call($target, config)
}) })
}) })

View File

@ -15,66 +15,66 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'dropdown' const NAME = 'dropdown'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.dropdown' const DATA_KEY = 'bs.dropdown'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key
const TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key const TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key
const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key
const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key
const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse) const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`) const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
const EVENT_HIDE = `hide${EVENT_KEY}` const EVENT_HIDE = `hide${EVENT_KEY}`
const EVENT_HIDDEN = `hidden${EVENT_KEY}` const EVENT_HIDDEN = `hidden${EVENT_KEY}`
const EVENT_SHOW = `show${EVENT_KEY}` const EVENT_SHOW = `show${EVENT_KEY}`
const EVENT_SHOWN = `shown${EVENT_KEY}` const EVENT_SHOWN = `shown${EVENT_KEY}`
const EVENT_CLICK = `click${EVENT_KEY}` const EVENT_CLICK = `click${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}` const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`
const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}` const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_DISABLED = 'disabled' const CLASS_NAME_DISABLED = 'disabled'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_DROPUP = 'dropup' const CLASS_NAME_DROPUP = 'dropup'
const CLASS_NAME_DROPRIGHT = 'dropright' const CLASS_NAME_DROPRIGHT = 'dropright'
const CLASS_NAME_DROPLEFT = 'dropleft' const CLASS_NAME_DROPLEFT = 'dropleft'
const CLASS_NAME_MENURIGHT = 'dropdown-menu-right' const CLASS_NAME_MENURIGHT = 'dropdown-menu-right'
const CLASS_NAME_POSITION_STATIC = 'position-static' const CLASS_NAME_POSITION_STATIC = 'position-static'
const SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]' const SELECTOR_DATA_TOGGLE = '[data-toggle="dropdown"]'
const SELECTOR_FORM_CHILD = '.dropdown form' const SELECTOR_FORM_CHILD = '.dropdown form'
const SELECTOR_MENU = '.dropdown-menu' const SELECTOR_MENU = '.dropdown-menu'
const SELECTOR_NAVBAR_NAV = '.navbar-nav' const SELECTOR_NAVBAR_NAV = '.navbar-nav'
const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
const PLACEMENT_TOP = 'top-start' const PLACEMENT_TOP = 'top-start'
const PLACEMENT_TOPEND = 'top-end' const PLACEMENT_TOPEND = 'top-end'
const PLACEMENT_BOTTOM = 'bottom-start' const PLACEMENT_BOTTOM = 'bottom-start'
const PLACEMENT_BOTTOMEND = 'bottom-end' const PLACEMENT_BOTTOMEND = 'bottom-end'
const PLACEMENT_RIGHT = 'right-start' const PLACEMENT_RIGHT = 'right-start'
const PLACEMENT_LEFT = 'left-start' const PLACEMENT_LEFT = 'left-start'
const Default = { const Default = {
offset : 0, offset: 0,
flip : true, flip: true,
boundary : 'scrollParent', boundary: 'scrollParent',
reference : 'toggle', reference: 'toggle',
display : 'dynamic', display: 'dynamic',
popperConfig : null popperConfig: null
} }
const DefaultType = { const DefaultType = {
offset : '(number|string|function)', offset: '(number|string|function)',
flip : 'boolean', flip: 'boolean',
boundary : '(string|element)', boundary: '(string|element)',
reference : '(string|element)', reference: '(string|element)',
display : 'string', display: 'string',
popperConfig : '(null|object)' popperConfig: '(null|object)'
} }
/** /**
@ -85,10 +85,10 @@ const DefaultType = {
class Dropdown { class Dropdown {
constructor(element, config) { constructor(element, config) {
this._element = element this._element = element
this._popper = null this._popper = null
this._config = this._getConfig(config) this._config = this._getConfig(config)
this._menu = this._getMenuElement() this._menu = this._getMenuElement()
this._inNavbar = this._detectNavbar() this._inNavbar = this._detectNavbar()
this._addEventListeners() this._addEventListeners()
@ -172,6 +172,7 @@ class Dropdown {
if (this._config.boundary !== 'scrollParent') { if (this._config.boundary !== 'scrollParent') {
$(parent).addClass(CLASS_NAME_POSITION_STATIC) $(parent).addClass(CLASS_NAME_POSITION_STATIC)
} }
this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()) this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())
} }
@ -241,7 +242,7 @@ class Dropdown {
// Private // Private
_addEventListeners() { _addEventListeners() {
$(this._element).on(EVENT_CLICK, (event) => { $(this._element).on(EVENT_CLICK, event => {
event.preventDefault() event.preventDefault()
event.stopPropagation() event.stopPropagation()
this.toggle() this.toggle()
@ -272,6 +273,7 @@ class Dropdown {
this._menu = parent.querySelector(SELECTOR_MENU) this._menu = parent.querySelector(SELECTOR_MENU)
} }
} }
return this._menu return this._menu
} }
@ -281,9 +283,9 @@ class Dropdown {
// Handle dropup // Handle dropup
if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) { if ($parentDropdown.hasClass(CLASS_NAME_DROPUP)) {
placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) placement = $(this._menu).hasClass(CLASS_NAME_MENURIGHT) ?
? PLACEMENT_TOPEND PLACEMENT_TOPEND :
: PLACEMENT_TOP PLACEMENT_TOP
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) { } else if ($parentDropdown.hasClass(CLASS_NAME_DROPRIGHT)) {
placement = PLACEMENT_RIGHT placement = PLACEMENT_RIGHT
} else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) { } else if ($parentDropdown.hasClass(CLASS_NAME_DROPLEFT)) {
@ -291,6 +293,7 @@ class Dropdown {
} else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) { } else if ($(this._menu).hasClass(CLASS_NAME_MENURIGHT)) {
placement = PLACEMENT_BOTTOMEND placement = PLACEMENT_BOTTOMEND
} }
return placement return placement
} }
@ -302,7 +305,7 @@ class Dropdown {
const offset = {} const offset = {}
if (typeof this._config.offset === 'function') { if (typeof this._config.offset === 'function') {
offset.fn = (data) => { offset.fn = data => {
data.offsets = { data.offsets = {
...data.offsets, ...data.offsets,
...this._config.offset(data.offsets, this._element) || {} ...this._config.offset(data.offsets, this._element) || {}
@ -360,6 +363,7 @@ class Dropdown {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config]() data[config]()
} }
}) })
@ -444,8 +448,8 @@ class Dropdown {
// - If key is other than escape // - If key is other than escape
// - If key is not up or down => not a dropdown command // - If key is not up or down => not a dropdown command
// - If trigger inside the menu => not a dropdown command // - If trigger inside the menu => not a dropdown command
if (/input|textarea/i.test(event.target.tagName) if (/input|textarea/i.test(event.target.tagName) ?
? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&
(event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||
$(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { $(event.target).closest(SELECTOR_MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
return return
@ -455,7 +459,7 @@ class Dropdown {
return return
} }
const parent = Dropdown._getParentFromElement(this) const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(CLASS_NAME_SHOW) const isActive = $(parent).hasClass(CLASS_NAME_SHOW)
if (!isActive && event.which === ESCAPE_KEYCODE) { if (!isActive && event.which === ESCAPE_KEYCODE) {
@ -475,7 +479,7 @@ class Dropdown {
} }
const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS)) const items = [].slice.call(parent.querySelectorAll(SELECTOR_VISIBLE_ITEMS))
.filter((item) => $(item).is(':visible')) .filter(item => $(item).is(':visible'))
if (items.length === 0) { if (items.length === 0) {
return return
@ -514,7 +518,7 @@ $(document)
event.stopPropagation() event.stopPropagation()
Dropdown._jQueryInterface.call($(this), 'toggle') Dropdown._jQueryInterface.call($(this), 'toggle')
}) })
.on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, (e) => { .on(EVENT_CLICK_DATA_API, SELECTOR_FORM_CHILD, e => {
e.stopPropagation() e.stopPropagation()
}) })

View File

@ -14,54 +14,54 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'modal' const NAME = 'modal'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.modal' const DATA_KEY = 'bs.modal'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
const Default = { const Default = {
backdrop : true, backdrop: true,
keyboard : true, keyboard: true,
focus : true, focus: true,
show : true show: true
} }
const DefaultType = { const DefaultType = {
backdrop : '(boolean|string)', backdrop: '(boolean|string)',
keyboard : 'boolean', keyboard: 'boolean',
focus : 'boolean', focus: 'boolean',
show : 'boolean' show: 'boolean'
} }
const EVENT_HIDE = `hide${EVENT_KEY}` const EVENT_HIDE = `hide${EVENT_KEY}`
const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}` const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
const EVENT_HIDDEN = `hidden${EVENT_KEY}` const EVENT_HIDDEN = `hidden${EVENT_KEY}`
const EVENT_SHOW = `show${EVENT_KEY}` const EVENT_SHOW = `show${EVENT_KEY}`
const EVENT_SHOWN = `shown${EVENT_KEY}` const EVENT_SHOWN = `shown${EVENT_KEY}`
const EVENT_FOCUSIN = `focusin${EVENT_KEY}` const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
const EVENT_RESIZE = `resize${EVENT_KEY}` const EVENT_RESIZE = `resize${EVENT_KEY}`
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}` const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}` const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}` const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY}`
const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}` const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable' const CLASS_NAME_SCROLLABLE = 'modal-dialog-scrollable'
const CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure' const CLASS_NAME_SCROLLBAR_MEASURER = 'modal-scrollbar-measure'
const CLASS_NAME_BACKDROP = 'modal-backdrop' const CLASS_NAME_BACKDROP = 'modal-backdrop'
const CLASS_NAME_OPEN = 'modal-open' const CLASS_NAME_OPEN = 'modal-open'
const CLASS_NAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_STATIC = 'modal-static' const CLASS_NAME_STATIC = 'modal-static'
const SELECTOR_DIALOG = '.modal-dialog' const SELECTOR_DIALOG = '.modal-dialog'
const SELECTOR_MODAL_BODY = '.modal-body' const SELECTOR_MODAL_BODY = '.modal-body'
const SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]' const SELECTOR_DATA_TOGGLE = '[data-toggle="modal"]'
const SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]' const SELECTOR_DATA_DISMISS = '[data-dismiss="modal"]'
const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
const SELECTOR_STICKY_CONTENT = '.sticky-top' const SELECTOR_STICKY_CONTENT = '.sticky-top'
/** /**
@ -72,15 +72,15 @@ const SELECTOR_STICKY_CONTENT = '.sticky-top'
class Modal { class Modal {
constructor(element, config) { constructor(element, config) {
this._config = this._getConfig(config) this._config = this._getConfig(config)
this._element = element this._element = element
this._dialog = element.querySelector(SELECTOR_DIALOG) this._dialog = element.querySelector(SELECTOR_DIALOG)
this._backdrop = null this._backdrop = null
this._isShown = false this._isShown = false
this._isBodyOverflowing = false this._isBodyOverflowing = false
this._ignoreBackdropClick = false this._ignoreBackdropClick = false
this._isTransitioning = false this._isTransitioning = false
this._scrollbarWidth = 0 this._scrollbarWidth = 0
} }
// Getters // Getters
@ -131,11 +131,11 @@ class Modal {
$(this._element).on( $(this._element).on(
EVENT_CLICK_DISMISS, EVENT_CLICK_DISMISS,
SELECTOR_DATA_DISMISS, SELECTOR_DATA_DISMISS,
(event) => this.hide(event) event => this.hide(event)
) )
$(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => { $(this._dialog).on(EVENT_MOUSEDOWN_DISMISS, () => {
$(this._element).one(EVENT_MOUSEUP_DISMISS, (event) => { $(this._element).one(EVENT_MOUSEUP_DISMISS, event => {
if ($(event.target).is(this._element)) { if ($(event.target).is(this._element)) {
this._ignoreBackdropClick = true this._ignoreBackdropClick = true
} }
@ -180,10 +180,10 @@ class Modal {
$(this._dialog).off(EVENT_MOUSEDOWN_DISMISS) $(this._dialog).off(EVENT_MOUSEDOWN_DISMISS)
if (transition) { if (transition) {
const transitionDuration = Util.getTransitionDurationFromElement(this._element) const transitionDuration = Util.getTransitionDurationFromElement(this._element)
$(this._element) $(this._element)
.one(Util.TRANSITION_END, (event) => this._hideModal(event)) .one(Util.TRANSITION_END, event => this._hideModal(event))
.emulateTransitionEnd(transitionDuration) .emulateTransitionEnd(transitionDuration)
} else { } else {
this._hideModal() this._hideModal()
@ -192,7 +192,7 @@ class Modal {
dispose() { dispose() {
[window, this._element, this._dialog] [window, this._element, this._dialog]
.forEach((htmlElement) => $(htmlElement).off(EVENT_KEY)) .forEach(htmlElement => $(htmlElement).off(EVENT_KEY))
/** /**
* `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API`
@ -203,15 +203,15 @@ class Modal {
$.removeData(this._element, DATA_KEY) $.removeData(this._element, DATA_KEY)
this._config = null this._config = null
this._element = null this._element = null
this._dialog = null this._dialog = null
this._backdrop = null this._backdrop = null
this._isShown = null this._isShown = null
this._isBodyOverflowing = null this._isBodyOverflowing = null
this._ignoreBackdropClick = null this._ignoreBackdropClick = null
this._isTransitioning = null this._isTransitioning = null
this._scrollbarWidth = null this._scrollbarWidth = null
} }
handleUpdate() { handleUpdate() {
@ -304,12 +304,13 @@ class Modal {
if (this._config.focus) { if (this._config.focus) {
this._element.focus() this._element.focus()
} }
this._isTransitioning = false this._isTransitioning = false
$(this._element).trigger(shownEvent) $(this._element).trigger(shownEvent)
} }
if (transition) { if (transition) {
const transitionDuration = Util.getTransitionDurationFromElement(this._dialog) const transitionDuration = Util.getTransitionDurationFromElement(this._dialog)
$(this._dialog) $(this._dialog)
.one(Util.TRANSITION_END, transitionComplete) .one(Util.TRANSITION_END, transitionComplete)
@ -322,7 +323,7 @@ class Modal {
_enforceFocus() { _enforceFocus() {
$(document) $(document)
.off(EVENT_FOCUSIN) // Guard against infinite focus loop .off(EVENT_FOCUSIN) // Guard against infinite focus loop
.on(EVENT_FOCUSIN, (event) => { .on(EVENT_FOCUSIN, event => {
if (document !== event.target && if (document !== event.target &&
this._element !== event.target && this._element !== event.target &&
$(this._element).has(event.target).length === 0) { $(this._element).has(event.target).length === 0) {
@ -333,7 +334,7 @@ class Modal {
_setEscapeEvent() { _setEscapeEvent() {
if (this._isShown) { if (this._isShown) {
$(this._element).on(EVENT_KEYDOWN_DISMISS, (event) => { $(this._element).on(EVENT_KEYDOWN_DISMISS, event => {
if (this._config.keyboard && event.which === ESCAPE_KEYCODE) { if (this._config.keyboard && event.which === ESCAPE_KEYCODE) {
event.preventDefault() event.preventDefault()
this.hide() this.hide()
@ -348,7 +349,7 @@ class Modal {
_setResizeEvent() { _setResizeEvent() {
if (this._isShown) { if (this._isShown) {
$(window).on(EVENT_RESIZE, (event) => this.handleUpdate(event)) $(window).on(EVENT_RESIZE, event => this.handleUpdate(event))
} else { } else {
$(window).off(EVENT_RESIZE) $(window).off(EVENT_RESIZE)
} }
@ -376,8 +377,8 @@ class Modal {
} }
_showBackdrop(callback) { _showBackdrop(callback) {
const animate = $(this._element).hasClass(CLASS_NAME_FADE) const animate = $(this._element).hasClass(CLASS_NAME_FADE) ?
? CLASS_NAME_FADE : '' CLASS_NAME_FADE : ''
if (this._isShown && this._config.backdrop) { if (this._isShown && this._config.backdrop) {
this._backdrop = document.createElement('div') this._backdrop = document.createElement('div')
@ -389,11 +390,12 @@ class Modal {
$(this._backdrop).appendTo(document.body) $(this._backdrop).appendTo(document.body)
$(this._element).on(EVENT_CLICK_DISMISS, (event) => { $(this._element).on(EVENT_CLICK_DISMISS, event => {
if (this._ignoreBackdropClick) { if (this._ignoreBackdropClick) {
this._ignoreBackdropClick = false this._ignoreBackdropClick = false
return return
} }
if (event.target !== event.currentTarget) { if (event.target !== event.currentTarget) {
return return
} }
@ -563,6 +565,7 @@ class Modal {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config](relatedTarget) data[config](relatedTarget)
} else if (_config.show) { } else if (_config.show) {
data.show(relatedTarget) data.show(relatedTarget)
@ -585,8 +588,8 @@ $(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
target = document.querySelector(selector) target = document.querySelector(selector)
} }
const config = $(target).data(DATA_KEY) const config = $(target).data(DATA_KEY) ?
? 'toggle' : { 'toggle' : {
...$(target).data(), ...$(target).data(),
...$(this).data() ...$(this).data()
} }
@ -595,7 +598,7 @@ $(document).on(EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
event.preventDefault() event.preventDefault()
} }
const $target = $(target).one(EVENT_SHOW, (showEvent) => { const $target = $(target).one(EVENT_SHOW, showEvent => {
if (showEvent.isDefaultPrevented()) { if (showEvent.isDefaultPrevented()) {
// Only register focus restorer if modal will actually get shown // Only register focus restorer if modal will actually get shown
return return

View File

@ -14,20 +14,20 @@ import Tooltip from './tooltip'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'popover' const NAME = 'popover'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.popover' const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_PREFIX = 'bs-popover' const CLASS_PREFIX = 'bs-popover'
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g') const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const Default = { const Default = {
...Tooltip.Default, ...Tooltip.Default,
placement : 'right', placement: 'right',
trigger : 'click', trigger: 'click',
content : '', content: '',
template : '<div class="popover" role="tooltip">' + template: '<div class="popover" role="tooltip">' +
'<div class="arrow"></div>' + '<div class="arrow"></div>' +
'<h3 class="popover-header"></h3>' + '<h3 class="popover-header"></h3>' +
'<div class="popover-body"></div></div>' '<div class="popover-body"></div></div>'
@ -35,26 +35,26 @@ const Default = {
const DefaultType = { const DefaultType = {
...Tooltip.DefaultType, ...Tooltip.DefaultType,
content : '(string|element|function)' content: '(string|element|function)'
} }
const CLASS_NAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const SELECTOR_TITLE = '.popover-header' const SELECTOR_TITLE = '.popover-header'
const SELECTOR_CONTENT = '.popover-body' const SELECTOR_CONTENT = '.popover-body'
const Event = { const Event = {
HIDE : `hide${EVENT_KEY}`, HIDE: `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`, HIDDEN: `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`, SHOW: `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`, SHOWN: `shown${EVENT_KEY}`,
INSERTED : `inserted${EVENT_KEY}`, INSERTED: `inserted${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`, CLICK: `click${EVENT_KEY}`,
FOCUSIN : `focusin${EVENT_KEY}`, FOCUSIN: `focusin${EVENT_KEY}`,
FOCUSOUT : `focusout${EVENT_KEY}`, FOCUSOUT: `focusout${EVENT_KEY}`,
MOUSEENTER : `mouseenter${EVENT_KEY}`, MOUSEENTER: `mouseenter${EVENT_KEY}`,
MOUSELEAVE : `mouseleave${EVENT_KEY}` MOUSELEAVE: `mouseleave${EVENT_KEY}`
} }
/** /**
@ -118,6 +118,7 @@ class Popover extends Tooltip {
if (typeof content === 'function') { if (typeof content === 'function') {
content = content.call(this.element) content = content.call(this.element)
} }
this.setElementContent($tip.find(SELECTOR_CONTENT), content) this.setElementContent($tip.find(SELECTOR_CONTENT), content)
$tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`) $tip.removeClass(`${CLASS_NAME_FADE} ${CLASS_NAME_SHOW}`)
@ -158,6 +159,7 @@ class Popover extends Tooltip {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config]() data[config]()
} }
}) })

View File

@ -14,42 +14,42 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'scrollspy' const NAME = 'scrollspy'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.scrollspy' const DATA_KEY = 'bs.scrollspy'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const Default = { const Default = {
offset : 10, offset: 10,
method : 'auto', method: 'auto',
target : '' target: ''
} }
const DefaultType = { const DefaultType = {
offset : 'number', offset: 'number',
method : 'string', method: 'string',
target : '(string|element)' target: '(string|element)'
} }
const EVENT_ACTIVATE = `activate${EVENT_KEY}` const EVENT_ACTIVATE = `activate${EVENT_KEY}`
const EVENT_SCROLL = `scroll${EVENT_KEY}` const EVENT_SCROLL = `scroll${EVENT_KEY}`
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}` const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item' const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'
const CLASS_NAME_ACTIVE = 'active' const CLASS_NAME_ACTIVE = 'active'
const SELECTOR_DATA_SPY = '[data-spy="scroll"]' const SELECTOR_DATA_SPY = '[data-spy="scroll"]'
const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group' const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
const SELECTOR_NAV_LINKS = '.nav-link' const SELECTOR_NAV_LINKS = '.nav-link'
const SELECTOR_NAV_ITEMS = '.nav-item' const SELECTOR_NAV_ITEMS = '.nav-item'
const SELECTOR_LIST_ITEMS = '.list-group-item' const SELECTOR_LIST_ITEMS = '.list-group-item'
const SELECTOR_DROPDOWN = '.dropdown' const SELECTOR_DROPDOWN = '.dropdown'
const SELECTOR_DROPDOWN_ITEMS = '.dropdown-item' const SELECTOR_DROPDOWN_ITEMS = '.dropdown-item'
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle' const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
const METHOD_OFFSET = 'offset' const METHOD_OFFSET = 'offset'
const METHOD_POSITION = 'position' const METHOD_POSITION = 'position'
/** /**
@ -60,18 +60,18 @@ const METHOD_POSITION = 'position'
class ScrollSpy { class ScrollSpy {
constructor(element, config) { constructor(element, config) {
this._element = element this._element = element
this._scrollElement = element.tagName === 'BODY' ? window : element this._scrollElement = element.tagName === 'BODY' ? window : element
this._config = this._getConfig(config) this._config = this._getConfig(config)
this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` + this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS},` +
`${this._config.target} ${SELECTOR_LIST_ITEMS},` + `${this._config.target} ${SELECTOR_LIST_ITEMS},` +
`${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}` `${this._config.target} ${SELECTOR_DROPDOWN_ITEMS}`
this._offsets = [] this._offsets = []
this._targets = [] this._targets = []
this._activeTarget = null this._activeTarget = null
this._scrollHeight = 0 this._scrollHeight = 0
$(this._scrollElement).on(EVENT_SCROLL, (event) => this._process(event)) $(this._scrollElement).on(EVENT_SCROLL, event => this._process(event))
this.refresh() this.refresh()
this._process() this._process()
@ -90,14 +90,14 @@ class ScrollSpy {
// Public // Public
refresh() { refresh() {
const autoMethod = this._scrollElement === this._scrollElement.window const autoMethod = this._scrollElement === this._scrollElement.window ?
? METHOD_OFFSET : METHOD_POSITION METHOD_OFFSET : METHOD_POSITION
const offsetMethod = this._config.method === 'auto' const offsetMethod = this._config.method === 'auto' ?
? autoMethod : this._config.method autoMethod : this._config.method
const offsetBase = offsetMethod === METHOD_POSITION const offsetBase = offsetMethod === METHOD_POSITION ?
? this._getScrollTop() : 0 this._getScrollTop() : 0
this._offsets = [] this._offsets = []
this._targets = [] this._targets = []
@ -107,7 +107,7 @@ class ScrollSpy {
const targets = [].slice.call(document.querySelectorAll(this._selector)) const targets = [].slice.call(document.querySelectorAll(this._selector))
targets targets
.map((element) => { .map(element => {
let target let target
const targetSelector = Util.getSelectorFromElement(element) const targetSelector = Util.getSelectorFromElement(element)
@ -125,11 +125,12 @@ class ScrollSpy {
] ]
} }
} }
return null return null
}) })
.filter((item) => item) .filter(item => item)
.sort((a, b) => a[0] - b[0]) .sort((a, b) => a[0] - b[0])
.forEach((item) => { .forEach(item => {
this._offsets.push(item[0]) this._offsets.push(item[0])
this._targets.push(item[1]) this._targets.push(item[1])
}) })
@ -139,14 +140,14 @@ class ScrollSpy {
$.removeData(this._element, DATA_KEY) $.removeData(this._element, DATA_KEY)
$(this._scrollElement).off(EVENT_KEY) $(this._scrollElement).off(EVENT_KEY)
this._element = null this._element = null
this._scrollElement = null this._scrollElement = null
this._config = null this._config = null
this._selector = null this._selector = null
this._offsets = null this._offsets = null
this._targets = null this._targets = null
this._activeTarget = null this._activeTarget = null
this._scrollHeight = null this._scrollHeight = null
} }
// Private // Private
@ -163,6 +164,7 @@ class ScrollSpy {
id = Util.getUID(NAME) id = Util.getUID(NAME)
$(config.target).attr('id', id) $(config.target).attr('id', id)
} }
config.target = `#${id}` config.target = `#${id}`
} }
@ -172,8 +174,8 @@ class ScrollSpy {
} }
_getScrollTop() { _getScrollTop() {
return this._scrollElement === window return this._scrollElement === window ?
? this._scrollElement.pageYOffset : this._scrollElement.scrollTop this._scrollElement.pageYOffset : this._scrollElement.scrollTop
} }
_getScrollHeight() { _getScrollHeight() {
@ -184,14 +186,14 @@ class ScrollSpy {
} }
_getOffsetHeight() { _getOffsetHeight() {
return this._scrollElement === window return this._scrollElement === window ?
? window.innerHeight : this._scrollElement.getBoundingClientRect().height window.innerHeight : this._scrollElement.getBoundingClientRect().height
} }
_process() { _process() {
const scrollTop = this._getScrollTop() + this._config.offset const scrollTop = this._getScrollTop() + this._config.offset
const scrollHeight = this._getScrollHeight() const scrollHeight = this._getScrollHeight()
const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight() const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight()
if (this._scrollHeight !== scrollHeight) { if (this._scrollHeight !== scrollHeight) {
this.refresh() this.refresh()
@ -203,6 +205,7 @@ class ScrollSpy {
if (this._activeTarget !== target) { if (this._activeTarget !== target) {
this._activate(target) this._activate(target)
} }
return return
} }
@ -231,7 +234,7 @@ class ScrollSpy {
const queries = this._selector const queries = this._selector
.split(',') .split(',')
.map((selector) => `${selector}[data-target="${target}"],${selector}[href="${target}"]`) .map(selector => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
const $link = $([].slice.call(document.querySelectorAll(queries.join(',')))) const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))
@ -262,8 +265,8 @@ class ScrollSpy {
_clear() { _clear() {
[].slice.call(document.querySelectorAll(this._selector)) [].slice.call(document.querySelectorAll(this._selector))
.filter((node) => node.classList.contains(CLASS_NAME_ACTIVE)) .filter(node => node.classList.contains(CLASS_NAME_ACTIVE))
.forEach((node) => node.classList.remove(CLASS_NAME_ACTIVE)) .forEach(node => node.classList.remove(CLASS_NAME_ACTIVE))
} }
// Static // Static
@ -282,6 +285,7 @@ class ScrollSpy {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config]() data[config]()
} }
}) })

View File

@ -14,31 +14,31 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'tab' const NAME = 'tab'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.tab' const DATA_KEY = 'bs.tab'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api' const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const EVENT_HIDE = `hide${EVENT_KEY}` const EVENT_HIDE = `hide${EVENT_KEY}`
const EVENT_HIDDEN = `hidden${EVENT_KEY}` const EVENT_HIDDEN = `hidden${EVENT_KEY}`
const EVENT_SHOW = `show${EVENT_KEY}` const EVENT_SHOW = `show${EVENT_KEY}`
const EVENT_SHOWN = `shown${EVENT_KEY}` const EVENT_SHOWN = `shown${EVENT_KEY}`
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu' const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu'
const CLASS_NAME_ACTIVE = 'active' const CLASS_NAME_ACTIVE = 'active'
const CLASS_NAME_DISABLED = 'disabled' const CLASS_NAME_DISABLED = 'disabled'
const CLASS_NAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const SELECTOR_DROPDOWN = '.dropdown' const SELECTOR_DROPDOWN = '.dropdown'
const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group' const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
const SELECTOR_ACTIVE = '.active' const SELECTOR_ACTIVE = '.active'
const SELECTOR_ACTIVE_UL = '> li > .active' const SELECTOR_ACTIVE_UL = '> li > .active'
const SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]' const SELECTOR_DATA_TOGGLE = '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]'
const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle' const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
const SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active' const SELECTOR_DROPDOWN_ACTIVE_CHILD = '> .dropdown-menu .active'
/** /**
@ -135,9 +135,9 @@ class Tab {
// Private // Private
_activate(element, container, callback) { _activate(element, container, callback) {
const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ?
? $(container).find(SELECTOR_ACTIVE_UL) $(container).find(SELECTOR_ACTIVE_UL) :
: $(container).children(SELECTOR_ACTIVE) $(container).children(SELECTOR_ACTIVE)
const active = activeElements[0] const active = activeElements[0]
const isTransitioning = callback && (active && $(active).hasClass(CLASS_NAME_FADE)) const isTransitioning = callback && (active && $(active).hasClass(CLASS_NAME_FADE))
@ -220,6 +220,7 @@ class Tab {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config]() data[config]()
} }
}) })

View File

@ -14,33 +14,33 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'toast' const NAME = 'toast'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.toast' const DATA_KEY = 'bs.toast'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}` const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
const EVENT_HIDE = `hide${EVENT_KEY}` const EVENT_HIDE = `hide${EVENT_KEY}`
const EVENT_HIDDEN = `hidden${EVENT_KEY}` const EVENT_HIDDEN = `hidden${EVENT_KEY}`
const EVENT_SHOW = `show${EVENT_KEY}` const EVENT_SHOW = `show${EVENT_KEY}`
const EVENT_SHOWN = `shown${EVENT_KEY}` const EVENT_SHOWN = `shown${EVENT_KEY}`
const CLASS_NAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_HIDE = 'hide' const CLASS_NAME_HIDE = 'hide'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const CLASS_NAME_SHOWING = 'showing' const CLASS_NAME_SHOWING = 'showing'
const DefaultType = { const DefaultType = {
animation : 'boolean', animation: 'boolean',
autohide : 'boolean', autohide: 'boolean',
delay : 'number' delay: 'number'
} }
const Default = { const Default = {
animation : true, animation: true,
autohide : true, autohide: true,
delay : 500 delay: 500
} }
const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]' const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'
@ -54,7 +54,7 @@ const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'
class Toast { class Toast {
constructor(element, config) { constructor(element, config) {
this._element = element this._element = element
this._config = this._getConfig(config) this._config = this._getConfig(config)
this._timeout = null this._timeout = null
this._setListeners() this._setListeners()
} }
@ -142,7 +142,7 @@ class Toast {
$.removeData(this._element, DATA_KEY) $.removeData(this._element, DATA_KEY)
this._element = null this._element = null
this._config = null this._config = null
} }
// Private // Private
@ -195,8 +195,8 @@ class Toast {
static _jQueryInterface(config) { static _jQueryInterface(config) {
return this.each(function () { return this.each(function () {
const $element = $(this) const $element = $(this)
let data = $element.data(DATA_KEY) let data = $element.data(DATA_KEY)
const _config = typeof config === 'object' && config const _config = typeof config === 'object' && config
if (!data) { if (!data) {
data = new Toast(this, _config) data = new Toast(this, _config)
@ -220,9 +220,9 @@ class Toast {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$.fn[NAME] = Toast._jQueryInterface $.fn[NAME] = Toast._jQueryInterface
$.fn[NAME].Constructor = Toast $.fn[NAME].Constructor = Toast
$.fn[NAME].noConflict = () => { $.fn[NAME].noConflict = () => {
$.fn[NAME] = JQUERY_NO_CONFLICT $.fn[NAME] = JQUERY_NO_CONFLICT
return Toast._jQueryInterface return Toast._jQueryInterface
} }

View File

@ -77,7 +77,7 @@ function allowedAttribute(attr, allowedAttributeList) {
return true return true
} }
const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp) const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp)
// Check if a regular expression validates the attribute. // Check if a regular expression validates the attribute.
for (let i = 0, len = regExp.length; i < len; i++) { for (let i = 0, len = regExp.length; i < len; i++) {
@ -116,7 +116,7 @@ export function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
const attributeList = [].slice.call(el.attributes) const attributeList = [].slice.call(el.attributes)
const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []) const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
attributeList.forEach((attr) => { attributeList.forEach(attr => {
if (!allowedAttribute(attr, whitelistedAttributes)) { if (!allowedAttribute(attr, whitelistedAttributes)) {
el.removeAttribute(attr.nodeName) el.removeAttribute(attr.nodeName)
} }

View File

@ -19,88 +19,88 @@ import Util from './util'
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
const NAME = 'tooltip' const NAME = 'tooltip'
const VERSION = '4.5.2' const VERSION = '4.5.2'
const DATA_KEY = 'bs.tooltip' const DATA_KEY = 'bs.tooltip'
const EVENT_KEY = `.${DATA_KEY}` const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const CLASS_PREFIX = 'bs-tooltip' const CLASS_PREFIX = 'bs-tooltip'
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g') const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
const DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'] const DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
const DefaultType = { const DefaultType = {
animation : 'boolean', animation: 'boolean',
template : 'string', template: 'string',
title : '(string|element|function)', title: '(string|element|function)',
trigger : 'string', trigger: 'string',
delay : '(number|object)', delay: '(number|object)',
html : 'boolean', html: 'boolean',
selector : '(string|boolean)', selector: '(string|boolean)',
placement : '(string|function)', placement: '(string|function)',
offset : '(number|string|function)', offset: '(number|string|function)',
container : '(string|element|boolean)', container: '(string|element|boolean)',
fallbackPlacement : '(string|array)', fallbackPlacement: '(string|array)',
boundary : '(string|element)', boundary: '(string|element)',
sanitize : 'boolean', sanitize: 'boolean',
sanitizeFn : '(null|function)', sanitizeFn: '(null|function)',
whiteList : 'object', whiteList: 'object',
popperConfig : '(null|object)' popperConfig: '(null|object)'
} }
const AttachmentMap = { const AttachmentMap = {
AUTO : 'auto', AUTO: 'auto',
TOP : 'top', TOP: 'top',
RIGHT : 'right', RIGHT: 'right',
BOTTOM : 'bottom', BOTTOM: 'bottom',
LEFT : 'left' LEFT: 'left'
} }
const Default = { const Default = {
animation : true, animation: true,
template : '<div class="tooltip" role="tooltip">' + template: '<div class="tooltip" role="tooltip">' +
'<div class="arrow"></div>' + '<div class="arrow"></div>' +
'<div class="tooltip-inner"></div></div>', '<div class="tooltip-inner"></div></div>',
trigger : 'hover focus', trigger: 'hover focus',
title : '', title: '',
delay : 0, delay: 0,
html : false, html: false,
selector : false, selector: false,
placement : 'top', placement: 'top',
offset : 0, offset: 0,
container : false, container: false,
fallbackPlacement : 'flip', fallbackPlacement: 'flip',
boundary : 'scrollParent', boundary: 'scrollParent',
sanitize : true, sanitize: true,
sanitizeFn : null, sanitizeFn: null,
whiteList : DefaultWhitelist, whiteList: DefaultWhitelist,
popperConfig : null popperConfig: null
} }
const HOVER_STATE_SHOW = 'show' const HOVER_STATE_SHOW = 'show'
const HOVER_STATE_OUT = 'out' const HOVER_STATE_OUT = 'out'
const Event = { const Event = {
HIDE : `hide${EVENT_KEY}`, HIDE: `hide${EVENT_KEY}`,
HIDDEN : `hidden${EVENT_KEY}`, HIDDEN: `hidden${EVENT_KEY}`,
SHOW : `show${EVENT_KEY}`, SHOW: `show${EVENT_KEY}`,
SHOWN : `shown${EVENT_KEY}`, SHOWN: `shown${EVENT_KEY}`,
INSERTED : `inserted${EVENT_KEY}`, INSERTED: `inserted${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`, CLICK: `click${EVENT_KEY}`,
FOCUSIN : `focusin${EVENT_KEY}`, FOCUSIN: `focusin${EVENT_KEY}`,
FOCUSOUT : `focusout${EVENT_KEY}`, FOCUSOUT: `focusout${EVENT_KEY}`,
MOUSEENTER : `mouseenter${EVENT_KEY}`, MOUSEENTER: `mouseenter${EVENT_KEY}`,
MOUSELEAVE : `mouseleave${EVENT_KEY}` MOUSELEAVE: `mouseleave${EVENT_KEY}`
} }
const CLASS_NAME_FADE = 'fade' const CLASS_NAME_FADE = 'fade'
const CLASS_NAME_SHOW = 'show' const CLASS_NAME_SHOW = 'show'
const SELECTOR_TOOLTIP_INNER = '.tooltip-inner' const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'
const SELECTOR_ARROW = '.arrow' const SELECTOR_ARROW = '.arrow'
const TRIGGER_HOVER = 'hover' const TRIGGER_HOVER = 'hover'
const TRIGGER_FOCUS = 'focus' const TRIGGER_FOCUS = 'focus'
const TRIGGER_CLICK = 'click' const TRIGGER_CLICK = 'click'
const TRIGGER_MANUAL = 'manual' const TRIGGER_MANUAL = 'manual'
/** /**
@ -116,16 +116,16 @@ class Tooltip {
} }
// private // private
this._isEnabled = true this._isEnabled = true
this._timeout = 0 this._timeout = 0
this._hoverState = '' this._hoverState = ''
this._activeTrigger = {} this._activeTrigger = {}
this._popper = null this._popper = null
// Protected // Protected
this.element = element this.element = element
this.config = this._getConfig(config) this.config = this._getConfig(config)
this.tip = null this.tip = null
this._setListeners() this._setListeners()
} }
@ -220,9 +220,9 @@ class Tooltip {
$(this.tip).remove() $(this.tip).remove()
} }
this._isEnabled = null this._isEnabled = null
this._timeout = null this._timeout = null
this._hoverState = null this._hoverState = null
this._activeTrigger = null this._activeTrigger = null
if (this._popper) { if (this._popper) {
this._popper.destroy() this._popper.destroy()
@ -230,8 +230,8 @@ class Tooltip {
this._popper = null this._popper = null
this.element = null this.element = null
this.config = null this.config = null
this.tip = null this.tip = null
} }
show() { show() {
@ -253,7 +253,7 @@ class Tooltip {
return return
} }
const tip = this.getTipElement() const tip = this.getTipElement()
const tipId = Util.getUID(this.constructor.NAME) const tipId = Util.getUID(this.constructor.NAME)
tip.setAttribute('id', tipId) tip.setAttribute('id', tipId)
@ -265,9 +265,9 @@ class Tooltip {
$(tip).addClass(CLASS_NAME_FADE) $(tip).addClass(CLASS_NAME_FADE)
} }
const placement = typeof this.config.placement === 'function' const placement = typeof this.config.placement === 'function' ?
? this.config.placement.call(this, tip, this.element) this.config.placement.call(this, tip, this.element) :
: this.config.placement this.config.placement
const attachment = this._getAttachment(placement) const attachment = this._getAttachment(placement)
this.addAttachmentClass(attachment) this.addAttachmentClass(attachment)
@ -297,8 +297,9 @@ class Tooltip {
if (this.config.animation) { if (this.config.animation) {
this._fixTransition() this._fixTransition()
} }
const prevHoverState = this._hoverState const prevHoverState = this._hoverState
this._hoverState = null this._hoverState = null
$(this.element).trigger(this.constructor.Event.SHOWN) $(this.element).trigger(this.constructor.Event.SHOWN)
@ -320,7 +321,7 @@ class Tooltip {
} }
hide(callback) { hide(callback) {
const tip = this.getTipElement() const tip = this.getTipElement()
const hideEvent = $.Event(this.constructor.Event.HIDE) const hideEvent = $.Event(this.constructor.Event.HIDE)
const complete = () => { const complete = () => {
if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) { if (this._hoverState !== HOVER_STATE_SHOW && tip.parentNode) {
@ -426,9 +427,9 @@ class Tooltip {
let title = this.element.getAttribute('data-original-title') let title = this.element.getAttribute('data-original-title')
if (!title) { if (!title) {
title = typeof this.config.title === 'function' title = typeof this.config.title === 'function' ?
? this.config.title.call(this.element) this.config.title.call(this.element) :
: this.config.title this.config.title
} }
return title return title
@ -451,12 +452,12 @@ class Tooltip {
boundariesElement: this.config.boundary boundariesElement: this.config.boundary
} }
}, },
onCreate: (data) => { onCreate: data => {
if (data.originalPlacement !== data.placement) { if (data.originalPlacement !== data.placement) {
this._handlePopperPlacementChange(data) this._handlePopperPlacementChange(data)
} }
}, },
onUpdate: (data) => this._handlePopperPlacementChange(data) onUpdate: data => this._handlePopperPlacementChange(data)
} }
return { return {
@ -469,7 +470,7 @@ class Tooltip {
const offset = {} const offset = {}
if (typeof this.config.offset === 'function') { if (typeof this.config.offset === 'function') {
offset.fn = (data) => { offset.fn = data => {
data.offsets = { data.offsets = {
...data.offsets, ...data.offsets,
...this.config.offset(data.offsets, this.element) || {} ...this.config.offset(data.offsets, this.element) || {}
@ -503,24 +504,24 @@ class Tooltip {
_setListeners() { _setListeners() {
const triggers = this.config.trigger.split(' ') const triggers = this.config.trigger.split(' ')
triggers.forEach((trigger) => { triggers.forEach(trigger => {
if (trigger === 'click') { if (trigger === 'click') {
$(this.element).on( $(this.element).on(
this.constructor.Event.CLICK, this.constructor.Event.CLICK,
this.config.selector, this.config.selector,
(event) => this.toggle(event) event => this.toggle(event)
) )
} else if (trigger !== TRIGGER_MANUAL) { } else if (trigger !== TRIGGER_MANUAL) {
const eventIn = trigger === TRIGGER_HOVER const eventIn = trigger === TRIGGER_HOVER ?
? this.constructor.Event.MOUSEENTER this.constructor.Event.MOUSEENTER :
: this.constructor.Event.FOCUSIN this.constructor.Event.FOCUSIN
const eventOut = trigger === TRIGGER_HOVER const eventOut = trigger === TRIGGER_HOVER ?
? this.constructor.Event.MOUSELEAVE this.constructor.Event.MOUSELEAVE :
: this.constructor.Event.FOCUSOUT this.constructor.Event.FOCUSOUT
$(this.element) $(this.element)
.on(eventIn, this.config.selector, (event) => this._enter(event)) .on(eventIn, this.config.selector, event => this._enter(event))
.on(eventOut, this.config.selector, (event) => this._leave(event)) .on(eventOut, this.config.selector, event => this._leave(event))
} }
}) })
@ -647,7 +648,7 @@ class Tooltip {
const dataAttributes = $(this.element).data() const dataAttributes = $(this.element).data()
Object.keys(dataAttributes) Object.keys(dataAttributes)
.forEach((dataAttr) => { .forEach(dataAttr => {
if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {
delete dataAttributes[dataAttr] delete dataAttributes[dataAttr]
} }
@ -750,6 +751,7 @@ class Tooltip {
if (typeof data[config] === 'undefined') { if (typeof data[config] === 'undefined') {
throw new TypeError(`No method named "${config}"`) throw new TypeError(`No method named "${config}"`)
} }
data[config]() data[config]()
} }
}) })

View File

@ -34,6 +34,7 @@ function getSpecialTransitionEndEvent() {
if ($(event.target).is(this)) { if ($(event.target).is(this)) {
return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
} }
return undefined return undefined
} }
} }
@ -71,9 +72,9 @@ const Util = {
getUID(prefix) { getUID(prefix) {
do { do {
// eslint-disable-next-line no-bitwise
prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
} while (document.getElementById(prefix)) } while (document.getElementById(prefix))
return prefix return prefix
}, },
@ -87,7 +88,7 @@ const Util = {
try { try {
return document.querySelector(selector) ? selector : null return document.querySelector(selector) ? selector : null
} catch (err) { } catch (_) {
return null return null
} }
}, },
@ -137,9 +138,9 @@ const Util = {
for (const property in configTypes) { for (const property in configTypes) {
if (Object.prototype.hasOwnProperty.call(configTypes, property)) { if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
const expectedTypes = configTypes[property] const expectedTypes = configTypes[property]
const value = config[property] const value = config[property]
const valueType = value && Util.isElement(value) const valueType = value && Util.isElement(value) ?
? 'element' : toType(value) 'element' : toType(value)
if (!new RegExp(expectedTypes).test(valueType)) { if (!new RegExp(expectedTypes).test(valueType)) {
throw new Error( throw new Error(

View File

@ -13,8 +13,8 @@ const browsers = {
base: 'BrowserStack', base: 'BrowserStack',
os: 'OS X', os: 'OS X',
os_version: 'High Sierra', os_version: 'High Sierra',
browser : 'Chrome', browser: 'Chrome',
browser_version : 'latest' browser_version: 'latest'
}, },
firefoxMac: { firefoxMac: {
base: 'BrowserStack', base: 'BrowserStack',

View File

@ -135,7 +135,7 @@ conf.plugins = plugins
conf.reporters = reporters conf.reporters = reporters
conf.files = files conf.files = files
module.exports = (karmaConfig) => { module.exports = karmaConfig => {
// possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG // possible values: karmaConfig.LOG_DISABLE || karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN || karmaConfig.LOG_INFO || karmaConfig.LOG_DEBUG
conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN conf.logLevel = karmaConfig.LOG_ERROR || karmaConfig.LOG_WARN
karmaConfig.set(conf) karmaConfig.set(conf)

View File

@ -65,8 +65,8 @@ $(function () {
$el.bootstrapCarousel() $el.bootstrapCarousel()
try { try {
$el.bootstrapCarousel('noMethod') $el.bootstrapCarousel('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })
@ -89,8 +89,8 @@ $(function () {
try { try {
$('<div/>').bootstrapCarousel(config) $('<div/>').bootstrapCarousel(config)
} catch (err) { } catch (error) {
message = err.message message = error.message
} }
assert.ok(message === expectedMessage, 'correct error message') assert.ok(message === expectedMessage, 'correct error message')
@ -102,8 +102,8 @@ $(function () {
try { try {
$('<div/>').bootstrapCarousel(config) $('<div/>').bootstrapCarousel(config)
} catch (err) { } catch (error) {
message = err.message message = error.message
} }
assert.ok(message === expectedMessage, 'correct error message') assert.ok(message === expectedMessage, 'correct error message')
@ -652,7 +652,7 @@ $(function () {
var eventArrowDown = $.Event('keydown', { var eventArrowDown = $.Event('keydown', {
which: 40 which: 40
}) })
var eventArrowUp = $.Event('keydown', { var eventArrowUp = $.Event('keydown', {
which: 38 which: 38
}) })

View File

@ -31,8 +31,8 @@ $(function () {
$el.bootstrapCollapse() $el.bootstrapCollapse()
try { try {
$el.bootstrapCollapse('noMethod') $el.bootstrapCollapse('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })
@ -457,7 +457,7 @@ $(function () {
'<div class="card"/>' + '<div class="card"/>' +
'</div>' '</div>'
var showFired = false var showFired = false
var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card') var $groups = $(accordionHTML).appendTo('#qunit-fixture').find('.card')
var $target1 = $('<a role="button" data-toggle="collapse" href="#body1"/>').appendTo($groups.eq(0)) var $target1 = $('<a role="button" data-toggle="collapse" href="#body1"/>').appendTo($groups.eq(0))
@ -468,7 +468,7 @@ $(function () {
}) })
var $target2 = $('<a role="button" data-toggle="collapse" href="#body2"/>').appendTo($groups.eq(1)) var $target2 = $('<a role="button" data-toggle="collapse" href="#body2"/>').appendTo($groups.eq(1))
var $body2 = $('<div id="body2" class="collapse" data-parent="#accordion"/>').appendTo($groups.eq(1)) var $body2 = $('<div id="body2" class="collapse" data-parent="#accordion"/>').appendTo($groups.eq(1))
$target2.trigger('click') $target2.trigger('click')
@ -604,8 +604,8 @@ $(function () {
var $collapseTwoOne = $('#collapseTwoOne') var $collapseTwoOne = $('#collapseTwoOne')
var $collapseTwoTwo = $('#collapseTwoTwo') var $collapseTwoTwo = $('#collapseTwoTwo')
var collapsedElements = { var collapsedElements = {
one : false, one: false,
two : false two: false
} }
function firstTest() { function firstTest() {
@ -830,7 +830,7 @@ $(function () {
parent: $('.my-collapse') parent: $('.my-collapse')
}) })
assert.ok(true, 'collapse correctly created') assert.ok(true, 'collapse correctly created')
} catch (err) { } catch (_) {
assert.ok(false, 'collapse not created') assert.ok(false, 'collapse not created')
} }
}) })
@ -851,7 +851,7 @@ $(function () {
parent: $('.my-collapse')[0] parent: $('.my-collapse')[0]
}) })
assert.ok(true, 'collapse correctly created') assert.ok(true, 'collapse correctly created')
} catch (err) { } catch (_) {
assert.ok(false, 'collapse not created') assert.ok(false, 'collapse not created')
} }
}) })

View File

@ -31,8 +31,8 @@ $(function () {
$el.bootstrapDropdown() $el.bootstrapDropdown()
try { try {
$el.bootstrapDropdown('noMethod') $el.bootstrapDropdown('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })

View File

@ -44,8 +44,8 @@ $(function () {
$el.bootstrapModal() $el.bootstrapModal()
try { try {
$el.bootstrapModal('noMethod') $el.bootstrapModal('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })
@ -450,8 +450,8 @@ $(function () {
var originalPadding = $body.css('padding-right') var originalPadding = $body.css('padding-right')
// Hide scrollbars to prevent the body overflowing // Hide scrollbars to prevent the body overflowing
$body.css('overflow', 'hidden') // Real scrollbar (for in-browser testing) $body.css('overflow', 'hidden') // Real scrollbar (for in-browser testing)
$('html').css('padding-right', '0px') // Simulated scrollbar (for PhantomJS) $('html').css('padding-right', '0px') // Simulated scrollbar (for PhantomJS)
$('<div id="modal-test"/>') $('<div id="modal-test"/>')
.on('shown.bs.modal', function () { .on('shown.bs.modal', function () {

View File

@ -32,8 +32,8 @@ $(function () {
$el.bootstrapPopover() $el.bootstrapPopover()
try { try {
$el.bootstrapPopover('noMethod') $el.bootstrapPopover('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })
@ -369,8 +369,8 @@ $(function () {
try { try {
$('<div data-toggle="popover" data-title="some title" data-content="@Johann-S" style="display: none"/>').bootstrapPopover('show') $('<div data-toggle="popover" data-title="some title" data-content="@Johann-S" style="display: none"/>').bootstrapPopover('show')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'Please use show on visible elements') assert.strictEqual(error.message, 'Please use show on visible elements')
done() done()
} }
}) })

View File

@ -31,8 +31,8 @@ $(function () {
$el.bootstrapScrollspy() $el.bootstrapScrollspy()
try { try {
$el.bootstrapScrollspy('noMethod') $el.bootstrapScrollspy('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })

View File

@ -31,8 +31,8 @@ $(function () {
$el.bootstrapTab() $el.bootstrapTab()
try { try {
$el.bootstrapTab('noMethod') $el.bootstrapTab('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })
@ -94,7 +94,7 @@ $(function () {
QUnit.test('should activate element by tab id in nav list', function (assert) { QUnit.test('should activate element by tab id in nav list', function (assert) {
assert.expect(2) assert.expect(2)
var tabsHTML = '<nav class="nav">' + var tabsHTML = '<nav class="nav">' +
'<a href="#home">Home</a>' + '<a href="#home">Home</a>' +
'<a href="#profile">Profile</a>' + '<a href="#profile">Profile</a>' +
'</nav>' '</nav>'
@ -110,7 +110,7 @@ $(function () {
QUnit.test('should activate element by tab id in list group', function (assert) { QUnit.test('should activate element by tab id in list group', function (assert) {
assert.expect(2) assert.expect(2)
var tabsHTML = '<div class="list-group">' + var tabsHTML = '<div class="list-group">' +
'<a href="#home">Home</a>' + '<a href="#home">Home</a>' +
'<a href="#profile">Profile</a>' + '<a href="#profile">Profile</a>' +
'</div>' '</div>'

View File

@ -41,8 +41,8 @@ $(function () {
try { try {
$el.bootstrapToast('noMethod') $el.bootstrapToast('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })

View File

@ -32,8 +32,8 @@ $(function () {
$el.bootstrapTooltip() $el.bootstrapTooltip()
try { try {
$el.bootstrapTooltip('noMethod') $el.bootstrapTooltip('noMethod')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'No method named "noMethod"') assert.strictEqual(error.message, 'No method named "noMethod"')
} }
}) })
@ -231,8 +231,8 @@ $(function () {
try { try {
$('<div title="tooltip title" style="display: none"/>').bootstrapTooltip('show') $('<div title="tooltip title" style="display: none"/>').bootstrapTooltip('show')
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'Please use show on visible elements') assert.strictEqual(error.message, 'Please use show on visible elements')
done() done()
} }
}) })
@ -336,7 +336,7 @@ $(function () {
assert.expect(7) assert.expect(7)
var $tooltip = $('<div/>') var $tooltip = $('<div/>')
.bootstrapTooltip() .bootstrapTooltip()
.on('click.foo', function () {}) // eslint-disable-line no-empty-function .on('click.foo', function () {})
assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data') assert.ok($tooltip.data('bs.tooltip'), 'tooltip has data')
assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events') assert.ok($._data($tooltip[0], 'events').mouseover && $._data($tooltip[0], 'events').mouseout, 'tooltip has hover events')
@ -561,7 +561,7 @@ $(function () {
try { try {
$tooltip.bootstrapTooltip('show') $tooltip.bootstrapTooltip('show')
} catch (err) { } catch (_) {
passed = false passed = false
} }

View File

@ -46,8 +46,8 @@ $(function () {
try { try {
Util.typeCheckConfig(namePlugin, config, defaultType) Util.typeCheckConfig(namePlugin, config, defaultType)
} catch (err) { } catch (error) {
assert.strictEqual(err.message, 'COLLAPSE: Option "parent" provided type "number" but expected type "(string|element)".') assert.strictEqual(error.message, 'COLLAPSE: Option "parent" provided type "number" but expected type "(string|element)".')
} }
}) })

View File

@ -44,8 +44,8 @@
// Modal relatedTarget demo // Modal relatedTarget demo
$('#exampleModal').on('show.bs.modal', function (event) { $('#exampleModal').on('show.bs.modal', function (event) {
var $button = $(event.relatedTarget) // Button that triggered the modal var $button = $(event.relatedTarget) // Button that triggered the modal
var recipient = $button.data('whatever') // Extract info from data-* attributes var recipient = $button.data('whatever') // Extract info from data-* attributes
// If necessary, you could initiate an AJAX request here (and then do the updating in a callback). // If necessary, you could initiate an AJAX request here (and then do the updating in a callback).
// Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead. // Update the modal's content. We'll use jQuery here, but you could use a data binding library or other methods instead.
var $modal = $(this) var $modal = $(this)
@ -109,4 +109,4 @@
bsCustomFileInput.init() bsCustomFileInput.init()
}) })
}(jQuery)) })(jQuery)

View File

@ -11,6 +11,7 @@
if (groups === null) { if (groups === null) {
return null return null
} }
var ieVersionNum = parseInt(groups[1], 10) var ieVersionNum = parseInt(groups[1], 10)
var ieMajorVersion = Math.floor(ieVersionNum) var ieMajorVersion = Math.floor(ieVersionNum)
return ieMajorVersion return ieMajorVersion
@ -24,9 +25,11 @@
if (typeof jscriptVersion === 'undefined') { if (typeof jscriptVersion === 'undefined') {
return 11 // IE11+ not in emulation mode return 11 // IE11+ not in emulation mode
} }
if (jscriptVersion < 9) { if (jscriptVersion < 9) {
return 8 // IE8 (or lower; haven't tested on IE<8) return 8 // IE8 (or lower; haven't tested on IE<8)
} }
return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode
} }
@ -34,14 +37,16 @@
if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) { if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) {
return // Opera, which might pretend to be IE return // Opera, which might pretend to be IE
} }
var emulated = emulatedIEMajorVersion() var emulated = emulatedIEMajorVersion()
if (emulated === null) { if (emulated === null) {
return // Not IE return // Not IE
} }
var nonEmulated = actualNonEmulatedIEMajorVersion() var nonEmulated = actualNonEmulatedIEMajorVersion()
if (emulated !== nonEmulated) { if (emulated !== nonEmulated) {
// eslint-disable-next-line no-alert // eslint-disable-next-line no-alert
window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!') window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!')
} }
}()) })()

View File

@ -37,12 +37,12 @@
var currentUrl = getOrigin() var currentUrl = getOrigin()
var liveUrl = 'https://getbootstrap.com/' var liveUrl = 'https://getbootstrap.com/'
hit.url = currentUrl.lastIndexOf(liveUrl, 0) === 0 hit.url = currentUrl.lastIndexOf(liveUrl, 0) === 0 ?
// On production, return the result as is // On production, return the result as is
? hit.url hit.url :
// On development or Netlify, replace `hit.url` with a trailing slash, // On development or Netlify, replace `hit.url` with a trailing slash,
// so that the result link is relative to the server root // so that the result link is relative to the server root
: hit.url.replace(liveUrl, '/') hit.url.replace(liveUrl, '/')
// Prevent jumping to first header // Prevent jumping to first header
if (hit.anchor === 'content') { if (hit.anchor === 'content') {
@ -56,4 +56,4 @@
// Set debug to `true` if you want to inspect the dropdown // Set debug to `true` if you want to inspect the dropdown
debug: false debug: false
}) })
}()) })()

View File

@ -13,8 +13,9 @@
event.preventDefault() event.preventDefault()
event.stopPropagation() event.stopPropagation()
} }
form.classList.add('was-validated') form.classList.add('was-validated')
}, false) }, false)
}) })
}, false) }, false)
}()) })()

View File

@ -50,4 +50,4 @@
} }
} }
}) })
}()) })()