@@ -46,7 +46,8 @@ describe('MdMenu', () => {
46
46
OverlapMenu ,
47
47
CustomMenuPanel ,
48
48
CustomMenu ,
49
- NestedMenu
49
+ NestedMenu ,
50
+ NestedMenuCustomElevation
50
51
] ,
51
52
providers : [
52
53
{ provide : OverlayContainer , useFactory : ( ) => {
@@ -530,7 +531,7 @@ describe('MdMenu', () => {
530
531
expect ( instance . levelTwoTrigger . triggersSubmenu ( ) ) . toBe ( true ) ;
531
532
} ) ;
532
533
533
- it ( 'should set the `isSubmenu` flag on the menu instances' , ( ) => {
534
+ it ( 'should set the `parentMenu` on the sub- menu instances' , ( ) => {
534
535
compileTestComponent ( ) ;
535
536
instance . rootTriggerEl . nativeElement . click ( ) ;
536
537
fixture . detectChanges ( ) ;
@@ -541,9 +542,9 @@ describe('MdMenu', () => {
541
542
instance . levelTwoTrigger . openMenu ( ) ;
542
543
fixture . detectChanges ( ) ;
543
544
544
- expect ( instance . rootMenu . isSubmenu ) . toBe ( false ) ;
545
- expect ( instance . levelOneMenu . isSubmenu ) . toBe ( true ) ;
546
- expect ( instance . levelTwoMenu . isSubmenu ) . toBe ( true ) ;
545
+ expect ( instance . rootMenu . parentMenu ) . toBeFalsy ( ) ;
546
+ expect ( instance . levelOneMenu . parentMenu ) . toBe ( instance . rootMenu ) ;
547
+ expect ( instance . levelTwoMenu . parentMenu ) . toBe ( instance . levelOneMenu ) ;
547
548
} ) ;
548
549
549
550
it ( 'should pass the layout direction the nested menus' , ( ) => {
@@ -885,6 +886,77 @@ describe('MdMenu', () => {
885
886
expect ( menuItems [ 1 ] . classList ) . not . toContain ( 'mat-menu-item-submenu-trigger' ) ;
886
887
} ) ;
887
888
889
+ it ( 'should increase the sub-menu elevation based on its depth' , ( ) => {
890
+ compileTestComponent ( ) ;
891
+ instance . rootTrigger . openMenu ( ) ;
892
+ fixture . detectChanges ( ) ;
893
+
894
+ instance . levelOneTrigger . openMenu ( ) ;
895
+ fixture . detectChanges ( ) ;
896
+
897
+ instance . levelTwoTrigger . openMenu ( ) ;
898
+ fixture . detectChanges ( ) ;
899
+
900
+ const menus = overlay . querySelectorAll ( '.mat-menu-panel' ) ;
901
+
902
+ expect ( menus [ 0 ] . classList )
903
+ . toContain ( 'mat-elevation-z2' , 'Expected root menu to have base elevation.' ) ;
904
+ expect ( menus [ 1 ] . classList )
905
+ . toContain ( 'mat-elevation-z3' , 'Expected first sub-menu to have base elevation + 1.' ) ;
906
+ expect ( menus [ 2 ] . classList )
907
+ . toContain ( 'mat-elevation-z4' , 'Expected second sub-menu to have base elevation + 2.' ) ;
908
+ } ) ;
909
+
910
+ it ( 'should update the elevation when the same menu is opened at a different depth' , ( ) => {
911
+ compileTestComponent ( ) ;
912
+ instance . rootTrigger . openMenu ( ) ;
913
+ fixture . detectChanges ( ) ;
914
+
915
+ instance . levelOneTrigger . openMenu ( ) ;
916
+ fixture . detectChanges ( ) ;
917
+
918
+ instance . levelTwoTrigger . openMenu ( ) ;
919
+ fixture . detectChanges ( ) ;
920
+
921
+ let lastMenu = overlay . querySelectorAll ( '.mat-menu-panel' ) [ 2 ] ;
922
+
923
+ expect ( lastMenu . classList )
924
+ . toContain ( 'mat-elevation-z4' , 'Expected menu to have the base elevation plus two.' ) ;
925
+
926
+ ( overlay . querySelector ( '.cdk-overlay-backdrop' ) ! as HTMLElement ) . click ( ) ;
927
+ fixture . detectChanges ( ) ;
928
+
929
+ expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
930
+
931
+ instance . alternateTrigger . openMenu ( ) ;
932
+ fixture . detectChanges ( ) ;
933
+
934
+ lastMenu = overlay . querySelector ( '.mat-menu-panel' ) as HTMLElement ;
935
+
936
+ expect ( lastMenu . classList )
937
+ . not . toContain ( 'mat-elevation-z4' , 'Expected menu not to maintain old elevation.' ) ;
938
+ expect ( lastMenu . classList )
939
+ . toContain ( 'mat-elevation-z2' , 'Expected menu to have the proper updated elevation.' ) ;
940
+ } ) ;
941
+
942
+ it ( 'should not increase the elevation if the user specified a custom one' , ( ) => {
943
+ const elevationFixture = TestBed . createComponent ( NestedMenuCustomElevation ) ;
944
+
945
+ elevationFixture . detectChanges ( ) ;
946
+ elevationFixture . componentInstance . rootTrigger . openMenu ( ) ;
947
+ elevationFixture . detectChanges ( ) ;
948
+
949
+ elevationFixture . componentInstance . levelOneTrigger . openMenu ( ) ;
950
+ elevationFixture . detectChanges ( ) ;
951
+
952
+ const menuClasses = overlayContainerElement . querySelectorAll ( '.mat-menu-panel' ) [ 1 ] . classList ;
953
+
954
+ expect ( menuClasses )
955
+ . toContain ( 'mat-elevation-z24' , 'Expected user elevation to be maintained' ) ;
956
+ expect ( menuClasses )
957
+ . not . toContain ( 'mat-elevation-z3' , 'Expected no stacked elevation.' ) ;
958
+ } ) ;
959
+
888
960
} ) ;
889
961
890
962
} ) ;
@@ -976,7 +1048,7 @@ class CustomMenuPanel implements MdMenuPanel {
976
1048
xPosition : MenuPositionX = 'after' ;
977
1049
yPosition : MenuPositionY = 'below' ;
978
1050
overlapTrigger = true ;
979
- isSubmenu = false ;
1051
+ parentMenu : MdMenuPanel ;
980
1052
981
1053
@ViewChild ( TemplateRef ) templateRef : TemplateRef < any > ;
982
1054
@Output ( ) close = new EventEmitter < void | 'click' | 'keydown' > ( ) ;
@@ -1004,6 +1076,10 @@ class CustomMenu {
1004
1076
#rootTrigger="mdMenuTrigger"
1005
1077
#rootTriggerEl>Toggle menu</button>
1006
1078
1079
+ <button
1080
+ [mdMenuTriggerFor]="levelTwo"
1081
+ #alternateTrigger="mdMenuTrigger">Toggle alternate menu</button>
1082
+
1007
1083
<md-menu #root="mdMenu">
1008
1084
<button md-menu-item
1009
1085
id="level-one-trigger"
@@ -1033,10 +1109,31 @@ class NestedMenu {
1033
1109
@ViewChild ( 'root' ) rootMenu : MdMenu ;
1034
1110
@ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
1035
1111
@ViewChild ( 'rootTriggerEl' ) rootTriggerEl : ElementRef ;
1112
+ @ViewChild ( 'alternateTrigger' ) alternateTrigger : MdMenuTrigger ;
1036
1113
1037
1114
@ViewChild ( 'levelOne' ) levelOneMenu : MdMenu ;
1038
1115
@ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
1039
1116
1040
1117
@ViewChild ( 'levelTwo' ) levelTwoMenu : MdMenu ;
1041
1118
@ViewChild ( 'levelTwoTrigger' ) levelTwoTrigger : MdMenuTrigger ;
1042
1119
}
1120
+
1121
+ @Component ( {
1122
+ template : `
1123
+ <button [mdMenuTriggerFor]="root" #rootTrigger="mdMenuTrigger">Toggle menu</button>
1124
+
1125
+ <md-menu #root="mdMenu">
1126
+ <button md-menu-item
1127
+ [mdMenuTriggerFor]="levelOne"
1128
+ #levelOneTrigger="mdMenuTrigger">One</button>
1129
+ </md-menu>
1130
+
1131
+ <md-menu #levelOne="mdMenu" class="mat-elevation-z24">
1132
+ <button md-menu-item>Two</button>
1133
+ </md-menu>
1134
+ `
1135
+ } )
1136
+ class NestedMenuCustomElevation {
1137
+ @ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
1138
+ @ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
1139
+ }
0 commit comments