bootstrap.js 97.5 KB
Newer Older
Mark Otto's avatar
Mark Otto committed
4001
4002
4003
4004
4005
 */
Popover.prototype.getDataKey = function () {
  return Popover._DATA_KEY
}

XhmikosR's avatar
XhmikosR committed
4006

Mark Otto's avatar
Mark Otto committed
4007
4008
4009
4010
4011
4012
/**
 * @override
 */
Popover.prototype.getEventObject = function () {
  return Popover._Event
}
XhmikosR's avatar
XhmikosR committed
4013
4014


Mark Otto's avatar
Mark Otto committed
4015
4016
4017
4018
4019
4020
/**
 * @override
 */
Popover.prototype.getArrowElement = function () {
  return (this.arrow = this.arrow || $(this.getTipElement()).find(Popover._Selector.ARROW)[0])
}
XhmikosR's avatar
XhmikosR committed
4021
4022


Mark Otto's avatar
Mark Otto committed
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
/**
 * @override
 */
Popover.prototype.setContent = function () {
  var tip          = this.getTipElement()
  var title        = this.getTitle()
  var content      = this._getContent()
  var titleElement = $(tip).find(Popover._Selector.TITLE)[0]

  if (titleElement) {
    titleElement[this.config['html'] ? 'innerHTML' : 'innerText'] = title
XhmikosR's avatar
XhmikosR committed
4034
4035
  }

Mark Otto's avatar
Mark Otto committed
4036
4037
4038
4039
  // we use append for html objects to maintain js events
  $(tip).find(Popover._Selector.CONTENT).children().detach().end()[
    this.config['html'] ? (typeof content == 'string' ? 'html' : 'append') : 'text'
  ](content)
XhmikosR's avatar
XhmikosR committed
4040

Mark Otto's avatar
Mark Otto committed
4041
4042
4043
  $(tip)
    .removeClass(Popover._ClassName.FADE)
    .removeClass(Popover._ClassName.IN)
XhmikosR's avatar
XhmikosR committed
4044

Mark Otto's avatar
Mark Otto committed
4045
4046
4047
4048
  for (var direction in Tooltip.Direction) {
    $(tip).removeClass(Popover._NAME + '-' + Tooltip.Direction[direction])
  }
}
XhmikosR's avatar
XhmikosR committed
4049
4050


Mark Otto's avatar
Mark Otto committed
4051
4052
4053
4054
4055
4056
/**
 * @override
 */
Popover.prototype.isWithContent = function () {
  return this.getTitle() || this._getContent()
}
XhmikosR's avatar
XhmikosR committed
4057
4058


Mark Otto's avatar
Mark Otto committed
4059
4060
4061
4062
4063
4064
/**
 * @override
 */
Popover.prototype.getTipElement = function () {
  return (this.tip = this.tip || $(this.config['template'])[0])
}
XhmikosR's avatar
XhmikosR committed
4065
4066


Mark Otto's avatar
Mark Otto committed
4067
4068
4069
4070
4071
4072
4073
4074
4075
/**
 * @private
 */
Popover.prototype._getContent = function () {
  return this.element.getAttribute('data-content')
    || (typeof this.config['content'] == 'function' ?
          this.config['content'].call(this.element) :
          this.config['content'])
}
XhmikosR's avatar
XhmikosR committed
4076
4077


4078

Mark Otto's avatar
Mark Otto committed
4079
4080
4081
4082
4083
/**
 * ------------------------------------------------------------------------
 * jQuery Interface + noConflict implementaiton
 * ------------------------------------------------------------------------
 */
XhmikosR's avatar
XhmikosR committed
4084

Mark Otto's avatar
Mark Otto committed
4085
4086
4087
4088
4089
/**
 * @const
 * @type {Function}
 */
$.fn[Popover._NAME] = Popover._jQueryInterface
XhmikosR's avatar
XhmikosR committed
4090
4091


Mark Otto's avatar
Mark Otto committed
4092
4093
4094
4095
4096
/**
 * @const
 * @type {Function}
 */
$.fn[Popover._NAME]['Constructor'] = Popover
XhmikosR's avatar
XhmikosR committed
4097
4098


Mark Otto's avatar
Mark Otto committed
4099
4100
4101
4102
4103
4104
4105
4106
/**
 * @const
 * @type {Function}
 */
$.fn[Popover._NAME]['noConflict'] = function () {
  $.fn[Popover._NAME] = Popover._JQUERY_NO_CONFLICT
  return this
}
XhmikosR's avatar
XhmikosR committed
4107

