assets/javascripts/bootstrap/tab.js
author ymh <ymh.work@gmail.com>
Wed, 16 Oct 2019 13:18:55 +0200
changeset 118 2c8d73b46563
parent 114 af15590802a4
permissions -rw-r--r--
test commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
114
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/* ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
 * Bootstrap: tab.js v3.3.5
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * http://getbootstrap.com/javascript/#tabs
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Copyright 2011-2015 Twitter, Inc.
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * ======================================================================== */
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
+function ($) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
  'use strict';
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
  // TAB CLASS DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  // ====================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
  var Tab = function (element) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    // jscs:disable requireDollarBeforejQueryAssignment
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    this.element = $(element)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    // jscs:enable requireDollarBeforejQueryAssignment
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  Tab.VERSION = '3.3.5'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
  Tab.TRANSITION_DURATION = 150
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  Tab.prototype.show = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    var $this    = this.element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    var selector = $this.data('target')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    if (!selector) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
      selector = $this.attr('href')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    if ($this.parent('li').hasClass('active')) return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    var $previous = $ul.find('.active:last a')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    var hideEvent = $.Event('hide.bs.tab', {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
      relatedTarget: $this[0]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    var showEvent = $.Event('show.bs.tab', {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
      relatedTarget: $previous[0]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    $previous.trigger(hideEvent)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    $this.trigger(showEvent)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    var $target = $(selector)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    this.activate($this.closest('li'), $ul)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    this.activate($target, $target.parent(), function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
      $previous.trigger({
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        type: 'hidden.bs.tab',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        relatedTarget: $this[0]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
      })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
      $this.trigger({
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        type: 'shown.bs.tab',
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        relatedTarget: $previous[0]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
      })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
  Tab.prototype.activate = function (element, container, callback) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    var $active    = container.find('> .active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
    var transition = callback
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
      && $.support.transition
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    function next() {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
      $active
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        .removeClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        .find('> .dropdown-menu > .active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
          .removeClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        .end()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        .find('[data-toggle="tab"]')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
          .attr('aria-expanded', false)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
      element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        .addClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        .find('[data-toggle="tab"]')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
          .attr('aria-expanded', true)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
      if (transition) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        element[0].offsetWidth // reflow for transition
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
        element.addClass('in')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
      } else {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
        element.removeClass('fade')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
      if (element.parent('.dropdown-menu').length) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
        element
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
          .closest('li.dropdown')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
            .addClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
          .end()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
          .find('[data-toggle="tab"]')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            .attr('aria-expanded', true)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
      }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
      callback && callback()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    $active.length && transition ?
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
      $active
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        .one('bsTransitionEnd', next)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
      next()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
    $active.removeClass('in')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
  // TAB PLUGIN DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
  // =====================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
  function Plugin(option) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    return this.each(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
      var $this = $(this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
      var data  = $this.data('bs.tab')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
      if (typeof option == 'string') data[option]()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
  var old = $.fn.tab
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
  $.fn.tab             = Plugin
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
  $.fn.tab.Constructor = Tab
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
  // TAB NO CONFLICT
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
  // ===============
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
  $.fn.tab.noConflict = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
    $.fn.tab = old
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    return this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
  // TAB DATA-API
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
  // ============
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
  var clickHandler = function (e) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    e.preventDefault()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    Plugin.call($(this), 'show')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
  $(document)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
}(jQuery);