@exalif/ngx-breadcrumbs
Version:
Angular 4+ breadcrumbs on top of native Angular router
73 lines • 10.9 kB
JavaScript
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==