UNPKG

pp-breadcrumbs

Version:

PP-Breadcrumbs is an Angular 10 library generating breadcrumbs based on the routing state.

60 lines 10.6 kB
import { Injectable, Injector } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, concat, from, isObservable, of } from 'rxjs'; import { PpBreadcrumbsResolver } from './breadcrumbs.resolver'; import { concatMap, distinct, filter, first, mergeMap, tap, toArray } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; export class PpBreadcrumbsService { constructor(router, injector) { this.router = router; this.injector = injector; this.breadcrumbs = new BehaviorSubject([]); this.defaultResolver = new PpBreadcrumbsResolver(); this.subscription = this.router.events.pipe(filter(x => x instanceof NavigationEnd), concatMap(() => this.onNavigationEnd())).subscribe(); this.onNavigationEnd().subscribe(); } get crumbs$() { return this.breadcrumbs.asObservable(); } ngOnDestroy() { var _a; (_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this.breadcrumbs.complete(); } onNavigationEnd() { return this.resolveCrumbs(this.router.routerState.snapshot.root).pipe(mergeMap((breadcrumbs) => breadcrumbs), distinct((breadcrumb) => breadcrumb.text), toArray(), mergeMap((breadcrumbs) => { return this.postProcess ? this.wrapIntoObservable(this.postProcess(breadcrumbs)).pipe(first()) : of(breadcrumbs); }), tap((breadcrumbs) => this.breadcrumbs.next(breadcrumbs))); } resolveCrumbs(route) { var _a; let crumbs$ = of([]); const data = (_a = route.routeConfig) === null || _a === void 0 ? void 0 : _a.data; if (data === null || data === void 0 ? void 0 : data.breadcrumbs) { const resolver = this.getBreadcrumbResolver(data.breadcrumbs); const result = resolver.resolve(route, this.router.routerState.snapshot); crumbs$ = this.wrapIntoObservable(result).pipe(first()); } return route.firstChild ? concat(crumbs$, this.resolveCrumbs(route.firstChild)) : crumbs$; } getBreadcrumbResolver(breadcrumbs) { return typeof breadcrumbs === 'function' && breadcrumbs.prototype instanceof PpBreadcrumbsResolver ? this.injector.get(breadcrumbs) : this.defaultResolver; } wrapIntoObservable(value) { return isObservable(value) ? value : from(Promise.resolve(value)); } } PpBreadcrumbsService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PpBreadcrumbsService_Factory() { return new PpBreadcrumbsService(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i0.INJECTOR)); }, token: PpBreadcrumbsService, providedIn: "root" }); PpBreadcrumbsService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; PpBreadcrumbsService.ctorParameters = () => [ { type: Router }, { type: Injector } ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3BwLWJyZWFkY3J1bWJzL3NyYy9saWIvYnJlYWRjcnVtYnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUF5QixhQUFhLEVBQUUsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUUsT0FBTyxFQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFFL0YsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7QUFNMUYsTUFBTSxPQUFPLG9CQUFvQjtJQVkvQixZQUFzQixNQUFjLEVBQVksUUFBa0I7UUFBNUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFZLGFBQVEsR0FBUixRQUFRLENBQVU7UUFSeEQsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBZSxFQUFFLENBQUMsQ0FBQztRQUNwRCxvQkFBZSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQVF0RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLGFBQWEsQ0FBQyxFQUN2QyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQ3hDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFZCxJQUFJLENB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T25EZXN0cm95LCBUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb25jYXQsIGZyb20sIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge1BwQnJlYWRjcnVtYnNSZXNvbHZlcn0gZnJvbSAnLi9icmVhZGNydW1icy5yZXNvbHZlcic7XHJcbmltcG9ydCB7Y29uY2F0TWFwLCBkaXN0aW5jdCwgZmlsdGVyLCBmaXJzdCwgbWVyZ2VNYXAsIHRhcCwgdG9BcnJheX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0JyZWFkY3J1bWJ9IGZyb20gJy4vYnJlYWRjcnVtYic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcEJyZWFkY3J1bWJzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHBvc3RQcm9jZXNzOiAoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IFByb21pc2U8QnJlYWRjcnVtYltdPiB8IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB8IEJyZWFkY3J1bWJbXTtcclxuXHJcbiAgcHJvdGVjdGVkIGJyZWFkY3J1bWJzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxCcmVhZGNydW1iW10+KFtdKTtcclxuICBwcm90ZWN0ZWQgZGVmYXVsdFJlc29sdmVyID0gbmV3IFBwQnJlYWRjcnVtYnNSZXNvbHZlcigpO1xyXG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGdldCBjcnVtYnMkKCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5icmVhZGNydW1icy5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlciwgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgZmlsdGVyKHggPT4geCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxyXG4gICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5vbk5hdmlnYXRpb25FbmQoKSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5vbk5hdmlnYXRpb25FbmQoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJzLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25OYXZpZ2F0aW9uRW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNydW1icyh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC5yb290KS5waXBlKFxyXG4gICAgICBtZXJnZU1hcCgoYnJlYWRjcnVtYnMpID0+IGJyZWFkY3J1bWJzKSxcclxuICAgICAgZGlzdGluY3QoKGJyZWFkY3J1bWIpID0+IGJyZWFkY3J1bWIudGV4dCksXHJcbiAgICAgIHRvQXJyYXkoKSxcclxuICAgICAgbWVyZ2VNYXAoKGJyZWFkY3J1bWJzKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zdFByb2Nlc3MgPyB0aGlzLndyYXBJbnRvT2JzZXJ2YWJsZSh0aGlzLnBvc3RQcm9jZXNzKGJyZWFkY3J1bWJzKSkucGlwZShmaXJzdCgpKSA6IG9mKGJyZWFkY3J1bWJzKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoYnJlYWRjcnVtYnMpID0+IHRoaXMuYnJlYWRjcnVtYnMubmV4dChicmVhZGNydW1icykpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc29sdmVDcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ge1xyXG4gICAgbGV0IGNydW1icyQ6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiA9IG9mKFtdKTtcclxuICAgIGNvbnN0IGRhdGEgPSByb3V0ZS5yb3V0ZUNvbmZpZz8uZGF0YTtcclxuXHJcbiAgICBpZiAoZGF0YT8uYnJlYWRjcnVtYnMpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmdldEJyZWFkY3J1bWJSZXNvbHZlcihkYXRhLmJyZWFkY3J1bWJzKTtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShyb3V0ZSwgdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xyXG4gICAgICBjcnVtYnMkID0gdGhpcy53cmFwSW50b09ic2VydmFibGUocmVzdWx0KS5waXBlKGZpcnN0KCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByb3V0ZS5maXJzdENoaWxkID8gY29uY2F0KGNydW1icyQsIHRoaXMucmVzb2x2ZUNydW1icyhyb3V0ZS5maXJzdENoaWxkKSkgOiBjcnVtYnMkO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEJyZWFkY3J1bWJSZXNvbHZlcihicmVhZGNydW1iczogc3RyaW5nIHwgVHlwZTxQcEJyZWFkY3J1bWJzUmVzb2x2ZXI+KTogUHBCcmVhZGNydW1ic1Jlc29sdmVyIHtcclxuICAgIHJldHVybiB0eXBlb2YgYnJlYWRjcnVtYnMgPT09ICdmdW5jdGlvbicgJiYgYnJlYWRjcnVtYnMucHJvdG90eXBlIGluc3RhbmNlb2YgUHBCcmVhZGNydW1ic1Jlc29sdmVyXHJcbiAgICAgID8gdGhpcy5pbmplY3Rvci5nZXQ8UHBCcmVhZGNydW1ic1Jlc29sdmVyPihicmVhZGNydW1icylcclxuICAgICAgOiB0aGlzLmRlZmF1bHRSZXNvbHZlcjtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB3cmFwSW50b09ic2VydmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZSA6IGZyb20oUHJvbWlzZS5yZXNvbHZlKHZhbHVlKSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==