123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- import $ from 'jquery'
- /**
- * --------------------------------------------------------------------------
- * Bootstrap (v4.1.3): util.js
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * --------------------------------------------------------------------------
- */
- const Util = (($) => {
- /**
- * ------------------------------------------------------------------------
- * Private TransitionEnd Helpers
- * ------------------------------------------------------------------------
- */
- const TRANSITION_END = 'transitionend'
- const MAX_UID = 1000000
- const MILLISECONDS_MULTIPLIER = 1000
- // Shoutout AngusCroll (https://goo.gl/pxwQGp)
- function toType(obj) {
- return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase()
- }
- function getSpecialTransitionEndEvent() {
- return {
- bindType: TRANSITION_END,
- delegateType: TRANSITION_END,
- handle(event) {
- if ($(event.target).is(this)) {
- return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params
- }
- return undefined // eslint-disable-line no-undefined
- }
- }
- }
- function transitionEndEmulator(duration) {
- let called = false
- $(this).one(Util.TRANSITION_END, () => {
- called = true
- })
- setTimeout(() => {
- if (!called) {
- Util.triggerTransitionEnd(this)
- }
- }, duration)
- return this
- }
- function setTransitionEndSupport() {
- $.fn.emulateTransitionEnd = transitionEndEmulator
- $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()
- }
- /**
- * --------------------------------------------------------------------------
- * Public Util Api
- * --------------------------------------------------------------------------
- */
- const Util = {
- TRANSITION_END: 'bsTransitionEnd',
- getUID(prefix) {
- do {
- // eslint-disable-next-line no-bitwise
- prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here
- } while (document.getElementById(prefix))
- return prefix
- },
- getSelectorFromElement(element) {
- let selector = element.getAttribute('data-target')
- if (!selector || selector === '#') {
- selector = element.getAttribute('href') || ''
- }
- try {
- return document.querySelector(selector) ? selector : null
- } catch (err) {
- return null
- }
- },
- getTransitionDurationFromElement(element) {
- if (!element) {
- return 0
- }
- // Get transition-duration of the element
- let transitionDuration = $(element).css('transition-duration')
- const floatTransitionDuration = parseFloat(transitionDuration)
- // Return 0 if element or transition duration is not found
- if (!floatTransitionDuration) {
- return 0
- }
- // If multiple durations are defined, take the first
- transitionDuration = transitionDuration.split(',')[0]
- return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER
- },
- reflow(element) {
- return element.offsetHeight
- },
- triggerTransitionEnd(element) {
- $(element).trigger(TRANSITION_END)
- },
- // TODO: Remove in v5
- supportsTransitionEnd() {
- return Boolean(TRANSITION_END)
- },
- isElement(obj) {
- return (obj[0] || obj).nodeType
- },
- typeCheckConfig(componentName, config, configTypes) {
- for (const property in configTypes) {
- if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
- const expectedTypes = configTypes[property]
- const value = config[property]
- const valueType = value && Util.isElement(value)
- ? 'element' : toType(value)
- if (!new RegExp(expectedTypes).test(valueType)) {
- throw new Error(
- `${componentName.toUpperCase()}: ` +
- `Option "${property}" provided type "${valueType}" ` +
- `but expected type "${expectedTypes}".`)
- }
- }
- }
- }
- }
- setTransitionEndSupport()
- return Util
- })($)
- export default Util
|