ng-dynamic-breadcrumb
Version:
Angular 14 Dynamic Breadcrumb
117 lines • 18.4 kB
JavaScript
import { Component, Input } from '@angular/core';
import { NavigationEnd, PRIMARY_OUTLET } from '@angular/router';
import { filter, map } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "./ng-dynamic-breadcrumb.service";
import * as i3 from "@angular/common";
export class NgDynamicBreadcrumbComponent {
constructor(activatedRoute, router, ngDynamicBreadcrumbService) {
this.activatedRoute = activatedRoute;
this.router = router;
this.ngDynamicBreadcrumbService = ngDynamicBreadcrumbService;
this.breadcrumb = [];
this.bgColor = '#eee';
this.fontSize = '18px';
this.fontColor = '#0275d8';
this.lastLinkColor = '#000';
this.symbol = ' / ';
this.breadCrumbData();
}
ngOnInit() {
this.ngDynamicBreadcrumbService.breadcrumbLabels.subscribe((labelData) => {
for (const label in labelData) {
if (labelData.hasOwnProperty(label)) {
this.breadcrumb.map((crumb) => {
const labelParams = crumb.label.match(/[^{{]+(?=\}})/g);
if (labelParams) {
for (const labelParam of labelParams) {
const dynamicData = labelData[label];
if (labelParam === label) {
crumb.label = crumb.label.replace('{{' + labelParam + '}}', dynamicData);
}
}
}
});
}
}
});
this.ngDynamicBreadcrumbService.newBreadcrumb.subscribe((breadcrumb) => {
if (breadcrumb.length > 0) {
this.updateData(this.activatedRoute, breadcrumb);
}
});
}
breadCrumbData() {
this.router.events
.pipe(filter(event => event instanceof NavigationEnd))
.pipe(map(() => this.activatedRoute))
.pipe(map((route) => {
while (route.firstChild) {
route = route.firstChild;
}
return route;
}))
.pipe(filter(route => route.outlet === PRIMARY_OUTLET))
.subscribe(route => {
this.params = route.snapshot.params;
this.updateData(route, null);
});
}
updateData(route, newBreadcrumb) {
if (route.snapshot.data.breadcrumb || newBreadcrumb) {
const data = route.snapshot.data.breadcrumb ? route.snapshot.data.breadcrumb : newBreadcrumb;
const breadcrumb = (JSON.parse(JSON.stringify(data)));
breadcrumb.map((crumb) => {
const urlChunks = crumb.url.split('/');
for (const chunk of urlChunks) {
if (chunk.includes(':')) {
const paramID = chunk.replace(':', '');
// const routerParamID = route.snapshot.params[paramID];
const routerParamID = this.params[paramID];
crumb.url = crumb.url.replace(`:${paramID}`, routerParamID);
}
}
const labelParams = crumb.label.match(/[^{{]+(?=\}})/g);
if (labelParams) {
for (const labelParam of labelParams) {
// const routerParamID = route.snapshot.params[labelParam.trim()];
const routerParamID = this.params[labelParam.trim()];
if (routerParamID) {
crumb.label = crumb.label.replace('{{' + labelParam + '}}', routerParamID);
}
else {
// crumb.label = crumb.label.replace('{{' + labelParam + '}}', '');
}
}
}
});
this.breadcrumb = breadcrumb;
}
else {
this.breadcrumb = [];
}
}
}
NgDynamicBreadcrumbComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: NgDynamicBreadcrumbComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.NgDynamicBreadcrumbService }], target: i0.ɵɵFactoryTarget.Component });
NgDynamicBreadcrumbComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.1", type: NgDynamicBreadcrumbComponent, selector: "app-ng-dynamic-breadcrumb", inputs: { bgColor: "bgColor", fontSize: "fontSize", fontColor: "fontColor", lastLinkColor: "lastLinkColor", symbol: "symbol" }, ngImport: i0, template: "<ul class=\"custom-bread-crumb\" [ngStyle]=\"{'background-color': bgColor}\">\r\n <span *ngFor=\"let item of breadcrumb; let i = index\">\r\n <li [ngStyle]=\"{'font-size': fontSize}\">\r\n <a *ngIf=\"item?.url\" [routerLink]=\"item?.url\" [queryParams]=\"item?.queryParams\" [ngStyle]=\"{'color': fontColor}\">{{ item.label }}</a>\r\n <span *ngIf=\"!item?.url\" [ngStyle]=\"{'color': lastLinkColor}\">{{ item.label }}</span>\r\n <span class=\"line\" *ngIf=\"breadcrumb.length !== i+1\">{{symbol}}</span>\r\n </li>\r\n </span>\r\n</ul>\r\n", styles: [".custom-bread-crumb{padding:10px 16px;list-style:none}.custom-bread-crumb li{display:inline}.custom-bread-crumb .line{padding-right:3px}.custom-bread-crumb li a{text-decoration:none}.custom-bread-crumb li a:hover{color:#01447e;text-decoration:underline}"], directives: [{ type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: NgDynamicBreadcrumbComponent, decorators: [{
type: Component,
args: [{
// tslint:disable-next-line: component-selector
selector: 'app-ng-dynamic-breadcrumb',
templateUrl: './ng-dynamic-breadcrumb.component.html',
styleUrls: ['./ng-dynamic-breadcrumb.component.css']
}]
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.NgDynamicBreadcrumbService }]; }, propDecorators: { bgColor: [{
type: Input
}], fontSize: [{
type: Input
}], fontColor: [{
type: Input
}], lastLinkColor: [{
type: Input
}], symbol: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZHluYW1pYy1icmVhZGNydW1iLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWR5bmFtaWMtYnJlYWRjcnVtYi9zcmMvbGliL25nLWR5bmFtaWMtYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1keW5hbWljLWJyZWFkY3J1bWIvc3JjL2xpYi9uZy1keW5hbWljLWJyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUEwQixhQUFhLEVBQUUsY0FBYyxFQUFvQixNQUFNLGlCQUFpQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFZLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBVXZELE1BQU0sT0FBTyw0QkFBNEI7SUFXdkMsWUFDVSxjQUE4QixFQUM5QixNQUFjLEVBQ2QsMEJBQXNEO1FBRnRELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQVpoRSxlQUFVLEdBQWlCLEVBQUUsQ0FBQztRQUNyQixZQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxNQUFNLENBQUM7UUFDbEIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixrQkFBYSxHQUFHLE1BQU0sQ0FBQztRQUN2QixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBU3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUN2RSxLQUFLLE1BQU0sS0FBSyxJQUFJ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Q0FBQztpQkFDckQ7bUtBSVUsT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBOYXZpZ2F0aW9uRW5kLCBQUklNQVJZX09VVExFVCwgUm91dGVzUmVjb2duaXplZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4vYnJlYWRjcnVtYi5tb2RlbCc7XHJcbmltcG9ydCB7IE5nRHluYW1pY0JyZWFkY3J1bWJTZXJ2aWNlIH0gZnJvbSAnLi9uZy1keW5hbWljLWJyZWFkY3J1bWIuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnYXBwLW5nLWR5bmFtaWMtYnJlYWRjcnVtYicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLWR5bmFtaWMtYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmctZHluYW1pYy1icmVhZGNydW1iLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdEeW5hbWljQnJlYWRjcnVtYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGJyZWFkY3J1bWI6IEJyZWFkY3J1bWJbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGJnQ29sb3IgPSAnI2VlZSc7XHJcbiAgQElucHV0KCkgZm9udFNpemUgPSAnMThweCc7XHJcbiAgQElucHV0KCkgZm9udENvbG9yID0gJyMwMjc1ZDgnO1xyXG4gIEBJbnB1dCgpIGxhc3RMaW5rQ29sb3IgPSAnIzAwMCc7XHJcbiAgQElucHV0KCkgc3ltYm9sID0gJyAvICc7XHJcbiAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBuZ0R5bmFtaWNCcmVhZGNydW1iU2VydmljZTogTmdEeW5hbWljQnJlYWRjcnVtYlNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuYnJlYWRDcnVtYkRhdGEoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5uZ0R5bmFtaWNCcmVhZGNydW1iU2VydmljZS5icmVhZGNydW1iTGFiZWxzLnN1YnNjcmliZSgobGFiZWxEYXRhKSA9PiB7XHJcbiAgICAgIGZvciAoY29uc3QgbGFiZWwgaW4gbGFiZWxEYXRhKSB7XHJcbiAgICAgICAgaWYgKGxhYmVsRGF0YS5oYXNPd25Qcm9wZXJ0eShsYWJlbCkpIHtcclxuICAgICAgICAgIHRoaXMuYnJlYWRjcnVtYi5tYXAoKGNydW1iKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsUGFyYW1zID0gY3J1bWIubGFiZWwubWF0Y2goL1tee3tdKyg/PVxcfX0pL2cpO1xyXG4gICAgICAgICAgICBpZiAobGFiZWxQYXJhbXMpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxhYmVsUGFyYW0gb2YgbGFiZWxQYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNEYXRhID0gbGFiZWxEYXRhW2xhYmVsXTtcclxuICAgICAgICAgICAgICAgIGlmIChsYWJlbFBhcmFtID09PSBsYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICBjcnVtYi5sYWJlbCA9IGNydW1iLmxhYmVsLnJlcGxhY2UoJ3t7JyArIGxhYmVsUGFyYW0gKyAnfX0nLCBkeW5hbWljRGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMubmdEeW5hbWljQnJlYWRjcnVtYlNlcnZpY2UubmV3QnJlYWRjcnVtYi5zdWJzY3JpYmUoKGJyZWFkY3J1bWI6IEJyZWFkY3J1bWJbXSkgPT4ge1xyXG4gICAgICBpZiAoYnJlYWRjcnVtYi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKHRoaXMuYWN0aXZhdGVkUm91dGUsIGJyZWFkY3J1bWIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgYnJlYWRDcnVtYkRhdGEoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcclxuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpXHJcbiAgICAgIC5waXBlKG1hcCgoKSA9PiB0aGlzLmFjdGl2YXRlZFJvdXRlKSlcclxuICAgICAgLnBpcGUobWFwKChyb3V0ZSkgPT4ge1xyXG4gICAgICAgIHdoaWxlIChyb3V0ZS5maXJzdENoaWxkKSB7IHJvdXRlID0gcm91dGUuZmlyc3RDaGlsZDsgfVxyXG4gICAgICAgIHJldHVybiByb3V0ZTtcclxuICAgICAgfSkpXHJcbiAgICAgIC5waXBlKGZpbHRlcihyb3V0ZSA9PiByb3V0ZS5vdXRsZXQgPT09IFBSSU1BUllfT1VUTEVUKSlcclxuICAgICAgLnN1YnNjcmliZShyb3V0ZSA9PiB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSByb3V0ZS5zbmFwc2hvdC5wYXJhbXM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKHJvdXRlLCBudWxsKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURhdGEocm91dGUsIG5ld0JyZWFkY3J1bWIpOiB2b2lkIHtcclxuICAgIGlmIChyb3V0ZS5zbmFwc2hvdC5kYXRhLmJyZWFkY3J1bWIgfHwgbmV3QnJlYWRjcnVtYikge1xyXG4gICAgICBjb25zdCBkYXRhID0gcm91dGUuc25hcHNob3QuZGF0YS5icmVhZGNydW1iID8gcm91dGUuc25hcHNob3QuZGF0YS5icmVhZGNydW1iIDogbmV3QnJlYWRjcnVtYjtcclxuICAgICAgY29uc3QgYnJlYWRjcnVtYiA9IChKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSk7XHJcbiAgICAgIGJyZWFkY3J1bWIubWFwKChjcnVtYikgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCB1cmxDaHVua3MgPSBjcnVtYi51cmwuc3BsaXQoJy8nKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIHVybENodW5rcykge1xyXG4gICAgICAgICAgaWYgKGNodW5rLmluY2x1ZGVzKCc6JykpIHtcclxuICAgICAgICAgICAgY29uc3QgcGFyYW1JRCA9IGNodW5rLnJlcGxhY2UoJzonLCAnJyk7XHJcbiAgICAgICAgICAgIC8vIGNvbnN0IHJvdXRlclBhcmFtSUQgPSByb3V0ZS5zbmFwc2hvdC5wYXJhbXNbcGFyYW1JRF07XHJcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlclBhcmFtSUQgPSB0aGlzLnBhcmFtc1twYXJhbUlEXTtcclxuICAgICAgICAgICAgY3J1bWIudXJsID0gY3J1bWIudXJsLnJlcGxhY2UoYDoke3BhcmFtSUR9YCwgcm91dGVyUGFyYW1JRCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBsYWJlbFBhcmFtcyA9IGNydW1iLmxhYmVsLm1hdGNoKC9bXnt7XSsoPz1cXH19KS9nKTtcclxuICAgICAgICBpZiAobGFiZWxQYXJhbXMpIHtcclxuICAgICAgICAgIGZvciAoY29uc3QgbGFiZWxQYXJhbSBvZiBsYWJlbFBhcmFtcykge1xyXG4gICAgICAgICAgICAvLyBjb25zdCByb3V0ZXJQYXJhbUlEID0gcm91dGUuc25hcHNob3QucGFyYW1zW2xhYmVsUGFyYW0udHJpbSgpXTtcclxuICAgICAgICAgICAgY29uc3Qgcm91dGVyUGFyYW1JRCA9IHRoaXMucGFyYW1zW2xhYmVsUGFyYW0udHJpbSgpXTtcclxuICAgICAgICAgICAgaWYgKHJvdXRlclBhcmFtSUQpIHtcclxuICAgICAgICAgICAgICBjcnVtYi5sYWJlbCA9IGNydW1iLmxhYmVsLnJlcGxhY2UoJ3t7JyArIGxhYmVsUGFyYW0gKyAnfX0nLCByb3V0ZXJQYXJhbUlEKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBjcnVtYi5sYWJlbCA9IGNydW1iLmxhYmVsLnJlcGxhY2UoJ3t7JyArIGxhYmVsUGFyYW0gKyAnfX0nLCAnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5icmVhZGNydW1iID0gYnJlYWRjcnVtYjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYnJlYWRjcnVtYiA9IFtdO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuIiwiPHVsIGNsYXNzPVwiY3VzdG9tLWJyZWFkLWNydW1iXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogYmdDb2xvcn1cIj5cclxuICA8c3BhbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBicmVhZGNydW1iOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgIDxsaSBbbmdTdHlsZV09XCJ7J2ZvbnQtc2l6ZSc6IGZvbnRTaXplfVwiPlxyXG4gICAgICAgICAgPGEgKm5nSWY9XCJpdGVtPy51cmxcIiBbcm91dGVyTGlua109XCJpdGVtPy51cmxcIiBbcXVlcnlQYXJhbXNdPVwiaXRlbT8ucXVlcnlQYXJhbXNcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogZm9udENvbG9yfVwiPnt7IGl0ZW0ubGFiZWwgfX08L2E+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtPy51cmxcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogbGFzdExpbmtDb2xvcn1cIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5lXCIgKm5nSWY9XCJicmVhZGNydW1iLmxlbmd0aCAhPT0gaSsxXCI+e3tzeW1ib2x9fTwvc3Bhbj5cclxuICAgICAgPC9saT5cclxuICA8L3NwYW4+XHJcbjwvdWw+XHJcbiJdfQ==