Skip to content

Commit 2b913de

Browse files
karajelbourn
authored andcommitted
fix(menu): update menu to use overlay rtl (#1687)
1 parent 267e323 commit 2b913de

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,18 +1,21 @@
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 {
1516
isFakeMousedownFromScreenReader,
17+
Dir,
18+
LayoutDirection,
1619
Overlay,
1720
OverlayState,
1821
OverlayRef,
@@ -51,7 +54,8 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
5154
@Output() onMenuClose = new EventEmitter<void>();
5255

5356
constructor(private _overlay: Overlay, private _element: ElementRef,
54-
private _viewContainerRef: ViewContainerRef, private _renderer: Renderer) {}
57+
private _viewContainerRef: ViewContainerRef, private _renderer: Renderer,
58+
@Optional() private _dir: Dir) {}
5559

5660
ngAfterViewInit() {
5761
this._checkMenu();
@@ -98,6 +102,11 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
98102
this._renderer.invokeElementMethod(this._element.nativeElement, 'focus');
99103
}
100104

105+
/** The text direction of the containing app. */
106+
get dir(): LayoutDirection {
107+
return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';
108+
}
109+
101110
/**
102111
* This method ensures that the menu closes when the overlay backdrop is clicked.
103112
* We do not use first() here because doing so would not catch clicks from within
@@ -173,9 +182,11 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
173182
*/
174183
private _getOverlayConfig(): OverlayState {
175184
const overlayState = new OverlayState();
176-
overlayState.positionStrategy = this._getPosition();
185+
overlayState.positionStrategy = this._getPosition()
186+
.withDirection(this.dir);
177187
overlayState.hasBackdrop = true;
178188
overlayState.backdropClass = 'md-overlay-transparent-backdrop';
189+
overlayState.direction = this.dir;
179190
return overlayState;
180191
}
181192

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)