Skip to content

Commit 7355054

Browse files
authored
fix(material/menu): update submenu indication when menu is assigned (#25608)
In #24437 we added the ability to conditionally remove a menu from a menu trigger. The problem is that the flag that determines if the menu item has the small triangle indicator is only set in the constructor. These changes move the logic to the setter and add a `markForCheck` to ensure that the view is in sync.
1 parent eae2620 commit 7355054

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

src/material/legacy-menu/menu.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,6 +2304,12 @@ describe('MatMenu', () => {
23042304
expect(menuItems[0].querySelector('.mat-menu-submenu-icon')).toBeTruthy();
23052305
expect(menuItems[1].classList).not.toContain('mat-menu-item-submenu-trigger');
23062306
expect(menuItems[1].querySelector('.mat-menu-submenu-icon')).toBeFalsy();
2307+
2308+
instance.levelOneTrigger.menu = null;
2309+
fixture.detectChanges();
2310+
2311+
expect(menuItems[0].classList).not.toContain('mat-menu-item-submenu-trigger');
2312+
expect(menuItems[0].querySelector('.mat-menu-submenu-icon')).toBeFalsy();
23072313
}));
23082314

23092315
it('should increase the sub-menu elevation based on its depth', fakeAsync(() => {

src/material/menu/menu-item.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@ export class MatMenuItem
183183
this._changeDetectorRef?.markForCheck();
184184
}
185185

186+
_setTriggersSubmenu(triggersSubmenu: boolean) {
187+
// @breaking-change 12.0.0 Remove null check for `_changeDetectorRef`.
188+
this._triggersSubmenu = triggersSubmenu;
189+
this._changeDetectorRef?.markForCheck();
190+
}
191+
186192
_hasFocus(): boolean {
187193
return this._document && this._document.activeElement === this._getHostElement();
188194
}

src/material/menu/menu-trigger.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ export abstract class _MatMenuTriggerBase implements AfterContentInit, OnDestroy
159159
}
160160
});
161161
}
162+
163+
this._menuItemInstance?._setTriggersSubmenu(this.triggersSubmenu());
162164
}
163165
private _menu: MatMenuPanel | null;
164166

@@ -257,10 +259,6 @@ export abstract class _MatMenuTriggerBase implements AfterContentInit, OnDestroy
257259
this._handleTouchStart,
258260
passiveEventListenerOptions,
259261
);
260-
261-
if (_menuItemInstance) {
262-
_menuItemInstance._triggersSubmenu = this.triggersSubmenu();
263-
}
264262
}
265263

266264
ngAfterContentInit() {
@@ -296,7 +294,7 @@ export abstract class _MatMenuTriggerBase implements AfterContentInit, OnDestroy
296294

297295
/** Whether the menu triggers a sub-menu or a top-level one. */
298296
triggersSubmenu(): boolean {
299-
return !!(this._menuItemInstance && this._parentMaterialMenu);
297+
return !!(this._menuItemInstance && this._parentMaterialMenu && this.menu);
300298
}
301299

302300
/** Toggles the menu between the open and closed states. */

src/material/menu/menu.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,6 +2315,12 @@ describe('MDC-based MatMenu', () => {
23152315
expect(menuItems[0].querySelector('.mat-mdc-menu-submenu-icon')).toBeTruthy();
23162316
expect(menuItems[1].classList).not.toContain('mat-mdc-menu-item-submenu-trigger');
23172317
expect(menuItems[1].querySelector('.mat-mdc-menu-submenu-icon')).toBeFalsy();
2318+
2319+
instance.levelOneTrigger.menu = null;
2320+
fixture.detectChanges();
2321+
2322+
expect(menuItems[0].classList).not.toContain('mat-mdc-menu-item-submenu-trigger');
2323+
expect(menuItems[0].querySelector('.mat-mdc-menu-submenu-icon')).toBeFalsy();
23182324
}));
23192325

23202326
it('should increase the sub-menu elevation based on its depth', fakeAsync(() => {

tools/public_api_guard/material/menu.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,8 @@ export class MatMenuItem extends _MatMenuItemBase implements FocusableOption, Ca
219219
role: 'menuitem' | 'menuitemradio' | 'menuitemcheckbox';
220220
// (undocumented)
221221
_setHighlighted(isHighlighted: boolean): void;
222+
// (undocumented)
223+
_setTriggersSubmenu(triggersSubmenu: boolean): void;
222224
_triggersSubmenu: boolean;
223225
// (undocumented)
224226
static ɵcmp: i0.ɵɵComponentDeclaration<MatMenuItem, "[mat-menu-item]", ["matMenuItem"], { "disabled": "disabled"; "disableRipple": "disableRipple"; "role": "role"; }, {}, never, ["mat-icon", "*"], false>;

0 commit comments

Comments
 (0)