UNPKG

coreui-angular-ex-dev

Version:

CoreUI Components Library for Angular

58 lines (50 loc) 2.08 kB
import { Injectable } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, Observable } from 'rxjs'; import { filter } from 'rxjs/operators'; import { IBreadcrumbItem } from '../breadcrumb-item/breadcrumb-item'; @Injectable({ providedIn: 'root' }) export class BreadcrumbRouterService { public outlet = 'primary'; breadcrumbs$: Observable<IBreadcrumbItem[]>; private breadcrumbsBehaviorSubject: BehaviorSubject<IBreadcrumbItem[]>; constructor(private router: Router, private route: ActivatedRoute) { this.breadcrumbsBehaviorSubject = new BehaviorSubject<any[]>( new Array<IBreadcrumbItem>() ); this.breadcrumbs$ = this.breadcrumbsBehaviorSubject.asObservable(); this.router.events .pipe( takeUntilDestroyed(), filter((event) => event instanceof NavigationEnd) ) .subscribe((event) => { const breadcrumbs: any[] = []; let currentRoute: ActivatedRoute | null = this.route.root; let url = ''; do { const childrenRoutes: ActivatedRoute[] = currentRoute.children; currentRoute = null; childrenRoutes.forEach((childRoute) => { // console.log('breadcrumb event', event, 'route', route); if (childRoute.outlet === this.outlet) { const routeSnapshot = childRoute.snapshot; url += '/' + routeSnapshot.url.map((segment) => segment.path).join('/'); breadcrumbs.push({ label: childRoute.snapshot.data['title'] || '', url, queryParams: routeSnapshot.queryParams }); currentRoute = childRoute; } }); } while (currentRoute); this.breadcrumbsBehaviorSubject.next(Object.assign([], breadcrumbs)); // console.log('breadcrumbs', breadcrumbs); return breadcrumbs; }); } }