alert.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*!
  2. * Bootstrap alert.js v5.0.2 (https://getbootstrap.com/)
  3. * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
  4. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  5. */
  6. (function (global, factory) {
  7. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/selector-engine.js'), require('./dom/event-handler.js'), require('./base-component.js')) :
  8. typeof define === 'function' && define.amd ? define(['./dom/selector-engine', './dom/event-handler', './base-component'], factory) :
  9. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Alert = factory(global.SelectorEngine, global.EventHandler, global.Base));
  10. }(this, (function (SelectorEngine, EventHandler, BaseComponent) { 'use strict';
  11. function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
  12. var EventHandler__default = /*#__PURE__*/_interopDefaultLegacy(EventHandler);
  13. var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
  14. const getSelector = element => {
  15. let selector = element.getAttribute('data-bs-target');
  16. if (!selector || selector === '#') {
  17. let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
  18. // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
  19. // `document.querySelector` will rightfully complain it is invalid.
  20. // See https://github.com/twbs/bootstrap/issues/32273
  21. if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
  22. return null;
  23. } // Just in case some CMS puts out a full URL with the anchor appended
  24. if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
  25. hrefAttr = `#${hrefAttr.split('#')[1]}`;
  26. }
  27. selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
  28. }
  29. return selector;
  30. };
  31. const getElementFromSelector = element => {
  32. const selector = getSelector(element);
  33. return selector ? document.querySelector(selector) : null;
  34. };
  35. const getjQuery = () => {
  36. const {
  37. jQuery
  38. } = window;
  39. if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
  40. return jQuery;
  41. }
  42. return null;
  43. };
  44. const DOMContentLoadedCallbacks = [];
  45. const onDOMContentLoaded = callback => {
  46. if (document.readyState === 'loading') {
  47. // add listener on the first call when the document is in loading state
  48. if (!DOMContentLoadedCallbacks.length) {
  49. document.addEventListener('DOMContentLoaded', () => {
  50. DOMContentLoadedCallbacks.forEach(callback => callback());
  51. });
  52. }
  53. DOMContentLoadedCallbacks.push(callback);
  54. } else {
  55. callback();
  56. }
  57. };
  58. const defineJQueryPlugin = plugin => {
  59. onDOMContentLoaded(() => {
  60. const $ = getjQuery();
  61. /* istanbul ignore if */
  62. if ($) {
  63. const name = plugin.NAME;
  64. const JQUERY_NO_CONFLICT = $.fn[name];
  65. $.fn[name] = plugin.jQueryInterface;
  66. $.fn[name].Constructor = plugin;
  67. $.fn[name].noConflict = () => {
  68. $.fn[name] = JQUERY_NO_CONFLICT;
  69. return plugin.jQueryInterface;
  70. };
  71. }
  72. });
  73. };
  74. /**
  75. * --------------------------------------------------------------------------
  76. * Bootstrap (v5.0.2): alert.js
  77. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  78. * --------------------------------------------------------------------------
  79. */
  80. /**
  81. * ------------------------------------------------------------------------
  82. * Constants
  83. * ------------------------------------------------------------------------
  84. */
  85. const NAME = 'alert';
  86. const DATA_KEY = 'bs.alert';
  87. const EVENT_KEY = `.${DATA_KEY}`;
  88. const DATA_API_KEY = '.data-api';
  89. const SELECTOR_DISMISS = '[data-bs-dismiss="alert"]';
  90. const EVENT_CLOSE = `close${EVENT_KEY}`;
  91. const EVENT_CLOSED = `closed${EVENT_KEY}`;
  92. const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;
  93. const CLASS_NAME_ALERT = 'alert';
  94. const CLASS_NAME_FADE = 'fade';
  95. const CLASS_NAME_SHOW = 'show';
  96. /**
  97. * ------------------------------------------------------------------------
  98. * Class Definition
  99. * ------------------------------------------------------------------------
  100. */
  101. class Alert extends BaseComponent__default['default'] {
  102. // Getters
  103. static get NAME() {
  104. return NAME;
  105. } // Public
  106. close(element) {
  107. const rootElement = element ? this._getRootElement(element) : this._element;
  108. const customEvent = this._triggerCloseEvent(rootElement);
  109. if (customEvent === null || customEvent.defaultPrevented) {
  110. return;
  111. }
  112. this._removeElement(rootElement);
  113. } // Private
  114. _getRootElement(element) {
  115. return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`);
  116. }
  117. _triggerCloseEvent(element) {
  118. return EventHandler__default['default'].trigger(element, EVENT_CLOSE);
  119. }
  120. _removeElement(element) {
  121. element.classList.remove(CLASS_NAME_SHOW);
  122. const isAnimated = element.classList.contains(CLASS_NAME_FADE);
  123. this._queueCallback(() => this._destroyElement(element), element, isAnimated);
  124. }
  125. _destroyElement(element) {
  126. element.remove();
  127. EventHandler__default['default'].trigger(element, EVENT_CLOSED);
  128. } // Static
  129. static jQueryInterface(config) {
  130. return this.each(function () {
  131. const data = Alert.getOrCreateInstance(this);
  132. if (config === 'close') {
  133. data[config](this);
  134. }
  135. });
  136. }
  137. static handleDismiss(alertInstance) {
  138. return function (event) {
  139. if (event) {
  140. event.preventDefault();
  141. }
  142. alertInstance.close(this);
  143. };
  144. }
  145. }
  146. /**
  147. * ------------------------------------------------------------------------
  148. * Data Api implementation
  149. * ------------------------------------------------------------------------
  150. */
  151. EventHandler__default['default'].on(document, EVENT_CLICK_DATA_API, SELECTOR_DISMISS, Alert.handleDismiss(new Alert()));
  152. /**
  153. * ------------------------------------------------------------------------
  154. * jQuery
  155. * ------------------------------------------------------------------------
  156. * add .Alert to jQuery only if jQuery is present
  157. */
  158. defineJQueryPlugin(Alert);
  159. return Alert;
  160. })));
  161. //# sourceMappingURL=alert.js.map