Repository navigation
Expand file tree
/
Copy pathangular-multi-select.min.js
More file actions
5 lines (5 loc) · 3.32 KB
/
Copy pathangular-multi-select.min.js
File metadata and controls
5 lines (5 loc) · 3.32 KB
1
2
3
4
5
(function(c){c.module("multi-select",["template/multiSelect.html"]).directive("multiSelect",["$q","$parse",function(e,r){function h(a){var b=[];c.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,e){function k(d,b){var l=[];c.forEach(d,function(d){for(var c=!1,e=0;e<b.length;e++)if(a.renderItem(b[e])==a.renderItem(d)){c=
!0;break}c||l.push(d)});return l}function m(a,c){var b=c.match(/(.+)\s+as\s+(.+)/),e={};e[b[1]]=a;return r(b[2])(e)}function n(){g&&a.model&&(a.numSelected=a.model.length,p.$setValidity("min",a.numSelected>=g))}a.selected={available:[],current:[]};var g,p;a.refreshAvailable=function(){a.model&&a.available&&(a.available=k(a.available,a.model),a.selected.available=h(a.available),a.selected.current=h(a.model))};a.add=function(){a.model.length||(a.model=[]);a.model=a.model.concat(a.selected(a.selected.available))};
a.remove=function(){var d=a.selected(a.selected.current);a.available=a.available.concat(d);a.model=k(a.model,d)};a.selected=function(a){var b=[];c.forEach(a,function(a){!0===a.selected&&b.push(a)});return b};a.watchModel=function(){a.model&&a.model.hasOwnProperty("$promise")&&!a.model.$resolved?a.model.then(function(d){a.$watch("model",a.watchModel)}):(a.refreshAvailable(),a.$watch("model",a.refreshAvailable))};var q={};a.watchAvailable=function(){a.available&&a.available.hasOwnProperty("$promise")&&
!a.available.$resolved?a.available.$promise.then(function(d){a.$watch("available",a.watchAvailable)}):a.available&&a.available!=q&&(a.refreshAvailable(),q=a.available)};a.$watch("available",a.watchAvailable);a.$watch("model",a.watchModel);a.renderItem=function(a){return m(a,f.display)};a.renderTitle=function(a){return f.title?m(a,f.title):""};a.config&&c.isDefined(a.config.requiredMin)&&(b=b.find("input"),p=c.element(b[b.length-1]).controller("ngModel"));a.$watch("config.requiredMin",function(a){c.isDefined(a)&&
(g=parseInt(a,10),n())});a.$watch("model",function(a){n()})}}}]);c.module("template/multiSelect.html",[]).run(["$templateCache",function(c){c.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);