ngx-dynamic-breadcrumb
Version:
113 lines • 15.6 kB
JavaScript
import { Injectable } from '@angular/core';
import { NavigationEnd } from '@angular/router';
import { BehaviorSubject } from 'rxjs';
import { filter } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
export class NgxBreadcrumbService {
constructor(router, activatedRoute) {
this.router = router;
this.activatedRoute = activatedRoute;
this.breadcrumbs = [];
this._breadcrumbChanges = new BehaviorSubject([]);
this.breadcrumbChanges = this._breadcrumbChanges.asObservable();
this._subscribeToRouteEvent();
}
/**
* Recursively build breadcrumb according to activated route.
*
* @param route activate route object
* @param url parent url
* @param breadcrumbs array of current breadcrumbs
*/
buildBreadCrumb(route, url = '', breadcrumbs = []) {
var _a, _b, _c, _d, _e, _f;
// If no routeConfig is available we are on the root path
let label, key, tooltip;
let isClickable = true;
const currentBreadcrumb = (_b = (_a = route.routeConfig) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.breadcrumb;
if (typeof currentBreadcrumb === 'object') {
key = currentBreadcrumb.key;
label = currentBreadcrumb.label;
isClickable = (_c = currentBreadcrumb.isClickable) !== null && _c !== void 0 ? _c : isClickable;
tooltip = (_d = currentBreadcrumb.tooltip) !== null && _d !== void 0 ? _d : label;
}
else if (typeof currentBreadcrumb === 'string') {
key = label = tooltip = currentBreadcrumb;
}
let path = (_f = (_e = route.routeConfig) === null || _e === void 0 ? void 0 : _e.path) !== null && _f !== void 0 ? _f : '';
// If the route is dynamic route such as ':id', replace it with actual param values
const dynamicRoutes = path.split('/').filter((el) => el.startsWith(':'));
if (dynamicRoutes.length && !!route.snapshot) {
dynamicRoutes.forEach((item) => {
const paramName = item.split(':')[1];
path = path.replace(item, route.snapshot.params[paramName]);
});
}
// In the routeConfig the complete path is not available,
//so we rebuild it each time
const nextUrl = path ? `${url}/${path}` : url;
const newBreadcrumbs = [...breadcrumbs];
if (key) {
const breadcrumb = {
key,
label,
tooltip,
url: nextUrl,
isClickable,
};
// Only adding route with non-empty label
newBreadcrumbs.push(breadcrumb);
}
if (route.firstChild) {
//If we are not on our current path yet,
//there will be more children to look after, to build our breadcrumb
return this.buildBreadCrumb(route.firstChild, nextUrl, newBreadcrumbs);
}
return newBreadcrumbs;
}
/**
* Returns the latest array of breadcrumbs.
*
* @returns Array of breadcrumbs
*/
getBreadcrumbs() {
return this._breadcrumbChanges.getValue();
}
/**
* Edit the breadcrumb label and url dynamically.
* If the label is null while editing, it will act
* as delete breadcrumb from UI.
*
* @param crumbs IReplaceBreadcrumb[]
*/
editBreadcrumbs(crumbs) {
crumbs.forEach((item) => {
var _a, _b;
const data = this.breadcrumbs.find((breadcrumb) => breadcrumb.key === item.key);
if (data) {
data.label = item.newLabel;
data.url = Array.isArray(item.newUrl)
? item.newUrl.join('/')
: (_a = item.newUrl) !== null && _a !== void 0 ? _a : data.url;
data.tooltip = (_b = item.tooltip) !== null && _b !== void 0 ? _b : data.tooltip;
}
});
this._breadcrumbChanges.next([...this.breadcrumbs]);
}
// private functions
_subscribeToRouteEvent() {
this.router.events
.pipe(filter((event) => event instanceof NavigationEnd))
.subscribe(() => {
this.breadcrumbs = this.buildBreadCrumb(this.activatedRoute.root);
this._breadcrumbChanges.next(this.breadcrumbs);
});
}
}
NgxBreadcrumbService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxBreadcrumbService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable });
NgxBreadcrumbService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxBreadcrumbService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxBreadcrumbService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWJyZWFkY3J1bWIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1icmVhZGNydW1iL3NyYy9saWIvbmd4LWJyZWFkY3J1bWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBa0IsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUt4QyxNQUFNLE9BQU8sb0JBQW9CO0lBWS9CLFlBQ21CLE1BQWMsRUFDZCxjQUE4QjtRQUQ5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBTnpDLGdCQUFXLEdBQWtCLEVBQUUsQ0FBQztRQUV2Qix1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFNM0UsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZSxDQUNiLEtBQXFCLEVBQ3JCLEdBQUcsR0FBRyxFQUFFLEVBQ1IsY0FBNkIsRUFBRTs7UUFFL0IseURBQXlEO1FBQ3pELElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUM7UUFDeEIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0saUJBQWlCLEdBQUcsTUFBQSxNQUFBLEtBQUssQ0FBQyxXQUFXLDBDQUFFLElBQUksMENBQUUsVUFBVSxDQUFDO1FBQzlELElBQUksT0FBTyxpQkFBaUIsS0FBSyxRQUFRLEVB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Q0FBQyxNQUFBLElBQUksQ0FBQyxNQUFNLG1DQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBQSxJQUFJLENBQUMsT0FBTyxtQ0FBSSxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQzdDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsb0JBQW9CO0lBQ1osc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTthQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsQ0FBQzthQUN2RCxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztrSEExSFUsb0JBQW9CO3NIQUFwQixvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBJQnJlYWRjcnVtYiwgSVJlcGxhY2VCcmVhZGNydW1iIH0gZnJvbSAnLi9uZ3gtYnJlYWRjcnVtYi50eXBlcyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZ3hCcmVhZGNydW1iU2VydmljZSB7XHJcblxyXG5cclxuICAvKipcclxuICAgKiBFbWl0IGNoYW5nZSB3aGVuIHRoZSBicmVhZGNydW1icyBhcmUgY2hhbmdlZC5cclxuICAgKi9cclxuICByZWFkb25seSBicmVhZGNydW1iQ2hhbmdlczogT2JzZXJ2YWJsZTxJQnJlYWRjcnVtYltdPjtcclxuXHJcbiAgcHJpdmF0ZSBicmVhZGNydW1iczogSUJyZWFkY3J1bWJbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9icmVhZGNydW1iQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUJyZWFkY3J1bWJbXT4oW10pO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVxyXG4gICkge1xyXG4gICAgdGhpcy5icmVhZGNydW1iQ2hhbmdlcyA9IHRoaXMuX2JyZWFkY3J1bWJDaGFuZ2VzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy5fc3Vic2NyaWJlVG9Sb3V0ZUV2ZW50KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWN1cnNpdmVseSBidWlsZCBicmVhZGNydW1iIGFjY29yZGluZyB0byBhY3RpdmF0ZWQgcm91dGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gcm91dGUgYWN0aXZhdGUgcm91dGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHVybCBwYXJlbnQgdXJsXHJcbiAgICogQHBhcmFtIGJyZWFkY3J1bWJzIGFycmF5IG9mIGN1cnJlbnQgYnJlYWRjcnVtYnNcclxuICAgKi9cclxuICBidWlsZEJyZWFkQ3J1bWIoXHJcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICB1cmwgPSAnJyxcclxuICAgIGJyZWFkY3J1bWJzOiBJQnJlYWRjcnVtYltdID0gW11cclxuICApOiBJQnJlYWRjcnVtYltdIHtcclxuICAgIC8vIElmIG5vIHJvdXRlQ29uZmlnIGlzIGF2YWlsYWJsZSB3ZSBhcmUgb24gdGhlIHJvb3QgcGF0aFxyXG4gICAgbGV0IGxhYmVsLCBrZXksIHRvb2x0aXA7XHJcbiAgICBsZXQgaXNDbGlja2FibGUgPSB0cnVlO1xyXG4gICAgY29uc3QgY3VycmVudEJyZWFkY3J1bWIgPSByb3V0ZS5yb3V0ZUNvbmZpZz8uZGF0YT8uYnJlYWRjcnVtYjtcclxuICAgIGlmICh0eXBlb2YgY3VycmVudEJyZWFkY3J1bWIgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGtleSA9IGN1cnJlbnRCcmVhZGNydW1iLmtleTtcclxuICAgICAgbGFiZWwgPSBjdXJyZW50QnJlYWRjcnVtYi5sYWJlbDtcclxuICAgICAgaXNDbGlja2FibGUgPSBjdXJyZW50QnJlYWRjcnVtYi5pc0NsaWNrYWJsZSA/PyBpc0NsaWNrYWJsZTtcclxuICAgICAgdG9vbHRpcCA9IGN1cnJlbnRCcmVhZGNydW1iLnRvb2x0aXAgPz8gbGFiZWw7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50QnJlYWRjcnVtYiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAga2V5ID0gbGFiZWwgPSB0b29sdGlwID0gY3VycmVudEJyZWFkY3J1bWI7XHJcbiAgICB9XHJcbiAgICBsZXQgcGF0aCA9IHJvdXRlLnJvdXRlQ29uZmlnPy5wYXRoID8/ICcnO1xyXG5cclxuICAgIC8vIElmIHRoZSByb3V0ZSBpcyBkeW5hbWljIHJvdXRlIHN1Y2ggYXMgJzppZCcsIHJlcGxhY2UgaXQgd2l0aCBhY3R1YWwgcGFyYW0gdmFsdWVzXHJcbiAgICBjb25zdCBkeW5hbWljUm91dGVzID0gcGF0aC5zcGxpdCgnLycpLmZpbHRlcigoZWwpID0+IGVsLnN0YXJ0c1dpdGgoJzonKSk7XHJcbiAgICBpZiAoZHluYW1pY1JvdXRlcy5sZW5ndGggJiYgISFyb3V0ZS5zbmFwc2hvdCkge1xyXG4gICAgICBkeW5hbWljUm91dGVzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSBpdGVtLnNwbGl0KCc6JylbMV07XHJcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShpdGVtLCByb3V0ZS5zbmFwc2hvdC5wYXJhbXNbcGFyYW1OYW1lXSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluIHRoZSByb3V0ZUNvbmZpZyB0aGUgY29tcGxldGUgcGF0aCBpcyBub3QgYXZhaWxhYmxlLFxyXG4gICAgLy9zbyB3ZSByZWJ1aWxkIGl0IGVhY2ggdGltZVxyXG4gICAgY29uc3QgbmV4dFVybCA9IHBhdGggPyBgJHt1cmx9LyR7cGF0aH1gIDogdXJsO1xyXG5cclxuICAgIGNvbnN0IG5ld0JyZWFkY3J1bWJzID0gWy4uLmJyZWFkY3J1bWJzXTtcclxuXHJcbiAgICBpZiAoa2V5KSB7XHJcbiAgICAgIGNvbnN0IGJyZWFkY3J1bWI6IElCcmVhZGNydW1iID0ge1xyXG4gICAgICAgIGtleSxcclxuICAgICAgICBsYWJlbCxcclxuICAgICAgICB0b29sdGlwLFxyXG4gICAgICAgIHVybDogbmV4dFVybCxcclxuICAgICAgICBpc0NsaWNrYWJsZSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIE9ubHkgYWRkaW5nIHJvdXRlIHdpdGggbm9uLWVtcHR5IGxhYmVsXHJcbiAgICAgIG5ld0JyZWFkY3J1bWJzLnB1c2goYnJlYWRjcnVtYik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJvdXRlLmZpcnN0Q2hpbGQpIHtcclxuICAgICAgLy9JZiB3ZSBhcmUgbm90IG9uIG91ciBjdXJyZW50IHBhdGggeWV0LFxyXG4gICAgICAvL3RoZXJlIHdpbGwgYmUgbW9yZSBjaGlsZHJlbiB0byBsb29rIGFmdGVyLCB0byBidWlsZCBvdXIgYnJlYWRjcnVtYlxyXG4gICAgICByZXR1cm4gdGhpcy5idWlsZEJyZWFkQ3J1bWIocm91dGUuZmlyc3RDaGlsZCwgbmV4dFVybCwgbmV3QnJlYWRjcnVtYnMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0JyZWFkY3J1bWJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgbGF0ZXN0IGFycmF5IG9mIGJyZWFkY3J1bWJzLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMgQXJyYXkgb2YgYnJlYWRjcnVtYnNcclxuICAgKi9cclxuICBwdWJsaWMgZ2V0QnJlYWRjcnVtYnMoKTogSUJyZWFkY3J1bWJbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnJlYWRjcnVtYkNoYW5nZXMuZ2V0VmFsdWUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVkaXQgdGhlIGJyZWFkY3J1bWIgbGFiZWwgYW5kIHVybCBkeW5hbWljYWxseS5cclxuICAgKiBJZiB0aGUgbGFiZWwgaXMgbnVsbCB3aGlsZSBlZGl0aW5nLCBpdCB3aWxsIGFjdFxyXG4gICAqIGFzIGRlbGV0ZSBicmVhZGNydW1iIGZyb20gVUkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gY3J1bWJzIElSZXBsYWNlQnJlYWRjcnVtYltdXHJcbiAgICovXHJcbiAgZWRpdEJyZWFkY3J1bWJzKGNydW1iczogSVJlcGxhY2VCcmVhZGNydW1iW10pOiB2b2lkIHtcclxuICAgIGNydW1icy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmJyZWFkY3J1bWJzLmZpbmQoXHJcbiAgICAgICAgKGJyZWFkY3J1bWIpID0+IGJyZWFkY3J1bWIua2V5ID09PSBpdGVtLmtleVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgIGRhdGEubGFiZWwgPSBpdGVtLm5ld0xhYmVsO1xyXG4gICAgICAgIGRhdGEudXJsID0gQXJyYXkuaXNBcnJheShpdGVtLm5ld1VybClcclxuICAgICAgICAgID8gaXRlbS5uZXdVcmwuam9pbignLycpXHJcbiAgICAgICAgICA6IGl0ZW0ubmV3VXJsID8/IGRhdGEudXJsO1xyXG4gICAgICAgIGRhdGEudG9vbHRpcCA9IGl0ZW0udG9vbHRpcCA/PyBkYXRhLnRvb2x0aXA7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5fYnJlYWRjcnVtYkNoYW5nZXMubmV4dChbLi4udGhpcy5icmVhZGNydW1ic10pO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBmdW5jdGlvbnNcclxuICBwcml2YXRlIF9zdWJzY3JpYmVUb1JvdXRlRXZlbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcclxuICAgICAgLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHRoaXMuYnVpbGRCcmVhZENydW1iKHRoaXMuYWN0aXZhdGVkUm91dGUucm9vdCk7XHJcbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYkNoYW5nZXMubmV4dCh0aGlzLmJyZWFkY3J1bWJzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==