@@ -33,14 +33,17 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
3333 template += '<ul class="dropdown-menu dropdown-menu-form" ng-if="open" ng-style="{display: open ? \'block\' : \'none\', height : settings.scrollable ? settings.scrollableHeight : \'auto\', overflow: \'auto\' }" >' ;
3434 template += '<li ng-if="settings.showCheckAll && settings.selectionLimit !== 1"><a ng-keydown="keyDownLink($event)" data-ng-click="selectAll()" tabindex="-1" id="selectAll"><span class="glyphicon glyphicon-ok"></span> {{texts.checkAll}}</a>' ;
3535 template += '<li ng-if="settings.showUncheckAll"><a ng-keydown="keyDownLink($event)" data-ng-click="deselectAll();" tabindex="-1" id="deselectAll"><span class="glyphicon glyphicon-remove"></span> {{texts.uncheckAll}}</a></li>' ;
36+ template += '<li ng-if="settings.selectByGroups && ((settings.showCheckAll && settings.selectionLimit > 0) || settings.showUncheckAll)" class="divider"></li>' ;
37+ template += '<li ng-repeat="currentGroup in settings.selectByGroups track by $index" ng-click="selectCurrentGroup(currentGroup)"><a ng-class="{\'dropdown-selected-group\': selectedGroup === currentGroup}" tabindex="-1">{{::texts.selectGroup}} {{::getGroupLabel(currentGroup)}}</a></li>' ;
38+ template += '<li ng-if="settings.selectByGroups && settings.showEnableSearchButton" class="divider"></li>' ;
3639 template += '<li ng-if="settings.showEnableSearchButton && settings.enableSearch"><a ng-keydown="keyDownLink($event); keyDownToggleSearch();" ng-click="toggleSearch($event);" tabindex="-1">{{texts.disableSearch}}</a></li>' ;
37- template += '<li ng-if="settings.showEnableSearchButton && !settings.enableSearch"><a ng-keydown="keyDownLink($event); keyDownToggleSearch();" ng-click="toggleSearch($event);" tabindex="-1">{{texts.enableSearch}}</a></li>' ;
38- template += '<li ng-if="(settings.showCheckAll && settings.selectionLimit > 0) || settings.showUncheckAll || settings.showEnableSearchButton" class="divider"></li>' ;
40+ template += '<li ng-if="settings.showEnableSearchButton && !settings.enableSearch"><a ng-keydown="keyDownLink($event); keyDownToggleSearch();" ng-click="toggleSearch($event);" tabindex="-1">{{texts.enableSearch}}</a></li>' ;
41+ template += '<li ng-if="(settings.showCheckAll && settings.selectionLimit > 0) || settings.showUncheckAll || settings.showEnableSearchButton" class="divider"></li>' ;
3942 template += '<li ng-if="settings.enableSearch"><div class="dropdown-header"><input type="text" class="form-control searchField" ng-keydown="keyDownSearchDefault($event); keyDownSearch($event, input.searchFilter);" ng-style="{width: \'100%\'}" ng-model="input.searchFilter" placeholder="{{texts.searchPlaceholder}}" /></li>' ;
4043 template += '<li ng-if="settings.enableSearch" class="divider"></li>' ;
4144
4245 if ( groups ) {
43- template += '<li ng-repeat-start="option in orderedItems | filter:getFilter(input.searchFilter)" ng-show="getPropertyForObject(option, settings.groupBy) !== getPropertyForObject(orderedItems[$index - 1], settings.groupBy)" role="presentation" class="dropdown-header">{{ getGroupTitle (getPropertyForObject(option, settings.groupBy)) }}</li>' ;
46+ template += '<li ng-repeat-start="option in orderedItems | filter:getFilter(input.searchFilter)" ng-show="getPropertyForObject(option, settings.groupBy) !== getPropertyForObject(orderedItems[$index - 1], settings.groupBy)" role="presentation" class="dropdown-header">{{ getGroupLabel (getPropertyForObject(option, settings.groupBy)) }}</li>' ;
4447 template += '<li ng-class="{\'active\': isChecked(getPropertyForObject(option,settings.idProp)) && settings.styleActive}" ng-repeat-end role="presentation">' ;
4548 } else {
4649 template += '<li ng-class="{\'active\': isChecked(getPropertyForObject(option,settings.idProp)) && settings.styleActive}" role="presentation" ng-repeat="option in options | filter:getFilter(input.searchFilter)">' ;
@@ -80,7 +83,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
8083 angular . element ( $element ) [ 0 ] . querySelector ( '.option' ) . focus ( ) ;
8184 } , 0 ) ;
8285 }
83- }
86+ }
8487 }
8588 } ;
8689
@@ -96,7 +99,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
9699 onDeselectAll : angular . noop ,
97100 onInitDone : angular . noop ,
98101 onMaxSelectionReached : angular . noop ,
99- onSelectionChanged : angular . noop
102+ onSelectionChanged : angular . noop
100103 } ;
101104
102105 $scope . settings = {
@@ -133,8 +136,9 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
133136 searchPlaceholder : 'Search...' ,
134137 buttonDefaultText : 'Select' ,
135138 dynamicButtonTextSuffix : 'checked' ,
136- disableSearch : 'Disable search' ,
137- enableSearch : 'Enable search'
139+ disableSearch : 'Disable search' ,
140+ enableSearch : 'Enable search' ,
141+ selectGroup : 'Select all:'
138142 } ;
139143
140144 $scope . input = {
@@ -157,6 +161,18 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
157161 }
158162 } ) ;
159163
164+ $scope . selectCurrentGroup = function ( currentGroup ) {
165+ $scope . selectedModel . splice ( 0 , $scope . selectedModel . length ) ;
166+ if ( $scope . orderedItems ) {
167+ $scope . orderedItems . forEach ( function ( item ) {
168+ if ( item [ $scope . groupBy ] === currentGroup ) {
169+ $scope . setSelectedItem ( $scope . getPropertyForObject ( item , $scope . settings . idProp ) , false , false )
170+ }
171+ } ) ;
172+ }
173+ $scope . externalEvents . onSelectionChanged ( ) ;
174+ } ;
175+
160176 angular . extend ( $scope . settings , $scope . extraSettings || [ ] ) ;
161177 angular . extend ( $scope . externalEvents , $scope . events || [ ] ) ;
162178 angular . extend ( $scope . texts , $scope . translationTexts ) ;
@@ -211,7 +227,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
211227 } ) ;
212228 }
213229
214- $scope . getGroupTitle = function ( groupValue ) {
230+ $scope . getGroupLabel = function ( groupValue ) {
215231 if ( $scope . settings . groupByTextProvider !== null ) {
216232 return $scope . settings . groupByTextProvider ( groupValue ) ;
217233 }
@@ -277,6 +293,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
277293 $scope . setSelectedItem ( value [ $scope . settings . idProp ] , true , false ) ;
278294 } ) ;
279295 $scope . externalEvents . onSelectionChanged ( ) ;
296+ $scope . selectedGroup = null ;
280297 } ;
281298
282299 $scope . deselectAll = function ( dontSendEvent ) {
@@ -294,6 +311,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
294311 if ( ! dontSendEvent ) {
295312 $scope . externalEvents . onSelectionChanged ( ) ;
296313 }
314+ $scope . selectedGroup = null ;
297315 } ;
298316
299317 $scope . setSelectedItem = function ( id , dontRemove , fireSelectionChange ) {
@@ -330,8 +348,9 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
330348 }
331349 }
332350 if ( fireSelectionChange ) {
333- $scope . externalEvents . onSelectionChanged ( ) ;
351+ $scope . externalEvents . onSelectionChanged ( ) ;
334352 }
353+ $scope . selectedGroup = null ;
335354 } ;
336355
337356 $scope . isChecked = function ( id ) {
@@ -443,13 +462,13 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
443462 }
444463 }
445464 } ;
446-
465+
447466 $scope . getFilter = function ( searchFilter ) {
448467 var filter = { } ;
449468 filter [ $scope . settings . searchField ] = searchFilter ;
450469 return filter ;
451470 } ;
452-
471+
453472 $scope . toggleSearch = function ( $event ) {
454473 if ( $event ) {
455474 $event . stopPropagation ( ) ;
@@ -459,7 +478,7 @@ directiveModule.directive('ngDropdownMultiselect', ['$filter', '$document', '$co
459478 $scope . input . searchFilter = '' ;
460479 }
461480 } ;
462-
481+
463482 $scope . keyDownToggleSearch = function ( ) {
464483 if ( ! $scope . settings . keyboardControls ) {
465484 return ;
0 commit comments