popover.js 4.27 KB
Newer Older
fat's avatar
fat committed
1
2
/**
 * --------------------------------------------------------------------------
XhmikosR's avatar
XhmikosR committed
3
 * Bootstrap (v4.3.1): popover.js
fat's avatar
fat committed
4
5
6
7
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * --------------------------------------------------------------------------
 */

8
9
10
import $ from 'jquery'
import Tooltip from './tooltip'

Johann-S's avatar
Johann-S committed
11
12
13
14
15
16
17
/**
 * ------------------------------------------------------------------------
 * Constants
 * ------------------------------------------------------------------------
 */

const NAME                = 'popover'
XhmikosR's avatar
XhmikosR committed
18
const VERSION             = '4.3.1'
Johann-S's avatar
Johann-S committed
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
const DATA_KEY            = 'bs.popover'
const EVENT_KEY           = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT  = $.fn[NAME]
const CLASS_PREFIX        = 'bs-popover'
const BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')

const Default = {
  ...Tooltip.Default,
  placement : 'right',
  trigger   : 'click',
  content   : '',
  template  : '<div class="popover" role="tooltip">' +
              '<div class="arrow"></div>' +
              '<h3 class="popover-header"></h3>' +
              '<div class="popover-body"></div></div>'
}

const DefaultType = {
  ...Tooltip.DefaultType,
  content : '(string|element|function)'
}

const ClassName = {
  FADE : 'fade',
  SHOW : 'show'
}

const Selector = {
  TITLE   : '.popover-header',
  CONTENT : '.popover-body'
}

const Event = {
  HIDE       : `hide${EVENT_KEY}`,
  HIDDEN     : `hidden${EVENT_KEY}`,
  SHOW       : `show${EVENT_KEY}`,
  SHOWN      : `shown${EVENT_KEY}`,
  INSERTED   : `inserted${EVENT_KEY}`,
  CLICK      : `click${EVENT_KEY}`,
  FOCUSIN    : `focusin${EVENT_KEY}`,
  FOCUSOUT   : `focusout${EVENT_KEY}`,
  MOUSEENTER : `mouseenter${EVENT_KEY}`,
  MOUSELEAVE : `mouseleave${EVENT_KEY}`
}

/**
 * ------------------------------------------------------------------------
 * Class Definition
 * ------------------------------------------------------------------------
 */

class Popover extends Tooltip {
  // Getters

  static get VERSION() {
    return VERSION
75
76
  }

Johann-S's avatar
Johann-S committed
77
78
  static get Default() {
    return Default
79
  }
fat's avatar
fat committed
80

Johann-S's avatar
Johann-S committed
81
82
  static get NAME() {
    return NAME
fat's avatar
fat committed
83
84
  }

Johann-S's avatar
Johann-S committed
85
86
  static get DATA_KEY() {
    return DATA_KEY
fat's avatar
fat committed
87
88
  }

Johann-S's avatar
Johann-S committed
89
90
  static get Event() {
    return Event
fat's avatar
fat committed
91
92
  }

Johann-S's avatar
Johann-S committed
93
94
95
  static get EVENT_KEY() {
    return EVENT_KEY
  }
fat's avatar
fat committed
96

Johann-S's avatar
Johann-S committed
97
98
99
  static get DefaultType() {
    return DefaultType
  }
fat's avatar
fat committed
100

Johann-S's avatar
Johann-S committed
101
  // Overrides
fat's avatar
fat committed
102

Johann-S's avatar
Johann-S committed
103
104
105
  isWithContent() {
    return this.getTitle() || this._getContent()
  }
fat's avatar
fat committed
106

Johann-S's avatar
Johann-S committed
107
108
109
  addAttachmentClass(attachment) {
    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
  }
fat's avatar
fat committed
110

Johann-S's avatar
Johann-S committed
111
112
113
114
  getTipElement() {
    this.tip = this.tip || $(this.config.template)[0]
    return this.tip
  }
fat's avatar
fat committed
115

Johann-S's avatar
Johann-S committed
116
117
  setContent() {
    const $tip = $(this.getTipElement())
fat's avatar
fat committed
118

Johann-S's avatar
Johann-S committed
119
120
121
122
123
    // We use append for html objects to maintain js events
    this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
    let content = this._getContent()
    if (typeof content === 'function') {
      content = content.call(this.element)
fat's avatar
fat committed
124
    }
Johann-S's avatar
Johann-S committed
125
    this.setElementContent($tip.find(Selector.CONTENT), content)
fat's avatar
fat committed
126

Johann-S's avatar
Johann-S committed
127
128
    $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
  }
fat's avatar
fat committed
129

Johann-S's avatar
Johann-S committed
130
  // Private
fat's avatar
fat committed
131

Johann-S's avatar
Johann-S committed
132
133
134
135
  _getContent() {
    return this.element.getAttribute('data-content') ||
      this.config.content
  }
fat's avatar
fat committed
136

Johann-S's avatar
Johann-S committed
137
138
139
140
141
  _cleanTipClass() {
    const $tip = $(this.getTipElement())
    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
    if (tabClass !== null && tabClass.length > 0) {
      $tip.removeClass(tabClass.join(''))
Johann-S's avatar
Johann-S committed
142
    }
Johann-S's avatar
Johann-S committed
143
  }
Johann-S's avatar
Johann-S committed
144

Johann-S's avatar
Johann-S committed
145
  // Static
fat's avatar
fat committed
146

Johann-S's avatar
Johann-S committed
147
148
149
150
  static _jQueryInterface(config) {
    return this.each(function () {
      let data = $(this).data(DATA_KEY)
      const _config = typeof config === 'object' ? config : null
fat's avatar
fat committed
151

Johann-S's avatar
Johann-S committed
152
153
      if (!data && /dispose|hide/.test(config)) {
        return
154
      }
fat's avatar
fat committed
155

Johann-S's avatar
Johann-S committed
156
157
158
      if (!data) {
        data = new Popover(this, _config)
        $(this).data(DATA_KEY, data)
Johann-S's avatar
Johann-S committed
159
      }
fat's avatar
fat committed
160

Johann-S's avatar
Johann-S committed
161
162
163
      if (typeof config === 'string') {
        if (typeof data[config] === 'undefined') {
          throw new TypeError(`No method named "${config}"`)
fat's avatar
fat committed
164
        }
Johann-S's avatar
Johann-S committed
165
166
167
        data[config]()
      }
    })
fat's avatar
fat committed
168
  }
Johann-S's avatar
Johann-S committed
169
}
fat's avatar
fat committed
170

Johann-S's avatar
Johann-S committed
171
172
173
174
175
/**
 * ------------------------------------------------------------------------
 * jQuery
 * ------------------------------------------------------------------------
 */
fat's avatar
fat committed
176

Johann-S's avatar
Johann-S committed
177
178
179
180
181
182
$.fn[NAME] = Popover._jQueryInterface
$.fn[NAME].Constructor = Popover
$.fn[NAME].noConflict = () => {
  $.fn[NAME] = JQUERY_NO_CONFLICT
  return Popover._jQueryInterface
}
fat's avatar
fat committed
183
184

export default Popover