Skip to content

Commit 8069641

Browse files
swseverancejelbourn
authored andcommittedFeb 11, 2019
fix(menu): prevent removal of mat-elevation class (#15035)
Fixes a bug to prevent mat-elevation classes from being removed from menu panel after `MatMenu`'s `panelClass` input is updated
1 parent 4819c5b commit 8069641

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed
 

‎src/lib/menu/menu-directive.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,25 @@ export class MatMenu implements AfterContentInit, MatMenuPanel<MatMenuItem>, OnI
196196
*/
197197
@Input('class')
198198
set panelClass(classes: string) {
199+
const previousPanelClass = this._previousPanelClass;
200+
201+
if (previousPanelClass && previousPanelClass.length) {
202+
previousPanelClass.split(' ').forEach((className: string) => {
203+
this._classList[className] = false;
204+
});
205+
}
206+
207+
this._previousPanelClass = classes;
208+
199209
if (classes && classes.length) {
200-
this._classList = classes.split(' ').reduce((obj: any, className: string) => {
201-
obj[className] = true;
202-
return obj;
203-
}, {});
210+
classes.split(' ').forEach((className: string) => {
211+
this._classList[className] = true;
212+
});
204213

205214
this._elementRef.nativeElement.className = '';
206215
}
207216
}
217+
private _previousPanelClass: string;
208218

209219
/**
210220
* This method takes classes set on the host mat-menu element and applies them on the

‎src/lib/menu/menu.spec.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ describe('MatMenu', () => {
384384
it('should transfer any custom classes from the host to the overlay', () => {
385385
const fixture = createComponent(SimpleMenu, [], [FakeIcon]);
386386

387+
fixture.componentInstance.panelClass = 'custom-one custom-two';
387388
fixture.detectChanges();
388389
fixture.componentInstance.trigger.openMenu();
389390
fixture.detectChanges();
@@ -398,6 +399,28 @@ describe('MatMenu', () => {
398399
expect(panel.classList).toContain('custom-two');
399400
});
400401

402+
it('should not remove mat-elevation class from overlay when panelClass is changed', () => {
403+
const fixture = createComponent(SimpleMenu, [], [FakeIcon]);
404+
405+
fixture.componentInstance.panelClass = 'custom-one';
406+
fixture.detectChanges();
407+
fixture.componentInstance.trigger.openMenu();
408+
fixture.detectChanges();
409+
410+
const panel = overlayContainerElement.querySelector('.mat-menu-panel')!;
411+
412+
expect(panel.classList).toContain('custom-one');
413+
expect(panel.classList).toContain('mat-elevation-z4');
414+
415+
fixture.componentInstance.panelClass = 'custom-two';
416+
fixture.detectChanges();
417+
418+
expect(panel.classList).not.toContain('custom-one');
419+
expect(panel.classList).toContain('custom-two');
420+
expect(panel.classList)
421+
.toContain('mat-elevation-z4', 'Expected mat-elevation-z4 not to be removed');
422+
});
423+
401424
it('should set the "menu" role on the overlay panel', () => {
402425
const fixture = createComponent(SimpleMenu, [], [FakeIcon]);
403426
fixture.detectChanges();
@@ -1858,7 +1881,7 @@ describe('MatMenu default overrides', () => {
18581881
<button [matMenuTriggerFor]="menu" #triggerEl>Toggle menu</button>
18591882
<mat-menu
18601883
#menu="matMenu"
1861-
class="custom-one custom-two"
1884+
[class]="panelClass"
18621885
(closed)="closeCallback($event)"
18631886
[backdropClass]="backdropClass">
18641887
@@ -1880,6 +1903,7 @@ class SimpleMenu {
18801903
extraItems: string[] = [];
18811904
closeCallback = jasmine.createSpy('menu closed callback');
18821905
backdropClass: string;
1906+
panelClass: string;
18831907
}
18841908

18851909
@Component({

0 commit comments

Comments
 (0)
Please sign in to comment.