forked from alalonde/angular-multi-select
-
Notifications
You must be signed in to change notification settings - Fork 0
/
angular-multi-select.min.js
4 lines (4 loc) · 3.03 KB
/
angular-multi-select.min.js
1
2
3
4
(function(d){d.module("multi-select",["template/multiSelect.html"]).directive("multiSelect",["$q","$parse",function(k,s){function l(a){var b=[];d.forEach(a,function(a){a.selected=!1;b.push(a)});return b}return{restrict:"E",require:"ngModel",scope:{selectedLabel:"@",availableLabel:"@",available:"=",model:"=ngModel",config:"="},templateUrl:"template/multiSelect.html",link:function(a,b,f,g){function m(c,n){var e=[];d.forEach(c,function(c){for(var d=!1,b=0;b<n.length;b++)if(a.renderItem(n[b])==a.renderItem(c)){d=
!0;break}d||e.push(c)});return e}function p(a,d){var e=d.match(/(.+)\s+as\s+(.+)/),b={};b[e[1]]=a;return s(e[2])(b)}function q(){h&&a.model&&(a.numSelected=a.model.length,r.$setValidity("min",a.numSelected>=h))}a.selected={available:[],current:[]};g=function(c){var b=k.defer();a[c]&&!a[c].hasOwnProperty("$promise")||a[c]&&0<a[c].length?b.resolve(a[c]):a.$watch(c,function(a,c){a&&0<a.length&&b.resolve(a)});return b.promise};var h,r;a.refreshAvailable=function(){a.available=m(a.available,a.model);a.selected.available=
l(a.available);a.selected.current=l(a.model)};a.add=function(){a.model=a.model.concat(a.selected(a.selected.available))};a.remove=function(){var c=a.selected(a.selected.current);a.available=a.available.concat(c);a.model=m(a.model,c)};a.selected=function(a){var b=[];d.forEach(a,function(a){!0===a.selected&&b.push(a)});return b};k.all([g("model"),g("available")]).then(function(c){a.refreshAvailable();a.$watch("model",a.refreshAvailable)});a.renderItem=function(a){return p(a,f.display)};a.renderTitle=
function(a){return f.title?p(a,f.title):""};a.config&&d.isDefined(a.config.requiredMin)&&(b=b.find("input"),r=d.element(b[b.length-1]).controller("ngModel"));a.$watch("config.requiredMin",function(a){d.isDefined(a)&&(h=parseInt(a,10),q())});a.$watch("model",function(a){q()})}}}]);d.module("template/multiSelect.html",[]).run(["$templateCache",function(d){d.put("template/multiSelect.html",'<div class="multiSelect"><div class="select"><label class="control-label" for="multiSelectSelected">{{ selectedLabel }} ({{ model.length }})</label><ul><li ng-repeat="entity in model"><label class="checkbox" title="{{ renderTitle(entity) }}"><input type="checkbox" ng-model="selected.current[$index].selected"> {{ renderItem(entity) }}</label></li></ul></div><div class="select buttons"><button class="btn mover left" ng-click="add()" title="Add selected" ng-disabled="!selected(selected.available).length"><i class="icon-arrow-left"></i></button><button class="btn mover right" ng-click="remove()" title="Remove selected" ng-disabled="!selected(selected.current).length"><i class="icon-arrow-right"></i></button></div><div class="select"><label class="control-label" for="multiSelectAvailable">{{ availableLabel }} ({{ available.length }})</label><ul><li ng-repeat="entity in available"><label class="checkbox" title="{{ renderTitle(entity) }}"><input type="checkbox" ng-model="selected.available[$index].selected"> {{ renderItem(entity) }}</label></li></ul></div><input type="number" name="numSelected" ng-model="numSelected" style="display: none"></div>')}])})(angular);