Skip to content

Commit 72979c7

Browse files
committed
feat(menu): Added ability to show the menu overlay around the menu trigger
1 parent adfc4d1 commit 72979c7

File tree

6 files changed

+71
-9
lines changed

6 files changed

+71
-9
lines changed

src/demo-app/menu/menu-demo.html

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,54 @@
6262
</md-menu>
6363
</div>
6464
</div>
65+
66+
<div class="demo-menu">
67+
<div class="menu-section">
68+
<p>overlay-trigger: false</p>
69+
70+
<md-toolbar>
71+
<button md-icon-button [md-menu-trigger-for]="menuOverlay">
72+
<md-icon>more_vert</md-icon>
73+
</button>
74+
</md-toolbar>
75+
76+
<md-menu overlay-trigger="false" #menuOverlay="mdMenu">
77+
<button md-menu-item *ngFor="let item of items" [disabled]="item.disabled">
78+
{{ item.text }}
79+
</button>
80+
</md-menu>
81+
</div>
82+
<div class="menu-section">
83+
<p>
84+
Position x: before, overlay-trigger: false
85+
</p>
86+
<md-toolbar class="end-icon">
87+
<button md-icon-button [md-menu-trigger-for]="posXMenuOverlay">
88+
<md-icon>more_vert</md-icon>
89+
</button>
90+
</md-toolbar>
91+
92+
<md-menu x-position="before" overlay-trigger="false" #posXMenuOverlay="mdMenu" class="before">
93+
<button md-menu-item *ngFor="let item of iconItems" [disabled]="item.disabled">
94+
<md-icon>{{ item.icon }}</md-icon>
95+
{{ item.text }}
96+
</button>
97+
</md-menu>
98+
</div>
99+
<div class="menu-section">
100+
<p>
101+
Position y: above, overlay-trigger: false
102+
</p>
103+
<md-toolbar>
104+
<button md-icon-button [md-menu-trigger-for]="posYMenuOverlay">
105+
<md-icon>more_vert</md-icon>
106+
</button>
107+
</md-toolbar>
108+
109+
<md-menu y-position="above" overlay-trigger="false" #posYMenuOverlay="mdMenu">
110+
<button md-menu-item *ngFor="let item of items" [disabled]="item.disabled">
111+
{{ item.text }}
112+
</button>
113+
</md-menu>
114+
</div>
115+
</div>

src/lib/menu/README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# md-menu
22

3-
`md-menu` is a list of options that displays when triggered. You can read more about menus in the
3+
`md-menu` is a list of options that displays when triggered. You can read more about menus in the
44
[Material Design spec](https://material.google.com/components/menus.html).
55

66
### Not yet implemented
@@ -114,8 +114,9 @@ Output:
114114

115115
### Customizing menu position
116116

117-
By default, the menu will display after and below its trigger. You can change this display position
118-
using the `x-position` (`before | after`) and `y-position` (`above | below`) attributes.
117+
By default, the menu will display after and below its trigger. You can change this display position
118+
using the `x-position` (`before | after`) and `y-position` (`above | below`) attributes. The menu
119+
can be positioned over the menu button or outside using `overlay-trigger` (`true | false`).
119120

120121
*my-comp.html*
121122
```html
@@ -148,7 +149,8 @@ also adds `aria-hasPopup="true"` to the trigger element.
148149
| --- | --- | --- |
149150
| `x-position` | `before | after` | The horizontal position of the menu in relation to the trigger. Defaults to `after`. |
150151
| `y-position` | `above | below` | The vertical position of the menu in relation to the trigger. Defaults to `below`. |
151-
152+
| `overlay-trigger` | `true | false` | Whether to have the menu show on top of the menu trigger or outside. Defaults to `true`. |
153+
152154
### Trigger Programmatic API
153155

154156
**Properties**

src/lib/menu/menu-directive.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,18 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy {
4646

4747
positionX: MenuPositionX = 'after';
4848
positionY: MenuPositionY = 'below';
49+
overlayTrigger = true;
4950

5051
@ViewChild(TemplateRef) templateRef: TemplateRef<any>;
5152
@ContentChildren(MdMenuItem) items: QueryList<MdMenuItem>;
5253

5354
constructor(@Attribute('x-position') posX: MenuPositionX,
54-
@Attribute('y-position') posY: MenuPositionY) {
55+
@Attribute('y-position') posY: MenuPositionY,
56+
@Attribute('overlay-trigger') trigger = true) {
5557
if (posX) { this._setPositionX(posX); }
5658
if (posY) { this._setPositionY(posY); }
59+
60+
this.overlayTrigger = trigger;
5761
this._setPositionClasses();
5862
}
5963

src/lib/menu/menu-panel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {MenuPositionX, MenuPositionY} from './menu-positions';
44
export interface MdMenuPanel {
55
positionX: MenuPositionX;
66
positionY: MenuPositionY;
7+
overlayTrigger: boolean;
78
templateRef: TemplateRef<any>;
89
close: EventEmitter<void>;
910
focusFirstItem: () => void;

src/lib/menu/menu-trigger.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,15 @@ export class MdMenuTrigger implements AfterViewInit, OnDestroy {
197197
*/
198198
private _getPosition(): ConnectedPositionStrategy {
199199
const positionX: HorizontalConnectionPos = this.menu.positionX === 'before' ? 'end' : 'start';
200-
const positionY: VerticalConnectionPos = this.menu.positionY === 'above' ? 'bottom' : 'top';
201-
200+
const overlayY: VerticalConnectionPos = this.menu.positionY === 'above' ? 'bottom' : 'top';
201+
let originY = overlayY;
202+
if (this.menu.overlayTrigger) {
203+
originY = overlayY === 'top' ? 'bottom' : 'top';
204+
}
202205
return this._overlay.position().connectedTo(
203206
this._element,
204-
{originX: positionX, originY: positionY},
205-
{overlayX: positionX, overlayY: positionY}
207+
{originX: positionX, originY: originY},
208+
{overlayX: positionX, overlayY: overlayY}
206209
);
207210
}
208211

src/lib/menu/menu.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ class PositionedMenu {
195195
class CustomMenuPanel implements MdMenuPanel {
196196
positionX: MenuPositionX = 'after';
197197
positionY: MenuPositionY = 'below';
198+
overlayTrigger: true;
198199
@ViewChild(TemplateRef) templateRef: TemplateRef<any>;
199200
@Output() close = new EventEmitter<void>();
200201
focusFirstItem = () => {};

0 commit comments

Comments
 (0)