@@ -27,6 +27,7 @@ import {merge, partition} from 'rxjs';
2727import { skip , takeUntil , skipWhile } from 'rxjs/operators' ;
2828import { MENU_STACK , MenuStack } from './menu-stack' ;
2929import { CdkMenuTriggerBase , MENU_TRIGGER } from './menu-trigger-base' ;
30+ import { CDK_MENU } from './menu-interface' ;
3031
3132/** The preferred menu positions for the context menu. */
3233const CONTEXT_MENU_POSITIONS = STANDARD_DROPDOWN_BELOW_POSITIONS . map ( position => {
@@ -92,6 +93,9 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr
9293
9394 private readonly _changeDetectorRef = inject ( ChangeDetectorRef ) ;
9495
96+ /** The parent menu this trigger belongs to. */
97+ private readonly _parentMenu = inject ( CDK_MENU , { optional : true } ) ;
98+
9599 /** Whether the context menu is disabled. */
96100 @Input ( { alias : 'cdkContextMenuDisabled' , transform : booleanAttribute } ) disabled : boolean = false ;
97101
@@ -237,7 +241,7 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr
237241 this . overlayRef ! . updatePosition ( ) ;
238242 } else {
239243 this . opened . next ( ) ;
240-
244+ this . _closeSiblingTriggers ( ) ;
241245 if ( this . overlayRef ) {
242246 (
243247 this . overlayRef . getConfig ( ) . positionStrategy as FlexibleConnectedPositionStrategy
@@ -251,4 +255,22 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr
251255 this . _subscribeToOutsideClicks ( userEvent ) ;
252256 }
253257 }
258+
259+ /** Close out any sibling menu trigger menus. */
260+ private _closeSiblingTriggers ( ) {
261+ if ( this . _parentMenu ) {
262+ // If nothing was removed from the stack and the last element is not the parent item
263+ // that means that the parent menu is a menu bar since we don't put the menu bar on the
264+ // stack
265+ const isParentMenuBar =
266+ ! this . menuStack . closeSubMenuOf ( this . _parentMenu ) &&
267+ this . menuStack . peek ( ) !== this . _parentMenu ;
268+
269+ if ( isParentMenuBar ) {
270+ this . menuStack . closeAll ( ) ;
271+ }
272+ } else {
273+ this . menuStack . closeAll ( ) ;
274+ }
275+ }
254276}
0 commit comments