Skip to content

Commit 93a21c7

Browse files
crisbetoandrewseguin
authored andcommitted
fix(menu): remove classes from inert element (#4800)
Removes the classes from the inert `md-menu` element, after they're transferred to the menu panel. Fixes #4484.
1 parent 8d9bbbf commit 93a21c7

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

src/lib/menu/menu-directive.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
TemplateRef,
1313
ViewChild,
1414
ViewEncapsulation,
15+
ElementRef,
1516
} from '@angular/core';
1617
import {MenuPositionX, MenuPositionY} from './menu-positions';
1718
import {throwMdMenuInvalidPositionX, throwMdMenuInvalidPositionY} from './menu-errors';
@@ -85,16 +86,22 @@ export class MdMenu implements AfterContentInit, MdMenuPanel, OnDestroy {
8586
*/
8687
@Input('class')
8788
set classList(classes: string) {
88-
this._classList = classes.split(' ').reduce((obj: any, className: string) => {
89-
obj[className] = true;
90-
return obj;
91-
}, {});
92-
this.setPositionClasses();
89+
if (classes && classes.length) {
90+
this._classList = classes.split(' ').reduce((obj: any, className: string) => {
91+
obj[className] = true;
92+
return obj;
93+
}, {});
94+
95+
this._elementRef.nativeElement.className = '';
96+
this.setPositionClasses();
97+
}
9398
}
9499

95100
/** Event emitted when the menu is closed. */
96101
@Output() close = new EventEmitter<void>();
97102

103+
constructor(private _elementRef: ElementRef) { }
104+
98105
ngAfterContentInit() {
99106
this._keyManager = new FocusKeyManager(this.items).withWrap();
100107
this._tabSubscription = this._keyManager.tabOut.subscribe(() => this._emitCloseEvent());

src/lib/menu/menu.spec.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,22 @@ describe('MdMenu', () => {
118118
expect(overlayPane.getAttribute('dir')).toEqual('rtl');
119119
});
120120

121+
it('should transfer any custom classes from the host to the overlay', () => {
122+
const fixture = TestBed.createComponent(SimpleMenu);
123+
124+
fixture.detectChanges();
125+
fixture.componentInstance.trigger.openMenu();
126+
127+
const menuEl = fixture.debugElement.query(By.css('md-menu')).nativeElement;
128+
const panel = overlayContainerElement.querySelector('.mat-menu-panel');
129+
130+
expect(menuEl.classList).not.toContain('custom-one');
131+
expect(menuEl.classList).not.toContain('custom-two');
132+
133+
expect(panel.classList).toContain('custom-one');
134+
expect(panel.classList).toContain('custom-two');
135+
});
136+
121137
describe('positions', () => {
122138
let fixture: ComponentFixture<PositionedMenu>;
123139
let panel: HTMLElement;
@@ -462,7 +478,7 @@ describe('MdMenu', () => {
462478
@Component({
463479
template: `
464480
<button [mdMenuTriggerFor]="menu" #triggerEl>Toggle menu</button>
465-
<md-menu #menu="mdMenu" (close)="closeCallback()">
481+
<md-menu class="custom-one custom-two" #menu="mdMenu" (close)="closeCallback()">
466482
<button md-menu-item> Item </button>
467483
<button md-menu-item disabled> Disabled </button>
468484
</md-menu>

0 commit comments

Comments
 (0)