diff --git a/dist/js/nya-bs-select.js b/dist/js/nya-bs-select.js index e6afde1..1565646 100644 --- a/dist/js/nya-bs-select.js +++ b/dist/js/nya-bs-select.js @@ -849,11 +849,19 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC // simple keyboard support $element.on('keydown', function(event){ - var keyCode = event.keyCode; + var keyCode = event.keyCode, + + $this = $(this); if(keyCode !== 27 && keyCode !== 13 && keyCode !== 38 && keyCode !== 40) { - // we only handle special keys. don't waste time to traverse the dom tree. - return; + + var letter = String.fromCharCode(event.which); + + var filterLetter = $this.find('a:contains("'+ letter +'")').filter(function() { + return $(this).text().indexOf(letter) === 0; + }); + + filterLetter.eq(0).focus(); } // prevent a click event to be fired. diff --git a/dist/js/nya-bs-select.min.js b/dist/js/nya-bs-select.min.js index b850f4f..ef0990c 100644 --- a/dist/js/nya-bs-select.min.js +++ b/dist/js/nya-bs-select.min.js @@ -3,4 +3,4 @@ * Copyright 2014 Nyasoft * Licensed under MIT license */ -!function(){"use strict";function a(){return++j}function b(a){return a&&a.window===a}function c(a){return"string"==typeof a}function d(a){if(null==a||b(a))return!1;var d=a.length;return 1===a.nodeType&&d?!0:c(a)||Array.isArray(a)||0===d||"number"==typeof d&&d>0&&d-1 in a}function e(){return Object.create(null)}function f(b,c){var d,e=typeof b;return"function"==e||"object"==e&&null!==b?"function"==typeof(d=b.$$hashKey)?d=b.$$hashKey():void 0===d&&(d=b.$$hashKey=(c||a)()):d=b,e+":"+d}function g(a,b,c){var d,e,f=[],g=[];for(d=0;dc;c++)if(w(b,a[c]))return!0;return!1},p=function(a,b){var c,d=a.length;if(0===d)return-1;for(c=0;d>c;c++)if(w(b,a[c]))return c;return-1},q=function(a,b,c){var d,e=a,f=typeof c;if(a==b)return null;do if("string"===f){if(d=" "+e.className+" ",1===e.nodeType&&d.replace(/[\t\r\n\f]/g," ").indexOf(c)>=0)return e}else if(e==c)return e;while((e=e.parentNode)&&e!=b&&9!==e.nodeType);return null},r=function(a){var b,c=a.className.replace(/[\t\r\n\f]/g," ").trim();b=c.split(" ");for(var d=0;d0)for(var h=0;g>h;h++){if(c=f.eq(h),d=!0,e=r(c[0]),e.length>0)for(var i=0;id;d++)if(-1!==c.eq(d).text().toLowerCase().indexOf(b.toLowerCase()))return!0;return!1},v=angular.element,w=angular.equals,x=angular.copy,y=angular.extend,z=angular.module("nya.bootstrap.select",[]);z.provider("nyaBsConfig",function(){var a=null,b={"en-us":{defaultNoneSelection:"Nothing selected",noSearchResult:"NO SEARCH RESULT",numberItemSelected:"%d item selected",selectAll:"Select All",deselectAll:"Deselect All"}},c=x(b);this.setLocalizedText=function(a,b){if(!a)throw new Error("localeId must be a string formatted as languageId-countryId");c[a]||(c[a]={}),c[a]=y(c[a],b)},this.useLocale=function(b){a=b},this.$get=["$locale",function(d){var e;return e=a?c[a]:c[d.id],e||(e=b["en-us"]),e}]}),z.controller("nyaBsSelectCtrl",function(){var a=this;a.keyIdentifier=null,a.valueIdentifier=null,a.isMultiple=!1,a.onCollectionChange=function(){},a.setId=function(b){a.id=b||"id#"+Math.floor(1e4*Math.random())}}),z.directive("nyaBsSelect",["$parse","$document","$timeout","nyaBsConfig",function(a,b,c,d){var e="Nothing selected",f='',g='',h='',j='',k='
  • NO SEARCH RESULT
  • ',l='
    ';return{restrict:"ECA",require:["ngModel","nyaBsSelect"],controller:"nyaBsSelectCtrl",compile:function(m,n){m.addClass("btn-group");var y,z,A,B,C,D,E,F,G=function(){var a;return a=n.titleTpl?v(n.titleTpl):n.title?document.createTextNode(n.title):L.defaultNoneSelectionTpl?v(L.defaultNoneSelectionTpl):L.defaultNoneSelection?document.createTextNode(L.defaultNoneSelection):document.createTextNode(e)},H=m.children(),I=v(f),J=v(g),K=v(j),L=d,M="undefined"!=typeof n.multiple;for(B=r(m[0]),B.forEach(function(a){/btn-(?:primary|info|success|warning|danger|inverse)/.test(a)&&(m.removeClass(a),I.removeClass("btn-default"),I.addClass(a)),/btn-(?:lg|sm|xs)/.test(a)&&(m.removeClass(a),I.addClass(a)),"form-control"===a&&I.addClass(a)}),K.append(H),C=H.length,D=0;C>D;D++)E=H.eq(D),(E.hasClass("nya-bs-option")||E.attr("nya-bs-option"))&&(E.find("a").attr("tabindex","0"),F=E.attr("value"),angular.isString(F)&&""!==F&&(E.attr("data-value",F),E.removeAttr("value")));return"true"===n.liveSearch&&(y=v(h),n.noSearchTitle?k=k.replace("NO SEARCH RESULT",n.noSearchTitle):n.noSearchTitleTpl?k=k.replace("NO SEARCH RESULT",n.noSearchTitleTpl):L.noSearchResultTpl?k=k.replace("NO SEARCH RESULT",L.noSearchResultTpl):L.noSearchResult&&(k=k.replace("NO SEARCH RESULT",L.noSearchResult)),z=v(k),J.append(y),K.append(z)),"true"===n.actionsBox&&M&&(L.selectAllTpl?l=l.replace("SELECT ALL",L.selectAllTpl):L.selectAll&&(l=l.replace("SELECT ALL",L.selectAll)),L.deselectAllTpl?l=l.replace("DESELECT ALL",L.deselectAllTpl):L.selectAll&&(l=l.replace("DESELECT ALL",L.deselectAll)),A=v(l),J.append(A)),I.children().eq(0).append(G()),J.append(K),m.append(I),m.append(J),function(d,e,f,g){function h(){var a,b,c=N.children(),d=c.length;for(a=0;d>a;a++)if(b=c.eq(a),b.hasClass("active")&&b.hasClass("nya-bs-option")&&!b.hasClass("not-match"))return b;return null}function j(a){for(var b,c=a.childNodes,d=c.length,e=0;d>e;e++)if(b=c[e],1===b.nodeType&&"a"===b.tagName.toLowerCase()){b.focus();break}}function k(a){var b;b=a?N.children().eq(0):N.children().eq(N.children().length-1);for(var c=0;c0){c=E.$modelValue,e=Array.isArray(c)?x(c):[];for(var f=0;f\s*(\d+)\s*/))&&(i=parseInt(h[1],10)),"undefined"!=typeof i&&a.length>i)return b.empty(),void(L.numberItemSelectedTpl?b.append(v(L.numberItemSelectedTpl.replace("%d",a.length))):L.numberItemSelected?b.append(document.createTextNode(L.numberItemSelected.replace("%d",a.length))):b.append(document.createTextNode(a.length+" items selected")));for(e=0;k>e;e++)d=j.eq(e),d.hasClass("nya-bs-option")&&(c=r(d),J?Array.isArray(a)&&o(a,c)&&(g=d.attr("title"),g?l.push(document.createTextNode(g)):l.push(y(d))):w(a,c)&&(g=d.attr("title"),g?l.push(document.createTextNode(g)):l.push(y(d))));if(0===l.length)b.empty(),b.append(G());else if(1===l.length)b.empty(),b.append(l[0]);else for(b.empty(),e=0;eb;b++)if(a=c.eq(b),a.hasClass("nya-bs-option")||a.attr("nya-bs-option")){B=a[0].clientHeight;break}if(/\d+/.test(f.size)){var e=parseInt(f.size,10);N.css("max-height",e*B+"px"),N.css("overflow-y","auto")}}var B,C,D,E=g[0],F=g[1],H=!1,I=a(F.valueExp),J="undefined"!=typeof f.multiple,K=t(e,["dropdown-toggle"]),M=K.next(),N=t(M,["dropdown-menu","inner"]),O=t(M,["bs-searchbox"]),P=t(N,["no-search-result"]),Q=t(M,["bs-actionsbox"]);F.valueExp&&(D=function(a,b){return I(a,b)}),F.setId(e.attr("id")),J&&(F.isMultiple=!0,E.$isEmpty=function(a){return!a||0===a.length}),"undefined"!=typeof f.disabled&&d.$watch(f.disabled,function(a){a?(K.addClass("disabled"),C=K.attr("tabindex"),K.attr("tabindex","-1"),H=!0):(K.removeClass("disabled"),C?K.attr("tabindex",C):K.removeAttr("tabindex"),H=!1)}),F.onCollectionChange=function(a){var b,c,e=[],f=E.$modelValue;if(f){if(Array.isArray(a)&&a.length>0){if(D)for(b=0;ba;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&(u(b.find("a"),d)?(b.removeClass("not-match"),e++):b.addClass("not-match"));0===e?P.addClass("show"):P.removeClass("show")}else{for(a=0;g>a;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&b.removeClass("not-match");P.removeClass("show")}c=k(!0),c&&(f.removeClass("active"),v(c).addClass("active"))}),E.$render=function(){var a,b,c=E.$modelValue,d=N.children(),e=d.length;if("undefined"==typeof c)for(a=0;e>a;a++)d.eq(a).hasClass("nya-bs-option")&&d.eq(a).removeClass("selected");else for(a=0;e>a;a++)d.eq(a).hasClass("nya-bs-option")&&(b=r(d.eq(a)),J?o(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"):w(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"));z()},e.on("keydown",function(a){var b=a.keyCode;if(27===b||13===b||38===b||40===b){if(a.preventDefault(),H)return void a.stopPropagation();var c,d,g,i,m=q(a.target,e[0],K[0]);"true"===f.liveSearch?d=q(a.target,e[0],O[0]):c=q(a.target,e[0],M[0]),m?13!==b&&38!==b&&40!==b||e.hasClass("open")||(a.stopPropagation(),e.addClass("open"),"undefined"==typeof B&&A(),"true"===f.liveSearch?(O.children().eq(0)[0].focus(),i=k(!0),i&&(N.children().removeClass("active"),v(i).addClass("active"))):(i=k(!0),i&&j(i))):c?27===b?(K[0].focus(),e.hasClass("open")&&e.triggerHandler("blur"),e.removeClass("open"),a.stopPropagation()):38===b?(a.stopPropagation(),i=l(a.target.parentNode,"previousSibling"),i?j(i):(i=k(!1),i&&j(i))):40===b?(a.stopPropagation(),i=l(a.target.parentNode,"nextSibling"),i?j(i):(i=k(!0),i&&j(i))):13===b&&(a.stopPropagation(),g=v(a.target.parentNode),g.hasClass("nya-bs-option")&&(n(g),J||K[0].focus())):d&&(27===b?(K[0].focus(),e.removeClass("open"),a.stopPropagation()):38===b?(a.stopPropagation(),g=h(),g&&(i=l(g[0],"previousSibling"),i?(g.removeClass("active"),v(i).addClass("active")):(i=k(!1),i&&(g.removeClass("active"),v(i).addClass("active"))))):40===b?(a.stopPropagation(),g=h(),g&&(i=l(g[0],"nextSibling"),i?(g.removeClass("active"),v(i).addClass("active")):(i=k(!0),i&&(g.removeClass("active"),v(i).addClass("active"))))):13===b&&(g=h(),g&&(n(g),J||K[0].focus())))}}),d.$on("$destroy",function(){N.off(),K.off(),O.off&&O.off(),b.off("click",R)})}}}}]),z.directive("nyaBsOption",["$parse",function(a){var b=/^\s*(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/;return{restrict:"A",transclude:"element",priority:1e3,terminal:!0,require:["^nyaBsSelect","^ngModel"],compile:function(c,i){var j=i.nyaBsOption,p=document.createComment(" end nyaBsOption: "+j+" "),q=j.match(b);if(!q)throw new Error("invalid expression");var r,s,t,u,x,y=i.value,z=y?a(y):null,A=q[3]||q[1],B=q[2],C=q[4],D=q[5]?a(q[5]):null,E=q[6],F={$id:f},G={};return E?u=a(E):(r=function(a,b){return f(b)},s=function(a){return a}),function(a,b,c,f,i){function j(a){var c,f,j,u,y,z,C,D,F,G,I,K,L,M,N,O=b[0],P=e(),Q=[];if(x&&(K=[]),d(a))z=a,y=t||r;else{y=t||s,z=[];for(var R in a)a.hasOwnProperty(R)&&"$"!=R.charAt(0)&&z.push(R);z.sort()}for(C=z.length,D=new Array(C),c=0;C>c;c++)if(f=a===z?c:z[c],j=a[f],u=y(f,j,c),N={},B&&(N[B]=f),N[A]=j,Q.push(N),x&&(G=x(f,j),-1===K.indexOf(G)&&G&&K.push(G)),J[u])F=J[u],delete J[u],x&&(F.group=G),F.key=f,F.value=j,P[u]=F,D[c]=F;else{if(P[u])throw D.forEach(function(a){a&&a.scope&&(J[a.id]=a)}),new Error("Duplicates in a select are not allowed. Use 'track by' expression to specify unique keys.");D[c]={id:u,scope:void 0,clone:void 0,key:f,value:j},P[u]=!0,G&&(D[c].group=G)}K&&K.length>0&&(D=g(D,K,"group"));for(var S in J)F=J[S],M=h(F.clone),M.removeData("isolateScope"),M.remove(),F.scope.$destroy();for(c=0;C>c;c++)F=D[c],F.scope?(I=O,k(F)!=I&&v(O).after(F.clone),O=l(F),m(F.scope,c,A,F.value,B,F.key,C,F.group)):i(function(a,b){n(a,b),F.scope=b;var d=p.cloneNode(!1);a[a.length++]=d,v(O).after(a),a.addClass("nya-bs-option"),j=q?q(F.key,F.value):F.value||F.key,E.isMultiple?Array.isArray(H.$modelValue)&&o(H.$modelValue,j)&&a.addClass("selected"):w(j,H.$modelValue)&&a.addClass("selected"),O=d,F.clone=a,P[F.id]=F,m(F.scope,c,A,F.value,B,F.key,C,F.group)}),K&&(L&&L===F.group?F.clone.removeClass("first-in-group"):F.clone.addClass("first-in-group"),L=F.group,F.clone.addClass("group-item"));J=P,E.onCollectionChange(Q)}var q,E=f[0],H=f[1],I={};u&&(t=function(b,c,d){return B&&(F[B]=b),F[A]=c,F.$index=d,u(a,F)}),D&&(x=function(b,c){return B&&(G[B]=b),G[A]=c,D(a,G)}),B&&(E.keyIdentifier=B),A&&(E.valueIdentifier=A),z&&(E.valueExp=y,q=function(b,c){return B&&(I[B]=b),I[A]=c,z(a,I)});var J=e();"true"===c.deepWatch?a.$watch(C,j,!0):a.$watchCollection(C,j)}}}}])}(); \ No newline at end of file +!function(){"use strict";function a(){return++j}function b(a){return a&&a.window===a}function c(a){return"string"==typeof a}function d(a){if(null==a||b(a))return!1;var d=a.length;return 1===a.nodeType&&d?!0:c(a)||Array.isArray(a)||0===d||"number"==typeof d&&d>0&&d-1 in a}function e(){return Object.create(null)}function f(b,c){var d,e=typeof b;return"function"==e||"object"==e&&null!==b?"function"==typeof(d=b.$$hashKey)?d=b.$$hashKey():void 0===d&&(d=b.$$hashKey=(c||a)()):d=b,e+":"+d}function g(a,b,c){var d,e,f=[],g=[];for(d=0;dc;c++)if(w(b,a[c]))return!0;return!1},p=function(a,b){var c,d=a.length;if(0===d)return-1;for(c=0;d>c;c++)if(w(b,a[c]))return c;return-1},q=function(a,b,c){var d,e=a,f=typeof c;if(a==b)return null;do if("string"===f){if(d=" "+e.className+" ",1===e.nodeType&&d.replace(/[\t\r\n\f]/g," ").indexOf(c)>=0)return e}else if(e==c)return e;while((e=e.parentNode)&&e!=b&&9!==e.nodeType);return null},r=function(a){var b,c=a.className.replace(/[\t\r\n\f]/g," ").trim();b=c.split(" ");for(var d=0;d0)for(var h=0;g>h;h++){if(c=f.eq(h),d=!0,e=r(c[0]),e.length>0)for(var i=0;id;d++)if(-1!==c.eq(d).text().toLowerCase().indexOf(b.toLowerCase()))return!0;return!1},v=angular.element,w=angular.equals,x=angular.copy,y=angular.extend,z=angular.module("nya.bootstrap.select",[]);z.provider("nyaBsConfig",function(){var a=null,b={"en-us":{defaultNoneSelection:"Nothing selected",noSearchResult:"NO SEARCH RESULT",numberItemSelected:"%d item selected",selectAll:"Select All",deselectAll:"Deselect All"}},c=x(b);this.setLocalizedText=function(a,b){if(!a)throw new Error("localeId must be a string formatted as languageId-countryId");c[a]||(c[a]={}),c[a]=y(c[a],b)},this.useLocale=function(b){a=b},this.$get=["$locale",function(d){var e;return e=a?c[a]:c[d.id],e||(e=b["en-us"]),e}]}),z.controller("nyaBsSelectCtrl",function(){var a=this;a.keyIdentifier=null,a.valueIdentifier=null,a.isMultiple=!1,a.onCollectionChange=function(){},a.setId=function(b){a.id=b||"id#"+Math.floor(1e4*Math.random())}}),z.directive("nyaBsSelect",["$parse","$document","$timeout","nyaBsConfig",function(a,b,c,d){var e="Nothing selected",f='',g='',h='',j='',k='
  • NO SEARCH RESULT
  • ',l='
    ';return{restrict:"ECA",require:["ngModel","nyaBsSelect"],controller:"nyaBsSelectCtrl",compile:function(m,n){m.addClass("btn-group");var y,z,A,B,C,D,E,F,G=function(){var a;return a=n.titleTpl?v(n.titleTpl):n.title?document.createTextNode(n.title):L.defaultNoneSelectionTpl?v(L.defaultNoneSelectionTpl):L.defaultNoneSelection?document.createTextNode(L.defaultNoneSelection):document.createTextNode(e)},H=m.children(),I=v(f),J=v(g),K=v(j),L=d,M="undefined"!=typeof n.multiple;for(B=r(m[0]),B.forEach(function(a){/btn-(?:primary|info|success|warning|danger|inverse)/.test(a)&&(m.removeClass(a),I.removeClass("btn-default"),I.addClass(a)),/btn-(?:lg|sm|xs)/.test(a)&&(m.removeClass(a),I.addClass(a)),"form-control"===a&&I.addClass(a)}),K.append(H),C=H.length,D=0;C>D;D++)E=H.eq(D),(E.hasClass("nya-bs-option")||E.attr("nya-bs-option"))&&(E.find("a").attr("tabindex","0"),F=E.attr("value"),angular.isString(F)&&""!==F&&(E.attr("data-value",F),E.removeAttr("value")));return"true"===n.liveSearch&&(y=v(h),n.noSearchTitle?k=k.replace("NO SEARCH RESULT",n.noSearchTitle):n.noSearchTitleTpl?k=k.replace("NO SEARCH RESULT",n.noSearchTitleTpl):L.noSearchResultTpl?k=k.replace("NO SEARCH RESULT",L.noSearchResultTpl):L.noSearchResult&&(k=k.replace("NO SEARCH RESULT",L.noSearchResult)),z=v(k),J.append(y),K.append(z)),"true"===n.actionsBox&&M&&(L.selectAllTpl?l=l.replace("SELECT ALL",L.selectAllTpl):L.selectAll&&(l=l.replace("SELECT ALL",L.selectAll)),L.deselectAllTpl?l=l.replace("DESELECT ALL",L.deselectAllTpl):L.selectAll&&(l=l.replace("DESELECT ALL",L.deselectAll)),A=v(l),J.append(A)),I.children().eq(0).append(G()),J.append(K),m.append(I),m.append(J),function(d,e,f,g){function h(){var a,b,c=N.children(),d=c.length;for(a=0;d>a;a++)if(b=c.eq(a),b.hasClass("active")&&b.hasClass("nya-bs-option")&&!b.hasClass("not-match"))return b;return null}function j(a){for(var b,c=a.childNodes,d=c.length,e=0;d>e;e++)if(b=c[e],1===b.nodeType&&"a"===b.tagName.toLowerCase()){b.focus();break}}function k(a){var b;b=a?N.children().eq(0):N.children().eq(N.children().length-1);for(var c=0;c0){c=E.$modelValue,e=Array.isArray(c)?x(c):[];for(var f=0;f\s*(\d+)\s*/))&&(i=parseInt(h[1],10)),"undefined"!=typeof i&&a.length>i)return b.empty(),void(L.numberItemSelectedTpl?b.append(v(L.numberItemSelectedTpl.replace("%d",a.length))):L.numberItemSelected?b.append(document.createTextNode(L.numberItemSelected.replace("%d",a.length))):b.append(document.createTextNode(a.length+" items selected")));for(e=0;k>e;e++)d=j.eq(e),d.hasClass("nya-bs-option")&&(c=r(d),J?Array.isArray(a)&&o(a,c)&&(g=d.attr("title"),g?l.push(document.createTextNode(g)):l.push(y(d))):w(a,c)&&(g=d.attr("title"),g?l.push(document.createTextNode(g)):l.push(y(d))));if(0===l.length)b.empty(),b.append(G());else if(1===l.length)b.empty(),b.append(l[0]);else for(b.empty(),e=0;eb;b++)if(a=c.eq(b),a.hasClass("nya-bs-option")||a.attr("nya-bs-option")){B=a[0].clientHeight;break}if(/\d+/.test(f.size)){var e=parseInt(f.size,10);N.css("max-height",e*B+"px"),N.css("overflow-y","auto")}}var B,C,D,E=g[0],F=g[1],H=!1,I=a(F.valueExp),J="undefined"!=typeof f.multiple,K=t(e,["dropdown-toggle"]),M=K.next(),N=t(M,["dropdown-menu","inner"]),O=t(M,["bs-searchbox"]),P=t(N,["no-search-result"]),Q=t(M,["bs-actionsbox"]);F.valueExp&&(D=function(a,b){return I(a,b)}),F.setId(e.attr("id")),J&&(F.isMultiple=!0,E.$isEmpty=function(a){return!a||0===a.length}),"undefined"!=typeof f.disabled&&d.$watch(f.disabled,function(a){a?(K.addClass("disabled"),C=K.attr("tabindex"),K.attr("tabindex","-1"),H=!0):(K.removeClass("disabled"),C?K.attr("tabindex",C):K.removeAttr("tabindex"),H=!1)}),F.onCollectionChange=function(a){var b,c,e=[],f=E.$modelValue;if(f){if(Array.isArray(a)&&a.length>0){if(D)for(b=0;ba;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&(u(b.find("a"),d)?(b.removeClass("not-match"),e++):b.addClass("not-match"));0===e?P.addClass("show"):P.removeClass("show")}else{for(a=0;g>a;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&b.removeClass("not-match");P.removeClass("show")}c=k(!0),c&&(f.removeClass("active"),v(c).addClass("active"))}),E.$render=function(){var a,b,c=E.$modelValue,d=N.children(),e=d.length;if("undefined"==typeof c)for(a=0;e>a;a++)d.eq(a).hasClass("nya-bs-option")&&d.eq(a).removeClass("selected");else for(a=0;e>a;a++)d.eq(a).hasClass("nya-bs-option")&&(b=r(d.eq(a)),J?o(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"):w(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"));z()},e.on("keydown",function(a){var b=a.keyCode,c=$(this);if(27!==b&&13!==b&&38!==b&&40!==b){var d=String.fromCharCode(a.which),g=c.find('a:contains("'+d+'")').filter(function(){return 0===$(this).text().indexOf(d)});g.eq(0).focus()}if(a.preventDefault(),H)return void a.stopPropagation();var i,m,o,p,r=q(a.target,e[0],K[0]);"true"===f.liveSearch?m=q(a.target,e[0],O[0]):i=q(a.target,e[0],M[0]),r?13!==b&&38!==b&&40!==b||e.hasClass("open")||(a.stopPropagation(),e.addClass("open"),"undefined"==typeof B&&A(),"true"===f.liveSearch?(O.children().eq(0)[0].focus(),p=k(!0),p&&(N.children().removeClass("active"),v(p).addClass("active"))):(p=k(!0),p&&j(p))):i?27===b?(K[0].focus(),e.hasClass("open")&&e.triggerHandler("blur"),e.removeClass("open"),a.stopPropagation()):38===b?(a.stopPropagation(),p=l(a.target.parentNode,"previousSibling"),p?j(p):(p=k(!1),p&&j(p))):40===b?(a.stopPropagation(),p=l(a.target.parentNode,"nextSibling"),p?j(p):(p=k(!0),p&&j(p))):13===b&&(a.stopPropagation(),o=v(a.target.parentNode),o.hasClass("nya-bs-option")&&(n(o),J||K[0].focus())):m&&(27===b?(K[0].focus(),e.removeClass("open"),a.stopPropagation()):38===b?(a.stopPropagation(),o=h(),o&&(p=l(o[0],"previousSibling"),p?(o.removeClass("active"),v(p).addClass("active")):(p=k(!1),p&&(o.removeClass("active"),v(p).addClass("active"))))):40===b?(a.stopPropagation(),o=h(),o&&(p=l(o[0],"nextSibling"),p?(o.removeClass("active"),v(p).addClass("active")):(p=k(!0),p&&(o.removeClass("active"),v(p).addClass("active"))))):13===b&&(o=h(),o&&(n(o),J||K[0].focus())))}),d.$on("$destroy",function(){N.off(),K.off(),O.off&&O.off(),b.off("click",R)})}}}}]),z.directive("nyaBsOption",["$parse",function(a){var b=/^\s*(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/;return{restrict:"A",transclude:"element",priority:1e3,terminal:!0,require:["^nyaBsSelect","^ngModel"],compile:function(c,i){var j=i.nyaBsOption,p=document.createComment(" end nyaBsOption: "+j+" "),q=j.match(b);if(!q)throw new Error("invalid expression");var r,s,t,u,x,y=i.value,z=y?a(y):null,A=q[3]||q[1],B=q[2],C=q[4],D=q[5]?a(q[5]):null,E=q[6],F={$id:f},G={};return E?u=a(E):(r=function(a,b){return f(b)},s=function(a){return a}),function(a,b,c,f,i){function j(a){var c,f,j,u,y,z,C,D,F,G,I,K,L,M,N,O=b[0],P=e(),Q=[];if(x&&(K=[]),d(a))z=a,y=t||r;else{y=t||s,z=[];for(var R in a)a.hasOwnProperty(R)&&"$"!=R.charAt(0)&&z.push(R);z.sort()}for(C=z.length,D=new Array(C),c=0;C>c;c++)if(f=a===z?c:z[c],j=a[f],u=y(f,j,c),N={},B&&(N[B]=f),N[A]=j,Q.push(N),x&&(G=x(f,j),-1===K.indexOf(G)&&G&&K.push(G)),J[u])F=J[u],delete J[u],x&&(F.group=G),F.key=f,F.value=j,P[u]=F,D[c]=F;else{if(P[u])throw D.forEach(function(a){a&&a.scope&&(J[a.id]=a)}),new Error("Duplicates in a select are not allowed. Use 'track by' expression to specify unique keys.");D[c]={id:u,scope:void 0,clone:void 0,key:f,value:j},P[u]=!0,G&&(D[c].group=G)}K&&K.length>0&&(D=g(D,K,"group"));for(var S in J)F=J[S],M=h(F.clone),M.removeData("isolateScope"),M.remove(),F.scope.$destroy();for(c=0;C>c;c++)F=D[c],F.scope?(I=O,k(F)!=I&&v(O).after(F.clone),O=l(F),m(F.scope,c,A,F.value,B,F.key,C,F.group)):i(function(a,b){n(a,b),F.scope=b;var d=p.cloneNode(!1);a[a.length++]=d,v(O).after(a),a.addClass("nya-bs-option"),j=q?q(F.key,F.value):F.value||F.key,E.isMultiple?Array.isArray(H.$modelValue)&&o(H.$modelValue,j)&&a.addClass("selected"):w(j,H.$modelValue)&&a.addClass("selected"),O=d,F.clone=a,P[F.id]=F,m(F.scope,c,A,F.value,B,F.key,C,F.group)}),K&&(L&&L===F.group?F.clone.removeClass("first-in-group"):F.clone.addClass("first-in-group"),L=F.group,F.clone.addClass("group-item"));J=P,E.onCollectionChange(Q)}var q,E=f[0],H=f[1],I={};u&&(t=function(b,c,d){return B&&(F[B]=b),F[A]=c,F.$index=d,u(a,F)}),D&&(x=function(b,c){return B&&(G[B]=b),G[A]=c,D(a,G)}),B&&(E.keyIdentifier=B),A&&(E.valueIdentifier=A),z&&(E.valueExp=y,q=function(b,c){return B&&(I[B]=b),I[A]=c,z(a,I)});var J=e();"true"===c.deepWatch?a.$watch(C,j,!0):a.$watchCollection(C,j)}}}}])}(); \ No newline at end of file diff --git a/src/nya-bs-select.js b/src/nya-bs-select.js index 4d645e9..5032387 100644 --- a/src/nya-bs-select.js +++ b/src/nya-bs-select.js @@ -440,11 +440,19 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC // simple keyboard support $element.on('keydown', function(event){ - var keyCode = event.keyCode; + var keyCode = event.keyCode, + + $this = $(this); if(keyCode !== 27 && keyCode !== 13 && keyCode !== 38 && keyCode !== 40) { - // we only handle special keys. don't waste time to traverse the dom tree. - return; + + var letter = String.fromCharCode(event.which); + + var filterLetter = $this.find('a:contains("'+ letter +'")').filter(function() { + return $(this).text().indexOf(letter) === 0; + }); + + filterLetter.eq(0).focus(); } // prevent a click event to be fired.