@@ -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 : ( ) => {
@@ -528,7 +529,7 @@ describe('MdMenu', () => {
528
529
expect ( instance . levelTwoTrigger . triggersSubmenu ( ) ) . toBe ( true ) ;
529
530
} ) ;
530
531
531
- it ( 'should set the `isSubmenu` flag on the menu instances' , ( ) => {
532
+ it ( 'should set the `parentMenu` on the sub- menu instances' , ( ) => {
532
533
compileTestComponent ( ) ;
533
534
instance . rootTriggerEl . nativeElement . click ( ) ;
534
535
fixture . detectChanges ( ) ;
@@ -539,9 +540,9 @@ describe('MdMenu', () => {
539
540
instance . levelTwoTrigger . openMenu ( ) ;
540
541
fixture . detectChanges ( ) ;
541
542
542
- expect ( instance . rootMenu . isSubmenu ) . toBe ( false ) ;
543
- expect ( instance . levelOneMenu . isSubmenu ) . toBe ( true ) ;
544
- expect ( instance . levelTwoMenu . isSubmenu ) . toBe ( true ) ;
543
+ expect ( instance . rootMenu . parentMenu ) . toBeFalsy ( ) ;
544
+ expect ( instance . levelOneMenu . parentMenu ) . toBe ( instance . rootMenu ) ;
545
+ expect ( instance . levelTwoMenu . parentMenu ) . toBe ( instance . levelOneMenu ) ;
545
546
} ) ;
546
547
547
548
it ( 'should pass the layout direction the nested menus' , ( ) => {
@@ -872,6 +873,77 @@ describe('MdMenu', () => {
872
873
expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
873
874
} ) ;
874
875
876
+ it ( 'should increase the sub-menu elevation based on its depth' , ( ) => {
877
+ compileTestComponent ( ) ;
878
+ instance . rootTrigger . openMenu ( ) ;
879
+ fixture . detectChanges ( ) ;
880
+
881
+ instance . levelOneTrigger . openMenu ( ) ;
882
+ fixture . detectChanges ( ) ;
883
+
884
+ instance . levelTwoTrigger . openMenu ( ) ;
885
+ fixture . detectChanges ( ) ;
886
+
887
+ const menus = overlay . querySelectorAll ( '.mat-menu-panel' ) ;
888
+
889
+ expect ( menus [ 0 ] . classList )
890
+ . toContain ( 'mat-elevation-z2' , 'Expected root menu to have base elevation.' ) ;
891
+ expect ( menus [ 1 ] . classList )
892
+ . toContain ( 'mat-elevation-z3' , 'Expected first sub-menu to have base elevation + 1.' ) ;
893
+ expect ( menus [ 2 ] . classList )
894
+ . toContain ( 'mat-elevation-z4' , 'Expected second sub-menu to have base elevation + 2.' ) ;
895
+ } ) ;
896
+
897
+ it ( 'should update the elevation when the same menu is opened at a different depth' , ( ) => {
898
+ compileTestComponent ( ) ;
899
+ instance . rootTrigger . openMenu ( ) ;
900
+ fixture . detectChanges ( ) ;
901
+
902
+ instance . levelOneTrigger . openMenu ( ) ;
903
+ fixture . detectChanges ( ) ;
904
+
905
+ instance . levelTwoTrigger . openMenu ( ) ;
906
+ fixture . detectChanges ( ) ;
907
+
908
+ let lastMenu = overlay . querySelectorAll ( '.mat-menu-panel' ) [ 2 ] ;
909
+
910
+ expect ( lastMenu . classList )
911
+ . toContain ( 'mat-elevation-z4' , 'Expected menu to have the base elevation plus two.' ) ;
912
+
913
+ ( overlay . querySelector ( '.cdk-overlay-backdrop' ) ! as HTMLElement ) . click ( ) ;
914
+ fixture . detectChanges ( ) ;
915
+
916
+ expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
917
+
918
+ instance . alternateTrigger . openMenu ( ) ;
919
+ fixture . detectChanges ( ) ;
920
+
921
+ lastMenu = overlay . querySelector ( '.mat-menu-panel' ) as HTMLElement ;
922
+
923
+ expect ( lastMenu . classList )
924
+ . not . toContain ( 'mat-elevation-z4' , 'Expected menu not to maintain old elevation.' ) ;
925
+ expect ( lastMenu . classList )
926
+ . toContain ( 'mat-elevation-z2' , 'Expected menu to have the proper updated elevation.' ) ;
927
+ } ) ;
928
+
929
+ it ( 'should not increase the elevation if the user specified a custom one' , ( ) => {
930
+ const elevationFixture = TestBed . createComponent ( NestedMenuCustomElevation ) ;
931
+
932
+ elevationFixture . detectChanges ( ) ;
933
+ elevationFixture . componentInstance . rootTrigger . openMenu ( ) ;
934
+ elevationFixture . detectChanges ( ) ;
935
+
936
+ elevationFixture . componentInstance . levelOneTrigger . openMenu ( ) ;
937
+ elevationFixture . detectChanges ( ) ;
938
+
939
+ const menuClasses = overlayContainerElement . querySelectorAll ( '.mat-menu-panel' ) [ 1 ] . classList ;
940
+
941
+ expect ( menuClasses )
942
+ . toContain ( 'mat-elevation-z24' , 'Expected user elevation to be maintained' ) ;
943
+ expect ( menuClasses )
944
+ . not . toContain ( 'mat-elevation-z3' , 'Expected no stacked elevation.' ) ;
945
+ } ) ;
946
+
875
947
} ) ;
876
948
877
949
} ) ;
@@ -963,7 +1035,7 @@ class CustomMenuPanel implements MdMenuPanel {
963
1035
xPosition : MenuPositionX = 'after' ;
964
1036
yPosition : MenuPositionY = 'below' ;
965
1037
overlapTrigger = true ;
966
- isSubmenu = false ;
1038
+ parentMenu : MdMenuPanel ;
967
1039
968
1040
@ViewChild ( TemplateRef ) templateRef : TemplateRef < any > ;
969
1041
@Output ( ) close = new EventEmitter < void | 'click' | 'keydown' > ( ) ;
@@ -991,6 +1063,10 @@ class CustomMenu {
991
1063
#rootTrigger="mdMenuTrigger"
992
1064
#rootTriggerEl>Toggle menu</button>
993
1065
1066
+ <button
1067
+ [mdMenuTriggerFor]="levelTwo"
1068
+ #alternateTrigger="mdMenuTrigger">Toggle alternate menu</button>
1069
+
994
1070
<md-menu #root="mdMenu">
995
1071
<button md-menu-item
996
1072
id="level-one-trigger"
@@ -1020,10 +1096,31 @@ class NestedMenu {
1020
1096
@ViewChild ( 'root' ) rootMenu : MdMenu ;
1021
1097
@ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
1022
1098
@ViewChild ( 'rootTriggerEl' ) rootTriggerEl : ElementRef ;
1099
+ @ViewChild ( 'alternateTrigger' ) alternateTrigger : MdMenuTrigger ;
1023
1100
1024
1101
@ViewChild ( 'levelOne' ) levelOneMenu : MdMenu ;
1025
1102
@ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
1026
1103
1027
1104
@ViewChild ( 'levelTwo' ) levelTwoMenu : MdMenu ;
1028
1105
@ViewChild ( 'levelTwoTrigger' ) levelTwoTrigger : MdMenuTrigger ;
1029
1106
}
1107
+
1108
+ @Component ( {
1109
+ template : `
1110
+ <button [mdMenuTriggerFor]="root" #rootTrigger="mdMenuTrigger">Toggle menu</button>
1111
+
1112
+ <md-menu #root="mdMenu">
1113
+ <button md-menu-item
1114
+ [mdMenuTriggerFor]="levelOne"
1115
+ #levelOneTrigger="mdMenuTrigger">One</button>
1116
+ </md-menu>
1117
+
1118
+ <md-menu #levelOne="mdMenu" class="mat-elevation-z24">
1119
+ <button md-menu-item>Two</button>
1120
+ </md-menu>
1121
+ `
1122
+ } )
1123
+ class NestedMenuCustomElevation {
1124
+ @ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
1125
+ @ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
1126
+ }
0 commit comments