88 OnInit ,
99 Optional ,
1010 Renderer2 ,
11- SimpleChanges
11+ SimpleChanges ,
12+ ViewChild
1213} from '@angular/core' ;
1314import { NavigationEnd , Router } from '@angular/router' ;
1415
@@ -19,15 +20,26 @@ import { SidebarComponent } from '../sidebar/sidebar.component';
1920import { Observable , Subscription } from 'rxjs' ;
2021import { filter } from 'rxjs/operators' ;
2122import { animate , AnimationEvent , state , style , transition , trigger } from '@angular/animations' ;
23+ import { SidebarNavGroupService } from './sidebar-nav-group.service' ;
2224
2325@Component ( {
2426 selector : 'c-sidebar-nav' ,
2527 templateUrl : './sidebar-nav.component.html' ,
2628 styleUrls : [ './sidebar-nav.component.scss' ]
2729} )
2830export class SidebarNavComponent implements OnChanges {
31+
32+ constructor (
33+ @Optional ( ) public sidebar : SidebarComponent ,
34+ public helper : SidebarNavHelper ,
35+ public router : Router ,
36+ private renderer : Renderer2 ,
37+ private hostElement : ElementRef ,
38+ private sidebarService : SidebarService
39+ ) { }
40+
2941 @Input ( ) navItems ?: INavData [ ] = [ ] ;
30- @Input ( ) dropdownMode ? : 'closeInactive ' | 'noAction ' | 'openActive ' = 'closeInactive ' ;
42+ @Input ( ) dropdownMode : 'path ' | 'none ' | 'close ' = 'path ' ;
3143 @Input ( ) groupItems ?: boolean ;
3244 @Input ( ) compact ?: boolean ;
3345
@@ -48,15 +60,6 @@ export class SidebarNavComponent implements OnChanges {
4860
4961 public navItemsArray : INavData [ ] = [ ] ;
5062
51- constructor (
52- @Optional ( ) public sidebar : SidebarComponent ,
53- public helper : SidebarNavHelper ,
54- public router : Router ,
55- private renderer : Renderer2 ,
56- private hostElement : ElementRef ,
57- private sidebarService : SidebarService
58- ) { }
59-
6063 public ngOnChanges ( changes : SimpleChanges ) : void {
6164 this . navItemsArray = Array . isArray ( this . navItems ) ? this . navItems . slice ( ) : [ ] ;
6265 }
@@ -89,53 +92,61 @@ export class SidebarNavComponent implements OnChanges {
8992 ]
9093} )
9194export class SidebarNavGroupComponent implements OnInit , OnDestroy {
95+
96+ constructor (
97+ private router : Router ,
98+ private renderer : Renderer2 ,
99+ private hostElement : ElementRef ,
100+ public helper : SidebarNavHelper ,
101+ private sidebarNavGroupService : SidebarNavGroupService
102+ ) {
103+ this . navigationEndObservable = router . events . pipe (
104+ filter ( ( event : any ) => event instanceof NavigationEnd )
105+ ) as Observable < NavigationEnd > ;
106+ }
107+
92108 @Input ( ) item : any ;
93- @Input ( ) dropdownMode : 'closeInactive' | 'noAction' | 'openActive' = 'closeInactive' ;
94- // @ts -ignore
95- @Input ( ) show : boolean ;
109+ @Input ( ) dropdownMode : 'path' | 'none' | 'close' = 'path' ;
110+ @Input ( ) show ?: boolean ;
96111
97112 @HostBinding ( 'class' )
98- // tslint:disable-next-line:typedef
99113 get hostClasses ( ) : any {
100114 return {
101115 'nav-group' : true ,
102116 show : this . open
103117 } ;
104118 }
105119
106- // todo: dropdownMode
120+ @ ViewChild ( SidebarNavComponent , { read : ElementRef } ) sidebarNav ! : ElementRef ;
107121
108122 navigationEndObservable : Observable < NavigationEnd > ;
109- // @ts -ignore
110- navSubscription : Subscription ;
123+ navSubscription ! : Subscription ;
124+ navGroupSubscription ! : Subscription ;
111125
112- // @ts -ignore
113- public open : boolean ;
126+ public open ! : boolean ;
114127 public navItems : INavData [ ] = [ ] ;
115128 public display : any = { display : 'block' } ;
116129
117- constructor (
118- private router : Router ,
119- public helper : SidebarNavHelper ,
120- private hostElement : ElementRef
121- ) {
122- this . navigationEndObservable = router . events . pipe (
123- filter ( ( event : any ) => event instanceof NavigationEnd )
124- ) as Observable < NavigationEnd > ;
125- }
126-
127130 ngOnInit ( ) : void {
128131
129132 this . navItems = [ ...this . item . children ] ;
130133
131134 this . navSubscription = this . navigationEndObservable . subscribe ( ( event : NavigationEnd ) => {
132- const samePath = this . samePath ( event . url ) ;
133- this . openGroup ( samePath ) ;
135+ if ( this . dropdownMode !== 'none' ) {
136+ const samePath = this . samePath ( event . url ) ;
137+ this . openGroup ( samePath ) ;
138+ }
134139 } ) ;
135140
136141 if ( this . samePath ( this . router . routerState . snapshot . url ) ) {
137142 this . openGroup ( true ) ;
138143 }
144+
145+ this . navGroupSubscription = this . sidebarNavGroupService . sidebarNavGroupState$ . subscribe ( next => {
146+ if ( this . dropdownMode === 'close' && next . sidebarNavGroup && next . sidebarNavGroup !== this ) {
147+ this . openGroup ( false ) ;
148+ }
149+ } ) ;
139150 }
140151
141152 samePath ( url : string ) : boolean {
@@ -154,17 +165,22 @@ export class SidebarNavGroupComponent implements OnInit, OnDestroy {
154165
155166 toggleGroup ( $event : any ) : void {
156167 $event . preventDefault ( ) ;
157- this . open = ! this . open ;
168+ this . openGroup ( ! this . open ) ;
169+ if ( this . open ) {
170+ this . sidebarNavGroupService . toggle ( { open : this . open , sidebarNavGroup : this } ) ;
171+ }
158172 }
159173
160174 ngOnDestroy ( ) : void {
161175 this . navSubscription . unsubscribe ( ) ;
162176 }
163177
164178 onAnimationStart ( $event : AnimationEvent ) {
165- setTimeout ( ( ) => {
166- this . display = { display : 'block' } ;
167- } ) ;
179+ this . display = { display : 'block' } ;
180+ if ( $event . toState === 'open' ) {
181+ const host = this . sidebarNav . nativeElement ;
182+ this . renderer . setStyle ( host , 'height' , `${ host [ 'scrollHeight' ] } px` ) ;
183+ }
168184 }
169185
170186 onAnimationDone ( $event : AnimationEvent ) {
0 commit comments