diff --git a/src/inputs/typeahead.js b/src/inputs/typeahead.js index 8945059..dc6d7e1 100644 --- a/src/inputs/typeahead.js +++ b/src/inputs/typeahead.js @@ -25,7 +25,6 @@ $(function(){ {value: 'us', text: 'United States'}, {value: 'ru', text: 'Russia'} ] - } }); }); </script> @@ -57,8 +56,11 @@ $(function(){ //apply typeahead this.$input.typeahead(this.options.typeahead); - //attach own render method - this.$input.data('typeahead').render = $.proxy(this.typeaheadRender, this.$input.data('typeahead')); + //patch some methods in typeahead + var ta = this.$input.data('typeahead'); + ta.render = $.proxy(this.typeaheadRender, ta); + ta.select = $.proxy(this.typeaheadSelect, ta); + ta.move = $.proxy(this.typeaheadMove, ta); this.renderClear(); this.setClass(); @@ -161,7 +163,6 @@ $(function(){ return $.fn.typeahead.Constructor.prototype.highlighter.call(this, item.text); }, updater: function (item) { - item = this.$menu.find('.active').data('item'); this.$element.data('value', item.value); return item.text; }, @@ -172,7 +173,7 @@ $(function(){ There are a lot of disscussion in bootstrap repo on this point and still no result. See https://github.com/twitter/bootstrap/issues/5967 - This function just store item in via jQuery data() method instead of attr('data-value') + This function just store item via jQuery data() method instead of attr('data-value') */ typeaheadRender: function (items) { var that = this; @@ -184,10 +185,56 @@ $(function(){ return i[0]; }); - items.first().addClass('active'); + //add option to disable autoselect of first line + //see https://github.com/twitter/bootstrap/pull/4164 + if (this.options.autoSelect) { + items.first().addClass('active'); + } this.$menu.html(items); return this; + }, + + //add option to disable autoselect of first line + //see https://github.com/twitter/bootstrap/pull/4164 + typeaheadSelect: function () { + var val = this.$menu.find('.active').data('item') + if(this.options.autoSelect || val){ + this.$element + .val(this.updater(val)) + .change() + } + return this.hide() + }, + + /* + if autoSelect = false and nothing matched we need extra press onEnter that is not convinient. + This patch fixes it. + */ + typeaheadMove: function (e) { + if (!this.shown) return + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + if (!this.$menu.find('.active').length) return + e.preventDefault() + break + + case 38: // up arrow + e.preventDefault() + this.prev() + break + + case 40: // down arrow + e.preventDefault() + this.next() + break + } + + e.stopPropagation() } + /*jshint eqeqeq: true, curly: true, laxcomma: false*/ });