1
- angular . module ( 'ui.bootstrap.dropdown' , [ 'ui.bootstrap.position' ] )
1
+ angular . module ( 'ui.bootstrap.dropdown' , [ 'ui.bootstrap.multiMap' , 'ui.bootstrap. position'] )
2
2
3
3
. constant ( 'uibDropdownConfig' , {
4
4
appendToOpenClass : 'uib-dropdown-open' ,
5
5
openClass : 'open'
6
6
} )
7
7
8
- . service ( 'uibDropdownService' , [ '$document' , '$rootScope' , function ( $document , $rootScope ) {
8
+ . service ( 'uibDropdownService' , [ '$document' , '$rootScope' , '$$multiMap' , function ( $document , $rootScope , $$multiMap ) {
9
9
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
+ }
10
26
11
- this . open = function ( dropdownScope , element ) {
27
+ return false ;
28
+ } ;
29
+
30
+ this . open = function ( dropdownScope , element , appendTo ) {
12
31
if ( ! openScope ) {
13
32
$document . on ( 'click' , closeDropdown ) ;
14
33
}
@@ -18,14 +37,52 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
18
37
}
19
38
20
39
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
+ }
21
60
} ;
22
61
23
- this . close = function ( dropdownScope , element ) {
62
+ this . close = function ( dropdownScope , element , appendTo ) {
24
63
if ( openScope === dropdownScope ) {
25
64
$document . off ( 'click' , closeDropdown ) ;
26
65
$document . off ( 'keydown' , this . keybindFilter ) ;
27
66
openScope = null ;
28
67
}
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
+ }
29
86
} ;
30
87
31
88
var closeDropdown = function ( evt ) {
@@ -244,10 +301,18 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
244
301
}
245
302
246
303
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 ) ;
248
307
249
308
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 ( ) {
251
316
if ( angular . isDefined ( isOpen ) && isOpen !== wasOpen ) {
252
317
toggleInvoker ( $scope , { open : ! ! isOpen } ) ;
253
318
}
@@ -270,10 +335,10 @@ angular.module('ui.bootstrap.dropdown', ['ui.bootstrap.position'])
270
335
}
271
336
272
337
scope . focusToggleElement ( ) ;
273
- uibDropdownService . open ( scope , $element ) ;
338
+ uibDropdownService . open ( scope , $element , appendTo ) ;
274
339
} else {
275
340
$document . off ( 'keydown' , uibDropdownService . keybindFilter ) ;
276
- uibDropdownService . close ( scope , $element ) ;
341
+ uibDropdownService . close ( scope , $element , appendTo ) ;
277
342
if ( self . dropdownMenuTemplateUrl ) {
278
343
if ( templateScope ) {
279
344
templateScope . $destroy ( ) ;
0 commit comments