diff --git a/dist/css/nya-bs-select.css b/dist/css/nya-bs-select.css index e261457..6c0e199 100644 --- a/dist/css/nya-bs-select.css +++ b/dist/css/nya-bs-select.css @@ -173,9 +173,21 @@ .nya-bs-select.show-menu-arrow.open > .dropdown-toggle:after { display: block; } -.nya-bs-select .bs-searchbox { +.nya-bs-select .bs-searchbox, +.nya-bs-select .bs-actionsbox { padding: 4px 8px; } +.nya-bs-select .bs-actionsbox { + float: left; + width: 100%; + box-sizing: border-box; +} +.nya-bs-select .bs-actionsbox .btn-group button { + width: 50%; +} +.nya-bs-select .bs-searchbox + .bs-actionsbox { + padding: 0 8px 4px; +} .nya-bs-select .bs-searchbox input.form-control { margin-bottom: 0; width: 100%; diff --git a/dist/css/nya-bs-select.min.css b/dist/css/nya-bs-select.min.css index 0bf70ab..22eda10 100644 --- a/dist/css/nya-bs-select.min.css +++ b/dist/css/nya-bs-select.min.css @@ -4,4 +4,4 @@ * Licensed under MIT license */ -.nya-bs-select{width:220px \0;padding:0;margin:0}.nya-bs-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.nya-bs-select.form-control{margin-bottom:0;padding:0;border:none}.nya-bs-select.form-control:not([class*=col-]){width:100%}.nya-bs-select>.btn{width:100%;padding-right:25px}.nya-bs-select>.btn .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.nya-bs-select>.btn .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.nya-bs-select.fit-width{width:auto!important}.nya-bs-select.btn-group:not(.input-group-btn),.nya-bs-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.nya-bs-select.btn-group.dropdown-menu-right,.nya-bs-select.btn-group[class*=col-].dropdown-menu-right,.row-fluid .nya-bs-select.btn-group[class*=col-].dropdown-menu-right{float:right}.nya-bs-select.btn-group[class*=col-] .btn{width:100%}.nya-bs-select.btn-group .dropdown-menu{min-width:100%;z-index:1035;box-sizing:border-box}.nya-bs-select.btn-group .dropdown-menu.inner{position:static;border:0;padding:0;margin:0;border-radius:0;box-shadow:none}.nya-bs-select.btn-group .dropdown-menu li{position:relative}.nya-bs-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.nya-bs-select.btn-group .dropdown-menu li.not-match{display:none}.nya-bs-select.btn-group .dropdown-menu li.no-search-result{display:none;padding:3px;background:#f5f5f5;margin:0 5px}.nya-bs-select.btn-group .dropdown-menu li.no-search-result.show{display:list-item}.nya-bs-select.btn-group .dropdown-menu li.group-item a{padding-left:2.25em}.nya-bs-select.btn-group .dropdown-menu li a{cursor:pointer}.nya-bs-select.btn-group .dropdown-menu li a span.check-mark{display:none}.nya-bs-select.btn-group .dropdown-menu li a span.text{display:inline-block}.nya-bs-select.btn-group .dropdown-menu li small{padding-left:.5em}.nya-bs-select.btn-group .dropdown-menu li.selected a .check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.nya-bs-select.btn-group .dropdown-menu li a span.text{margin-right:34px}.nya-bs-select.btn-group .dropdown-menu li .dropdown-header{display:none}.nya-bs-select.btn-group .dropdown-menu li.first-in-group{margin-top:1.75em}.nya-bs-select.btn-group .dropdown-menu li.first-in-group .dropdown-header{display:block;position:absolute;top:-1.75em;left:0}.nya-bs-select.show-menu-arrow.open>.btn{z-index:1036}.nya-bs-select.show-menu-arrow .dropdown-toggle:before{content:" ";border-left:7px solid transparent;border-right:7px solid transparent;border-bottom-width:7px;border-bottom-style:solid;border-bottom-color:rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.nya-bs-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.nya-bs-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-bottom:0;border-top-width:7px;border-top-style:solid;border-top-color:rgba(204,204,204,.2)}.nya-bs-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.nya-bs-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.nya-bs-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.nya-bs-select.show-menu-arrow.open>.dropdown-toggle:after,.nya-bs-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.nya-bs-select .bs-searchbox{padding:4px 8px}.nya-bs-select .bs-searchbox input.form-control{margin-bottom:0;width:100%;float:none;z-index:inherit;display:block;position:static;border-radius:4px}.nya-bs-select.fit-width .btn .filter-option{position:static}.nya-bs-select.fit-width .btn .caret{position:static;top:auto;margin-top:-1px}.nya-bs-select.on-modal .dropdown-menu{z-index:1040}.nya-bs-select.on-modal.open>.btn{z-index:1041} \ No newline at end of file +.nya-bs-select{width:220px \0;padding:0;margin:0}.nya-bs-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.nya-bs-select.form-control{margin-bottom:0;padding:0;border:none}.nya-bs-select.form-control:not([class*=col-]){width:100%}.nya-bs-select>.btn{width:100%;padding-right:25px}.nya-bs-select>.btn .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.nya-bs-select>.btn .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.nya-bs-select.fit-width{width:auto!important}.nya-bs-select.btn-group:not(.input-group-btn),.nya-bs-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.nya-bs-select.btn-group.dropdown-menu-right,.nya-bs-select.btn-group[class*=col-].dropdown-menu-right,.row-fluid .nya-bs-select.btn-group[class*=col-].dropdown-menu-right{float:right}.nya-bs-select.btn-group[class*=col-] .btn{width:100%}.nya-bs-select.btn-group .dropdown-menu{min-width:100%;z-index:1035;box-sizing:border-box}.nya-bs-select.btn-group .dropdown-menu.inner{position:static;border:0;padding:0;margin:0;border-radius:0;box-shadow:none}.nya-bs-select.btn-group .dropdown-menu li{position:relative}.nya-bs-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.nya-bs-select.btn-group .dropdown-menu li.not-match{display:none}.nya-bs-select.btn-group .dropdown-menu li.no-search-result{display:none;padding:3px;background:#f5f5f5;margin:0 5px}.nya-bs-select.btn-group .dropdown-menu li.no-search-result.show{display:list-item}.nya-bs-select.btn-group .dropdown-menu li.group-item a{padding-left:2.25em}.nya-bs-select.btn-group .dropdown-menu li a{cursor:pointer}.nya-bs-select.btn-group .dropdown-menu li a span.check-mark{display:none}.nya-bs-select.btn-group .dropdown-menu li a span.text{display:inline-block}.nya-bs-select.btn-group .dropdown-menu li small{padding-left:.5em}.nya-bs-select.btn-group .dropdown-menu li.selected a .check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.nya-bs-select.btn-group .dropdown-menu li a span.text{margin-right:34px}.nya-bs-select.btn-group .dropdown-menu li .dropdown-header{display:none}.nya-bs-select.btn-group .dropdown-menu li.first-in-group{margin-top:1.75em}.nya-bs-select.btn-group .dropdown-menu li.first-in-group .dropdown-header{display:block;position:absolute;top:-1.75em;left:0}.nya-bs-select.show-menu-arrow.open>.btn{z-index:1036}.nya-bs-select.show-menu-arrow .dropdown-toggle:before{content:" ";border-left:7px solid transparent;border-right:7px solid transparent;border-bottom-width:7px;border-bottom-style:solid;border-bottom-color:rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.nya-bs-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.nya-bs-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-bottom:0;border-top-width:7px;border-top-style:solid;border-top-color:rgba(204,204,204,.2)}.nya-bs-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.nya-bs-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.nya-bs-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.nya-bs-select.show-menu-arrow.open>.dropdown-toggle:after,.nya-bs-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.nya-bs-select .bs-actionsbox,.nya-bs-select .bs-searchbox{padding:4px 8px}.nya-bs-select .bs-actionsbox{float:left;width:100%;box-sizing:border-box}.nya-bs-select .bs-actionsbox .btn-group button{width:50%}.nya-bs-select .bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.nya-bs-select .bs-searchbox input.form-control{margin-bottom:0;width:100%;float:none;z-index:inherit;display:block;position:static;border-radius:4px}.nya-bs-select.fit-width .btn .filter-option{position:static}.nya-bs-select.fit-width .btn .caret{position:static;top:auto;margin-top:-1px}.nya-bs-select.on-modal .dropdown-menu{z-index:1040}.nya-bs-select.on-modal.open>.btn{z-index:1041} \ No newline at end of file diff --git a/dist/js/nya-bs-select.js b/dist/js/nya-bs-select.js index a6b33bf..3e1e6ba 100644 --- a/dist/js/nya-bs-select.js +++ b/dist/js/nya-bs-select.js @@ -331,7 +331,9 @@ nyaBsSelect.provider('nyaBsConfig', function() { 'en-us': { defaultNoneSelection: 'Nothing selected', noSearchResult: 'NO SEARCH RESULT', - numberItemSelected: '%d item selected' + numberItemSelected: '%d item selected', + selectAll: 'Select All', + deselectAll: 'Deselect All' } }; @@ -421,6 +423,13 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC var NO_SEARCH_RESULT = '
  • NO SEARCH RESULT
  • '; + var ACTIONS_BOX = '
    ' + + '
    ' + + '' + + '' + + '
    ' + + '
    '; + return { restrict: 'ECA', require: ['ngModel', 'nyaBsSelect'], @@ -459,11 +468,13 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC dropdownMenu = jqLite(DROPDOWN_MENU), searchBox, noSearchResult, + actionsBox, classList, length, index, liElement, - localizedText = nyaBsConfig; + localizedText = nyaBsConfig, + isMultiple = typeof tAttrs.multiple !== 'undefined'; classList = getClassList(tElement[0]); classList.forEach(function(className) { @@ -510,6 +521,24 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC dropdownMenu.append(noSearchResult); } + if (tAttrs.actionsBox === 'true' && isMultiple) { + // set localizedText + if (localizedText.selectAllTpl) { + ACTIONS_BOX = ACTIONS_BOX.replace('SELECT ALL', localizedText.selectAllTpl); + } else if (localizedText.selectAll) { + ACTIONS_BOX = ACTIONS_BOX.replace('SELECT ALL', localizedText.selectAll); + } + + if (localizedText.deselectAllTpl) { + ACTIONS_BOX = ACTIONS_BOX.replace('DESELECT ALL', localizedText.deselectAllTpl); + } else if (localizedText.selectAll) { + ACTIONS_BOX = ACTIONS_BOX.replace('DESELECT ALL', localizedText.deselectAll); + } + + actionsBox = jqLite(ACTIONS_BOX); + dropdownContainer.append(actionsBox); + } + // set default none selection text dropdownToggle.children().eq(0).append(getDefaultNoneSelectionContent()); @@ -534,7 +563,8 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC dropdownContainer = dropdownToggle.next(), dropdownMenu = queryChildren(dropdownContainer, ['dropdown-menu', 'inner']), searchBox = queryChildren(dropdownContainer, ['bs-searchbox']), - noSearchResult = queryChildren(dropdownMenu, ['no-search-result']); + noSearchResult = queryChildren(dropdownMenu, ['no-search-result']), + actionsBox = queryChildren(dropdownContainer, ['bs-actionsbox']); if(nyaBsSelectCtrl.valueExp) { valueExpFn = function(scope, locals) { @@ -698,6 +728,18 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC } }); + // actions box + if ($attrs.actionsBox === 'true' && isMultiple) { + actionsBox.find('.bs-select-all').on('click', function () { + setAllOptions(true); + }); + + actionsBox.find('.bs-deselect-all').on('click', function () { + setAllOptions(false); + }); + } + + // live search if($attrs.liveSearch === 'true') { searchBox.children().on('input', function(){ @@ -1033,6 +1075,58 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC return null; } + /** + * + */ + function setAllOptions(selectAll) { + if (!isMultiple || isDisabled) + return; + + var liElements, + modelValue, + viewValue; + + liElements = dropdownMenu.find('li'); + if (liElements.length > 0) { + modelValue = ngCtrl.$modelValue; + + // make a deep copy enforce ngModelController to call its $render method. + // See: https://github.com/angular/angular.js/issues/1751 + viewValue = Array.isArray(modelValue) ? deepCopy(modelValue) : []; + + for (var i = 0; i < liElements.length; i++) { + var nyaBsOption = jqLite(liElements[i]); + if (nyaBsOption.hasClass('disabled')) + continue; + + var value, index; + + // if user specify the value attribute. we should use the value attribute + // otherwise, use the valueIdentifier specified field in target scope + value = getOptionValue(nyaBsOption); + + if (typeof value !== 'undefined') { + index = indexOf(viewValue, value); + if (selectAll && index == -1) { + // check element + viewValue.push(value); + nyaBsOption.addClass('selected'); + } else if (!selectAll && index != -1) { + // uncheck element + viewValue.splice(index, 1); + nyaBsOption.removeClass('selected'); + } + } + } + + // update view value regardless + ngCtrl.$setViewValue(viewValue); + $scope.$digest(); + + updateButtonContent(); + } + } + /** * select an option represented by nyaBsOption argument. Get the option's value and update model. * if isMultiple = true, doesn't close dropdown menu. otherwise close the menu. diff --git a/dist/js/nya-bs-select.min.js b/dist/js/nya-bs-select.min.js index ec38c8b..9cbbaed 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(v(b,a[c]))return!0;return!1},o=function(a,b){var c,d=a.length;if(0===d)return-1;for(c=0;d>c;c++)if(v(b,a[c]))return c;return-1},p=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},q=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=q(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},u=angular.element,v=angular.equals,w=angular.copy,x=angular.extend,y=angular.module("nya.bootstrap.select",[]);y.provider("nyaBsConfig",function(){var a=null,b={"en-us":{defaultNoneSelection:"Nothing selected",noSearchResult:"NO SEARCH RESULT",numberItemSelected:"%d item selected"}},c=w(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]=x(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}]}),y.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())}}),y.directive("nyaBsSelect",["$parse","$document","$timeout","nyaBsConfig",function(a,b,c,d){var e="Nothing selected",f='',g='',h='',j='',k='
  • NO SEARCH RESULT
  • ';return{restrict:"ECA",require:["ngModel","nyaBsSelect"],controller:"nyaBsSelectCtrl",compile:function(l,m){l.addClass("btn-group");var x,y,z,A,B,C,D=function(){var a;return a=m.titleTpl?u(m.titleTpl):m.title?document.createTextNode(m.title):I.defaultNoneSelectionTpl?u(I.defaultNoneSelectionTpl):document.createTextNode(I.defaultNoneSelection?I.defaultNoneSelection:e)},E=l.children(),F=u(f),G=u(g),H=u(j),I=d;for(z=q(l[0]),z.forEach(function(a){/btn-(?:primary|info|success|warning|danger|inverse)/.test(a)&&(l.removeClass(a),F.removeClass("btn-default"),F.addClass(a)),"form-control"===a&&F.addClass(a)}),H.append(E),A=E.length,B=0;A>B;B++)C=E.eq(B),(C.hasClass("nya-bs-option")||C.attr("nya-bs-option"))&&C.find("a").attr("tabindex","0");return"true"===m.liveSearch&&(x=u(h),I.noSearchResultTpl?k=k.replace("NO SEARCH RESULT",I.noSearchResultTpl):I.noSearchResult&&(k=k.replace("NO SEARCH RESULT",I.noSearchResult)),y=u(k),G.append(x),H.append(y)),F.children().eq(0).append(D()),G.append(H),l.append(F),l.append(G),function(d,e,f,g){function h(){var a,b,c=M.children(),d=c.length;for(a=0;d>a;a++)if(b=c.eq(a),b.hasClass("active")&&b.hasClass("nya-bs-option"))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=M.children().eq(a?0:M.children().length-1);for(var c=0;c\s*(\d+)\s*/))&&(i=parseInt(h[1],10)),"undefined"!=typeof i&&a.length>i)return b.empty(),void b.append(I.numberItemSelectedTpl?u(I.numberItemSelectedTpl.replace("%d",a.length)):I.numberItemSelected?document.createTextNode(I.numberItemSelected.replace("%d",a.length)):document.createTextNode(a.length+" items selected"));for(e=0;k>e;e++)d=j.eq(e),d.hasClass("nya-bs-option")&&(c=q(d),J?Array.isArray(a)&&n(a,c)&&(g=d.attr("title"),l.push(g?document.createTextNode(g):x(d))):v(a,c)&&(g=d.attr("title"),l.push(g?document.createTextNode(g):x(d))));if(0===l.length)b.empty(),b.append(D());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")){A=a[0].clientHeight;break}if(/\d+/.test(f.size)){var e=parseInt(f.size,10);M.css("max-height",e*A+"px"),M.css("overflow-y","auto")}}var A,B,C,E=g[0],F=g[1],G=!1,H=a(F.valueExp),J="undefined"!=typeof f.multiple,K=s(e,["dropdown-toggle"]),L=K.next(),M=s(L,["dropdown-menu","inner"]),N=s(L,["bs-searchbox"]),O=s(M,["no-search-result"]);F.valueExp&&(C=function(a,b){return H(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"),B=K.attr("tabindex"),K.attr("tabindex","-1"),G=!0):(K.removeClass("disabled"),B?K.attr("tabindex",B):K.removeAttr("tabindex"),G=!1)}),F.onCollectionChange=function(a){var b,c,e=[],f=E.$modelValue;if(f){if(a&&0!==a.length){if(C)for(b=0;ba;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&(t(b.find("a"),d)?(b.removeClass("not-match"),e++):b.addClass("not-match"));0===e?O.addClass("show"):O.removeClass("show")}else{for(a=0;g>a;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&b.removeClass("not-match");O.removeClass("show")}c=k(!0),c&&(f.removeClass("active"),u(c).addClass("active"))}),E.$render=function(){var a,b,c=E.$modelValue,d=M.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=q(d.eq(a)),J?n(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"):v(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"));y()},e.on("keydown",function(a){var b=a.keyCode;if(27===b||13===b||38===b||40===b){if(a.preventDefault(),G)return void a.stopPropagation();var c,d,g,i,n=p(a.target,e[0],K[0]);"true"===f.liveSearch?d=p(a.target,e[0],N[0]):c=p(a.target,e[0],L[0]),n?13!==b&&38!==b&&40!==b||e.hasClass("open")||(a.stopPropagation(),e.addClass("open"),"undefined"==typeof A&&z(),"true"===f.liveSearch?(N.children().eq(0)[0].focus(),i=k(!0),i&&(M.children().removeClass("active"),u(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=u(a.target.parentNode),g.hasClass("nya-bs-option")&&(m(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"),u(i).addClass("active")):(i=k(!1),i&&(g.removeClass("active"),u(i).addClass("active"))))):40===b?(a.stopPropagation(),g=h(),g&&(i=l(g[0],"nextSibling"),i?(g.removeClass("active"),u(i).addClass("active")):(i=k(!0),i&&(g.removeClass("active"),u(i).addClass("active"))))):13===b&&(g=h(),g&&(m(g),J||K[0].focus())))}})}}}}]),y.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,o=document.createComment(" end nyaBsOption: "+j+" "),p=j.match(b);if(!p)throw new Error("invalid expression");var q,r,s,t,w,x=i.value,y=x?a(x):null,z=p[3]||p[1],A=p[2],B=p[4],C=p[5]?a(p[5]):null,D=p[6],E={$id:f},F={};return D?t=a(D):(q=function(a,b){return f(b)},r=function(a){return a}),function(a,b,c,f,i){function j(a){var c,f,j,t,x,y,B,C,E,F,H,J,K,L,M=b[0],N=e(),O=[];if(w&&(J=[]),d(a))y=a,x=s||q;else{x=s||r,y=[];for(var P in a)a.hasOwnProperty(P)&&"$"!=P.charAt(0)&&y.push(P);y.sort()}for(B=y.length,C=new Array(B),c=0;B>c;c++)if(f=a===y?c:y[c],j=a[f],t=x(f,j,c),L={},A&&(L[A]=f),L[z]=j,O.push(L),w&&(F=w(f,j),-1===J.indexOf(F)&&F&&J.push(F)),I[t])E=I[t],delete I[t],w&&(E.group=F),E.key=f,E.value=j,N[t]=E,C[c]=E;else{if(N[t])throw C.forEach(function(a){a&&a.scope&&(I[a.id]=a)}),new Error("Duplicates in a select are not allowed. Use 'track by' expression to specify unique keys.");C[c]={id:t,scope:void 0,clone:void 0,key:f,value:j},N[t]=!0,F&&(C[c].group=F)}J&&J.length>0&&(C=g(C,J,"group"));for(var Q in I)E=I[Q],h(E.clone).remove(),E.scope.$destroy();for(c=0;B>c;c++)E=C[c],E.scope?(H=M,k(E)!=H&&u(M).after(E.clone),M=l(E),m(E.scope,c,z,E.value,A,E.key,B,E.group)):i(function(a,b){E.scope=b;var d=o.cloneNode(!1);a[a.length++]=d,u(M).after(a),a.addClass("nya-bs-option"),j=p?p(E.key,E.value):E.value||E.key,D.isMultiple?Array.isArray(G.$modelValue)&&n(G.$modelValue,j)&&a.addClass("selected"):v(j,G.$modelValue)&&a.addClass("selected"),M=d,E.clone=a,N[E.id]=E,m(E.scope,c,z,E.value,A,E.key,B,E.group)}),J&&(K&&K===E.group?E.clone.removeClass("first-in-group"):E.clone.addClass("first-in-group"),K=E.group,E.clone.addClass("group-item"));I=N,D.onCollectionChange(O)}var p,D=f[0],G=f[1],H={};t&&(s=function(b,c,d){return A&&(E[A]=b),E[z]=c,E.$index=d,t(a,E)}),C&&(w=function(b,c){return A&&(F[A]=b),F[z]=c,C(a,F)}),A&&(D.keyIdentifier=A),z&&(D.valueIdentifier=z),y&&(D.valueExp=x,p=function(b,c){return A&&(H[A]=b),H[z]=c,y(a,H)});var I=e();"true"===c.deepWatch?a.$watch(B,j,!0):a.$watchCollection(B,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(v(b,a[c]))return!0;return!1},o=function(a,b){var c,d=a.length;if(0===d)return-1;for(c=0;d>c;c++)if(v(b,a[c]))return c;return-1},p=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},q=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=q(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},u=angular.element,v=angular.equals,w=angular.copy,x=angular.extend,y=angular.module("nya.bootstrap.select",[]);y.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=w(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]=x(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}]}),y.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())}}),y.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,x){m.addClass("btn-group");var y,z,A,B,C,D,E,F=function(){var a;return a=x.titleTpl?u(x.titleTpl):x.title?document.createTextNode(x.title):K.defaultNoneSelectionTpl?u(K.defaultNoneSelectionTpl):document.createTextNode(K.defaultNoneSelection?K.defaultNoneSelection:e)},G=m.children(),H=u(f),I=u(g),J=u(j),K=d,L="undefined"!=typeof x.multiple;for(B=q(m[0]),B.forEach(function(a){/btn-(?:primary|info|success|warning|danger|inverse)/.test(a)&&(m.removeClass(a),H.removeClass("btn-default"),H.addClass(a)),"form-control"===a&&H.addClass(a)}),J.append(G),C=G.length,D=0;C>D;D++)E=G.eq(D),(E.hasClass("nya-bs-option")||E.attr("nya-bs-option"))&&E.find("a").attr("tabindex","0");return"true"===x.liveSearch&&(y=u(h),K.noSearchResultTpl?k=k.replace("NO SEARCH RESULT",K.noSearchResultTpl):K.noSearchResult&&(k=k.replace("NO SEARCH RESULT",K.noSearchResult)),z=u(k),I.append(y),J.append(z)),"true"===x.actionsBox&&L&&(K.selectAllTpl?l=l.replace("SELECT ALL",K.selectAllTpl):K.selectAll&&(l=l.replace("SELECT ALL",K.selectAll)),K.deselectAllTpl?l=l.replace("DESELECT ALL",K.deselectAllTpl):K.selectAll&&(l=l.replace("DESELECT ALL",K.deselectAll)),A=u(l),I.append(A)),H.children().eq(0).append(F()),I.append(J),m.append(H),m.append(I),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"))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=N.children().eq(a?0:N.children().length-1);for(var c=0;c0){c=E.$modelValue,e=Array.isArray(c)?w(c):[];for(var f=0;f\s*(\d+)\s*/))&&(i=parseInt(h[1],10)),"undefined"!=typeof i&&a.length>i)return b.empty(),void b.append(K.numberItemSelectedTpl?u(K.numberItemSelectedTpl.replace("%d",a.length)):K.numberItemSelected?document.createTextNode(K.numberItemSelected.replace("%d",a.length)):document.createTextNode(a.length+" items selected"));for(e=0;k>e;e++)d=j.eq(e),d.hasClass("nya-bs-option")&&(c=x(d),J?Array.isArray(a)&&n(a,c)&&(g=d.attr("title"),l.push(g?document.createTextNode(g):y(d))):v(a,c)&&(g=d.attr("title"),l.push(g?document.createTextNode(g):y(d))));if(0===l.length)b.empty(),b.append(F());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],G=g[1],H=!1,I=a(G.valueExp),J="undefined"!=typeof f.multiple,L=s(e,["dropdown-toggle"]),M=L.next(),N=s(M,["dropdown-menu","inner"]),O=s(M,["bs-searchbox"]),P=s(N,["no-search-result"]),Q=s(M,["bs-actionsbox"]);G.valueExp&&(D=function(a,b){return I(a,b)}),G.setId(e.attr("id")),J&&(G.isMultiple=!0,E.$isEmpty=function(a){return!a||0===a.length}),"undefined"!=typeof f.disabled&&d.$watch(f.disabled,function(a){a?(L.addClass("disabled"),C=L.attr("tabindex"),L.attr("tabindex","-1"),H=!0):(L.removeClass("disabled"),C?L.attr("tabindex",C):L.removeAttr("tabindex"),H=!1)}),G.onCollectionChange=function(a){var b,c,e=[],f=E.$modelValue;if(f){if(a&&0!==a.length){if(D)for(b=0;ba;a++)b=f.eq(a),b.hasClass("nya-bs-option")&&(t(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"),u(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=x(d.eq(a)),J?n(c,b)?d.eq(a).addClass("selected"):d.eq(a).removeClass("selected"):v(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=p(a.target,e[0],L[0]);"true"===f.liveSearch?d=p(a.target,e[0],O[0]):c=p(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"),u(i).addClass("active"))):(i=k(!0),i&&j(i))):c?27===b?(L[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=u(a.target.parentNode),g.hasClass("nya-bs-option")&&(q(g),J||L[0].focus())):d&&(27===b?(L[0].focus(),e.removeClass("open"),a.stopPropagation()):38===b?(a.stopPropagation(),g=h(),g&&(i=l(g[0],"previousSibling"),i?(g.removeClass("active"),u(i).addClass("active")):(i=k(!1),i&&(g.removeClass("active"),u(i).addClass("active"))))):40===b?(a.stopPropagation(),g=h(),g&&(i=l(g[0],"nextSibling"),i?(g.removeClass("active"),u(i).addClass("active")):(i=k(!0),i&&(g.removeClass("active"),u(i).addClass("active"))))):13===b&&(g=h(),g&&(q(g),J||L[0].focus())))}})}}}}]),y.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,o=document.createComment(" end nyaBsOption: "+j+" "),p=j.match(b);if(!p)throw new Error("invalid expression");var q,r,s,t,w,x=i.value,y=x?a(x):null,z=p[3]||p[1],A=p[2],B=p[4],C=p[5]?a(p[5]):null,D=p[6],E={$id:f},F={};return D?t=a(D):(q=function(a,b){return f(b)},r=function(a){return a}),function(a,b,c,f,i){function j(a){var c,f,j,t,x,y,B,C,E,F,H,J,K,L,M=b[0],N=e(),O=[];if(w&&(J=[]),d(a))y=a,x=s||q;else{x=s||r,y=[];for(var P in a)a.hasOwnProperty(P)&&"$"!=P.charAt(0)&&y.push(P);y.sort()}for(B=y.length,C=new Array(B),c=0;B>c;c++)if(f=a===y?c:y[c],j=a[f],t=x(f,j,c),L={},A&&(L[A]=f),L[z]=j,O.push(L),w&&(F=w(f,j),-1===J.indexOf(F)&&F&&J.push(F)),I[t])E=I[t],delete I[t],w&&(E.group=F),E.key=f,E.value=j,N[t]=E,C[c]=E;else{if(N[t])throw C.forEach(function(a){a&&a.scope&&(I[a.id]=a)}),new Error("Duplicates in a select are not allowed. Use 'track by' expression to specify unique keys.");C[c]={id:t,scope:void 0,clone:void 0,key:f,value:j},N[t]=!0,F&&(C[c].group=F)}J&&J.length>0&&(C=g(C,J,"group"));for(var Q in I)E=I[Q],h(E.clone).remove(),E.scope.$destroy();for(c=0;B>c;c++)E=C[c],E.scope?(H=M,k(E)!=H&&u(M).after(E.clone),M=l(E),m(E.scope,c,z,E.value,A,E.key,B,E.group)):i(function(a,b){E.scope=b;var d=o.cloneNode(!1);a[a.length++]=d,u(M).after(a),a.addClass("nya-bs-option"),j=p?p(E.key,E.value):E.value||E.key,D.isMultiple?Array.isArray(G.$modelValue)&&n(G.$modelValue,j)&&a.addClass("selected"):v(j,G.$modelValue)&&a.addClass("selected"),M=d,E.clone=a,N[E.id]=E,m(E.scope,c,z,E.value,A,E.key,B,E.group)}),J&&(K&&K===E.group?E.clone.removeClass("first-in-group"):E.clone.addClass("first-in-group"),K=E.group,E.clone.addClass("group-item"));I=N,D.onCollectionChange(O)}var p,D=f[0],G=f[1],H={};t&&(s=function(b,c,d){return A&&(E[A]=b),E[z]=c,E.$index=d,t(a,E)}),C&&(w=function(b,c){return A&&(F[A]=b),F[z]=c,C(a,F)}),A&&(D.keyIdentifier=A),z&&(D.valueIdentifier=z),y&&(D.valueExp=x,p=function(b,c){return A&&(H[A]=b),H[z]=c,y(a,H)});var I=e();"true"===c.deepWatch?a.$watch(B,j,!0):a.$watchCollection(B,j)}}}}])}(); \ No newline at end of file diff --git a/less/nya-bs-select.less b/less/nya-bs-select.less index 59f243f..569d445 100644 --- a/less/nya-bs-select.less +++ b/less/nya-bs-select.less @@ -231,8 +231,25 @@ } } - .bs-searchbox { + .bs-searchbox, + .bs-actionsbox { padding: 4px 8px; + } + + .bs-actionsbox { + float: left; + width: 100%; + box-sizing: border-box; + + & .btn-group button { + width: 50%; + } + } + + .bs-searchbox { + & + .bs-actionsbox { + padding: 0 8px 4px; + } & input.form-control { margin-bottom: 0; diff --git a/src/nya-bs-config.js b/src/nya-bs-config.js index a65d92b..dbdfed4 100644 --- a/src/nya-bs-config.js +++ b/src/nya-bs-config.js @@ -10,7 +10,9 @@ nyaBsSelect.provider('nyaBsConfig', function() { 'en-us': { defaultNoneSelection: 'Nothing selected', noSearchResult: 'NO SEARCH RESULT', - numberItemSelected: '%d item selected' + numberItemSelected: '%d item selected', + selectAll: 'Select All', + deselectAll: 'Deselect All' } }; diff --git a/src/nya-bs-select.js b/src/nya-bs-select.js index 18567f5..d6ff1e5 100644 --- a/src/nya-bs-select.js +++ b/src/nya-bs-select.js @@ -18,6 +18,13 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC var NO_SEARCH_RESULT = '
  • NO SEARCH RESULT
  • '; + var ACTIONS_BOX = '
    ' + + '
    ' + + '' + + '' + + '
    ' + + '
    '; + return { restrict: 'ECA', require: ['ngModel', 'nyaBsSelect'], @@ -56,11 +63,13 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC dropdownMenu = jqLite(DROPDOWN_MENU), searchBox, noSearchResult, + actionsBox, classList, length, index, liElement, - localizedText = nyaBsConfig; + localizedText = nyaBsConfig, + isMultiple = typeof tAttrs.multiple !== 'undefined'; classList = getClassList(tElement[0]); classList.forEach(function(className) { @@ -107,6 +116,24 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC dropdownMenu.append(noSearchResult); } + if (tAttrs.actionsBox === 'true' && isMultiple) { + // set localizedText + if (localizedText.selectAllTpl) { + ACTIONS_BOX = ACTIONS_BOX.replace('SELECT ALL', localizedText.selectAllTpl); + } else if (localizedText.selectAll) { + ACTIONS_BOX = ACTIONS_BOX.replace('SELECT ALL', localizedText.selectAll); + } + + if (localizedText.deselectAllTpl) { + ACTIONS_BOX = ACTIONS_BOX.replace('DESELECT ALL', localizedText.deselectAllTpl); + } else if (localizedText.selectAll) { + ACTIONS_BOX = ACTIONS_BOX.replace('DESELECT ALL', localizedText.deselectAll); + } + + actionsBox = jqLite(ACTIONS_BOX); + dropdownContainer.append(actionsBox); + } + // set default none selection text dropdownToggle.children().eq(0).append(getDefaultNoneSelectionContent()); @@ -131,7 +158,8 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC dropdownContainer = dropdownToggle.next(), dropdownMenu = queryChildren(dropdownContainer, ['dropdown-menu', 'inner']), searchBox = queryChildren(dropdownContainer, ['bs-searchbox']), - noSearchResult = queryChildren(dropdownMenu, ['no-search-result']); + noSearchResult = queryChildren(dropdownMenu, ['no-search-result']), + actionsBox = queryChildren(dropdownContainer, ['bs-actionsbox']); if(nyaBsSelectCtrl.valueExp) { valueExpFn = function(scope, locals) { @@ -295,6 +323,18 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC } }); + // actions box + if ($attrs.actionsBox === 'true' && isMultiple) { + actionsBox.find('.bs-select-all').on('click', function () { + setAllOptions(true); + }); + + actionsBox.find('.bs-deselect-all').on('click', function () { + setAllOptions(false); + }); + } + + // live search if($attrs.liveSearch === 'true') { searchBox.children().on('input', function(){ @@ -630,6 +670,58 @@ nyaBsSelect.directive('nyaBsSelect', ['$parse', '$document', '$timeout', 'nyaBsC return null; } + /** + * + */ + function setAllOptions(selectAll) { + if (!isMultiple || isDisabled) + return; + + var liElements, + modelValue, + viewValue; + + liElements = dropdownMenu.find('li'); + if (liElements.length > 0) { + modelValue = ngCtrl.$modelValue; + + // make a deep copy enforce ngModelController to call its $render method. + // See: https://github.com/angular/angular.js/issues/1751 + viewValue = Array.isArray(modelValue) ? deepCopy(modelValue) : []; + + for (var i = 0; i < liElements.length; i++) { + var nyaBsOption = jqLite(liElements[i]); + if (nyaBsOption.hasClass('disabled')) + continue; + + var value, index; + + // if user specify the value attribute. we should use the value attribute + // otherwise, use the valueIdentifier specified field in target scope + value = getOptionValue(nyaBsOption); + + if (typeof value !== 'undefined') { + index = indexOf(viewValue, value); + if (selectAll && index == -1) { + // check element + viewValue.push(value); + nyaBsOption.addClass('selected'); + } else if (!selectAll && index != -1) { + // uncheck element + viewValue.splice(index, 1); + nyaBsOption.removeClass('selected'); + } + } + } + + // update view value regardless + ngCtrl.$setViewValue(viewValue); + $scope.$digest(); + + updateButtonContent(); + } + } + /** * select an option represented by nyaBsOption argument. Get the option's value and update model. * if isMultiple = true, doesn't close dropdown menu. otherwise close the menu.