Mark Otto's avatar
Mark Otto committed
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
/** =======================================================================
 * Bootstrap: tab.js v4.0.0
 * http://getbootstrap.com/javascript/#tabs
 * ========================================================================
 * Copyright 2011-2015 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ========================================================================
 * @fileoverview - Bootstrap's tab plugin. Tab O_O
 *
 * Public Methods & Properties:
 *
 *   + $.tab
 *   + $.tab.noConflict
 *   + $.tab.Constructor
 *   + $.tab.Constructor.VERSION
 *   + $.tab.Constructor.prototype.show
 *
 * ========================================================================
 */
XhmikosR's avatar
XhmikosR committed
4127
4128


Mark Otto's avatar
Mark Otto committed
4129
'use strict';
XhmikosR's avatar
XhmikosR committed
4130

Mark Otto's avatar
Mark Otto committed
4131
4132
4133
4134
4135
4136
/**
 * Our Tab class.
 * @param {Element!} element
 * @constructor
 */
var Tab = function (element) {
XhmikosR's avatar
XhmikosR committed
4137

Mark Otto's avatar
Mark Otto committed
4138
4139
  /** @type {Element} */
  this._element = element
XhmikosR's avatar
XhmikosR committed
4140

Mark Otto's avatar
Mark Otto committed
4141
}
XhmikosR's avatar
XhmikosR committed
4142
4143


Mark Otto's avatar
Mark Otto committed
4144
4145
4146
4147
4148
/**
 * @const
 * @type {string}
 */
Tab['VERSION'] = '4.0.0'
XhmikosR's avatar
XhmikosR committed
4149
4150


Mark Otto's avatar
Mark Otto committed
4151
4152
4153
4154
4155
4156
/**
 * @const
 * @type {string}
 * @private
 */
Tab._NAME = 'tab'
XhmikosR's avatar
XhmikosR committed
4157
4158


Mark Otto's avatar
Mark Otto committed
4159
4160
4161
4162
4163
4164
/**
 * @const
 * @type {string}
 * @private
 */
Tab._DATA_KEY = 'bs.tab'
XhmikosR's avatar
XhmikosR committed
4165
4166


Mark Otto's avatar
Mark Otto committed
4167
4168
4169
4170
4171
4172
/**
 * @const
 * @type {number}
 * @private
 */
Tab._TRANSITION_DURATION = 150
XhmikosR's avatar
XhmikosR committed
4173
4174


Mark Otto's avatar
Mark Otto committed
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
/**
 * @const
 * @enum {string}
 * @private
 */
Tab._Event = {
  HIDE   : 'hide.bs.tab',
  HIDDEN : 'hidden.bs.tab',
  SHOW   : 'show.bs.tab',
  SHOWN  : 'shown.bs.tab'
}
XhmikosR's avatar
XhmikosR committed
4186
4187


Mark Otto's avatar
Mark Otto committed
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
/**
 * @const
 * @enum {string}
 * @private
 */
Tab._ClassName = {
  DROPDOWN_MENU : 'dropdown-menu',
  ACTIVE        : 'active',
  FADE          : 'fade',
  IN            : 'in'
}
XhmikosR's avatar
XhmikosR committed
4199

Heinrich Fenkart's avatar
grunt    
Heinrich Fenkart committed
4200

Mark Otto's avatar
Mark Otto committed
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
/**
 * @const
 * @enum {string}
 * @private
 */
Tab._Selector = {
  A                     : 'a',
  LI                    : 'li',
  LI_DROPDOWN           : 'li.dropdown',
  UL                    : 'ul:not(.dropdown-menu)',
  FADE_CHILD            : ':scope > .fade',
  ACTIVE                : '.active',
  ACTIVE_CHILD          : ':scope > .active',
  DATA_TOGGLE           : '[data-toggle="tab"], [data-toggle="pill"]',
  DROPDOWN_ACTIVE_CHILD : ':scope > .dropdown-menu > .active'
}
XhmikosR's avatar
XhmikosR committed
4217
4218


Mark Otto's avatar
Mark Otto committed
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
/**
 * @param {Object|string=} opt_config
 * @this {jQuery}
 * @return {jQuery}
 * @private
 */
Tab._jQueryInterface = function (opt_config) {
  return this.each(function () {
    var $this = $(this)
    var data  = $this.data(Tab._DATA_KEY)
XhmikosR's avatar
XhmikosR committed
4229

Mark Otto's avatar
Mark Otto committed
4230
4231
4232
4233
    if (!data) {
      data = data = new Tab(this)
      $this.data(Tab._DATA_KEY, data)
    }
XhmikosR's avatar
XhmikosR committed
4234

Mark Otto's avatar
Mark Otto committed
4235
4236
4237
4238
4239
    if (typeof opt_config === 'string') {
      data[opt_config]()
    }
  })
}
XhmikosR's avatar
XhmikosR committed
4240
4241


