]>
git.ipfire.org Git - ipfire.org.git/blob - static/scss/bootstrap-4.0.0-alpha.6/js/src/tab.js
c069b0a9a950c2b61ffe4727fe5fcdef48fca2d7
1 import Util
from './util'
5 * --------------------------------------------------------------------------
6 * Bootstrap (v4.0.0-alpha.6): tab.js
7 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
8 * --------------------------------------------------------------------------
15 * ------------------------------------------------------------------------
17 * ------------------------------------------------------------------------
21 const VERSION
= '4.0.0-alpha.6'
22 const DATA_KEY
= 'bs.tab'
23 const EVENT_KEY
= `.${DATA_KEY}`
24 const DATA_API_KEY
= '.data-api'
25 const JQUERY_NO_CONFLICT
= $.fn
[NAME
]
26 const TRANSITION_DURATION
= 150
29 HIDE
: `hide${EVENT_KEY}`,
30 HIDDEN
: `hidden${EVENT_KEY}`,
31 SHOW
: `show${EVENT_KEY}`,
32 SHOWN
: `shown${EVENT_KEY}`,
33 CLICK_DATA_API
: `click${EVENT_KEY}${DATA_API_KEY}`
37 DROPDOWN_MENU
: 'dropdown-menu',
39 DISABLED
: 'disabled',
47 DROPDOWN
: '.dropdown',
48 LIST
: 'ul:not(.dropdown-menu), ol:not(.dropdown-menu), nav:not(.dropdown-menu)',
49 FADE_CHILD
: '> .nav-item .fade, > .fade',
51 ACTIVE_CHILD
: '> .nav-item > .active, > .active',
52 DATA_TOGGLE
: '[data-toggle="tab"], [data-toggle="pill"]',
53 DROPDOWN_TOGGLE
: '.dropdown-toggle',
54 DROPDOWN_ACTIVE_CHILD
: '> .dropdown-menu .active'
59 * ------------------------------------------------------------------------
61 * ------------------------------------------------------------------------
66 constructor(element
) {
67 this._element
= element
73 static get VERSION() {
81 if (this._element
.parentNode
&&
82 this._element
.parentNode
.nodeType
=== Node
.ELEMENT_NODE
&&
83 $(this._element
).hasClass(ClassName
.ACTIVE
) ||
84 $(this._element
).hasClass(ClassName
.DISABLED
)) {
90 const listElement
= $(this._element
).closest(Selector
.LIST
)[0]
91 const selector
= Util
.getSelectorFromElement(this._element
)
94 previous
= $.makeArray($(listElement
).find(Selector
.ACTIVE
))
95 previous
= previous
[previous
.length
- 1]
98 const hideEvent
= $.Event(Event
.HIDE
, {
99 relatedTarget
: this._element
102 const showEvent
= $.Event(Event
.SHOW
, {
103 relatedTarget
: previous
107 $(previous
).trigger(hideEvent
)
110 $(this._element
).trigger(showEvent
)
112 if (showEvent
.isDefaultPrevented() ||
113 hideEvent
.isDefaultPrevented()) {
118 target
= $(selector
)[0]
126 const complete
= () => {
127 const hiddenEvent
= $.Event(Event
.HIDDEN
, {
128 relatedTarget
: this._element
131 const shownEvent
= $.Event(Event
.SHOWN
, {
132 relatedTarget
: previous
135 $(previous
).trigger(hiddenEvent
)
136 $(this._element
).trigger(shownEvent
)
140 this._activate(target
, target
.parentNode
, complete
)
147 $.removeClass(this._element
, DATA_KEY
)
154 _activate(element
, container
, callback
) {
155 const active
= $(container
).find(Selector
.ACTIVE_CHILD
)[0]
156 const isTransitioning
= callback
157 && Util
.supportsTransitionEnd()
158 && (active
&& $(active
).hasClass(ClassName
.FADE
)
159 || Boolean($(container
).find(Selector
.FADE_CHILD
)[0]))
161 const complete
= () => this._transitionComplete(
168 if (active
&& isTransitioning
) {
170 .one(Util
.TRANSITION_END
, complete
)
171 .emulateTransitionEnd(TRANSITION_DURATION
)
178 $(active
).removeClass(ClassName
.SHOW
)
182 _transitionComplete(element
, active
, isTransitioning
, callback
) {
184 $(active
).removeClass(ClassName
.ACTIVE
)
186 const dropdownChild
= $(active
.parentNode
).find(
187 Selector
.DROPDOWN_ACTIVE_CHILD
191 $(dropdownChild
).removeClass(ClassName
.ACTIVE
)
194 active
.setAttribute('aria-expanded', false)
197 $(element
).addClass(ClassName
.ACTIVE
)
198 element
.setAttribute('aria-expanded', true)
200 if (isTransitioning
) {
202 $(element
).addClass(ClassName
.SHOW
)
204 $(element
).removeClass(ClassName
.FADE
)
207 if (element
.parentNode
&&
208 $(element
.parentNode
).hasClass(ClassName
.DROPDOWN_MENU
)) {
210 const dropdownElement
= $(element
).closest(Selector
.DROPDOWN
)[0]
211 if (dropdownElement
) {
212 $(dropdownElement
).find(Selector
.DROPDOWN_TOGGLE
).addClass(ClassName
.ACTIVE
)
215 element
.setAttribute('aria-expanded', true)
226 static _jQueryInterface(config
) {
227 return this.each(function () {
228 const $this = $(this)
229 let data
= $this.data(DATA_KEY
)
233 $this.data(DATA_KEY
, data
)
236 if (typeof config
=== 'string') {
237 if (data
[config
] === undefined) {
238 throw new Error(`No method named "${config}"`)
249 * ------------------------------------------------------------------------
250 * Data Api implementation
251 * ------------------------------------------------------------------------
255 .on(Event
.CLICK_DATA_API
, Selector
.DATA_TOGGLE
, function (event
) {
256 event
.preventDefault()
257 Tab
._jQueryInterface
.call($(this), 'show')
262 * ------------------------------------------------------------------------
264 * ------------------------------------------------------------------------
267 $.fn
[NAME
] = Tab
._jQueryInterface
268 $.fn
[NAME
].Constructor
= Tab
269 $.fn
[NAME
].noConflict = function () {
270 $.fn
[NAME
] = JQUERY_NO_CONFLICT
271 return Tab
._jQueryInterface