3 var directiveModule = angular.module('angularjs-dropdown-multiselect-old', ['ngRoute',
11 'ui.grid.resizeColumns',
16 'ngSanitize','vs-repeat']);
18 directiveModule.directive('ngDropdownMultiselectOld', ['$filter', '$document', '$compile', '$parse','$rootScope', '$resource', '$http','$location',
19 function ($filter, $document, $compile, $parse, $rootScope, $resource, $http,$location)
32 translationTexts: '=',
35 template: function (element, attrs)
37 var checkboxes = attrs.checkboxes ? true : false;
38 var groups = attrs.groupBy ? true : false;
40 var template = '<div class="multiselect-parent btn-group dropdown-multiselect" style="width:100%;">';
41 template += '<div style="width:98%;" class="dropdown-toggle" ng-class="settings.buttonClasses" ng-click="toggleDropdown()">{{getButtonText()}} <span class="caret"></span></div>';
42 template += '<ul class="dropdown-menu dropdown-menu-form" ng-style="{display: open ? \'block\' : \'none\', height : settings.scrollable ? settings.scrollableHeight : \'auto\' }" style="overflow: scroll; width:280px;" >';
43 template += '<li ng-show="settings.enableSearch"><div class="dropdown-header"><input type="text" class="form-control" style="width: 100%;" ng-model="searchFilter" ng-focus="this" placeholder="{{texts.searchPlaceholder}}" /></li>';
44 template += '<li ng-show="settings.enableSearch" class="divider"></li>';
50 template += '<li ng-repeat-start="option in orderedItems | filter: searchFilter" ng-show="getPropertyForObject(option, settings.groupBy) !== getPropertyForObject(orderedItems[$index - 1], settings.groupBy)" role="presentation" class="dropdown-header1">{{ getGroupTitle(getPropertyForObject(option, settings.groupBy)) }}</li>';
51 template += '<li ng-repeat-end role="presentation">';
53 template += '<li role="presentation" ng-repeat="option in options| filter: searchFilter">';
56 template += '<a role="menuitem" tabindex="-1" ng-click="setSelectedItem(getPropertyForObject(option,settings.idProp))">';
59 template += '<div class="checkbox"><label><input class="checkboxInput" type="checkbox" ng-click="checkboxClick($event, getPropertyForObject(option,settings.idProp))" ng-checked="isChecked(getPropertyForObject(option,settings.idProp))" /> {{getPropertyForObject(option, settings.displayProp)}}</label></div></a>';
61 template += '<span data-ng-class="{\'glyphicon glyphicon-ok\': isChecked(getPropertyForObject(option,settings.idProp))}"></span> {{getPropertyForObject(option, settings.displayProp)}}</a>';
67 template += '<li ng-hide="(!settings.showCheckAll) && !settings.showUncheckAll" class="divider"></li>';
68 template += '<li ng-hide="!settings.showCheckAll"><a data-ng-click="selectAll()"><span class="glyphicon glyphicon-ok"></span> {{texts.checkAll}}</a>';
69 template += '<li ng-show="settings.showUncheckAll"><a data-ng-click="deselectAll();"><span class="glyphicon glyphicon-remove"></span> {{texts.uncheckAll}}</a></li>';
71 template += '<li class="divider" ng-show="settings.selectionLimit > 1"></li>';
72 template += '<li role="presentation" ng-show="settings.selectionLimit > 1"><a role="menuitem">{{selectedModel.length}} {{texts.selectionOf}} {{settings.selectionLimit}} {{texts.selectionCount}}</a></li>';
77 element.html(template);
79 link: function ($scope, $element, $attrs)
81 var $dropdownTrigger = $element.children()[0];
84 $scope.toggleDropdown = function () {
85 $scope.open = !$scope.open;
92 $scope.checkboxClick = function ($event, id) {
93 $scope.setSelectedItem(id);
94 $event.stopImmediatePropagation();
97 $scope.externalEvents =
99 onItemSelect: angular.noop,
100 onItemDeselect: angular.noop,
101 onSelectAll: angular.noop,
102 onDeselectAll: angular.noop,
103 onInitDone: angular.noop,
104 onMaxSelectionReached: angular.noop
110 scrollableHeight: '300px',
114 externalIdProp: 'id',
118 showUncheckAll: true,
119 closeOnSelect: false,
120 buttonClasses: 'btn btn-default',
121 closeOnDeselect: false,
122 groupBy: $attrs.groupBy || undefined,
123 groupByTextProvider: null,
124 smartButtonMaxItems: 0,
125 smartButtonTextConverter: angular.noop
129 checkAll: 'Check All',
130 uncheckAll: 'Uncheck All',
131 selectionCount: 'checked',
133 searchPlaceholder: 'Search...',
134 buttonDefaultText: 'Select',
135 dynamicButtonTextSuffix: 'checked'
138 $scope.searchFilter = $scope.searchFilter || '';
140 if (angular.isDefined($scope.settings.groupBy))
142 $scope.$watch('options', function (newValue)
144 if (angular.isDefined(newValue))
146 $scope.orderedItems = $filter('orderBy')(newValue, $scope.settings.groupBy);
151 angular.extend($scope.settings, $scope.extraSettings || []);
152 angular.extend($scope.externalEvents, $scope.events || []);
153 angular.extend($scope.texts, $scope.translationTexts);
155 $scope.singleSelection = $scope.settings.selectionLimit === 1;
157 function getFindObj(id)
161 if ($scope.settings.externalIdProp === '')
163 findObj[$scope.settings.idProp] = id;
167 findObj[$scope.settings.externalIdProp] = id;
173 function clearObject(object)
175 for (var prop in object)
181 if ($scope.singleSelection)
183 if (angular.isArray($scope.selectedModel) && $scope.selectedModel.length === 0)
185 clearObject($scope.selectedModel);
189 if ($scope.settings.closeOnBlur)
191 $document.on('click', function (e)
193 var target = e.target.parentElement;
194 var parentFound = false;
196 while (angular.isDefined(target) && target !== null && !parentFound)
200 if (_.contains(target.className.split(' '), 'multiselect-parent') && !parentFound)
202 if(target === $dropdownTrigger)
208 target = target.parentElement;
215 $scope.$apply(function () {
222 $scope.getGroupTitle = function (groupValue) {
223 if ($scope.settings.groupByTextProvider !== null) {
224 return $scope.settings.groupByTextProvider(groupValue);
230 $scope.getButtonText = function () {
231 if ($scope.settings.dynamicTitle && ($scope.selectedModel.length > 0 || (angular.isObject($scope.selectedModel) && _.keys($scope.selectedModel).length > 0))) {
232 if ($scope.settings.smartButtonMaxItems > 0) {
235 angular.forEach($scope.options, function (optionItem) {
236 if ($scope.isChecked($scope.getPropertyForObject(optionItem, $scope.settings.idProp))) {
237 var displayText = $scope.getPropertyForObject(optionItem, $scope.settings.displayProp);
238 var converterResponse = $scope.settings.smartButtonTextConverter(displayText, optionItem);
240 itemsText.push(converterResponse ? converterResponse : displayText);
244 if ($scope.selectedModel.length > $scope.settings.smartButtonMaxItems) {
245 itemsText = itemsText.slice(0, $scope.settings.smartButtonMaxItems);
246 itemsText.push('...');
249 return itemsText.join(', ');
253 if ($scope.singleSelection) {
254 totalSelected = ($scope.selectedModel !== null && angular.isDefined($scope.selectedModel[$scope.settings.idProp])) ? 1 : 0;
256 totalSelected = angular.isDefined($scope.selectedModel) ? $scope.selectedModel.length : 0;
259 if (totalSelected === 0) {
260 return $scope.texts.buttonDefaultText;
262 return totalSelected + ' ' + $scope.texts.dynamicButtonTextSuffix;
266 return $scope.texts.buttonDefaultText;
270 $scope.getPropertyForObject = function (object, property)
272 if (angular.isDefined(object) && object.hasOwnProperty(property)) {
273 return object[property];
279 $scope.selectAll = function ()
281 $scope.deselectAll(false,true);
282 $scope.externalEvents.onSelectAll();
284 var len = $scope.selectedModel.length;
286 angular.forEach($scope.options, function (value)
288 if(value[$scope.settings.idProp]=="All")
292 $scope.setSelectedItem(value[$scope.settings.idProp], true, true);
296 $scope.setSelectedItem(value[$scope.settings.idProp], true, true);
302 $scope.deselectAll = function (sendEvent,ignore)
304 var len = $scope.selectedModel.length;
306 sendEvent = sendEvent || true;
310 $scope.externalEvents.onDeselectAll();
313 if ($scope.singleSelection)
315 clearObject($scope.selectedModel);
319 $scope.selectedModel.splice(0, $scope.selectedModel.length);
322 if(ignore!=true || ignore==undefined)
326 $scope.setSelectedItem("All", true, true);
330 $scope.setSelectedItem("All", true, true);
337 $scope.setSelectedItem = function (id, dontRemove, refresh)
339 var findObj = getFindObj(id);
342 if ($scope.settings.externalIdProp === '')
344 finalObj = _.find($scope.options, findObj);
352 if ($scope.singleSelection)
354 clearObject($scope.selectedModel);
355 angular.extend($scope.selectedModel, finalObj);
356 $scope.externalEvents.onItemSelect(finalObj);
358 if ($scope.settings.closeOnSelect) $scope.open = false;
363 dontRemove = dontRemove || false;
366 var exists = _.findIndex($scope.selectedModel, findObj) !== -1;
368 if (!dontRemove && exists) {
369 $scope.selectedModel.splice(_.findIndex($scope.selectedModel, findObj), 1);
370 $scope.externalEvents.onItemDeselect(findObj);
371 } else if (!exists && ($scope.settings.selectionLimit === 0 || $scope.selectedModel.length < $scope.settings.selectionLimit)) {
372 $scope.selectedModel.push(finalObj);
373 $scope.externalEvents.onItemSelect(finalObj);
376 if ($scope.settings.closeOnSelect) $scope.open = false;
378 if(refresh || refresh==undefined)
380 if("/dashboard"==$location.path())
382 $rootScope.ReLoadDashboardComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
384 else if("/api_portfolio"==$location.path())
386 $rootScope.ReLoadAPIPortfolioComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
388 else if("/project_portfolio"==$location.path())
390 $rootScope.ReLoadProjectPortFolioComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
392 else if("/installed_bundle_versions"==$location.path())
394 $rootScope.ReLoadInstalledBundleComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
395 }else if("/adapter_inventory"==$location.path())
397 $rootScope.ReLoadAdapterInventoryComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
399 else if("/api_taxonomy"==$location.path())
401 $rootScope.ReLoadAPITaxonomyComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
402 }else if("/defects"==$location.path())
404 $rootScope.ReLoadDefectReportComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
405 } else if("/environment_configurations"==$location.path())
407 $rootScope.ReLoadEnvConfigComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
409 else if("/federated_qc_coverage"==$location.path()) {
410 $rootScope.ReLoadQcCodeCoverageComboBox($scope.translationTexts.buttonDefaultText,finalObj.id);
422 $scope.isChecked = function (id) {
423 if ($scope.singleSelection) {
424 return $scope.selectedModel !== null && angular.isDefined($scope.selectedModel[$scope.settings.idProp]) && $scope.selectedModel[$scope.settings.idProp] === getFindObj(id)[$scope.settings.idProp];
427 return _.findIndex($scope.selectedModel, getFindObj(id)) !== -1;
430 $scope.externalEvents.onInitDone();