1- import { AfterContentInit , Component , ContentChild , ElementRef , EventEmitter , HostBinding , Input , OnChanges , OnDestroy , OnInit , Output , SimpleChange , ViewChild , Renderer2 , booleanAttribute , inject } from '@angular/core' ;
1+ import { AfterContentInit , afterRenderEffect , Component , ContentChild , ElementRef , EventEmitter , HostBinding , Input , OnChanges , OnDestroy , OnInit , Output , SimpleChange , ViewChild , Renderer2 , booleanAttribute , inject , signal , computed } from '@angular/core' ;
22import { fromEvent , interval , Subscription } from 'rxjs' ;
33import { debounce } from 'rxjs/operators' ;
44import { IgxNavigationService , IToggleView } from 'igniteui-angular/core' ;
@@ -49,10 +49,18 @@ export class IgxNavigationDrawerComponent implements
4949 OnChanges {
5050 private elementRef = inject < ElementRef > ( ElementRef ) ;
5151 private _state = inject ( IgxNavigationService , { optional : true } ) ;
52- protected renderer = inject ( Renderer2 ) ;
52+ private renderer = inject ( Renderer2 ) ;
5353 private _touchManager = inject ( HammerGesturesManager ) ;
5454 private platformUtil = inject ( PlatformUtil ) ;
5555
56+ private _isOpen = signal ( false ) ;
57+ private _pinned = signal ( false ) ;
58+ private _miniTemplate = signal < IgxNavDrawerMiniTemplateDirective | undefined > ( undefined ) ;
59+ private _visibleOverlay = computed < boolean > ( ( ) => {
60+ return ! this . _pinned ( ) && ( this . _isOpen ( ) || ! ! this . _miniTemplate ( ) ) ;
61+ } ) ;
62+ private _closingAnimation = signal ( false ) ;
63+
5664
5765 /** @hidden @internal */
5866 @HostBinding ( 'class.igx-nav-drawer' )
@@ -140,7 +148,14 @@ export class IgxNavigationDrawerComponent implements
140148 * <igx-nav-drawer [pin]="false"></igx-nav-drawer>
141149 * ```
142150 */
143- @Input ( { transform : booleanAttribute } ) public pin = false ;
151+ @Input ( { transform : booleanAttribute } )
152+ public get pin ( ) : boolean {
153+ return this . _pinned ( ) ;
154+ }
155+ public set pin ( v : boolean ) {
156+ this . _pinned . set ( v ) ;
157+ }
158+
144159
145160 /**
146161 * Width of the drawer in its open state.
@@ -237,11 +252,9 @@ export class IgxNavigationDrawerComponent implements
237252 @ContentChild ( IgxNavDrawerTemplateDirective , { read : IgxNavDrawerTemplateDirective } )
238253 protected contentTemplate : IgxNavDrawerTemplateDirective ;
239254
240- @ViewChild ( 'aside' , { static : true } ) private _drawer : ElementRef ;
241- @ViewChild ( 'overlay' , { static : true } ) private _overlay : ElementRef ;
242- @ViewChild ( 'dummy' , { static : true } ) private _styleDummy : ElementRef ;
243-
244- private _isOpen = false ;
255+ @ViewChild ( 'aside' , { static : true } ) private _drawer : ElementRef < HTMLElement > ;
256+ @ViewChild ( 'overlay' , { static : true } ) private _overlay : ElementRef < HTMLElement > ;
257+ @ViewChild ( 'dummy' , { static : true } ) private _styleDummy : ElementRef < HTMLElement > ;
245258
246259 /**
247260 * State of the drawer.
@@ -264,11 +277,11 @@ export class IgxNavigationDrawerComponent implements
264277 */
265278 @Input ( { transform : booleanAttribute } )
266279 public get isOpen ( ) {
267- return this . _isOpen ;
280+ return this . _isOpen ( ) ;
268281 }
269282 public set isOpen ( value ) {
270- this . _isOpen = value ;
271- this . isOpenChange . emit ( this . _isOpen ) ;
283+ this . _isOpen . set ( value ) ;
284+ this . isOpenChange . emit ( value ) ;
272285 }
273286
274287 /**
@@ -290,27 +303,25 @@ export class IgxNavigationDrawerComponent implements
290303 return this . contentTemplate . template ;
291304 }
292305 }
293-
294- private _miniTemplate : IgxNavDrawerMiniTemplateDirective ;
295306 /**
296307 * @hidden
297308 */
298309 public get miniTemplate ( ) : IgxNavDrawerMiniTemplateDirective {
299- return this . _miniTemplate ;
310+ return this . _miniTemplate ( ) ;
300311 }
301312
302313 /**
303314 * @hidden
304315 */
305316 @ContentChild ( IgxNavDrawerMiniTemplateDirective , { read : IgxNavDrawerMiniTemplateDirective } )
306317 public set miniTemplate ( v : IgxNavDrawerMiniTemplateDirective ) {
307- this . _miniTemplate = v ;
318+ this . _miniTemplate . set ( v ) ;
308319 }
309320
310321 /** @hidden @internal */
311322 @HostBinding ( 'class.igx-nav-drawer--mini' )
312323 public get isMini ( ) : boolean {
313- return ! ! this . _miniTemplate && ! this . isOpen ;
324+ return ! ! this . miniTemplate && ! this . isOpen ;
314325 }
315326
316327 /** @hidden @internal */
@@ -361,14 +372,14 @@ export class IgxNavigationDrawerComponent implements
361372 * @hidden
362373 */
363374 public get drawer ( ) {
364- return this . _drawer . nativeElement ;
375+ return this . _drawer ? .nativeElement ;
365376 }
366377
367378 /**
368379 * @hidden
369380 */
370381 public get overlay ( ) {
371- return this . _overlay . nativeElement ;
382+ return this . _overlay ? .nativeElement ;
372383 }
373384
374385 /**
@@ -440,6 +451,13 @@ export class IgxNavigationDrawerComponent implements
440451 return this . _state ;
441452 }
442453
454+ constructor ( ) {
455+ afterRenderEffect ( ( ) => {
456+ if ( this . _closingAnimation ( ) ) return ;
457+ this . togglePopover ( this . _visibleOverlay ( ) ) ;
458+ } ) ;
459+ }
460+
443461 /**
444462 * @hidden
445463 */
@@ -572,6 +590,8 @@ export class IgxNavigationDrawerComponent implements
572590
573591 this . closing . emit ( ) ;
574592
593+ // TODO: intersection observer for close popover instead of transitionend
594+ this . _closingAnimation . set ( true ) ;
575595 this . isOpen = false ;
576596 this . elementRef . nativeElement . addEventListener ( 'transitionend' , this . toggleClosedEvent , false ) ;
577597 }
@@ -827,13 +847,30 @@ export class IgxNavigationDrawerComponent implements
827847 } ) ;
828848 }
829849
850+ private togglePopover ( show : boolean ) {
851+ // check element and functionality exist:
852+ if ( typeof this . drawer ?. showPopover !== 'function' ) return ;
853+
854+ const popoverOpen = this . drawer . matches ( ':popover-open' ) ;
855+ if ( show === popoverOpen ) return ;
856+
857+ if ( show ) {
858+ this . overlay . showPopover ( ) ;
859+ this . drawer . showPopover ( ) ;
860+ } else {
861+ this . overlay . hidePopover ( ) ;
862+ this . drawer . hidePopover ( ) ;
863+ }
864+ }
865+
830866 private toggleOpenedEvent = ( ) => {
831867 this . elementRef . nativeElement . removeEventListener ( 'transitionend' , this . toggleOpenedEvent , false ) ;
832868 this . opened . emit ( ) ;
833869 } ;
834870
835871 private toggleClosedEvent = ( ) => {
836872 this . elementRef . nativeElement . removeEventListener ( 'transitionend' , this . toggleClosedEvent , false ) ;
873+ this . _closingAnimation . set ( false ) ;
837874 this . closed . emit ( ) ;
838875 } ;
839876}
0 commit comments