UNPKG

@exalif/ngx-breadcrumbs

Version:

Angular 4+ breadcrumbs on top of native Angular router

73 lines 10.9 kB
import { Injectable, Injector } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { of, BehaviorSubject, concat } from 'rxjs'; import { filter, flatMap, distinct, toArray, first, tap } from 'rxjs/operators'; import { BreadcrumbsConfig } from './breadcrumbs.config'; import { BreadcrumbsResolver } from './breadcrumbs.resolver'; import { BreadcrumbsUtils } from '../utils/breadcrumbs.utils'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "./breadcrumbs.config"; class BreadcrumbsService { constructor(route, router, config, injector) { this.route = route; this.router = router; this.config = config; this.injector = injector; this.breadcrumbs = new BehaviorSubject([]); this.defaultResolver = new BreadcrumbsResolver(); this.router.events.pipe(filter((x) => x instanceof NavigationEnd)) .subscribe((_) => { const routeRoot = router.routerState.snapshot.root; this.resolveCrumbs(routeRoot).pipe(flatMap((crumbs) => crumbs), this.config.applyDistinctOn ? distinct((crumb) => crumb[this.config.applyDistinctOn]) : tap(), toArray(), flatMap((crumbs) => { if (this.config.postProcess) { const postProcessedCrumb = this.config.postProcess(crumbs); return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(first()); } else { return of(crumbs); } })) .subscribe((crumbs) => { this.breadcrumbs.next(crumbs); }); }); } get crumbs$() { return this.breadcrumbs; } getCrumbs() { return this.crumbs$; } resolveCrumbs(route) { let crumbs$; const data = route.routeConfig && route.routeConfig.data; if (data && data.breadcrumbs) { let resolver; if (data.breadcrumbs.prototype instanceof BreadcrumbsResolver) { resolver = this.injector.get(data.breadcrumbs); } else { resolver = this.defaultResolver; } const result = resolver.resolve(route, this.router.routerState.snapshot); crumbs$ = BreadcrumbsUtils.wrapIntoObservable(result).pipe(first()); } else { crumbs$ = of([]); } if (route.firstChild) { crumbs$ = concat(crumbs$, this.resolveCrumbs(route.firstChild)); } return crumbs$; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: BreadcrumbsService, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.BreadcrumbsConfig }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: BreadcrumbsService }); } } export { BreadcrumbsService }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: BreadcrumbsService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.BreadcrumbsConfig }, { type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LWJyZWFkY3J1bWJzL3NyYy9saWIvc2VydmljZXMvYnJlYWRjcnVtYnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUEwQixhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEcsT0FBTyxFQUFjLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7O0FBRTlELE1BQ2Esa0JBQWtCO0lBSzdCLFlBQ1MsS0FBcUIsRUFDcEIsTUFBYyxFQUNkLE1BQXlCLEVBQ3pCLFFBQWtCO1FBSG5CLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQUN6QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBUHBCLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWUsRUFBRSxDQUFDLENBQUM7UUFDcEQsb0JBQWUsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFTbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxD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OlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgQmVoYXZpb3JTdWJqZWN0LCBjb25jYXQgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZmlsdGVyLCBmbGF0TWFwLCBkaXN0aW5jdCwgdG9BcnJheSwgZmlyc3QsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQnJlYWRjcnVtYnNDb25maWcgfSBmcm9tICcuL2JyZWFkY3J1bWJzLmNvbmZpZyc7XG5pbXBvcnQgeyBCcmVhZGNydW1ic1Jlc29sdmVyIH0gZnJvbSAnLi9icmVhZGNydW1icy5yZXNvbHZlcic7XG5pbXBvcnQgeyBCcmVhZGNydW1iIH0gZnJvbSAnLi4vbW9kZWxzL2JyZWFkY3J1bWInO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNVdGlscyB9IGZyb20gJy4uL3V0aWxzL2JyZWFkY3J1bWJzLnV0aWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyZWFkY3J1bWJzU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBicmVhZGNydW1icyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QnJlYWRjcnVtYltdPihbXSk7XG4gIHByaXZhdGUgZGVmYXVsdFJlc29sdmVyID0gbmV3IEJyZWFkY3J1bWJzUmVzb2x2ZXIoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBjb25maWc6IEJyZWFkY3J1bWJzQ29uZmlnLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge1xuXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKCh4KSA9PiB4IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXG4gICAgICAuc3Vic2NyaWJlKChfOiBOYXZpZ2F0aW9uRW5kKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdXRlUm9vdCA9IHJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC5yb290O1xuXG4gICAgICAgIHRoaXMucmVzb2x2ZUNydW1icyhyb3V0ZVJvb3QpLnBpcGUoXG4gICAgICAgICAgZmxhdE1hcCgoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IGNydW1icyksXG4gICAgICAgICAgdGhpcy5jb25maWcuYXBwbHlEaXN0aW5jdE9uXG4gICAgICAgICAgICA/IGRpc3RpbmN0KChjcnVtYjogQnJlYWRjcnVtYikgPT4gY3J1bWJbdGhpcy5jb25maWcuYXBwbHlEaXN0aW5jdE9uXSlcbiAgICAgICAgICAgIDogdGFwKCksXG4gICAgICAgICAgdG9BcnJheSgpLFxuICAgICAgICAgIGZsYXRNYXAoKGNydW1iczogQnJlYWRjcnVtYltdKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWcucG9zdFByb2Nlc3MpIHtcbiAgICAgICAgICAgICAgY29uc3QgcG9zdFByb2Nlc3NlZENydW1iID0gdGhpcy5jb25maWcucG9zdFByb2Nlc3MoY3J1bWJzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIEJyZWFkY3J1bWJzVXRpbHMud3JhcEludG9PYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ocG9zdFByb2Nlc3NlZENydW1iKS5waXBlKFxuICAgICAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBvZihjcnVtYnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5icmVhZGNydW1icy5uZXh0KGNydW1icyk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldCBjcnVtYnMkKCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG4gICAgcmV0dXJuIHRoaXMuYnJlYWRjcnVtYnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3J1bWJzKCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG4gICAgcmV0dXJuIHRoaXMuY3J1bWJzJDtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUNydW1icyhyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XG5cbiAgICBsZXQgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+O1xuXG4gICAgY29uc3QgZGF0YSA9IHJvdXRlLnJvdXRlQ29uZmlnICYmIHJvdXRlLnJvdXRlQ29uZmlnLmRhdGE7XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmJyZWFkY3J1bWJzKSB7XG4gICAgICBsZXQgcmVzb2x2ZXI6IEJyZWFkY3J1bWJzUmVzb2x2ZXI7XG5cbiAgICAgIGlmIChkYXRhLmJyZWFkY3J1bWJzLnByb3RvdHlwZSBpbnN0YW5jZW9mIEJyZWFkY3J1bWJzUmVzb2x2ZXIpIHtcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLmluamVjdG9yLmdldChkYXRhLmJyZWFkY3J1bWJzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmVyID0gdGhpcy5kZWZhdWx0UmVzb2x2ZXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVyLnJlc29sdmUocm91dGUsIHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcbiAgICAgIGNydW1icyQgPSBCcmVhZGNydW1ic1V0aWxzLndyYXBJbnRvT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+KHJlc3VsdCkucGlwZShcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjcnVtYnMkID0gb2YoW10pO1xuICAgIH1cblxuICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XG4gICAgICBjcnVtYnMkID0gY29uY2F0KGNydW1icyQsIHRoaXMucmVzb2x2ZUNydW1icyhyb3V0ZS5maXJzdENoaWxkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNydW1icyQ7XG4gIH1cbn1cbiJdfQ==