pp-breadcrumbs
Version:
PP-Breadcrumbs is an Angular 10 library generating breadcrumbs based on the routing state.
153 lines (143 loc) • 8.03 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/router'), require('rxjs'), require('lodash'), require('rxjs/operators'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('pp-breadcrumbs', ['exports', '@angular/core', '@angular/router', 'rxjs', 'lodash', 'rxjs/operators', '@angular/common'], factory) :
(global = global || self, factory(global['pp-breadcrumbs'] = {}, global.ng.core, global.ng.router, global.rxjs, global.lodash, global.rxjs.operators, global.ng.common));
}(this, (function (exports, i0, i1, rxjs, lodash, operators, common) { 'use strict';
var PpBreadcrumbsResolver = /** @class */ (function () {
function PpBreadcrumbsResolver() {
}
PpBreadcrumbsResolver.prototype.resolve = function (route, state) {
var data = route.routeConfig.data;
var path = this.getFullPath(route);
var rawText = typeof data.breadcrumbs === 'string' ? data.breadcrumbs : data.breadcrumbs.text || data.text || path;
return rxjs.of([
{
path: path,
text: this.stringFormat(rawText, route.data)
}
]);
};
PpBreadcrumbsResolver.prototype.getFullPath = function (route) {
var relativePath = function (segments) { return segments.reduce(function (a, v) { return (a += '/' + v.path); }, ''); };
var fullPath = function (routes) { return routes.reduce(function (a, v) { return (a += relativePath(v.url)); }, ''); };
return fullPath(route.pathFromRoot);
};
PpBreadcrumbsResolver.prototype.stringFormat = function (templateString, binding) {
var compiled = lodash.template(templateString, { interpolate: /{{(.+?)}}/g });
return compiled(binding);
};
return PpBreadcrumbsResolver;
}());
PpBreadcrumbsResolver.decorators = [
{ type: i0.Injectable }
];
var PpBreadcrumbsService = /** @class */ (function () {
function PpBreadcrumbsService(router, injector) {
var _this = this;
this.router = router;
this.injector = injector;
this.breadcrumbs = new rxjs.BehaviorSubject([]);
this.defaultResolver = new PpBreadcrumbsResolver();
this.subscription = this.router.events.pipe(operators.filter(function (x) { return x instanceof i1.NavigationEnd; }), operators.concatMap(function () { return _this.onNavigationEnd(); })).subscribe();
this.onNavigationEnd().subscribe();
}
Object.defineProperty(PpBreadcrumbsService.prototype, "crumbs$", {
get: function () {
return this.breadcrumbs.asObservable();
},
enumerable: false,
configurable: true
});
PpBreadcrumbsService.prototype.ngOnDestroy = function () {
var _a;
(_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
this.breadcrumbs.complete();
};
PpBreadcrumbsService.prototype.onNavigationEnd = function () {
var _this = this;
return this.resolveCrumbs(this.router.routerState.snapshot.root).pipe(operators.mergeMap(function (breadcrumbs) { return breadcrumbs; }), operators.distinct(function (breadcrumb) { return breadcrumb.text; }), operators.toArray(), operators.mergeMap(function (breadcrumbs) {
return _this.postProcess ? _this.wrapIntoObservable(_this.postProcess(breadcrumbs)).pipe(operators.first()) : rxjs.of(breadcrumbs);
}), operators.tap(function (breadcrumbs) { return _this.breadcrumbs.next(breadcrumbs); }));
};
PpBreadcrumbsService.prototype.resolveCrumbs = function (route) {
var _a;
var crumbs$ = rxjs.of([]);
var data = (_a = route.routeConfig) === null || _a === void 0 ? void 0 : _a.data;
if (data === null || data === void 0 ? void 0 : data.breadcrumbs) {
var resolver = this.getBreadcrumbResolver(data.breadcrumbs);
var result = resolver.resolve(route, this.router.routerState.snapshot);
crumbs$ = this.wrapIntoObservable(result).pipe(operators.first());
}
return route.firstChild ? rxjs.concat(crumbs$, this.resolveCrumbs(route.firstChild)) : crumbs$;
};
PpBreadcrumbsService.prototype.getBreadcrumbResolver = function (breadcrumbs) {
return typeof breadcrumbs === 'function' && breadcrumbs.prototype instanceof PpBreadcrumbsResolver
? this.injector.get(breadcrumbs)
: this.defaultResolver;
};
PpBreadcrumbsService.prototype.wrapIntoObservable = function (value) {
return rxjs.isObservable(value) ? value : rxjs.from(Promise.resolve(value));
};
return PpBreadcrumbsService;
}());
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: i0.Injectable, args: [{
providedIn: 'root'
},] }
];
PpBreadcrumbsService.ctorParameters = function () { return [
{ type: i1.Router },
{ type: i0.Injector }
]; };
var PpBreadcrumbsComponent = /** @class */ (function () {
function PpBreadcrumbsComponent(service) {
this.service = service;
}
PpBreadcrumbsComponent.prototype.ngOnInit = function () {
var _this = this;
this.subscription = this.service.crumbs$.subscribe(function (crumbs) {
_this.crumbs = crumbs;
});
};
PpBreadcrumbsComponent.prototype.ngOnDestroy = function () {
var _a;
(_a = this.subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
};
return PpBreadcrumbsComponent;
}());
PpBreadcrumbsComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'pp-breadcrumbs',
template: "<ol *ngIf=\"crumbs.length\" class=\"breadcrumb\">\r\n <li *ngFor=\"let crumb of crumbs; let first = first; let last = last\" [ngClass]=\"{ 'active': last }\" class=\"breadcrumb-item\">\r\n <a *ngIf=\"!last; else lastBreadcrumb\" [routerLink]=\"crumb.path\" [innerHTML]=\"crumb.text\"></a>\r\n <ng-template #lastBreadcrumb>\r\n <span [innerHTML]=\"crumb.text\"></span>\r\n </ng-template>\r\n </li>\r\n</ol>\r\n",
styles: [""]
},] }
];
PpBreadcrumbsComponent.ctorParameters = function () { return [
{ type: PpBreadcrumbsService }
]; };
var PpBreadcrumbsModule = /** @class */ (function () {
function PpBreadcrumbsModule() {
}
return PpBreadcrumbsModule;
}());
PpBreadcrumbsModule.decorators = [
{ type: i0.NgModule, args: [{
declarations: [PpBreadcrumbsComponent],
imports: [common.CommonModule, i1.RouterModule],
exports: [PpBreadcrumbsComponent]
},] }
];
/*
* Public API Surface of pp-breadcrumbs
*/
/**
* Generated bundle index. Do not edit.
*/
exports.PpBreadcrumbsComponent = PpBreadcrumbsComponent;
exports.PpBreadcrumbsModule = PpBreadcrumbsModule;
exports.PpBreadcrumbsResolver = PpBreadcrumbsResolver;
exports.PpBreadcrumbsService = PpBreadcrumbsService;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=pp-breadcrumbs.umd.js.map