Skip to content
This repository was archived by the owner on Dec 16, 2019. It is now read-only.

Commit 5bbae96

Browse files
committed
Fixed bug when using angular-ui-bootstrap, Added special handle when using single selection limit
1 parent 95d846f commit 5bbae96

File tree

3 files changed

+65
-39
lines changed

3 files changed

+65
-39
lines changed

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "angularjs-dropdown-multiselect",
3-
"version": "1.3.1",
3+
"version": "1.3.2",
44
"authors": [
55
"Dotan Simha <dotansimha@gmail.com>"
66
],

development_index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
<script>
1313
var staticPath = '/angularjs-dropdown-multiselect/pages/';
1414
</script>
15+
<style>
16+
.nav, .pagination, .carousel, .panel-title a { cursor: pointer; }
17+
</style>
1518

1619
<!--[if lt IE 9]>
1720
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
@@ -48,6 +51,8 @@ <h2>based on Bootstrap's dropdown</h2>
4851
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>
4952
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/highlight.min.js"></script>
5053
<script type="text/javascript" src="https://rawgit.com/pc035860/angular-highlightjs/master/angular-highlightjs.js"></script>
54+
<script type="text/javascript"
55+
src="http://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.js"></script>
5156

5257
<script type="text/javascript" src="src/angularjs-dropdown-multiselect.js"></script>
5358

src/angularjs-dropdown-multiselect.js

Lines changed: 59 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
1717
var checkboxes = attrs.checkboxes ? true : false;
1818
var groups = attrs.groupBy ? true : false;
1919

20-
var template = '<div class="multiselect-parent btn-group dropdown-multiselect" data-ng-class="{open: open}">';
20+
var template = '<div class="multiselect-parent btn-group dropdown-multiselect">';
2121
template +='<button type="button" class="btn btn-default dropdown-toggle" ng-click="toggleDropdown()">{{getButtonText()}}<span class="caret"></span></button>';
22-
template += '<ul class="dropdown-menu dropdown-menu-form">';
22+
template += '<ul class="dropdown-menu dropdown-menu-form" ng-style="{display: open ? \'block\' : \'none\'}">';
2323
template += '<li ng-hide="settings.selectionLimit > 0"><a data-ng-click="selectAll()"><span class="glyphicon glyphicon-ok"></span> Check All</a>';
2424
template += '<li><a data-ng-click="deselectAll();"><span class="glyphicon glyphicon-remove"></span> Uncheck All</a></li>';
2525
template += '<li class="divider"></li>';
@@ -47,8 +47,8 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
4747

4848
template += '</li>';
4949

50-
template += '<li class="divider" ng-show="settings.selectionLimit > 0"></li>';
51-
template += '<li role="presentation" ng-show="settings.selectionLimit > 0"><a role="menuitem">{{selectedModel.length}} / {{settings.selectionLimit}} selected</a></li>';
50+
template += '<li class="divider" ng-show="settings.selectionLimit > 1"></li>';
51+
template += '<li role="presentation" ng-show="settings.selectionLimit > 1"><a role="menuitem">{{selectedModel.length}} / {{settings.selectionLimit}} selected</a></li>';
5252

5353
template += '</ul>';
5454
template += '</div>';
@@ -92,6 +92,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
9292
groupBy: $attrs.groupBy || undefined,
9393
groupByTextProvider: null};
9494

