aboutsummaryrefslogtreecommitdiff
path: root/js/src/alert.js
diff options
context:
space:
mode:
authorJohann-S <[email protected]>2019-10-02 11:43:54 +0200
committerJohann-S <[email protected]>2019-10-03 09:55:57 +0200
commit3d12b541c488ea09efced2fb987fcbf384c656bb (patch)
tree1863095dd8162e25a1909cf741e32faa091c32d4 /js/src/alert.js
parent393ddae09b0578c8d381540bdbb4e68cdec1b45b (diff)
downloadbootstrap-3d12b541c488ea09efced2fb987fcbf384c656bb.tar.xz
bootstrap-3d12b541c488ea09efced2fb987fcbf384c656bb.zip
return to the original file structure to avoid breaking modularity
Diffstat (limited to 'js/src/alert.js')
-rw-r--r--js/src/alert.js188
1 files changed, 188 insertions, 0 deletions
diff --git a/js/src/alert.js b/js/src/alert.js
new file mode 100644
index 000000000..dbd931b52
--- /dev/null
+++ b/js/src/alert.js
@@ -0,0 +1,188 @@
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.3.1): alert.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+import {
+ getjQuery,
+ TRANSITION_END,
+ emulateTransitionEnd,
+ getElementFromSelector,
+ getTransitionDurationFromElement
+} from './util/index'
+import Data from './dom/data'
+import EventHandler from './dom/event-handler'
+import SelectorEngine from './dom/selector-engine'
+
+/**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+const NAME = 'alert'
+const VERSION = '4.3.1'
+const DATA_KEY = 'bs.alert'
+const EVENT_KEY = `.${DATA_KEY}`
+const DATA_API_KEY = '.data-api'
+
+const Selector = {
+ DISMISS: '[data-dismiss="alert"]'
+}
+
+const Event = {
+ CLOSE: `close${EVENT_KEY}`,
+ CLOSED: `closed${EVENT_KEY}`,
+ CLICK_DATA_API: `click${EVENT_KEY}${DATA_API_KEY}`
+}
+
+const ClassName = {
+ ALERT: 'alert',
+ FADE: 'fade',
+ SHOW: 'show'
+}
+
+/**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+class Alert {
+ constructor(element) {
+ this._element = element
+
+ if (this._element) {
+ Data.setData(element, DATA_KEY, this)
+ }
+ }
+
+ // Getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ // Public
+
+ close(element) {
+ let rootElement = this._element
+ if (element) {
+ rootElement = this._getRootElement(element)
+ }
+
+ const customEvent = this._triggerCloseEvent(rootElement)
+
+ if (customEvent === null || customEvent.defaultPrevented) {
+ return
+ }
+
+ this._removeElement(rootElement)
+ }
+
+ dispose() {
+ Data.removeData(this._element, DATA_KEY)
+ this._element = null
+ }
+
+ // Private
+
+ _getRootElement(element) {
+ let parent = getElementFromSelector(element)
+
+ if (!parent) {
+ parent = SelectorEngine.closest(element, `.${ClassName.ALERT}`)
+ }
+
+ return parent
+ }
+
+ _triggerCloseEvent(element) {
+ return EventHandler.trigger(element, Event.CLOSE)
+ }
+
+ _removeElement(element) {
+ element.classList.remove(ClassName.SHOW)
+
+ if (!element.classList.contains(ClassName.FADE)) {
+ this._destroyElement(element)
+ return
+ }
+
+ const transitionDuration = getTransitionDurationFromElement(element)
+
+ EventHandler
+ .one(element, TRANSITION_END, () => this._destroyElement(element))
+ emulateTransitionEnd(element, transitionDuration)
+ }
+
+ _destroyElement(element) {
+ if (element.parentNode) {
+ element.parentNode.removeChild(element)
+ }
+
+ EventHandler.trigger(element, Event.CLOSED)
+ }
+
+ // Static
+
+ static jQueryInterface(config) {
+ return this.each(function () {
+ let data = Data.getData(this, DATA_KEY)
+
+ if (!data) {
+ data = new Alert(this)
+ }
+
+ if (config === 'close') {
+ data[config](this)
+ }
+ })
+ }
+
+ static handleDismiss(alertInstance) {
+ return function (event) {
+ if (event) {
+ event.preventDefault()
+ }
+
+ alertInstance.close(this)
+ }
+ }
+
+ static getInstance(element) {
+ return Data.getData(element, DATA_KEY)
+ }
+}
+
+/**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+EventHandler
+ .on(document, Event.CLICK_DATA_API, Selector.DISMISS, Alert.handleDismiss(new Alert()))
+
+const $ = getjQuery()
+
+/**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ * add .alert to jQuery only if jQuery is present
+ */
+
+/* istanbul ignore if */
+if ($) {
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ $.fn[NAME] = Alert.jQueryInterface
+ $.fn[NAME].Constructor = Alert
+ $.fn[NAME].noConflict = () => {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Alert.jQueryInterface
+ }
+}
+
+export default Alert