@@ -19,7 +19,7 @@ import {
1919 signal ,
2020} from '@angular/core' ;
2121import { Observable , Subject , defer } from 'rxjs' ;
22- import { startWith } from 'rxjs/operators' ;
22+ import { startWith , take } from 'rxjs/operators' ;
2323import { _IdGenerator } from '../a11y' ;
2424import { Direction , Directionality } from '../bidi' ;
2525import {
@@ -30,8 +30,8 @@ import {
3030 OverlayContainer ,
3131 OverlayRef ,
3232} from '../overlay' ;
33- import { BasePortalOutlet , ComponentPortal , TemplatePortal } from '../portal' ;
34- import { DialogConfig } from './dialog-config' ;
33+ import { ComponentPortal , TemplatePortal } from '../portal' ;
34+ import { DialogConfig , DialogContainer } from './dialog-config' ;
3535import { DialogRef } from './dialog-ref' ;
3636
3737import { CdkDialogContainer } from './dialog-container' ;
@@ -141,14 +141,24 @@ export class Dialog implements OnDestroy {
141141 const dialogRef = new DialogRef ( overlayRef , config ) ;
142142 const dialogContainer = this . _attachContainer ( overlayRef , dialogRef , config ) ;
143143
144- ( dialogRef as { containerInstance : BasePortalOutlet } ) . containerInstance = dialogContainer ;
145- this . _attachDialogContent ( componentOrTemplateRef , dialogRef , dialogContainer , config ) ;
144+ ( dialogRef as { containerInstance : DialogContainer } ) . containerInstance = dialogContainer ;
146145
147146 // If this is the first dialog that we're opening, hide all the non-overlay content.
148147 if ( ! this . openDialogs . length ) {
149- this . _hideNonDialogContentFromAssistiveTechnology ( ) ;
148+ // Resolve this ahead of time, because some internal apps mock it out.
149+ const overlayContainer = this . _overlayContainer . getContainerElement ( ) ;
150+
151+ if ( dialogContainer . _focusTrapped ) {
152+ dialogContainer . _focusTrapped . pipe ( take ( 1 ) ) . subscribe ( ( ) => {
153+ this . _hideNonDialogContentFromAssistiveTechnology ( overlayContainer ) ;
154+ } ) ;
155+ } else {
156+ this . _hideNonDialogContentFromAssistiveTechnology ( overlayContainer ) ;
157+ }
150158 }
151159
160+ this . _attachDialogContent ( componentOrTemplateRef , dialogRef , dialogContainer , config ) ;
161+
152162 ( this . openDialogs as DialogRef < R , C > [ ] ) . push ( dialogRef ) ;
153163 dialogRef . closed . subscribe ( ( ) => this . _removeOpenDialog ( dialogRef , true ) ) ;
154164 this . afterOpened . next ( dialogRef ) ;
@@ -233,14 +243,14 @@ export class Dialog implements OnDestroy {
233243 overlay : OverlayRef ,
234244 dialogRef : DialogRef < R , C > ,
235245 config : DialogConfig < D , DialogRef < R , C > > ,
236- ) : BasePortalOutlet {
246+ ) : DialogContainer {
237247 const userInjector = config . injector || config . viewContainerRef ?. injector ;
238248 const providers : StaticProvider [ ] = [
239249 { provide : DialogConfig , useValue : config } ,
240250 { provide : DialogRef , useValue : dialogRef } ,
241251 { provide : OverlayRef , useValue : overlay } ,
242252 ] ;
243- let containerType : Type < BasePortalOutlet > ;
253+ let containerType : Type < DialogContainer > ;
244254
245255 if ( config . container ) {
246256 if ( typeof config . container === 'function' ) {
@@ -274,7 +284,7 @@ export class Dialog implements OnDestroy {
274284 private _attachDialogContent < R , D , C > (
275285 componentOrTemplateRef : ComponentType < C > | TemplateRef < C > ,
276286 dialogRef : DialogRef < R , C > ,
277- dialogContainer : BasePortalOutlet ,
287+ dialogContainer : DialogContainer ,
278288 config : DialogConfig < D , DialogRef < R , C > > ,
279289 ) {
280290 if ( componentOrTemplateRef instanceof TemplateRef ) {
@@ -316,7 +326,7 @@ export class Dialog implements OnDestroy {
316326 private _createInjector < R , D , C > (
317327 config : DialogConfig < D , DialogRef < R , C > > ,
318328 dialogRef : DialogRef < R , C > ,
319- dialogContainer : BasePortalOutlet ,
329+ dialogContainer : DialogContainer ,
320330 fallbackInjector : Injector | undefined ,
321331 ) : Injector {
322332 const userInjector = config . injector || config . viewContainerRef ?. injector ;
@@ -379,9 +389,7 @@ export class Dialog implements OnDestroy {
379389 }
380390
381391 /** Hides all of the content that isn't an overlay from assistive technology. */
382- private _hideNonDialogContentFromAssistiveTechnology ( ) {
383- const overlayContainer = this . _overlayContainer . getContainerElement ( ) ;
384-
392+ private _hideNonDialogContentFromAssistiveTechnology ( overlayContainer : HTMLElement ) {
385393 // Ensure that the overlay container is attached to the DOM.
386394 if ( overlayContainer . parentElement ) {
387395 const siblings = overlayContainer . parentElement . children ;
0 commit comments