95+
9596
if (angular.isDefined($scope.settings.groupBy))
9697
{
9798
$scope.$watch('options', function(newValue) {
@@ -105,6 +106,16 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
105106
angular.extend($scope.settings, $scope.extraSettings || []);
106107
angular.extend($scope.externalEvents, $scope.events || []);
107108

109+
$scope.singleSelection = $scope.settings.selectionLimit === 1;
110+
111+
if ($scope.singleSelection)
112+
{
113+
if (angular.isArray($scope.selectedModel) && $scope.selectedModel.length === 0)
114+
{
115+
$scope.selectedModel = null;
116+
}
117+
}
118+
108119
function getFindObj(id)
109120
{
110121
var findObj = {};
@@ -154,7 +165,16 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
154165
{
155166
if ($scope.settings.dynamicTitle)
156167
{
157-
var totalSelected = angular.isDefined($scope.selectedModel) ? $scope.selectedModel.length : 0;
168+
var totalSelected;
169+
170+
if ($scope.singleSelection)
171+
{
172+
totalSelected = $scope.selectedModel !== null ? 1 : 0;
173+
}
174+
else
175+
{
176+
totalSelected = angular.isDefined($scope.selectedModel) ? $scope.selectedModel.length : 0;
177+
}
158178

159179
if (totalSelected === 0)
160180
{
@@ -182,7 +202,6 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
182202

183203
$scope.selectAll = function () {
184204
$scope.deselectAll(false);
185-
186205
$scope.externalEvents.onSelectAll();
187206

188207
angular.forEach($scope.options, function(value)
@@ -194,55 +213,57 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
194213
$scope.deselectAll = function(sendEvent) {
195214
sendEvent = sendEvent || true;
196215

197-
if (sendEvent)
198-
{
216+
if (sendEvent) {
199217
$scope.externalEvents.onDeselectAll();
200218
}
201219

202-
$scope.selectedModel=[];
220+
if ($scope.singleSelection) {
221+
$scope.selectedModel = null;
222+
}
223+
else {
224+
$scope.selectedModel = [];
225+
}
226+
203227
};
204228

205229
$scope.setSelectedItem = function(id, dontRemove){
206-
dontRemove = dontRemove || false;
207230
var findObj = getFindObj(id);
231+
var finalObj = null;
232+
233+
if ($scope.settings.externalIdProp === '') {
234+
finalObj = _.find($scope.options, findObj);
235+
}
236+
else {
237+
finalObj = findObj;
238+
}
239+
240+
if ($scope.singleSelection)
241+
{
242+
$scope.selectedModel = finalObj;
243+
$scope.externalEvents.onItemSelect(finalObj);
244+
245+
return;
246+
}
247+
248+
dontRemove = dontRemove || false;
208249

209250
var exists = _.findIndex($scope.selectedModel, findObj) !== -1;
210251

211252
if (!dontRemove && exists) {
212253
$scope.selectedModel.splice(_.findIndex($scope.selectedModel, findObj), 1);
213254
$scope.externalEvents.onItemDeselect(findObj);
214-
} else if (!exists) {
215-
if ($scope.settings.selectionLimit === 0 || $scope.selectedModel.length < $scope.settings.selectionLimit) {
216-
if ($scope.settings.externalIdProp === '') {
217-
var fullObjFind = getFindObj(id);
218-
var fullObj = _.find($scope.options, fullObjFind);
219-
$scope.selectedModel.push(fullObj);
220-
221-
$scope.externalEvents.onItemSelect(fullObj);
222-
223-
if ($scope.settings.closeOnSelect)
224-
{
225-
$scope.toggleDropdown();
226-
}
227-
}
228-
else {
229-
$scope.selectedModel.push(findObj);
230-
$scope.externalEvents.onItemSelect(findObj);
231-
232-
if ($scope.settings.closeOnDeselect)
233-
{
234-
$scope.toggleDropdown();
235-
}
236-
}
237-
}
238-
else
239-
{
240-
$scope.externalEvents.onMaxSelectionReached();
241-
}
255+
} else if (!exists && ($scope.settings.selectionLimit === 0 || $scope.selectedModel.length < $scope.settings.selectionLimit)) {
256+
$scope.selectedModel.push(finalObj);
257+
$scope.externalEvents.onItemSelect(finalObj);
242258
}
243259
};
244260

245261
$scope.isChecked = function (id) {
262+
if ($scope.singleSelection)
263+
{
264+
return $scope.selectedModel !== null && $scope.selectedModel[$scope.settings.idProp] === getFindObj(id)[$scope.settings.idProp];
265+
}
266+
246267
return _.findIndex($scope.selectedModel, getFindObj(id)) !== -1;
247268
};
248269

0 commit comments

Comments
 (0)