mirror of https://github.com/twbs/bootstrap.git
				
				
				
			Merge branch '2.0-wip' of github.com:twitter/bootstrap into 2.0-wip
This commit is contained in:
		
						commit
						b81b0e2b15
					
				| 
						 | 
					@ -876,7 +876,7 @@ $('#my-alert').bind('closed', function () {
 | 
				
			||||||
      <div class="row">
 | 
					      <div class="row">
 | 
				
			||||||
        <div class="span3 columns">
 | 
					        <div class="span3 columns">
 | 
				
			||||||
          <p>The collapse plugin offers simple, flexible collapsible element support for making accordions and other collapsible ui components.</p>
 | 
					          <p>The collapse plugin offers simple, flexible collapsible element support for making accordions and other collapsible ui components.</p>
 | 
				
			||||||
          <a href="../js/bootstrap-collapsible.js" target="_blank" class="btn primary">Download</a>
 | 
					          <a href="../js/bootstrap-collapse.js" target="_blank" class="btn primary">Download</a>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="span9 columns">
 | 
					        <div class="span9 columns">
 | 
				
			||||||
          <h3>Using bootstrap-collapse.js</h3>
 | 
					          <h3>Using bootstrap-collapse.js</h3>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,190 @@
 | 
				
			||||||
 | 
					/* =============================================================
 | 
				
			||||||
 | 
					 * bootstrap-typeahead.js v2.0.0
 | 
				
			||||||
 | 
					 * http://twitter.github.com/bootstrap/javascript.html#collapsible
 | 
				
			||||||
 | 
					 * =============================================================
 | 
				
			||||||
 | 
					 * Copyright 2011 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"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  var Typeahead = function ( element, options ) {
 | 
				
			||||||
 | 
					    this.$element = $(element)
 | 
				
			||||||
 | 
					    this.options = $.extend({}, $.fn.typeahead.defaults, options)
 | 
				
			||||||
 | 
					    this.$menu = $(this.options.menu).appendTo('body')
 | 
				
			||||||
 | 
					    this.data = this.options.data
 | 
				
			||||||
 | 
					    this.shown = false
 | 
				
			||||||
 | 
					    this.listen()
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Typeahead.prototype = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    constructor: Typeahead
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , matcher: function(item, query) {
 | 
				
			||||||
 | 
					      return ~item.indexOf(query)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , select: function(event) {
 | 
				
			||||||
 | 
					      this.$element.val($(event.target).attr('data-value'))
 | 
				
			||||||
 | 
					      this.hide()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , show: function () {
 | 
				
			||||||
 | 
					      this.shown = true
 | 
				
			||||||
 | 
					      this.$menu.show()
 | 
				
			||||||
 | 
					      return this
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , hide: function () {
 | 
				
			||||||
 | 
					      this.shown = false
 | 
				
			||||||
 | 
					      this.$menu.hide()
 | 
				
			||||||
 | 
					      return this
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , lookup: function (event) {
 | 
				
			||||||
 | 
					      var query = this.$element.val()
 | 
				
			||||||
 | 
					        , that = this
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      var items = this.data.filter(function (item) {
 | 
				
			||||||
 | 
					        if (that.matcher(item, query)) {
 | 
				
			||||||
 | 
					          return item
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!items.length) {
 | 
				
			||||||
 | 
					        return this.shown ? this.hide() : this
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return this.render(items).show()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , render: function(items) {
 | 
				
			||||||
 | 
					      var that = this
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      items = $(items).map(function (i, item) {
 | 
				
			||||||
 | 
					        return $(that.options.item)
 | 
				
			||||||
 | 
					          .text(item)
 | 
				
			||||||
 | 
					          .attr('data-value', item)[0]
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      items.first().addClass('active')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$menu.append(items)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return this
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , next: function (event) {
 | 
				
			||||||
 | 
					      var active = this.$menu.find('.active').removeClass('active')
 | 
				
			||||||
 | 
					        , next = active.next() || $(this.$menu.find('li')[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      next.addClass('active')
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , prev: function (event) {
 | 
				
			||||||
 | 
					      var active = this.$menu.find('.active').removeClass('active')
 | 
				
			||||||
 | 
					        , next = active.prev() || this.$menu.find('li').last()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      next.addClass('active')
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , keyup: function () {
 | 
				
			||||||
 | 
					      event
 | 
				
			||||||
 | 
					        .stopPropagation()
 | 
				
			||||||
 | 
					        .preventDefault()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      switch(event.keyCode) {
 | 
				
			||||||
 | 
					        case 9: // tab
 | 
				
			||||||
 | 
					        case 13: // enter
 | 
				
			||||||
 | 
					          this.select()
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 27: // escape
 | 
				
			||||||
 | 
					          this.hide()
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					          this.lookup()
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , keypress: function (event) {
 | 
				
			||||||
 | 
					      event.stopPropagation()
 | 
				
			||||||
 | 
					      switch(event.keyCode) {
 | 
				
			||||||
 | 
					        case 9: // tab
 | 
				
			||||||
 | 
					        case 13: // enter
 | 
				
			||||||
 | 
					        case 27: // escape
 | 
				
			||||||
 | 
					          event.preventDefault()
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 38: // up arrow
 | 
				
			||||||
 | 
					          this.prev()
 | 
				
			||||||
 | 
					          event.preventDefault()
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 40: // down arrow
 | 
				
			||||||
 | 
					          this.next()
 | 
				
			||||||
 | 
					          event.preventDefault()
 | 
				
			||||||
 | 
					          break
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  , listen: function () {
 | 
				
			||||||
 | 
					      this.$element
 | 
				
			||||||
 | 
					        .on('focus', this.show)
 | 
				
			||||||
 | 
					        .on('blur', $.proxy(this.hide, this))
 | 
				
			||||||
 | 
					        .on('keypress', $.proxy(this.keypress, this))
 | 
				
			||||||
 | 
					        .on('keyup', this.keyup)
 | 
				
			||||||
 | 
					        .on('change', $.proxy(this.lookup, this))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if ($.browser.webkit || $.browser.msie) {
 | 
				
			||||||
 | 
					        this.$element.on('keydown', this.keypress)
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$menu
 | 
				
			||||||
 | 
					        .on('click', '* > *', $.proxy(this.select, this))
 | 
				
			||||||
 | 
					        .on('mouseenter', function () {
 | 
				
			||||||
 | 
					          /* remove selected class, add to mouseover */
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* TYPEAHEAD PLUGIN DEFINITION
 | 
				
			||||||
 | 
					  * ============================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $.fn.typeahead = function ( option ) {
 | 
				
			||||||
 | 
					    return this.each(function () {
 | 
				
			||||||
 | 
					      var $this = $(this)
 | 
				
			||||||
 | 
					        , data = $this.data('typeahead')
 | 
				
			||||||
 | 
					        , options = typeof option == 'object' && option
 | 
				
			||||||
 | 
					      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
 | 
				
			||||||
 | 
					      if (typeof option == 'string') data[option]()
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $.fn.typeahead.defaults = {
 | 
				
			||||||
 | 
					    data: null
 | 
				
			||||||
 | 
					  , items: 8
 | 
				
			||||||
 | 
					  , empty: false
 | 
				
			||||||
 | 
					  , noresults: false
 | 
				
			||||||
 | 
					  , menu: '<ul class="dropdown-menu"></ul>'
 | 
				
			||||||
 | 
					  , item: '<li></li>'
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  $.fn.typeahead.Constructor = Typeahead
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}( window.jQuery )
 | 
				
			||||||
| 
						 | 
					@ -22,6 +22,7 @@
 | 
				
			||||||
  <script src="../../js/bootstrap-tab.js"></script>
 | 
					  <script src="../../js/bootstrap-tab.js"></script>
 | 
				
			||||||
  <script src="../../js/bootstrap-twipsy.js"></script>
 | 
					  <script src="../../js/bootstrap-twipsy.js"></script>
 | 
				
			||||||
  <script src="../../js/bootstrap-popover.js"></script>
 | 
					  <script src="../../js/bootstrap-popover.js"></script>
 | 
				
			||||||
 | 
					  <script src="../../js/bootstrap-typeahead.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <!-- unit tests -->
 | 
					  <!-- unit tests -->
 | 
				
			||||||
  <script src="unit/bootstrap-transition.js"></script>
 | 
					  <script src="unit/bootstrap-transition.js"></script>
 | 
				
			||||||
| 
						 | 
					@ -34,6 +35,7 @@
 | 
				
			||||||
  <script src="unit/bootstrap-tab.js"></script>
 | 
					  <script src="unit/bootstrap-tab.js"></script>
 | 
				
			||||||
  <script src="unit/bootstrap-twipsy.js"></script>
 | 
					  <script src="unit/bootstrap-twipsy.js"></script>
 | 
				
			||||||
  <script src="unit/bootstrap-popover.js"></script>
 | 
					  <script src="unit/bootstrap-popover.js"></script>
 | 
				
			||||||
 | 
					  <script src="unit/bootstrap-typeahead.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,122 @@
 | 
				
			||||||
 | 
					$(function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    module("bootstrap-typeahead")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should be defined on jquery object", function () {
 | 
				
			||||||
 | 
					        ok($(document.body).typeahead, 'alert method is defined')
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should return element", function () {
 | 
				
			||||||
 | 
					        ok($(document.body).typeahead()[0] == document.body, 'document.body returned')
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should listen to an input", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />')
 | 
				
			||||||
 | 
					        $input.typeahead()
 | 
				
			||||||
 | 
					        ok($input.data('events').focus, 'has a focus event')
 | 
				
			||||||
 | 
					        ok($input.data('events').blur, 'has a blur event')
 | 
				
			||||||
 | 
					        ok($input.data('events').keypress, 'has a keypress event')
 | 
				
			||||||
 | 
					        ok($input.data('events').keyup, 'has a keyup event')
 | 
				
			||||||
 | 
					        ok($input.data('events').change, 'has a change event')
 | 
				
			||||||
 | 
					        if ($.browser.webkit || $.browser.msie) {
 | 
				
			||||||
 | 
					          ok($input.data('events').keydown, 'has a keydown event')
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          ok($input.data('events').keydown, 'does not have a keydown event')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should create a menu", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />')
 | 
				
			||||||
 | 
					        ok($input.typeahead().data('typeahead').$menu, 'has a menu')
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should listen to the menu", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />')
 | 
				
			||||||
 | 
					          , $menu = $input.typeahead().data('typeahead').$menu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok($menu.data('events').mouseover, 'has a mouseover(pseudo: mouseenter)')
 | 
				
			||||||
 | 
					        ok($menu.data('events').click, 'has a click')
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should show menu when query entered", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />').typeahead({
 | 
				
			||||||
 | 
					              data: ['aa', 'ab', 'ac']
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          , typeahead = $input.data('typeahead')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.val('a').change()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
 | 
				
			||||||
 | 
					        equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
 | 
				
			||||||
 | 
					        equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        typeahead.$menu.remove()
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should hide menu when query entered", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />').typeahead({
 | 
				
			||||||
 | 
					              data: ['aa', 'ab', 'ac']
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          , typeahead = $input.data('typeahead')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.val('a').change()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
 | 
				
			||||||
 | 
					        equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
 | 
				
			||||||
 | 
					        equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.blur()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok(!typeahead.$menu.is(":visible"), "typeahead is no longer visible")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        typeahead.$menu.remove()
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should set next item when down arrow is pressed", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />').typeahead({
 | 
				
			||||||
 | 
					              data: ['aa', 'ab', 'ac']
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          , typeahead = $input.data('typeahead')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.val('a').change()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok(typeahead.$menu.is(":visible"), 'typeahead is visible')
 | 
				
			||||||
 | 
					        equals(typeahead.$menu.find('li').length, 3, 'has 3 items in menu')
 | 
				
			||||||
 | 
					        equals(typeahead.$menu.find('.active').length, 1, 'one item is active')
 | 
				
			||||||
 | 
					        ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.trigger({
 | 
				
			||||||
 | 
					          type: 'keypress'
 | 
				
			||||||
 | 
					        , keyCode: 40
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok(typeahead.$menu.find('li').first().next().hasClass('active'), "second item is active")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.trigger({
 | 
				
			||||||
 | 
					          type: 'keypress'
 | 
				
			||||||
 | 
					        , keyCode: 38
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ok(typeahead.$menu.find('li').first().hasClass('active'), "first item is active")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        typeahead.$menu.remove()
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      test("should set input value to selected item", function () {
 | 
				
			||||||
 | 
					        var $input = $('<input />').typeahead({
 | 
				
			||||||
 | 
					              data: ['aa', 'ab', 'ac']
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          , typeahead = $input.data('typeahead')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $input.val('a').change()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $(typeahead.$menu.find('li')[2]).trigger('click')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        equals($input.val(), 'ac', 'input value was correctly set')
 | 
				
			||||||
 | 
					        ok(!typeahead.$menu.is(':visible'), 'the menu was hidden')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        typeahead.$menu.remove()
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
		Loading…
	
		Reference in New Issue