UNPKG

@miesil/pp-breadcrumbs

Version:

PP-Breadcrumbs is an Angular 7 module generating breadcrumbs based on the routing state.

341 lines (332 loc) 11.5 kB
import { of, Observable, BehaviorSubject, concat, from } from 'rxjs'; import { template, templateSettings } from 'lodash'; import { filter, mergeMap, distinct, toArray, first, tap } from 'rxjs/operators'; import { Injectable, Injector, Component, EventEmitter, Output, NgModule, defineInjectable, inject, INJECTOR } from '@angular/core'; import { ActivatedRoute, NavigationEnd, Router, RouterModule } from '@angular/router'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ templateSettings.interpolate = /{{([\s\S]+?)}}/g; var PpBreadcrumbsResolver = /** @class */ (function () { function PpBreadcrumbsResolver() { } /** * @param {?} route * @param {?} state * @return {?} */ PpBreadcrumbsResolver.prototype.resolve = /** * @param {?} route * @param {?} state * @return {?} */ function (route, state) { /** @type {?} */ var data = route.routeConfig.data; /** @type {?} */ var path = this.getFullPath(route); /** @type {?} */ var rawText = typeof data.breadcrumbs === 'string' ? data.breadcrumbs : data.breadcrumbs.text || data.text || path; return of([ { path: path, text: this.stringFormat(rawText, route.data) } ]); }; /** * @param {?} route * @return {?} */ PpBreadcrumbsResolver.prototype.getFullPath = /** * @param {?} route * @return {?} */ function (route) { /** @type {?} */ var relativePath = (/** * @param {?} segments * @return {?} */ function (segments) { return segments.reduce((/** * @param {?} a * @param {?} v * @return {?} */ function (a, v) { return (a += '/' + v.path); }), ''); }); /** @type {?} */ var fullPath = (/** * @param {?} routes * @return {?} */ function (routes) { return routes.reduce((/** * @param {?} a * @param {?} v * @return {?} */ function (a, v) { return (a += relativePath(v.url)); }), ''); }); return fullPath(route.pathFromRoot); }; /** * @private * @param {?} templateString * @param {?} binding * @return {?} */ PpBreadcrumbsResolver.prototype.stringFormat = /** * @private * @param {?} templateString * @param {?} binding * @return {?} */ function (templateString, binding) { /** @type {?} */ var compiled = template(templateString); return compiled(binding); }; PpBreadcrumbsResolver.decorators = [ { type: Injectable } ]; return PpBreadcrumbsResolver; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var PpBreadcrumbsService = /** @class */ (function () { function PpBreadcrumbsService(router, route, injector) { var _this = this; this.router = router; this.injector = injector; this.breadcrumbs = new BehaviorSubject([]); this.defaultResolver = new PpBreadcrumbsResolver(); this.breadcrumbsSource = []; this.router.events.pipe(filter((/** * @param {?} x * @return {?} */ function (x) { return x instanceof NavigationEnd; }))).subscribe((/** * @param {?} event * @return {?} */ function (event) { _this.resolveCrumbs(router.routerState.snapshot.root) .pipe(mergeMap((/** * @param {?} breadcrumbs * @return {?} */ function (breadcrumbs) { return breadcrumbs; })), distinct((/** * @param {?} breadcrumb * @return {?} */ function (breadcrumb) { return breadcrumb.text; })), toArray(), tap((/** * @param {?} breadcrumbs * @return {?} */ function (breadcrumbs) { return _this.breadcrumbsSource = breadcrumbs; })), mergeMap((/** * @param {?} breadcrumbs * @return {?} */ function (breadcrumbs) { return _this.postProcess ? _this.wrapIntoObservable(_this.postProcess(breadcrumbs)).pipe(first()) : of(breadcrumbs); }))) .subscribe((/** * @param {?} breadcrumbs * @return {?} */ function (breadcrumbs) { _this.breadcrumbs.next(breadcrumbs); })); })); } Object.defineProperty(PpBreadcrumbsService.prototype, "crumbs$", { get: /** * @return {?} */ function () { return this.breadcrumbs; }, enumerable: true, configurable: true }); /** * @return {?} */ PpBreadcrumbsService.prototype.refreshBreadcrumbs = /** * @return {?} */ function () { var _this = this; (this.postProcess ? this.wrapIntoObservable(this.postProcess(this.breadcrumbsSource)).pipe(first()) : of(this.breadcrumbsSource)) .subscribe((/** * @param {?} breadcrumbs * @return {?} */ function (breadcrumbs) { _this.breadcrumbs.next(breadcrumbs); })); }; /** * @private * @param {?} route * @return {?} */ PpBreadcrumbsService.prototype.resolveCrumbs = /** * @private * @param {?} route * @return {?} */ function (route) { /** @type {?} */ var crumbs$ = of([]); /** @type {?} */ var data = route.routeConfig && route.routeConfig.data; if (data && data.breadcrumbs) { /** @type {?} */ var resolver = data.breadcrumbs.prototype instanceof PpBreadcrumbsResolver ? this.injector.get(data.breadcrumbs) : this.defaultResolver; /** @type {?} */ var result = resolver.resolve(route, this.router.routerState.snapshot); crumbs$ = this.wrapIntoObservable(result).pipe(first()); } return route.firstChild ? concat(crumbs$, this.resolveCrumbs(route.firstChild)) : crumbs$; }; /** * @private * @template T * @param {?} value * @return {?} */ PpBreadcrumbsService.prototype.wrapIntoObservable = /** * @private * @template T * @param {?} value * @return {?} */ function (value) { return value instanceof Observable ? value : this.isPromise(value) ? from(Promise.resolve(value)) : of((/** @type {?} */ (value))); }; /** * @private * @param {?} value * @return {?} */ PpBreadcrumbsService.prototype.isPromise = /** * @private * @param {?} value * @return {?} */ function (value) { return value && typeof value.then === 'function'; }; PpBreadcrumbsService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ PpBreadcrumbsService.ctorParameters = function () { return [ { type: Router }, { type: ActivatedRoute }, { type: Injector } ]; }; /** @nocollapse */ PpBreadcrumbsService.ngInjectableDef = defineInjectable({ factory: function PpBreadcrumbsService_Factory() { return new PpBreadcrumbsService(inject(Router), inject(ActivatedRoute), inject(INJECTOR)); }, token: PpBreadcrumbsService, providedIn: "root" }); return PpBreadcrumbsService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var PpBreadcrumbsComponent = /** @class */ (function () { function PpBreadcrumbsComponent(service) { this.service = service; this.subscriptions = []; this.onNavigate = new EventEmitter(); } /** * @return {?} */ PpBreadcrumbsComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.subscriptions.push(this.service.crumbs$.subscribe((/** * @param {?} x * @return {?} */ function (x) { _this.crumbs = x; }))); }; /** * @return {?} */ PpBreadcrumbsComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.subscriptions.forEach((/** * @param {?} x * @return {?} */ function (x) { return x.unsubscribe(); })); this.onNavigate.complete(); this.onNavigate = undefined; }; /** * @return {?} */ PpBreadcrumbsComponent.prototype.click = /** * @return {?} */ function () { this.onNavigate.emit({}); }; PpBreadcrumbsComponent.decorators = [ { type: 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\" (click)=\"click()\"></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: [""] }] } ]; /** @nocollapse */ PpBreadcrumbsComponent.ctorParameters = function () { return [ { type: PpBreadcrumbsService } ]; }; PpBreadcrumbsComponent.propDecorators = { onNavigate: [{ type: Output }] }; return PpBreadcrumbsComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var PpBreadcrumbsModule = /** @class */ (function () { function PpBreadcrumbsModule() { } PpBreadcrumbsModule.decorators = [ { type: NgModule, args: [{ declarations: [PpBreadcrumbsComponent], imports: [CommonModule, RouterModule], exports: [PpBreadcrumbsComponent] },] } ]; return PpBreadcrumbsModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { PpBreadcrumbsService, PpBreadcrumbsComponent, PpBreadcrumbsResolver, PpBreadcrumbsModule }; //# sourceMappingURL=miesil-pp-breadcrumbs.js.map