aboutsummaryrefslogtreecommitdiff
path: root/js/src
diff options
context:
space:
mode:
authorfat <[email protected]>2015-05-11 12:29:06 -0700
committerfat <[email protected]>2015-05-11 12:29:06 -0700
commit8eee78ca15f51dc7e7d514497078bfd7c012ac21 (patch)
tree32d29ffcb06f5251e49d2c96f5a65afa53bf05be /js/src
parent2d91494d96f8161f1bcce6589081880b72706154 (diff)
downloadbootstrap-8eee78ca15f51dc7e7d514497078bfd7c012ac21.tar.xz
bootstrap-8eee78ca15f51dc7e7d514497078bfd7c012ac21.zip
tab es6
Diffstat (limited to 'js/src')
-rw-r--r--js/src/scrollspy.js9
-rw-r--r--js/src/tab.js278
2 files changed, 282 insertions, 5 deletions
diff --git a/js/src/scrollspy.js b/js/src/scrollspy.js
index 985da708d..b66f7bb88 100644
--- a/js/src/scrollspy.js
+++ b/js/src/scrollspy.js
@@ -17,11 +17,10 @@ const ScrollSpy = (($) => {
* ------------------------------------------------------------------------
*/
- const NAME = 'scrollspy'
- const VERSION = '4.0.0'
- const DATA_KEY = 'bs.scrollspy'
- const JQUERY_NO_CONFLICT = $.fn[NAME]
- const TRANSITION_DURATION = 150
+ const NAME = 'scrollspy'
+ const VERSION = '4.0.0'
+ const DATA_KEY = 'bs.scrollspy'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
const Defaults = {
offset : 10
diff --git a/js/src/tab.js b/js/src/tab.js
new file mode 100644
index 000000000..4668ff9e6
--- /dev/null
+++ b/js/src/tab.js
@@ -0,0 +1,278 @@
+import Util from './util'
+
+
+/**
+ * --------------------------------------------------------------------------
+ * Bootstrap (v4.0.0): tab.js
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * --------------------------------------------------------------------------
+ */
+
+const Tab = (($) => {
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Constants
+ * ------------------------------------------------------------------------
+ */
+
+ const NAME = 'tab'
+ const VERSION = '4.0.0'
+ const DATA_KEY = 'bs.tab'
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
+ const TRANSITION_DURATION = 150
+
+ const Event = {
+ HIDE : 'hide.bs.tab',
+ HIDDEN : 'hidden.bs.tab',
+ SHOW : 'show.bs.tab',
+ SHOWN : 'shown.bs.tab',
+ CLICK : 'click.bs.tab.data-api'
+ }
+
+ const ClassName = {
+ DROPDOWN_MENU : 'dropdown-menu',
+ ACTIVE : 'active',
+ FADE : 'fade',
+ IN : 'in'
+ }
+
+ const Selector = {
+ A : 'a',
+ LI : 'li',
+ LI_DROPDOWN : 'li.dropdown',
+ UL : 'ul:not(.dropdown-menu)',
+ FADE_CHILD : '> .fade',
+ ACTIVE : '.active',
+ ACTIVE_CHILD : '> .active',
+ DATA_TOGGLE : '[data-toggle="tab"], [data-toggle="pill"]',
+ DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu > .active'
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ class Tab {
+
+ constructor(element) {
+ this._element = element
+ }
+
+
+ // getters
+
+ static get VERSION() {
+ return VERSION
+ }
+
+ static get Default() {
+ return Default
+ }
+
+
+ // public
+
+ show() {
+ if (this._element.parentNode &&
+ (this._element.parentNode.nodeType == Node.ELEMENT_NODE) &&
+ ($(this._element).parent().hasClass(ClassName.ACTIVE))) {
+ return
+ }
+
+ let target
+ let previous
+ let ulElement = $(this._element).closest(Selector.UL)[0]
+ let selector = Util.getSelectorFromElement(this._element)
+
+ if (ulElement) {
+ previous = $.makeArray($(ulElement).find(Selector.ACTIVE))
+ previous = previous[previous.length - 1]
+
+ if (previous) {
+ previous = $(previous).find(Selector.A)[0]
+ }
+ }
+
+ let hideEvent = $.Event(Event.HIDE, {
+ relatedTarget: this._element
+ })
+
+ let showEvent = $.Event(Event.SHOW, {
+ relatedTarget: previous
+ })
+
+ if (previous) {
+ $(previous).trigger(hideEvent)
+ }
+
+ $(this._element).trigger(showEvent)
+
+ if (showEvent.isDefaultPrevented() ||
+ (hideEvent.isDefaultPrevented())) {
+ return
+ }
+
+ if (selector) {
+ target = $(selector)[0]
+ }
+
+ this._activate(
+ $(this._element).closest(Selector.LI)[0],
+ ulElement
+ )
+
+ let complete = () => {
+ let hiddenEvent = $.Event(Event.HIDDEN, {
+ relatedTarget: this._element
+ })
+
+ let shownEvent = $.Event(Event.SHOWN, {
+ relatedTarget: previous
+ })
+
+ $(previous).trigger(hiddenEvent)
+ $(this._element).trigger(shownEvent)
+ }
+
+ if (target) {
+ this._activate(target, target.parentNode, complete)
+ } else {
+ complete()
+ }
+ }
+
+
+ // private
+
+ _activate(element, container, callback) {
+ let active = $(container).find(Selector.ACTIVE_CHILD)[0]
+ let isTransitioning = callback
+ && Util.supportsTransitionEnd()
+ && ((active && $(active).hasClass(ClassName.FADE))
+ || !!$(container).find(Selector.FADE_CHILD)[0])
+
+ let complete = this._transitionComplete.bind(
+ this, element, active, isTransitioning, callback)
+
+ if (active && isTransitioning) {
+ $(active)
+ .one(Util.TRANSITION_END, complete)
+ .emulateTransitionEnd(TRANSITION_DURATION)
+
+ } else {
+ complete()
+ }
+
+ if (active) {
+ $(active).removeClass(ClassName.IN)
+ }
+ }
+
+ _transitionComplete(element, active, isTransitioning, callback) {
+ if (active) {
+ $(active).removeClass(ClassName.ACTIVE)
+
+ let dropdownChild = $(active).find(
+ Selector.DROPDOWN_ACTIVE_CHILD
+ )[0]
+ if (dropdownChild) {
+ $(dropdownChild).removeClass(ClassName.ACTIVE)
+ }
+
+ let activeToggle = $(active).find(Selector.DATA_TOGGLE)[0]
+ if (activeToggle) {
+ activeToggle.setAttribute('aria-expanded', false)
+ }
+ }
+
+ $(element).addClass(ClassName.ACTIVE)
+
+ let elementToggle = $(element).find(Selector.DATA_TOGGLE)[0]
+ if (elementToggle) {
+ elementToggle.setAttribute('aria-expanded', true)
+ }
+
+ if (isTransitioning) {
+ Util.reflow(element)
+ $(element).addClass(ClassName.IN)
+ } else {
+ $(element).removeClass(ClassName.FADE)
+ }
+
+ if (element.parentNode &&
+ ($(element.parentNode).hasClass(ClassName.DROPDOWN_MENU))) {
+
+ let dropdownElement = $(element).closest(Selector.LI_DROPDOWN)[0]
+ if (dropdownElement) {
+ $(dropdownElement).addClass(ClassName.ACTIVE)
+ }
+
+ elementToggle = $(element).find(Selector.DATA_TOGGLE)[0]
+ if (elementToggle) {
+ elementToggle.setAttribute('aria-expanded', true)
+ }
+ }
+
+ if (callback) {
+ callback()
+ }
+ }
+
+
+ // static
+
+ static _jQueryInterface(config) {
+ return this.each(function () {
+ let $this = $(this)
+ let data = $this.data(DATA_KEY)
+
+ if (!data) {
+ data = data = new Tab(this)
+ $this.data(DATA_KEY, data)
+ }
+
+ if (typeof config === 'string') {
+ data[config]()
+ }
+ })
+ }
+
+ }
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * Data Api implementation
+ * ------------------------------------------------------------------------
+ */
+
+ $(document)
+ .on(Event.CLICK, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault()
+ Tab._jQueryInterface.call($(this), 'show')
+ })
+
+
+ /**
+ * ------------------------------------------------------------------------
+ * jQuery
+ * ------------------------------------------------------------------------
+ */
+
+ $.fn[NAME] = Tab._jQueryInterface
+ $.fn[NAME].Constructor = Tab
+ $.fn[NAME].noConflict = function () {
+ $.fn[NAME] = JQUERY_NO_CONFLICT
+ return Tab._jQueryInterface
+ }
+
+ return Tab
+
+})(jQuery)
+
+export default Tab