@@ -46,7 +46,8 @@ describe('MdMenu', () => {
4646 OverlapMenu ,
4747 CustomMenuPanel ,
4848 CustomMenu ,
49- NestedMenu
49+ NestedMenu ,
50+ NestedMenuCustomElevation
5051 ] ,
5152 providers : [
5253 { provide : OverlayContainer , useFactory : ( ) => {
@@ -528,7 +529,7 @@ describe('MdMenu', () => {
528529 expect ( instance . levelTwoTrigger . triggersSubmenu ( ) ) . toBe ( true ) ;
529530 } ) ;
530531
531- it ( 'should set the `isSubmenu` flag on the menu instances' , ( ) => {
532+ it ( 'should set the `parentMenu` on the sub- menu instances' , ( ) => {
532533 compileTestComponent ( ) ;
533534 instance . rootTriggerEl . nativeElement . click ( ) ;
534535 fixture . detectChanges ( ) ;
@@ -539,9 +540,9 @@ describe('MdMenu', () => {
539540 instance . levelTwoTrigger . openMenu ( ) ;
540541 fixture . detectChanges ( ) ;
541542
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 ) ;
545546 } ) ;
546547
547548 it ( 'should pass the layout direction the nested menus' , ( ) => {
@@ -872,6 +873,77 @@ describe('MdMenu', () => {
872873 expect ( overlay . querySelectorAll ( '.mat-menu-panel' ) . length ) . toBe ( 0 , 'Expected no open menus' ) ;
873874 } ) ;
874875
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+
875947 } ) ;
876948
877949} ) ;
@@ -963,7 +1035,7 @@ class CustomMenuPanel implements MdMenuPanel {
9631035 xPosition : MenuPositionX = 'after' ;
9641036 yPosition : MenuPositionY = 'below' ;
9651037 overlapTrigger = true ;
966- isSubmenu = false ;
1038+ parentMenu : MdMenuPanel ;
9671039
9681040 @ViewChild ( TemplateRef ) templateRef : TemplateRef < any > ;
9691041 @Output ( ) close = new EventEmitter < void | 'click' | 'keydown' > ( ) ;
@@ -991,6 +1063,10 @@ class CustomMenu {
9911063 #rootTrigger="mdMenuTrigger"
9921064 #rootTriggerEl>Toggle menu</button>
9931065
1066+ <button
1067+ [mdMenuTriggerFor]="levelTwo"
1068+ #alternateTrigger="mdMenuTrigger">Toggle alternate menu</button>
1069+
9941070 <md-menu #root="mdMenu">
9951071 <button md-menu-item
9961072 id="level-one-trigger"
@@ -1020,10 +1096,31 @@ class NestedMenu {
10201096 @ViewChild ( 'root' ) rootMenu : MdMenu ;
10211097 @ViewChild ( 'rootTrigger' ) rootTrigger : MdMenuTrigger ;
10221098 @ViewChild ( 'rootTriggerEl' ) rootTriggerEl : ElementRef ;
1099+ @ViewChild ( 'alternateTrigger' ) alternateTrigger : MdMenuTrigger ;
10231100
10241101 @ViewChild ( 'levelOne' ) levelOneMenu : MdMenu ;
10251102 @ViewChild ( 'levelOneTrigger' ) levelOneTrigger : MdMenuTrigger ;
10261103
10271104 @ViewChild ( 'levelTwo' ) levelTwoMenu : MdMenu ;
10281105 @ViewChild ( 'levelTwoTrigger' ) levelTwoTrigger : MdMenuTrigger ;
10291106}
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