210 lines
5.4 KiB
JavaScript
210 lines
5.4 KiB
JavaScript
/**
|
|
* --------------------------------------------
|
|
* AdminLTE Toasts.js
|
|
* License MIT
|
|
* --------------------------------------------
|
|
*/
|
|
|
|
import $ from 'jquery'
|
|
|
|
/**
|
|
* Constants
|
|
* ====================================================
|
|
*/
|
|
|
|
const NAME = 'Toasts'
|
|
const DATA_KEY = 'lte.toasts'
|
|
const EVENT_KEY = `.${DATA_KEY}`
|
|
const JQUERY_NO_CONFLICT = $.fn[NAME]
|
|
|
|
const EVENT_INIT = `init${EVENT_KEY}`
|
|
const EVENT_CREATED = `created${EVENT_KEY}`
|
|
const EVENT_REMOVED = `removed${EVENT_KEY}`
|
|
|
|
const SELECTOR_CONTAINER_TOP_RIGHT = '#toastsContainerTopRight'
|
|
const SELECTOR_CONTAINER_TOP_LEFT = '#toastsContainerTopLeft'
|
|
const SELECTOR_CONTAINER_BOTTOM_RIGHT = '#toastsContainerBottomRight'
|
|
const SELECTOR_CONTAINER_BOTTOM_LEFT = '#toastsContainerBottomLeft'
|
|
|
|
const CLASS_NAME_TOP_RIGHT = 'toasts-top-right'
|
|
const CLASS_NAME_TOP_LEFT = 'toasts-top-left'
|
|
const CLASS_NAME_BOTTOM_RIGHT = 'toasts-bottom-right'
|
|
const CLASS_NAME_BOTTOM_LEFT = 'toasts-bottom-left'
|
|
|
|
const POSITION_TOP_RIGHT = 'topRight'
|
|
const POSITION_TOP_LEFT = 'topLeft'
|
|
const POSITION_BOTTOM_RIGHT = 'bottomRight'
|
|
const POSITION_BOTTOM_LEFT = 'bottomLeft'
|
|
|
|
const Default = {
|
|
position: POSITION_TOP_RIGHT,
|
|
fixed: true,
|
|
autohide: false,
|
|
autoremove: true,
|
|
delay: 1000,
|
|
fade: true,
|
|
icon: null,
|
|
image: null,
|
|
imageAlt: null,
|
|
imageHeight: '25px',
|
|
title: null,
|
|
subtitle: null,
|
|
close: true,
|
|
body: null,
|
|
class: null
|
|
}
|
|
|
|
/**
|
|
* Class Definition
|
|
* ====================================================
|
|
*/
|
|
class Toasts {
|
|
constructor(element, config) {
|
|
this._config = config
|
|
this._prepareContainer()
|
|
|
|
$('body').trigger($.Event(EVENT_INIT))
|
|
}
|
|
|
|
// Public
|
|
|
|
create() {
|
|
const toast = $('<div class="toast" role="alert" aria-live="assertive" aria-atomic="true"/>')
|
|
|
|
toast.data('autohide', this._config.autohide)
|
|
toast.data('animation', this._config.fade)
|
|
|
|
if (this._config.class) {
|
|
toast.addClass(this._config.class)
|
|
}
|
|
|
|
if (this._config.delay && this._config.delay != 500) {
|
|
toast.data('delay', this._config.delay)
|
|
}
|
|
|
|
const toastHeader = $('<div class="toast-header">')
|
|
|
|
if (this._config.image != null) {
|
|
const toastImage = $('<img />').addClass('rounded mr-2').attr('src', this._config.image).attr('alt', this._config.imageAlt)
|
|
|
|
if (this._config.imageHeight != null) {
|
|
toastImage.height(this._config.imageHeight).width('auto')
|
|
}
|
|
|
|
toastHeader.append(toastImage)
|
|
}
|
|
|
|
if (this._config.icon != null) {
|
|
toastHeader.append($('<i />').addClass('mr-2').addClass(this._config.icon))
|
|
}
|
|
|
|
if (this._config.title != null) {
|
|
toastHeader.append($('<strong />').addClass('mr-auto').html(this._config.title))
|
|
}
|
|
|
|
if (this._config.subtitle != null) {
|
|
toastHeader.append($('<small />').html(this._config.subtitle))
|
|
}
|
|
|
|
if (this._config.close == true) {
|
|
const toastClose = $('<button data-dismiss="toast" />').attr('type', 'button').addClass('ml-2 mb-1 close').attr('aria-label', 'Close').append('<span aria-hidden="true">×</span>')
|
|
|
|
if (this._config.title == null) {
|
|
toastClose.toggleClass('ml-2 ml-auto')
|
|
}
|
|
|
|
toastHeader.append(toastClose)
|
|
}
|
|
|
|
toast.append(toastHeader)
|
|
|
|
if (this._config.body != null) {
|
|
toast.append($('<div class="toast-body" />').html(this._config.body))
|
|
}
|
|
|
|
$(this._getContainerId()).prepend(toast)
|
|
|
|
const $body = $('body')
|
|
|
|
$body.trigger($.Event(EVENT_CREATED))
|
|
toast.toast('show')
|
|
|
|
if (this._config.autoremove) {
|
|
toast.on('hidden.bs.toast', function () {
|
|
$(this).delay(200).remove()
|
|
$body.trigger($.Event(EVENT_REMOVED))
|
|
})
|
|
}
|
|
}
|
|
|
|
// Static
|
|
|
|
_getContainerId() {
|
|
if (this._config.position == POSITION_TOP_RIGHT) {
|
|
return SELECTOR_CONTAINER_TOP_RIGHT
|
|
}
|
|
|
|
if (this._config.position == POSITION_TOP_LEFT) {
|
|
return SELECTOR_CONTAINER_TOP_LEFT
|
|
}
|
|
|
|
if (this._config.position == POSITION_BOTTOM_RIGHT) {
|
|
return SELECTOR_CONTAINER_BOTTOM_RIGHT
|
|
}
|
|
|
|
if (this._config.position == POSITION_BOTTOM_LEFT) {
|
|
return SELECTOR_CONTAINER_BOTTOM_LEFT
|
|
}
|
|
}
|
|
|
|
_prepareContainer() {
|
|
if ($(this._getContainerId()).length === 0) {
|
|
const container = $('<div />').attr('id', this._getContainerId().replace('#', ''))
|
|
if (this._config.position == POSITION_TOP_RIGHT) {
|
|
container.addClass(CLASS_NAME_TOP_RIGHT)
|
|
} else if (this._config.position == POSITION_TOP_LEFT) {
|
|
container.addClass(CLASS_NAME_TOP_LEFT)
|
|
} else if (this._config.position == POSITION_BOTTOM_RIGHT) {
|
|
container.addClass(CLASS_NAME_BOTTOM_RIGHT)
|
|
} else if (this._config.position == POSITION_BOTTOM_LEFT) {
|
|
container.addClass(CLASS_NAME_BOTTOM_LEFT)
|
|
}
|
|
|
|
$('body').append(container)
|
|
}
|
|
|
|
if (this._config.fixed) {
|
|
$(this._getContainerId()).addClass('fixed')
|
|
} else {
|
|
$(this._getContainerId()).removeClass('fixed')
|
|
}
|
|
}
|
|
|
|
// Static
|
|
|
|
static _jQueryInterface(option, config) {
|
|
return this.each(function () {
|
|
const _options = $.extend({}, Default, config)
|
|
const toast = new Toasts($(this), _options)
|
|
|
|
if (option === 'create') {
|
|
toast[option]()
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* jQuery API
|
|
* ====================================================
|
|
*/
|
|
|
|
$.fn[NAME] = Toasts._jQueryInterface
|
|
$.fn[NAME].Constructor = Toasts
|
|
$.fn[NAME].noConflict = function () {
|
|
$.fn[NAME] = JQUERY_NO_CONFLICT
|
|
return Toasts._jQueryInterface
|
|
}
|
|
|
|
export default Toasts
|