alert.js 4.09 KB
Newer Older
1
import $ from 'jquery'
2
3
4
import Util from './util'


fat's avatar
fat committed
5
6
/**
 * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
7
 * Bootstrap (v4.0.0-beta.2): alert.js
fat's avatar
fat committed
8
9
10
11
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

12
const Alert = (() => {
fat's avatar
fat committed
13
14


15
16
17
18
19
  /**
   * ------------------------------------------------------------------------
   * Constants
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
20

21
  const NAME                = 'alert'
Mark Otto's avatar
Mark Otto committed
22
  const VERSION             = '4.0.0-beta.2'
23
  const DATA_KEY            = 'bs.alert'
fat's avatar
fat committed
24
25
  const EVENT_KEY           = `.${DATA_KEY}`
  const DATA_API_KEY        = '.data-api'
26
27
  const JQUERY_NO_CONFLICT  = $.fn[NAME]
  const TRANSITION_DURATION = 150
fat's avatar
fat committed
28

29
30
31
  const Selector = {
    DISMISS : '[data-dismiss="alert"]'
  }
fat's avatar
fat committed
32

33
  const Event = {
fat's avatar
fat committed
34
35
36
    CLOSE          : `close${EVENT_KEY}`,
    CLOSED         : `closed${EVENT_KEY}`,
    CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
37
  }
fat's avatar
fat committed
38

39
  const ClassName = {
Starsam80's avatar
Starsam80 committed
40
41
42
    ALERT : 'alert',
    FADE  : 'fade',
    SHOW  : 'show'
43
  }
fat's avatar
fat committed
44
45


46
47
48
49
50
  /**
   * ------------------------------------------------------------------------
   * Class Definition
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
51

52
  class Alert {
fat's avatar
fat committed
53

54
    constructor(element) {
fat's avatar
fat committed
55
      this._element = element
fat's avatar
fat committed
56
57
58
    }


59
60
61
62
63
64
65
    // getters

    static get VERSION() {
      return VERSION
    }


66
67
68
    // public

    close(element) {
fat's avatar
fat committed
69
      element = element || this._element
fat's avatar
fat committed
70

71
72
      const rootElement = this._getRootElement(element)
      const customEvent = this._triggerCloseEvent(rootElement)
fat's avatar
fat committed
73

74
75
76
      if (customEvent.isDefaultPrevented()) {
        return
      }
fat's avatar
fat committed
77

78
      this._removeElement(rootElement)
fat's avatar
fat committed
79
80
    }

fat's avatar
fat committed
81
82
83
84
85
    dispose() {
      $.removeData(this._element, DATA_KEY)
      this._element = null
    }

fat's avatar
fat committed
86

87
    // private
fat's avatar
fat committed
88

89
    _getRootElement(element) {
90
91
      const selector = Util.getSelectorFromElement(element)
      let parent     = false
fat's avatar
fat committed
92

93
94
95
      if (selector) {
        parent = $(selector)[0]
      }
fat's avatar
fat committed
96

97
      if (!parent) {
fat's avatar
fat committed
98
        parent = $(element).closest(`.${ClassName.ALERT}`)[0]
99
100
101
      }

      return parent
fat's avatar
fat committed
102
103
    }

104
    _triggerCloseEvent(element) {
105
      const closeEvent = $.Event(Event.CLOSE)
Jacob Thornton's avatar
Jacob Thornton committed
106

107
108
      $(element).trigger(closeEvent)
      return closeEvent
fat's avatar
fat committed
109
110
    }

111
    _removeElement(element) {
Starsam80's avatar
Starsam80 committed
112
      $(element).removeClass(ClassName.SHOW)
fat's avatar
fat committed
113

114
115
116
117
118
      if (!Util.supportsTransitionEnd() ||
          !$(element).hasClass(ClassName.FADE)) {
        this._destroyElement(element)
        return
      }
fat's avatar
fat committed
119

120
      $(element)
121
        .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))
122
123
        .emulateTransitionEnd(TRANSITION_DURATION)
    }
fat's avatar
fat committed
124

125
126
127
128
129
    _destroyElement(element) {
      $(element)
        .detach()
        .trigger(Event.CLOSED)
        .remove()
fat's avatar
fat committed
130
131
132
    }


133
    // static
fat's avatar
fat committed
134

135
136
    static _jQueryInterface(config) {
      return this.each(function () {
137
138
        const $element = $(this)
        let data       = $element.data(DATA_KEY)
fat's avatar
fat committed
139

140
141
142
143
        if (!data) {
          data = new Alert(this)
          $element.data(DATA_KEY, data)
        }
fat's avatar
fat committed
144

145
146
147
148
149
        if (config === 'close') {
          data[config](this)
        }
      })
    }
fat's avatar
fat committed
150

151
152
153
154
155
    static _handleDismiss(alertInstance) {
      return function (event) {
        if (event) {
          event.preventDefault()
        }
fat's avatar
fat committed
156

157
        alertInstance.close(this)
fat's avatar
fat committed
158
      }
159
160
    }

fat's avatar
fat committed
161
162
163
  }


164
165
166
167
168
  /**
   * ------------------------------------------------------------------------
   * Data Api implementation
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
169

170
  $(document).on(
fat's avatar
fat committed
171
    Event.CLICK_DATA_API,
172
173
174
    Selector.DISMISS,
    Alert._handleDismiss(new Alert())
  )
fat's avatar
fat committed
175
176


177
178
179
180
181
  /**
   * ------------------------------------------------------------------------
   * jQuery
   * ------------------------------------------------------------------------
   */
fat's avatar
fat committed
182

183
184
185
  $.fn[NAME]             = Alert._jQueryInterface
  $.fn[NAME].Constructor = Alert
  $.fn[NAME].noConflict  = function () {
fat's avatar
fat committed
186
    $.fn[NAME] = JQUERY_NO_CONFLICT
187
188
    return Alert._jQueryInterface
  }
fat's avatar
fat committed
189

190
  return Alert
fat's avatar
fat committed
191

192
})(Util.jQuery)
fat's avatar
fat committed
193

194
export default Alert