@@ -45,7 +45,8 @@ describe('MdMenu', () => {
4545 OverlapMenu ,
4646 CustomMenuPanel ,
4747 CustomMenu ,
48- NestedMenu
48+ NestedMenu ,
49+ NestedMenuCustomElevation
4950 ] ,
5051 providers : [
5152 { provide : OverlayContainer , useFactory : ( ) => {
@@ -527,7 +528,7 @@ describe('MdMenu', () => {
527528 expect ( instance . levelTwoTrigger . triggersSubmenu ( ) ) . toBe ( true ) ;
528529 } ) ;
529530
530- it ( 'should set the `isSubmenu` flag on the menu instances' , ( ) => {
531+ it ( 'should set the `parentMenu` on the sub- menu instances' , ( ) => {
531532 compileTestComponent ( ) ;
532533 instance . rootTriggerEl . nativeElement . click ( ) ;
533534 fixture . detectChanges ( ) ;
@@ -538,9 +539,9 @@ describe('MdMenu', () => {
538539 instance . levelTwoTrigger . openMenu ( ) ;
539540 fixture . detectChanges ( ) ;
540541
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 ) ;
544545 } ) ;
545546
546547 it ( 'should pass the layout direction the nested menus' , ( ) => {
@@ -871,6 +872,77 @@ describe('MdMenu', () => {
871872 expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
872873 } ) ;
873874
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+
874946 } ) ;
875947
876948} ) ;
@@ -939,7 +1011,7 @@ class CustomMenuPanel implements MdMenuPanel {
9391011 xPosition : MenuPositionX = 'after' ;
9401012 yPosition : MenuPositionY = 'below' ;
9411013 overlapTrigger = true ;
942- isSubmenu = false ;
1014+ parentMenu : MdMenuPanel ;
9431015
9441016 @ViewChild ( TemplateRef ) templateRef : TemplateRef < any > ;
9451017 @Output ( ) close = new EventEmitter < void | 'click' | 'keydown' > ( ) ;
@@ -967,6 +1039,10 @@ class CustomMenu {
9671039 #rootTrigger="mdMenuTrigger"
9681040 #rootTriggerEl>Toggle menu</button>
9691041
1042+ <button
1043+ [mdMenuTriggerFor]="levelTwo"
1044+ #alternateTrigger="mdMenuTrigger">Toggle alternate menu</button>
1045+
9701046 <md-menu #root="mdMenu">
9711047 <button md-menu-item
9721048 id="level-one-trigger"
@@ -996,10 +1072,31 @@ class NestedMenu {
9961072 @ViewChild ( 'root' ) rootMenu : MdMenu ;
9971073 @ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
9981074 @ViewChild ( 'rootTriggerEl' ) rootTriggerEl : ElementRef ;
1075+ @ViewChild ( 'alternateTrigger' ) alternateTrigger : MdMenuTrigger ;
9991076
10001077 @ViewChild ( 'levelOne' ) levelOneMenu : MdMenu ;
10011078 @ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
10021079
10031080 @ViewChild ( 'levelTwo' ) levelTwoMenu : MdMenu ;
10041081 @ViewChild ( 'levelTwoTrigger' ) levelTwoTrigger : MdMenuTrigger ;
10051082}
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