9
import Util from './util'
16
const VERSION = '4.6.1'
17
const DATA_KEY = 'bs.toast'
18
const EVENT_KEY = `.${DATA_KEY}`
19
const JQUERY_NO_CONFLICT = $.fn[NAME]
21
const CLASS_NAME_FADE = 'fade'
22
const CLASS_NAME_HIDE = 'hide'
23
const CLASS_NAME_SHOW = 'show'
24
const CLASS_NAME_SHOWING = 'showing'
26
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
27
const EVENT_HIDE = `hide${EVENT_KEY}`
28
const EVENT_HIDDEN = `hidden${EVENT_KEY}`
29
const EVENT_SHOW = `show${EVENT_KEY}`
30
const EVENT_SHOWN = `shown${EVENT_KEY}`
32
const SELECTOR_DATA_DISMISS = '[data-dismiss="toast"]'
51
constructor(element, config) {
52
this._element = element
53
this._config = this._getConfig(config)
59
static get VERSION() {
63
static get DefaultType() {
67
static get Default() {
73
const showEvent = $.Event(EVENT_SHOW)
75
$(this._element).trigger(showEvent)
76
if (showEvent.isDefaultPrevented()) {
82
if (this._config.animation) {
83
this._element.classList.add(CLASS_NAME_FADE)
86
const complete = () => {
87
this._element.classList.remove(CLASS_NAME_SHOWING)
88
this._element.classList.add(CLASS_NAME_SHOW)
90
$(this._element).trigger(EVENT_SHOWN)
92
if (this._config.autohide) {
93
this._timeout = setTimeout(() => {
95
}, this._config.delay)
99
this._element.classList.remove(CLASS_NAME_HIDE)
100
Util.reflow(this._element)
101
this._element.classList.add(CLASS_NAME_SHOWING)
102
if (this._config.animation) {
103
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
106
.one(Util.TRANSITION_END, complete)
107
.emulateTransitionEnd(transitionDuration)
114
if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
118
const hideEvent = $.Event(EVENT_HIDE)
120
$(this._element).trigger(hideEvent)
121
if (hideEvent.isDefaultPrevented()) {
131
if (this._element.classList.contains(CLASS_NAME_SHOW)) {
132
this._element.classList.remove(CLASS_NAME_SHOW)
135
$(this._element).off(EVENT_CLICK_DISMISS)
137
$.removeData(this._element, DATA_KEY)
146
...$(this._element).data(),
147
...(typeof config === 'object' && config ? config : {})
150
Util.typeCheckConfig(
153
this.constructor.DefaultType
160
$(this._element).on(EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide())
164
const complete = () => {
165
this._element.classList.add(CLASS_NAME_HIDE)
166
$(this._element).trigger(EVENT_HIDDEN)
169
this._element.classList.remove(CLASS_NAME_SHOW)
170
if (this._config.animation) {
171
const transitionDuration = Util.getTransitionDurationFromElement(this._element)
174
.one(Util.TRANSITION_END, complete)
175
.emulateTransitionEnd(transitionDuration)
182
clearTimeout(this._timeout)
187
static _jQueryInterface(config) {
188
return this.each(function () {
189
const $element = $(this)
190
let data = $element.data(DATA_KEY)
191
const _config = typeof config === 'object' && config
194
data = new Toast(this, _config)
195
$element.data(DATA_KEY, data)
198
if (typeof config === 'string') {
199
if (typeof data[config] === 'undefined') {
200
throw new TypeError(`No method named "${config}"`)
213
$.fn[NAME] = Toast._jQueryInterface
214
$.fn[NAME].Constructor = Toast
215
$.fn[NAME].noConflict = () => {
216
$.fn[NAME] = JQUERY_NO_CONFLICT
217
return Toast._jQueryInterface