From b1460fe5585e50c00f605f423f50ddac3dc8ee0c Mon Sep 17 00:00:00 2001 From: Alexander Kochetov Date: Tue, 21 May 2013 23:59:23 +0400 Subject: [PATCH] Bundle names fixes, base widget fixes, other widgets fixes --- yii/bootstrap/Alert.php | 1 + yii/bootstrap/Modal.php | 1 + yii/bootstrap/TypeAhead.php | 1 + yii/bootstrap/Widget.php | 11 +- yii/bootstrap/assets.php | 39 +- yii/bootstrap/assets/js/bootstrap.js | 2280 ------------------------------ yii/bootstrap/assets/js/bootstrap.min.js | 6 - 7 files changed, 27 insertions(+), 2312 deletions(-) delete mode 100644 yii/bootstrap/assets/js/bootstrap.js delete mode 100644 yii/bootstrap/assets/js/bootstrap.min.js diff --git a/yii/bootstrap/Alert.php b/yii/bootstrap/Alert.php index f84a70b..558865a 100644 --- a/yii/bootstrap/Alert.php +++ b/yii/bootstrap/Alert.php @@ -77,6 +77,7 @@ class Alert extends Widget { parent::init(); + $this->getView()->registerAssetBundle('yii/bootstrap/alert'); $this->initOptions(); echo Html::beginTag('div', $this->options) . "\n"; diff --git a/yii/bootstrap/Modal.php b/yii/bootstrap/Modal.php index 1a70209..63c3450 100644 --- a/yii/bootstrap/Modal.php +++ b/yii/bootstrap/Modal.php @@ -102,6 +102,7 @@ class Modal extends Widget { parent::init(); + $this->getView()->registerAssetBundle('yii/bootstrap/modal'); $this->initOptions(); echo $this->renderToggleButton() . "\n"; diff --git a/yii/bootstrap/TypeAhead.php b/yii/bootstrap/TypeAhead.php index 4aee46a..2064224 100644 --- a/yii/bootstrap/TypeAhead.php +++ b/yii/bootstrap/TypeAhead.php @@ -68,6 +68,7 @@ class TypeAhead extends Widget */ public function run() { + $this->getView()->registerAssetBundle('yii/bootstrap/typeahead'); echo $this->renderField(); $this->registerPlugin('typeahead'); } diff --git a/yii/bootstrap/Widget.php b/yii/bootstrap/Widget.php index 405cd19..75cad9b 100644 --- a/yii/bootstrap/Widget.php +++ b/yii/bootstrap/Widget.php @@ -25,7 +25,10 @@ class Widget extends \yii\base\Widget * @var boolean whether to use the responsive version of Bootstrap. */ public static $responsive = true; - + /** + * @var boolean whether to use the transition effects. + */ + public static $transition = true; /** * @var array the HTML attributes for the widget container tag. */ @@ -67,9 +70,11 @@ class Widget extends \yii\base\Widget { $id = $this->options['id']; $view = $this->getView(); + $view->registerAssetBundle(static::$responsive ? 'yii/bootstrap/responsive' : 'yii/bootstrap'); - $bundle = static::$responsive ? 'yii/bootstrap-responsive' : 'yii/bootstrap'; - $view->registerAssetBundle($bundle); + if (static::$transition) { + $view->registerAssetBundle('yii/bootstrap/transition'); + } if ($this->pluginOptions !== false) { $options = empty($this->pluginOptions) ? '' : Json::encode($this->pluginOptions); diff --git a/yii/bootstrap/assets.php b/yii/bootstrap/assets.php index be771f8..cd14953 100644 --- a/yii/bootstrap/assets.php +++ b/yii/bootstrap/assets.php @@ -1,115 +1,108 @@ array( + 'yii/bootstrap' => array( 'sourcePath' => __DIR__ . '/assets', 'css' => array( YII_DEBUG ? 'css/bootstrap.css' : 'css/bootstrap.min.css', ), ), - 'yii/bootstrap/css-responsive' => array( + 'yii/bootstrap/responsive' => array( 'sourcePath' => __DIR__ . '/assets', 'css' => array( YII_DEBUG ? 'css/bootstrap-responsive.css' : 'css/bootstrap-responsive.min.css', ), - 'depends' => array('yii/bootstrap/css'), - ), - 'yii/bootstrap/all' => array( - 'sourcePath' => __DIR__ . '/assets', - 'js' => array( - YII_DEBUG ? 'js/bootstrap.js' : 'js/bootstrap.min.js', - ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/bootstrap'), ), 'yii/bootstrap/affix' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-affix.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/alert' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-alert.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/button' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-button.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/carousel' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-carousel.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/collapse' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-collapse.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/dropdown' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-dropdown.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/modal' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-modal.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/popover' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-popover.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/tooltip', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap/tooltip', 'yii/bootstrap'), ), 'yii/bootstrap/scrollspy' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-scrollspy.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/tab' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-tab.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/tooltip' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-tooltip.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/transition' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-transition.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), 'yii/bootstrap/typeahead' => array( 'sourcePath' => __DIR__ . '/assets', 'js' => array( 'js/bootstrap-typeahead.js', ), - 'depends' => array('yii/jquery', 'yii/bootstrap/css'), + 'depends' => array('yii/jquery', 'yii/bootstrap'), ), ); diff --git a/yii/bootstrap/assets/js/bootstrap.js b/yii/bootstrap/assets/js/bootstrap.js deleted file mode 100644 index 643e71c..0000000 --- a/yii/bootstrap/assets/js/bootstrap.js +++ /dev/null @@ -1,2280 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $(function () { - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT NO CONFLICT - * ================= */ - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - /* ALERT DATA-API - * ============== */ - - $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON NO CONFLICT - * ================== */ - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - /* BUTTON DATA-API - * =============== */ - - $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - if (this.interval) clearInterval(this.interval); - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , getActiveIndex: function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - return this.$items.index(this.$active) - } - - , to: function (pos) { - var activeIndex = this.getActiveIndex() - , that = this - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activeIndex == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - , direction: direction - }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - , slideIndex - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('carousel').pause().to(slideIndex).cycle() - } - - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning || this.$element.hasClass('in')) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.3.2 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement) { - // if mobile we we use a backdrop because click events don't delegate - $('