Mark Otto's avatar
Mark Otto committed
4242
4243
4244
4245
4246
4247
4248
4249
4250
/**
 * Show the tab
 */
Tab.prototype['show'] = function () {
  if ( this._element.parentNode
    && this._element.parentNode.nodeType == Node.ELEMENT_NODE
    && $(this._element).parent().hasClass(Tab._ClassName.ACTIVE)) {
    return
  }
XhmikosR's avatar
XhmikosR committed
4251

Mark Otto's avatar
Mark Otto committed
4252
4253
  var ulElement = $(this._element).closest(Tab._Selector.UL)[0]
  var selector  = Bootstrap.getSelectorFromElement(this._element)
XhmikosR's avatar
XhmikosR committed
4254

Mark Otto's avatar
Mark Otto committed
4255
4256
4257
  if (ulElement) {
    var previous = /** @type {Array.<Element>} */ ($.makeArray($(ulElement).find(Tab._Selector.ACTIVE)))
    previous = previous[previous.length - 1]
XhmikosR's avatar
XhmikosR committed
4258

Mark Otto's avatar
Mark Otto committed
4259
4260
4261
    if (previous) {
      previous = $(previous).find('a')[0]
    }
XhmikosR's avatar
XhmikosR committed
4262
4263
  }

Mark Otto's avatar
Mark Otto committed
4264
4265
4266
  var hideEvent = $.Event(Tab._Event.HIDE, {
    relatedTarget: this._element
  })
XhmikosR's avatar
XhmikosR committed
4267

Mark Otto's avatar
Mark Otto committed
4268
4269
4270
  var showEvent = $.Event(Tab._Event.SHOW, {
    relatedTarget: previous
  })
XhmikosR's avatar
XhmikosR committed
4271

Mark Otto's avatar
Mark Otto committed
4272
4273
  if (previous) {
    $(previous).trigger(hideEvent)
XhmikosR's avatar
XhmikosR committed
4274
4275
  }

Mark Otto's avatar
Mark Otto committed
4276
  $(this._element).trigger(showEvent)
4277

Mark Otto's avatar
Mark Otto committed
4278
  if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
4279

Mark Otto's avatar
Mark Otto committed
4280
4281
4282
  if (selector) {
    var target = $(selector)[0]
  }
4283

Mark Otto's avatar
Mark Otto committed
4284
  this._activate($(this._element).closest(Tab._Selector.LI)[0], ulElement)
4285

Mark Otto's avatar
Mark Otto committed
4286
4287
4288
4289
  var complete = function () {
    var hiddenEvent = $.Event(Tab._Event.HIDDEN, {
      relatedTarget: this._element
    })
4290

Mark Otto's avatar
Mark Otto committed
4291
4292
4293
    var shownEvent  = $.Event(Tab._Event.SHOWN, {
      relatedTarget: previous
    })
4294

Mark Otto's avatar
Mark Otto committed
4295
4296
4297
    $(previous).trigger(hiddenEvent)
    $(this._element).trigger(shownEvent)
  }.bind(this)
XhmikosR's avatar
XhmikosR committed
4298

Mark Otto's avatar
Mark Otto committed
4299
4300
4301
4302
  if (target) {
    this._activate(target, /** @type {Element} */ (target.parentNode), complete)
  } else {
    complete()
XhmikosR's avatar
XhmikosR committed
4303
  }
Mark Otto's avatar
Mark Otto committed
4304
}
XhmikosR's avatar
XhmikosR committed
4305
4306


Mark Otto's avatar
Mark Otto committed
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
/**
 * @param {Element} element
 * @param {Element} container
 * @param {Function=} opt_callback
 * @private
 */
Tab.prototype._activate = function (element, container, opt_callback) {
  var active          = $(container).find(Tab._Selector.ACTIVE_CHILD)[0]
  var isTransitioning = opt_callback
    && Bootstrap.transition
    && ((active && $(active).hasClass(Tab._ClassName.FADE))
       || !!$(container).find(Tab._Selector.FADE_CHILD)[0])

  var complete = this._transitionComplete.bind(this, element, active, isTransitioning, opt_callback)

  if (active && isTransitioning) {
    $(active)
      .one(Bootstrap.TRANSITION_END, complete)
      .emulateTransitionEnd(Tab._TRANSITION_DURATION)

  } else {
    complete()
  }

  if (active) {
    $(active).removeClass(Tab._ClassName.IN)
  }
}
XhmikosR's avatar
XhmikosR committed
4335
4336


Mark Otto's avatar
Mark Otto committed
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
/**
 * @param {Element} element
 * @param {Element} active
 * @param {boolean} isTransitioning
 * @param {Function=} opt_callback
 * @private
 */
