"use strict";var directiveModule=angular.module("angularjs-dropdown-multiselect",[]);directiveModule.directive("ngDropdownMultiselect",["$filter","$document","$compile","$parse",function($filter,$document){return{restrict:"AE",scope:{selectedModel:"=",options:"=",extraSettings:"=",events:"=",groupBy:"@"},template:function(element,attrs){var checkboxes=attrs.checkboxes?!0:!1,groups=attrs.groupBy?!0:!1,template='
';template+='',template+='",template+="
",element.html(template)},link:function($scope,$element,$attrs){function getFindObj(id){var findObj={};return""===$scope.settings.externalIdProp?findObj[$scope.settings.idProp]=id:findObj[$scope.settings.externalIdProp]=id,findObj}$scope.toggleDropdown=function(){$scope.open=!$scope.open},$scope.checkboxClick=function($event,id){$scope.setSelectedItem(id),$event.stopImmediatePropagation()},$scope.searchFilter="",$scope.externalEvents={onItemSelect:angular.noop,onItemDeselect:angular.noop,onSelectAll:angular.noop,onDeselectAll:angular.noop,onInitDone:angular.noop,onMaxSelectionReached:angular.noop},$scope.settings={dynamicTitle:!0,defaultText:"Select",closeOnBlur:!0,displayProp:"label",idProp:"id",externalIdProp:"id",enableSearch:!1,selectionLimit:0,closeOnSelect:!1,closeOnDeselect:!1,groupBy:$attrs.groupBy||void 0,groupByTextProvider:null},angular.isDefined($scope.settings.groupBy)&&$scope.$watch("options",function(newValue){angular.isDefined(newValue)&&($scope.orderedItems=$filter("orderBy")(newValue,$scope.settings.groupBy))}),angular.extend($scope.settings,$scope.extraSettings||[]),angular.extend($scope.externalEvents,$scope.events||[]),$scope.settings.closeOnBlur&&$document.on("click",function(e){for(var target=e.target.parentElement,parentFound=!1;angular.isDefined(target)&&null!==target&&!parentFound;)_.contains(target.classList,"multiselect-parent")&&!parentFound&&(parentFound=!0),target=target.parentElement;parentFound||$scope.$apply(function(){$scope.open=!1})}),$scope.getGroupTitle=function(groupValue){return null!==$scope.settings.groupByTextProvider?$scope.settings.groupByTextProvider(groupValue):groupValue},$scope.getButtonText=function(){if($scope.settings.dynamicTitle){var totalSelected=angular.isDefined($scope.selectedModel)?$scope.selectedModel.length:0;return 0===totalSelected?$scope.settings.defaultText:totalSelected+" selected"}return $scope.settings.defaultText},$scope.getPropertyForObject=function(object,property){return angular.isDefined(object)&&object.hasOwnProperty(property)?object[property]:""},$scope.selectAll=function(){$scope.deselectAll(!1),$scope.externalEvents.onSelectAll(),angular.forEach($scope.options,function(value){$scope.setSelectedItem(value[$scope.settings.idProp],!0)})},$scope.deselectAll=function(sendEvent){sendEvent=sendEvent||!0,sendEvent&&$scope.externalEvents.onDeselectAll(),$scope.selectedModel=[]},$scope.setSelectedItem=function(id,dontRemove){dontRemove=dontRemove||!1;var findObj=getFindObj(id),exists=-1!==_.findIndex($scope.selectedModel,findObj);if(!dontRemove&&exists)$scope.selectedModel.splice(_.findIndex($scope.selectedModel,findObj),1),$scope.externalEvents.onItemDeselect(findObj);else if(!exists)if(0===$scope.settings.selectionLimit||$scope.selectedModel.length<$scope.settings.selectionLimit)if(""===$scope.settings.externalIdProp){var fullObjFind=getFindObj(id),fullObj=_.find($scope.options,fullObjFind);$scope.selectedModel.push(fullObj),$scope.externalEvents.onItemSelect(fullObj),$scope.settings.closeOnSelect&&$scope.toggleDropdown()}else $scope.selectedModel.push(findObj),$scope.externalEvents.onItemSelect(findObj),$scope.settings.closeOnDeselect&&$scope.toggleDropdown();else $scope.externalEvents.onMaxSelectionReached()},$scope.isChecked=function(id){return-1!==_.findIndex($scope.selectedModel,getFindObj(id))},$scope.externalEvents.onInitDone()}}}]);