'use strict';
var directiveModule = angular.module('angularjs-dropdown-multiselect', []);
directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$compile', function ($filter, $document, $compile) {
return {
restrict: 'AE',
scope:{
selectedModel: '=',
options: '=',
extraSettings: '='
},
template: function(element, attrs)
{
var checkboxes = attrs.checkboxes ? true : false;
var template = '
';
template +='';
template += '';
template += '
';
element.html(template);
},
link: function($scope, $element, $attrs){
$scope.toggleDropdown = function()
{
$scope.open = !$scope.open;
};
$scope.checkboxClick = function($event, id)
{
$scope.setSelectedItem(id);
$event.stopImmediatePropagation();
};
$scope.settings = {
dynamicTitle: true,
defaultText: 'Select',
closeOnBlur: true,
displayProp: 'label',
idProp: 'id',
externalIdProp: 'id'};
angular.extend($scope.settings, $scope.extraSettings || []);
function getFindObj(id)
{
var findObj = {};
if ($scope.settings.externalIdProp === '')
{
findObj[$scope.settings.idProp] = id;
}
else {
findObj[$scope.settings.externalIdProp] = id;
}
return findObj;
}
if ($scope.settings.closeOnBlur) {
$document.on('click', function (e) {
var target = e.target.parentElement;
var parentFound = false;
while (angular.isDefined(target) && target !== null && !parentFound) {
if (_.contains(target.classList, 'multiselect-parent') && !parentFound) {
parentFound = true;
}
target = target.parentElement;
}
if (!parentFound) {
$scope.$apply(function () {
$scope.open = false;
});
}
});
}
$scope.getButtonText = function()
{
if ($scope.settings.dynamicTitle)
{
var totalSelected = angular.isDefined($scope.selectedModel) ? $scope.selectedModel.length : 0;
if (totalSelected === 0)
{
return $scope.settings.defaultText;
}
else
{
return totalSelected + ' selected';
}
}
else
{
return $scope.settings.defaultText;
}
};
$scope.getPropertyForObject = function(object, property)
{
if (object.hasOwnProperty(property)) {
return object[property];
}
return '';
};
$scope.selectAll = function () {
$scope.deselectAll();
angular.forEach($scope.options, function(value)
{
$scope.setSelectedItem(value[$scope.settings.idProp], true);
});
};
$scope.deselectAll = function() {
$scope.selectedModel=[];
};
$scope.setSelectedItem = function(id, dontRemove){
dontRemove = dontRemove || false;
var findObj = getFindObj(id);
var exists = _.findIndex($scope.selectedModel, findObj) !== -1;
if (!dontRemove && exists) {
$scope.selectedModel.splice(_.findIndex($scope.selectedModel, findObj), 1);
} else if (!exists) {
if ($scope.settings.externalIdProp === '')
{
var fullObjFind = getFindObj(id);
var fullObj = _.find($scope.options, fullObjFind);
$scope.selectedModel.push(fullObj);
}
else
{
$scope.selectedModel.push(findObj);
}
}
return false;
};
$scope.isChecked = function (id) {
if (_.findIndex($scope.selectedModel, getFindObj(id)) !== -1) {
return true;
}
return false;
};
}
};
}]);