/** * -------------------------------------------------------------------------- * Bootstrap (v4.3.1): toast.js * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * -------------------------------------------------------------------------- */ import $ from 'jquery' import Util from './util' /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ const NAME = 'toast' const VERSION = '4.3.1' const DATA_KEY = 'bs.toast' const EVENT_KEY = `.${DATA_KEY}` const JQUERY_NO_CONFLICT = $.fn[NAME] const Event = { CLICK_DISMISS : `click.dismiss${EVENT_KEY}`, HIDE : `hide${EVENT_KEY}`, HIDDEN : `hidden${EVENT_KEY}`, SHOW : `show${EVENT_KEY}`, SHOWN : `shown${EVENT_KEY}` } const ClassName = { FADE : 'fade', HIDE : 'hide', SHOW : 'show', SHOWING : 'showing' } const DefaultType = { animation : 'boolean', autohide : 'boolean', delay : 'number' } const Default = { animation : true, autohide : true, delay : 500 } const Selector = { DATA_DISMISS : '[data-dismiss="toast"]' } /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ class Toast { constructor(element, config) { this._element = element this._config = this._getConfig(config) this._timeout = null this._setListeners() } // Getters static get VERSION() { return VERSION } static get DefaultType() { return DefaultType } static get Default() { return Default } // Public show() { $(this._element).trigger(Event.SHOW) if (this._config.animation) { this._element.classList.add(ClassName.FADE) } const complete = () => { this._element.classList.remove(ClassName.SHOWING) this._element.classList.add(ClassName.SHOW) $(this._element).trigger(Event.SHOWN) if (this._config.autohide) { this.hide() } } this._element.classList.remove(ClassName.HIDE) this._element.classList.add(ClassName.SHOWING) if (this._config.animation) { const transitionDuration = Util.getTransitionDurationFromElement(this._element) $(this._element) .one(Util.TRANSITION_END, complete) .emulateTransitionEnd(transitionDuration) } else { complete() } } hide(withoutTimeout) { if (!this._element.classList.contains(ClassName.SHOW)) { return } $(this._element).trigger(Event.HIDE) if (withoutTimeout) { this._close() } else { this._timeout = setTimeout(() => { this._close() }, this._config.delay) } } dispose() { clearTimeout(this._timeout) this._timeout = null if (this._element.classList.contains(ClassName.SHOW)) { this._element.classList.remove(ClassName.SHOW) } $(this._element).off(Event.CLICK_DISMISS) $.removeData(this._element, DATA_KEY) this._element = null this._config = null } // Private _getConfig(config) { config = { ...Default, ...$(this._element).data(), ...typeof config === 'object' && config ? config : {} } Util.typeCheckConfig( NAME, config, this.constructor.DefaultType ) return config } _setListeners() { $(this._element).on( Event.CLICK_DISMISS, Selector.DATA_DISMISS, () => this.hide(true) ) } _close() { const complete = () => { this._element.classList.add(ClassName.HIDE) $(this._element).trigger(Event.HIDDEN) } this._element.classList.remove(ClassName.SHOW) if (this._config.animation) { const transitionDuration = Util.getTransitionDurationFromElement(this._element) $(this._element) .one(Util.TRANSITION_END, complete) .emulateTransitionEnd(transitionDuration) } else { complete() } } // Static static _jQueryInterface(config) { return this.each(function () { const $element = $(this) let data = $element.data(DATA_KEY) const _config = typeof config === 'object' && config if (!data) { data = new Toast(this, _config) $element.data(DATA_KEY, data) } if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`) } data[config](this) } }) } } /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ $.fn[NAME] = Toast._jQueryInterface $.fn[NAME].Constructor = Toast $.fn[NAME].noConflict = () => { $.fn[NAME] = JQUERY_NO_CONFLICT return Toast._jQueryInterface } export default Toast