@@ -45,7 +45,8 @@ describe('MdMenu', () => {
45
45
OverlapMenu ,
46
46
CustomMenuPanel ,
47
47
CustomMenu ,
48
- NestedMenu
48
+ NestedMenu ,
49
+ NestedMenuCustomElevation
49
50
] ,
50
51
providers : [
51
52
{ provide : OverlayContainer , useFactory : ( ) => {
@@ -527,7 +528,7 @@ describe('MdMenu', () => {
527
528
expect ( instance . levelTwoTrigger . triggersSubmenu ( ) ) . toBe ( true ) ;
528
529
} ) ;
529
530
530
- it ( 'should set the `isSubmenu` flag on the menu instances' , ( ) => {
531
+ it ( 'should set the `parentMenu` on the sub- menu instances' , ( ) => {
531
532
compileTestComponent ( ) ;
532
533
instance . rootTriggerEl . nativeElement . click ( ) ;
533
534
fixture . detectChanges ( ) ;
@@ -538,9 +539,9 @@ describe('MdMenu', () => {
538
539
instance . levelTwoTrigger . openMenu ( ) ;
539
540
fixture . detectChanges ( ) ;
540
541
541
- expect ( instance . rootMenu . isSubmenu ) . toBe ( false ) ;
542
- expect ( instance . levelOneMenu . isSubmenu ) . toBe ( true ) ;
543
- expect ( instance . levelTwoMenu . isSubmenu ) . toBe ( true ) ;
542
+ expect ( instance . rootMenu . parentMenu ) . toBeFalsy ( ) ;
543
+ expect ( instance . levelOneMenu . parentMenu ) . toBe ( instance . rootMenu ) ;
544
+ expect ( instance . levelTwoMenu . parentMenu ) . toBe ( instance . levelOneMenu ) ;
544
545
} ) ;
545
546
546
547
it ( 'should pass the layout direction the nested menus' , ( ) => {
@@ -871,6 +872,77 @@ describe('MdMenu', () => {
871
872
expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
872
873
} ) ;
873
874
875
+ it ( 'should increase the sub-menu elevation based on its depth' , ( ) => {
876
+ compileTestComponent ( ) ;
877
+ instance . rootTrigger . openMenu ( ) ;
878
+ fixture . detectChanges ( ) ;
879
+
880
+ instance . levelOneTrigger . openMenu ( ) ;
881
+ fixture . detectChanges ( ) ;
882
+
883
+ instance . levelTwoTrigger . openMenu ( ) ;
884
+ fixture . detectChanges ( ) ;
885
+
886
+ const menus = overlay . querySelectorAll ( '.mat-menu-panel' ) ;
887
+
888
+ expect ( menus [ 0 ] . classList )
889
+ . toContain ( 'mat-elevation-z2' , 'Expected root menu to have base elevation.' ) ;
890
+ expect ( menus [ 1 ] . classList )
891
+ . toContain ( 'mat-elevation-z3' , 'Expected first sub-menu to have base elevation + 1.' ) ;
892
+ expect ( menus [ 2 ] . classList )
893
+ . toContain ( 'mat-elevation-z4' , 'Expected second sub-menu to have base elevation + 2.' ) ;
894
+ } ) ;
895
+
896
+ it ( 'should update the elevation when the same menu is opened at a different depth' , ( ) => {
897
+ compileTestComponent ( ) ;
898
+ instance . rootTrigger . openMenu ( ) ;
899
+ fixture . detectChanges ( ) ;
900
+
901
+ instance . levelOneTrigger . openMenu ( ) ;
902
+ fixture . detectChanges ( ) ;
903
+
904
+ instance . levelTwoTrigger . openMenu ( ) ;
905
+ fixture . detectChanges ( ) ;
906
+
907
+ let lastMenu = overlay . querySelectorAll ( '.mat-menu-panel' ) [ 2 ] ;
908
+
909
+ expect ( lastMenu . classList )
910
+ . toContain ( 'mat-elevation-z4' , 'Expected menu to have the base elevation plus two.' ) ;
911
+
912
+ ( overlay . querySelector ( '.cdk-overlay-backdrop' ) ! as HTMLElement ) . click ( ) ;
913
+ fixture . detectChanges ( ) ;
914
+
915
+ expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
916
+
917
+ instance . alternateTrigger . openMenu ( ) ;
918
+ fixture . detectChanges ( ) ;
919
+
920
+ lastMenu = overlay . querySelector ( '.mat-menu-panel' ) as HTMLElement ;
921
+
922
+ expect ( lastMenu . classList )
923
+ . not . toContain ( 'mat-elevation-z4' , 'Expected menu not to maintain old elevation.' ) ;
924
+ expect ( lastMenu . classList )
925
+ . toContain ( 'mat-elevation-z2' , 'Expected menu to have the proper updated elevation.' ) ;
926
+ } ) ;
927
+
928
+ it ( 'should not increase the elevation if the user specified a custom one' , ( ) => {
929
+ const elevationFixture = TestBed . createComponent ( NestedMenuCustomElevation ) ;
930
+
931
+ elevationFixture . detectChanges ( ) ;
932
+ elevationFixture . componentInstance . rootTrigger . openMenu ( ) ;
933
+ elevationFixture . detectChanges ( ) ;
934
+
935
+ elevationFixture . componentInstance . levelOneTrigger . openMenu ( ) ;
936
+ elevationFixture . detectChanges ( ) ;
937
+
938
+ const menuClasses = overlayContainerElement . querySelectorAll ( '.mat-menu-panel' ) [ 1 ] . classList ;
939
+
940
+ expect ( menuClasses )
941
+ . toContain ( 'mat-elevation-z24' , 'Expected user elevation to be maintained' ) ;
942
+ expect ( menuClasses )
943
+ . not . toContain ( 'mat-elevation-z3' , 'Expected no stacked elevation.' ) ;
944
+ } ) ;
945
+
874
946
} ) ;
875
947
876
948
} ) ;
@@ -939,7 +1011,7 @@ class CustomMenuPanel implements MdMenuPanel {
939
1011
xPosition : MenuPositionX = 'after' ;
940
1012
yPosition : MenuPositionY = 'below' ;
941
1013
overlapTrigger = true ;
942
- isSubmenu = false ;
1014
+ parentMenu : MdMenuPanel ;
943
1015
944
1016
@ViewChild ( TemplateRef ) templateRef : TemplateRef < any > ;
945
1017
@Output ( ) close = new EventEmitter < void | 'click' | 'keydown' > ( ) ;
@@ -967,6 +1039,10 @@ class CustomMenu {
967
1039
#rootTrigger="mdMenuTrigger"
968
1040
#rootTriggerEl>Toggle menu</button>
969
1041
1042
+ <button
1043
+ [mdMenuTriggerFor]="levelTwo"
1044
+ #alternateTrigger="mdMenuTrigger">Toggle alternate menu</button>
1045
+
970
1046
<md-menu #root="mdMenu">
971
1047
<button md-menu-item
972
1048
id="level-one-trigger"
@@ -996,10 +1072,31 @@ class NestedMenu {
996
1072
@ViewChild ( 'root' ) rootMenu : MdMenu ;
997
1073
@ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
998
1074
@ViewChild ( 'rootTriggerEl' ) rootTriggerEl : ElementRef ;
1075
+ @ViewChild ( 'alternateTrigger' ) alternateTrigger : MdMenuTrigger ;
999
1076
1000
1077
@ViewChild ( 'levelOne' ) levelOneMenu : MdMenu ;
1001
1078
@ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
1002
1079
1003
1080
@ViewChild ( 'levelTwo' ) levelTwoMenu : MdMenu ;
1004
1081
@ViewChild ( 'levelTwoTrigger' ) levelTwoTrigger : MdMenuTrigger ;
1005
1082
}
1083
+
1084
+ @Component ( {
1085
+ template : `
1086
+ <button [mdMenuTriggerFor]="root" #rootTrigger="mdMenuTrigger">Toggle menu</button>
1087
+
1088
+ <md-menu #root="mdMenu">
1089
+ <button md-menu-item
1090
+ [mdMenuTriggerFor]="levelOne"
1091
+ #levelOneTrigger="mdMenuTrigger">One</button>
1092
+ </md-menu>
1093
+
1094
+ <md-menu #levelOne="mdMenu" class="mat-elevation-z24">
1095
+ <button md-menu-item>Two</button>
1096
+ </md-menu>
1097
+ `
1098
+ } )
1099
+ class NestedMenuCustomElevation {
1100
+ @ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
1101
+ @ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
1102
+ }
0 commit comments