Spaces:
Running
Running
/** | |
* -------------------------------------------------------------------------- | |
* Bootstrap (v5.1.3): toast.js | |
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) | |
* -------------------------------------------------------------------------- | |
*/ | |
import { | |
defineJQueryPlugin, | |
reflow, | |
typeCheckConfig | |
} from './util/index' | |
import EventHandler from './dom/event-handler' | |
import Manipulator from './dom/manipulator' | |
import BaseComponent from './base-component' | |
import { | |
enableDismissTrigger | |
} from './util/component-functions' | |
/** | |
* ------------------------------------------------------------------------ | |
* Constants | |
* ------------------------------------------------------------------------ | |
*/ | |
const NAME = 'toast' | |
const DATA_KEY = 'bs.toast' | |
const EVENT_KEY = `.${DATA_KEY}` | |
const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}` | |
const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}` | |
const EVENT_FOCUSIN = `focusin${EVENT_KEY}` | |
const EVENT_FOCUSOUT = `focusout${EVENT_KEY}` | |
const EVENT_HIDE = `hide${EVENT_KEY}` | |
const EVENT_HIDDEN = `hidden${EVENT_KEY}` | |
const EVENT_SHOW = `show${EVENT_KEY}` | |
const EVENT_SHOWN = `shown${EVENT_KEY}` | |
const CLASS_NAME_FADE = 'fade' | |
const CLASS_NAME_HIDE = 'hide' // @deprecated - kept here only for backwards compatibility | |
const CLASS_NAME_SHOW = 'show' | |
const CLASS_NAME_SHOWING = 'showing' | |
const DefaultType = { | |
animation: 'boolean', | |
autohide: 'boolean', | |
delay: 'number' | |
} | |
const Default = { | |
animation: true, | |
autohide: true, | |
delay: 5000 | |
} | |
/** | |
* ------------------------------------------------------------------------ | |
* Class Definition | |
* ------------------------------------------------------------------------ | |
*/ | |
class Toast extends BaseComponent { | |
constructor(element, config) { | |
super(element) | |
this._config = this._getConfig(config) | |
this._timeout = null | |
this._hasMouseInteraction = false | |
this._hasKeyboardInteraction = false | |
this._setListeners() | |
} | |
// Getters | |
static get DefaultType() { | |
return DefaultType | |
} | |
static get Default() { | |
return Default | |
} | |
static get NAME() { | |
return NAME | |
} | |
// Public | |
show() { | |
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW) | |
if (showEvent.defaultPrevented) { | |
return | |
} | |
this._clearTimeout() | |
if (this._config.animation) { | |
this._element.classList.add(CLASS_NAME_FADE) | |
} | |
const complete = () => { | |
this._element.classList.remove(CLASS_NAME_SHOWING) | |
EventHandler.trigger(this._element, EVENT_SHOWN) | |
this._maybeScheduleHide() | |
} | |
this._element.classList.remove(CLASS_NAME_HIDE) // @deprecated | |
reflow(this._element) | |
this._element.classList.add(CLASS_NAME_SHOW) | |
this._element.classList.add(CLASS_NAME_SHOWING) | |
this._queueCallback(complete, this._element, this._config.animation) | |
} | |
hide() { | |
if (!this._element.classList.contains(CLASS_NAME_SHOW)) { | |
return | |
} | |
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE) | |
if (hideEvent.defaultPrevented) { | |
return | |
} | |
const complete = () => { | |
this._element.classList.add(CLASS_NAME_HIDE) // @deprecated | |
this._element.classList.remove(CLASS_NAME_SHOWING) | |
this._element.classList.remove(CLASS_NAME_SHOW) | |
EventHandler.trigger(this._element, EVENT_HIDDEN) | |
} | |
this._element.classList.add(CLASS_NAME_SHOWING) | |
this._queueCallback(complete, this._element, this._config.animation) | |
} | |
dispose() { | |
this._clearTimeout() | |
if (this._element.classList.contains(CLASS_NAME_SHOW)) { | |
this._element.classList.remove(CLASS_NAME_SHOW) | |
} | |
super.dispose() | |
} | |
// Private | |
_getConfig(config) { | |
config = { | |
...Default, | |
...Manipulator.getDataAttributes(this._element), | |
...(typeof config === 'object' && config ? config : {}) | |
} | |
typeCheckConfig(NAME, config, this.constructor.DefaultType) | |
return config | |
} | |
_maybeScheduleHide() { | |
if (!this._config.autohide) { | |
return | |
} | |
if (this._hasMouseInteraction || this._hasKeyboardInteraction) { | |
return | |
} | |
this._timeout = setTimeout(() => { | |
this.hide() | |
}, this._config.delay) | |
} | |
_onInteraction(event, isInteracting) { | |
switch (event.type) { | |
case 'mouseover': | |
case 'mouseout': | |
this._hasMouseInteraction = isInteracting | |
break | |
case 'focusin': | |
case 'focusout': | |
this._hasKeyboardInteraction = isInteracting | |
break | |
default: | |
break | |
} | |
if (isInteracting) { | |
this._clearTimeout() | |
return | |
} | |
const nextElement = event.relatedTarget | |
if (this._element === nextElement || this._element.contains(nextElement)) { | |
return | |
} | |
this._maybeScheduleHide() | |
} | |
_setListeners() { | |
EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true)) | |
EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false)) | |
EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true)) | |
EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false)) | |
} | |
_clearTimeout() { | |
clearTimeout(this._timeout) | |
this._timeout = null | |
} | |
// Static | |
static jQueryInterface(config) { | |
return this.each(function() { | |
const data = Toast.getOrCreateInstance(this, config) | |
if (typeof config === 'string') { | |
if (typeof data[config] === 'undefined') { | |
throw new TypeError(`No method named "${config}"`) | |
} | |
data[config](this) | |
} | |
}) | |
} | |
} | |
enableDismissTrigger(Toast) | |
/** | |
* ------------------------------------------------------------------------ | |
* jQuery | |
* ------------------------------------------------------------------------ | |
* add .Toast to jQuery only if jQuery is present | |
*/ | |
defineJQueryPlugin(Toast) | |
export default Toast |