1- angular . module ( 'ui.bootstrap.dropdown' , [ 'ui.bootstrap.position' ] )
1+ angular . module ( 'ui.bootstrap.dropdown' , [ 'ui.bootstrap.multiMap' , 'ui.bootstrap. position'] )
22
33. constant ( 'uibDropdownConfig' , {
44 appendToOpenClass : 'uib-dropdown-open' ,
55 openClass : 'open'
66} )
77
8- . service ( 'uibDropdownService' , [ '$document' , '$rootScope' , function ( $document , $rootScope ) {
8+ . service ( 'uibDropdownService' , [ '$document' , '$rootScope' , '$$multiMap' , function ( $document , $rootScope , $$multiMap ) {
99 var openScope = null ;
10+ var openedContainers = $$multiMap . createNew ( ) ;
11+
12+ this . isOnlyOpen = function ( dropdownScope , appendTo ) {
13+ var openedDropdowns = openedContainers . get ( appendTo ) ;
14+ if ( openedDropdowns ) {
15+ var openDropdown = openedDropdowns . reduce ( function ( toClose , dropdown ) {
16+ if ( dropdown . scope === dropdownScope ) {
17+ return dropdown ;
18+ }
19+
20+ return toClose ;
21+ } , { } ) ;
22+ if ( openDropdown ) {
23+ return openedDropdowns . length === 1 ;
24+ }
25+ }
1026
11- this . open = function ( dropdownScope , element ) {
27+ return false ;
28+ } ;
29+
30+ this . open = function ( dropdownScope , element , appendTo ) {
1231 if ( ! openScope ) {
1332 $document . on ( 'click' , closeDropdown ) ;
1433 }
@@ -18,14 +37,52 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
1837 }
1938
2039 openScope = dropdownScope ;
40+
41+ if ( ! appendTo ) {
42+ return ;
43+ }
44+
45+ var openedDropdowns = openedContainers . get ( appendTo ) ;
46+ if ( openedDropdowns ) {
47+ var openedScopes = openedDropdowns . map ( function ( dropdown ) {
48+ return dropdown . scope ;
49+ } ) ;
50+ if ( openedScopes . indexOf ( dropdownScope ) === - 1 ) {
51+ openedContainers . put ( appendTo , {
52+ scope : dropdownScope
53+ } ) ;
54+ }
55+ } else {
56+ openedContainers . put ( appendTo , {
57+ scope : dropdownScope
58+ } ) ;
59+ }
2160 } ;
2261
23- this . close = function ( dropdownScope , element ) {
62+ this . close = function ( dropdownScope , element , appendTo ) {
2463 if ( openScope === dropdownScope ) {
2564 $document . off ( 'click' , closeDropdown ) ;
2665 $document . off ( 'keydown' , this . keybindFilter ) ;
2766 openScope = null ;
2867 }
68+
69+ if ( ! appendTo ) {
70+ return ;
71+ }
72+
73+ var openedDropdowns = openedContainers . get ( appendTo ) ;
74+ if ( openedDropdowns ) {
75+ var dropdownToClose = openedDropdowns . reduce ( function ( toClose , dropdown ) {
76+ if ( dropdown . scope === dropdownScope ) {
77+ return dropdown ;
78+ }
79+
80+ return toClose ;
81+ } , { } ) ;
82+ if ( dropdownToClose ) {
83+ openedContainers . remove ( appendTo , dropdownToClose ) ;
84+ }
85+ }
2986 } ;
3087
3188 var closeDropdown = function ( evt ) {
@@ -244,10 +301,18 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
244301 }
245302
246303 var openContainer = appendTo ? appendTo : $element ;
247- var hasOpenClass = openContainer . hasClass ( appendTo ? appendToOpenClass : openClass ) ;
304+ var dropdownOpenClass = appendTo ? appendToOpenClass : openClass ;
305+ var hasOpenClass = openContainer . hasClass ( dropdownOpenClass ) ;
306+ var isOnlyOpen = uibDropdownService . isOnlyOpen ( $scope , appendTo ) ;
248307
249308 if ( hasOpenClass === ! isOpen ) {
250- $animate [ isOpen ? 'addClass' : 'removeClass' ] ( openContainer , appendTo ? appendToOpenClass : openClass ) . then ( function ( ) {
309+ var toggleClass ;
310+ if ( appendTo ) {
311+ toggleClass = ! isOnlyOpen ? 'addClass' : 'removeClass' ;
312+ } else {
313+ toggleClass = isOpen ? 'addClass' : 'removeClass' ;
314+ }
315+ $animate [ toggleClass ] ( openContainer , dropdownOpenClass ) . then ( function ( ) {
251316 if ( angular . isDefined ( isOpen ) && isOpen !== wasOpen ) {
252317 toggleInvoker ( $scope , { open : ! ! isOpen } ) ;
253318 }
@@ -270,10 +335,10 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
270335 }
271336
272337 scope . focusToggleElement ( ) ;
273- uibDropdownService . open ( scope , $element ) ;
338+ uibDropdownService . open ( scope , $element , appendTo ) ;
274339 } else {
275340 $document . off ( 'keydown' , uibDropdownService . keybindFilter ) ;
276- uibDropdownService . close ( scope , $element ) ;
341+ uibDropdownService . close ( scope , $element , appendTo ) ;
277342 if ( self . dropdownMenuTemplateUrl ) {
278343 if ( templateScope ) {
279344 templateScope . $destroy ( ) ;
0 commit comments