pp-breadcrumbs
Version:
PP-Breadcrumbs is an Angular 10 library generating breadcrumbs based on the routing state.
60 lines • 10.6 kB
JavaScript
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==