Tab.prototype._transitionComplete = function (element, active, isTransitioning, opt_callback) {
  if (active) {
    $(active).removeClass(Tab._ClassName.ACTIVE)
XhmikosR's avatar
XhmikosR committed
4347

Mark Otto's avatar
Mark Otto committed
4348
4349
4350
4351
    var dropdownChild = $(active).find(Tab._Selector.DROPDOWN_ACTIVE_CHILD)[0]
    if (dropdownChild) {
      $(dropdownChild).removeClass(Tab._ClassName.ACTIVE)
    }
XhmikosR's avatar
XhmikosR committed
4352

Mark Otto's avatar
Mark Otto committed
4353
4354
4355
4356
4357
    var activeToggle = $(active).find(Tab._Selector.DATA_TOGGLE)[0]
    if (activeToggle) {
      activeToggle.setAttribute('aria-expanded', false)
    }
  }
XhmikosR's avatar
XhmikosR committed
4358

Mark Otto's avatar
Mark Otto committed
4359
  $(element).addClass(Tab._ClassName.ACTIVE)
XhmikosR's avatar
XhmikosR committed
4360

Mark Otto's avatar
Mark Otto committed
4361
4362
4363
4364
  var elementToggle = $(element).find(Tab._Selector.DATA_TOGGLE)[0]
  if (elementToggle) {
    elementToggle.setAttribute('aria-expanded', true)
  }
XhmikosR's avatar
XhmikosR committed
4365

Mark Otto's avatar
Mark Otto committed
4366
4367
4368
4369
4370
4371
  if (isTransitioning) {
    Bootstrap.reflow(element)
    $(element).addClass(Tab._ClassName.IN)
  } else {
    $(element).removeClass(Tab._ClassName.FADE)
  }
XhmikosR's avatar
XhmikosR committed
4372

Mark Otto's avatar
Mark Otto committed
4373
4374
4375
4376
  if (element.parentNode && $(element.parentNode).hasClass(Tab._ClassName.DROPDOWN_MENU)) {
    var dropdownElement = $(element).closest(Tab._Selector.LI_DROPDOWN)[0]
    if (dropdownElement) {
      $(dropdownElement).addClass(Tab._ClassName.ACTIVE)
4377
    }
XhmikosR's avatar
XhmikosR committed
4378

Mark Otto's avatar
Mark Otto committed
4379
4380
4381
    elementToggle = $(element).find(Tab._Selector.DATA_TOGGLE)[0]
    if (elementToggle) {
      elementToggle.setAttribute('aria-expanded', true)
XhmikosR's avatar
XhmikosR committed
4382
4383
4384
    }
  }

Mark Otto's avatar
Mark Otto committed
4385
4386
  if (opt_callback) {
    opt_callback()
XhmikosR's avatar
XhmikosR committed
4387
  }
Mark Otto's avatar
Mark Otto committed
4388
}
XhmikosR's avatar
XhmikosR committed
4389
4390


Mark Otto's avatar
Mark Otto committed
4391
4392
4393
4394
4395
/**
 * ------------------------------------------------------------------------
 * jQuery Interface + noConflict implementaiton
 * ------------------------------------------------------------------------
 */
XhmikosR's avatar
XhmikosR committed
4396

Mark Otto's avatar
Mark Otto committed
4397
4398
4399
4400
4401
/**
 * @const
 * @type {Function}
 */
$.fn[Tab._NAME] = Tab._jQueryInterface
XhmikosR's avatar
XhmikosR committed
4402
4403


Mark Otto's avatar
Mark Otto committed
4404
4405
4406
4407
4408
/**
 * @const
 * @type {Function}
 */
$.fn[Tab._NAME]['Constructor'] = Tab
XhmikosR's avatar
XhmikosR committed
4409
4410


Mark Otto's avatar
Mark Otto committed
4411
4412
4413
4414
4415
4416
4417
4418
/**
 * @const
 * @type {Function}
 */
$.fn[Tab._NAME]['noConflict'] = function () {
  $.fn[Tab._NAME] = Tab._JQUERY_NO_CONFLICT
  return this
}
XhmikosR's avatar
XhmikosR committed
4419
4420
4421



Mark Otto's avatar
Mark Otto committed
4422
4423
// TAB DATA-API
// ============
XhmikosR's avatar
XhmikosR committed
4424

Mark Otto's avatar
Mark Otto committed
4425
4426
4427
4428
var clickHandler = function (e) {
  e.preventDefault()
  Tab._jQueryInterface.call($(this), 'show')
}
XhmikosR's avatar
XhmikosR committed
4429

Mark Otto's avatar
Mark Otto committed
4430
4431
$(document)
  .on('click.bs.tab.data-api', Tab._Selector.DATA_TOGGLE, clickHandler)
For faster browsing, not all history is shown. View entire blame