Skip to content

Commit 5d94e5d

Browse files
committed
fix(menu): update menu to use overlay rtl
1 parent 3253ff3 commit 5d94e5d

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

src/lib/core/style/_menu-common.scss

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,22 @@ $md-menu-side-padding: 16px !default;
6868
&.md-menu-before.md-menu-above {
6969
transform-origin: right bottom;
7070
}
71+
72+
[dir='rtl'] & {
73+
&.md-menu-after.md-menu-below {
74+
transform-origin: right top;
75+
}
76+
77+
&.md-menu-after.md-menu-above {
78+
transform-origin: right bottom;
79+
}
80+
81+
&.md-menu-before.md-menu-below {
82+
transform-origin: left top;
83+
}
84+
85+
&.md-menu-before.md-menu-above {
86+
transform-origin: left bottom;
87+
}
88+
}
7189
}

src/lib/menu/menu-trigger.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
import {
2+
AfterViewInit,
23
Directive,
34
ElementRef,
5+
EventEmitter,
46
Input,
7+
OnDestroy,
8+
Optional,
59
Output,
6-
EventEmitter,
10+
Renderer,
711
ViewContainerRef,
8-
AfterViewInit,
9-
OnDestroy,
10-
Renderer
1112
} from '@angular/core';
1213
import {MdMenuPanel} from './menu-panel';
1314
import {MdMenuMissingError} from './menu-errors';
1415
import {
16+
Dir,
17+
LayoutDirection,
1518
ENTER,
1619
SPACE,
1720
Overlay,
@@ -52,7 +55,8 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
5255
@Output() onMenuClose = new EventEmitter<void>();
5356

5457
constructor(private _overlay: Overlay, private _element: ElementRef,
55-
private _viewContainerRef: ViewContainerRef, private _renderer: Renderer) {}
58+
private _viewContainerRef: ViewContainerRef, private _renderer: Renderer,
59+
@Optional() private _dir: Dir) {}
5660

5761
ngAfterViewInit() {
5862
this._checkMenu();
@@ -99,6 +103,11 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
99103
this._renderer.invokeElementMethod(this._element.nativeElement, 'focus');
100104
}
101105

106+
/** The text direction of the containing app. */
107+
get dir(): LayoutDirection {
108+
return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';
109+
}
110+
102111
/**
103112
* This method ensures that the menu closes when the overlay backdrop is clicked.
104113
* We do not use first() here because doing so would not catch clicks from within
@@ -169,9 +178,11 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
169178
*/
170179
private _getOverlayConfig(): OverlayState {
171180
const overlayState = new OverlayState();
172-
overlayState.positionStrategy = this._getPosition();
181+
overlayState.positionStrategy = this._getPosition()
182+
.withDirection(this.dir);
173183
overlayState.hasBackdrop = true;
174184
overlayState.backdropClass = 'md-overlay-transparent-backdrop';
185+
overlayState.direction = this.dir;
175186
return overlayState;
176187
}
177188

src/lib/menu/menu.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ import {
1515
MenuPositionY
1616
} from './menu';
1717
import {OverlayContainer} from '../core/overlay/overlay-container';
18+
import {Dir, LayoutDirection} from '../core/rtl/dir';
1819

1920
describe('MdMenu', () => {
2021
let overlayContainerElement: HTMLElement;
22+
let dir: LayoutDirection = 'ltr';
2123

2224
beforeEach(async(() => {
2325
TestBed.configureTestingModule({
@@ -27,6 +29,9 @@ describe('MdMenu', () => {
2729
{provide: OverlayContainer, useFactory: () => {
2830
overlayContainerElement = document.createElement('div');
2931
return {getContainerElement: () => overlayContainerElement};
32+
}},
33+
{provide: Dir, useFactory: () => {
34+
return {value: dir};
3035
}}
3136
]
3237
});
@@ -74,6 +79,17 @@ describe('MdMenu', () => {
7479
}).not.toThrowError();
7580
});
7681

82+
it('should set the panel direction based on the trigger direction', () => {
83+
dir = 'rtl';
84+
const fixture = TestBed.createComponent(SimpleMenu);
85+
fixture.detectChanges();
86+
fixture.componentInstance.trigger.openMenu();
87+
fixture.detectChanges();
88+
89+
const overlayPane = overlayContainerElement.children[0];
90+
expect(overlayPane.getAttribute('dir')).toEqual('rtl');
91+
});
92+
7793
describe('positions', () => {
7894
it('should append md-menu-after and md-menu-below classes by default', () => {
7995
const fixture = TestBed.createComponent(SimpleMenu);

0 commit comments

Comments
 (0)