@outerlimitstech/ngx-breadcrumbs 18.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @outerlimitstech/ngx-breadcrumbs
2
+
3
+ Angular Library for generating breadcrumbs based on the routing state.
4
+
5
+ This package is a modified fork of original [@exalif/ngx-breadcrumbs](https://github.com/exalif/angular-libs)
6
+
7
+ _(The old component was lib-breadcrumbs)_
8
+
9
+
10
+ ## Usage
11
+
12
+ Coming Soon!
13
+
14
+
15
+ Place the `olt-ngx-breadcrumbs` component, which will render the breadcrumbs,
@@ -0,0 +1,51 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { BreadcrumbsService } from './services/breadcrumbs.service';
3
+ import { BreadcrumbsConfig } from './services';
4
+ import { RouterModule } from '@angular/router';
5
+ import { CommonModule } from '@angular/common';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "@angular/router";
9
+ export class BreadcrumbsComponent {
10
+ breadcrumbsService = inject(BreadcrumbsService);
11
+ crumbs$ = this.breadcrumbsService.getCrumbs();
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: BreadcrumbsComponent, isStandalone: true, selector: "olt-ngx-breadcrumbs", providers: [
14
+ BreadcrumbsService,
15
+ {
16
+ provide: BreadcrumbsConfig,
17
+ useFactory: () => new BreadcrumbsConfig()
18
+ }
19
+ ], ngImport: i0, template: `
20
+ <ol *ngIf="crumbs$ | async as crumbs" class="breadcrumbs__container">
21
+ <li *ngFor="let crumb of crumbs; let last = last"
22
+ [ngClass]="{ 'breadcrumbs__item--active': last }"
23
+ class="breadcrumbs__item"
24
+ >
25
+ <a *ngIf="!last" [routerLink]="crumb.path">{{ crumb.text }}</a>
26
+ <span *ngIf="last">{{ crumb.text }}</span>
27
+ </li>
28
+ </ol>
29
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsComponent, decorators: [{
32
+ type: Component,
33
+ args: [{ selector: 'olt-ngx-breadcrumbs', standalone: true, imports: [CommonModule, RouterModule], providers: [
34
+ BreadcrumbsService,
35
+ {
36
+ provide: BreadcrumbsConfig,
37
+ useFactory: () => new BreadcrumbsConfig()
38
+ }
39
+ ], template: `
40
+ <ol *ngIf="crumbs$ | async as crumbs" class="breadcrumbs__container">
41
+ <li *ngFor="let crumb of crumbs; let last = last"
42
+ [ngClass]="{ 'breadcrumbs__item--active': last }"
43
+ class="breadcrumbs__item"
44
+ >
45
+ <a *ngIf="!last" [routerLink]="crumb.path">{{ crumb.text }}</a>
46
+ <span *ngIf="last">{{ crumb.text }}</span>
47
+ </li>
48
+ </ol>
49
+ ` }]
50
+ }] });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJyZWFkY3J1bWJzL3NyYy9saWIvYnJlYWRjcnVtYnMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2xELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBMEIvQyxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXpDLE9BQU8sR0FBNkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO3VHQUhwRSxvQkFBb0I7MkZBQXBCLG9CQUFvQixrRUFwQnBCO1lBQ1Qsa0JBQWtCO1lBQ2xCO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLGlCQUFpQixFQUFFO2FBQzFDO1NBQ0YsMEJBQ1M7Ozs7Ozs7Ozs7R0FVVCx5RUFsQlMsWUFBWSxrWkFBRSxZQUFZOzsyRkFxQnpCLG9CQUFvQjtrQkF4QmhDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsYUFDMUI7d0JBQ1Qsa0JBQWtCO3dCQUNsQjs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxpQkFBaUIsRUFBRTt5QkFDMUM7cUJBQ0YsWUFDUzs7Ozs7Ozs7OztHQVVUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQnJlYWRjcnVtYiB9IGZyb20gJy4vbW9kZWxzL2JyZWFkY3J1bWInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJzU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYnJlYWRjcnVtYnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJzQ29uZmlnIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ29sdC1uZ3gtYnJlYWRjcnVtYnMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUm91dGVyTW9kdWxlXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIEJyZWFkY3J1bWJzU2VydmljZSxcclxuICAgIHsgXHJcbiAgICAgIHByb3ZpZGU6IEJyZWFkY3J1bWJzQ29uZmlnLCBcclxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gbmV3IEJyZWFkY3J1bWJzQ29uZmlnKCkgXHJcbiAgICB9ICAgIFxyXG4gIF0sICBcclxuICB0ZW1wbGF0ZTogYFxyXG4gICA8b2wgKm5nSWY9XCJjcnVtYnMkIHwgYXN5bmMgYXMgY3J1bWJzXCIgY2xhc3M9XCJicmVhZGNydW1ic19fY29udGFpbmVyXCI+XHJcbiAgICAgIDxsaSAqbmdGb3I9XCJsZXQgY3J1bWIgb2YgY3J1bWJzOyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2JyZWFkY3J1bWJzX19pdGVtLS1hY3RpdmUnOiBsYXN0IH1cIlxyXG4gICAgICAgIGNsYXNzPVwiYnJlYWRjcnVtYnNfX2l0ZW1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGEgKm5nSWY9XCIhbGFzdFwiIFtyb3V0ZXJMaW5rXT1cImNydW1iLnBhdGhcIj57eyBjcnVtYi50ZXh0IH19PC9hPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwibGFzdFwiPnt7IGNydW1iLnRleHQgfX08L3NwYW4+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L29sPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb21wb25lbnQge1xyXG4gIGJyZWFkY3J1bWJzU2VydmljZSA9IGluamVjdChCcmVhZGNydW1ic1NlcnZpY2UpO1xyXG5cclxuICBwdWJsaWMgY3J1bWJzJDogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+ID0gdGhpcy5icmVhZGNydW1ic1NlcnZpY2UuZ2V0Q3J1bWJzKCk7XHJcblxyXG4gIFxyXG59XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1icmVhZGNydW1icy9zcmMvbGliL21vZGVscy9icmVhZGNydW1iLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEJyZWFkY3J1bWIge1xyXG4gIHRleHQ6IHN0cmluZztcclxuICBwYXRoOiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -0,0 +1,16 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class BreadcrumbsConfig {
4
+ postProcess = null;
5
+ applyDistinctOn = 'text';
6
+ constructor(options) {
7
+ this.postProcess = options?.postProcess ?? null;
8
+ this.applyDistinctOn = options?.applyDistinctOn ?? 'text';
9
+ }
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsConfig, deps: [{ token: BreadcrumbsConfig }], target: i0.ɵɵFactoryTarget.Injectable });
11
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsConfig });
12
+ }
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsConfig, decorators: [{
14
+ type: Injectable
15
+ }], ctorParameters: () => [{ type: BreadcrumbsConfig }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWJyZWFkY3J1bWJzL3NyYy9saWIvc2VydmljZXMvYnJlYWRjcnVtYnMuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBUzNDLE1BQU0sT0FBTyxpQkFBaUI7SUFDckIsV0FBVyxHQUErQixJQUFJLENBQUM7SUFDL0MsZUFBZSxHQUF1QixNQUFNLENBQUM7SUFFcEQsWUFBWSxPQUEyQjtRQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDO1FBQ2hELElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxNQUFNLENBQUM7SUFDNUQsQ0FBQzt1R0FQVSxpQkFBaUI7MkdBQWpCLGlCQUFpQjs7MkZBQWpCLGlCQUFpQjtrQkFEN0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1iIH0gZnJvbSAnLi4vbW9kZWxzL2JyZWFkY3J1bWInO1xyXG5cclxuZXhwb3J0IHR5cGUgUG9zdFByb2Nlc3NGdW5jdGlvbiA9IChjcnVtYnM6IEJyZWFkY3J1bWJbXSkgPT4gUHJvbWlzZTxCcmVhZGNydW1iW10+IHwgT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHwgQnJlYWRjcnVtYltdO1xyXG5cclxuZXhwb3J0IHR5cGUgRGlzdGluY3RLZXkgPSBrZXlvZiBCcmVhZGNydW1iO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYnNDb25maWcge1xyXG4gIHB1YmxpYyBwb3N0UHJvY2VzczogUG9zdFByb2Nlc3NGdW5jdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBhcHBseURpc3RpbmN0T246IERpc3RpbmN0S2V5IHwgbnVsbCA9ICd0ZXh0JztcclxuXHJcbiAgY29uc3RydWN0b3Iob3B0aW9ucz86IEJyZWFkY3J1bWJzQ29uZmlnKSB7XHJcbiAgICB0aGlzLnBvc3RQcm9jZXNzID0gb3B0aW9ucz8ucG9zdFByb2Nlc3MgPz8gbnVsbDtcclxuICAgIHRoaXMuYXBwbHlEaXN0aW5jdE9uID0gb3B0aW9ucz8uYXBwbHlEaXN0aW5jdE9uID8/ICd0ZXh0JztcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,29 @@
1
+ import { of } from 'rxjs';
2
+ import { BreadcrumbsUtils } from '../utils/breadcrumbs.utils';
3
+ // export const breadcrumbsResolver: ResolveFn<Breadcrumb[]> = (route, state) => {
4
+ // return new Array<Breadcrumb>();
5
+ // };
6
+ export class BreadcrumbsResolver {
7
+ resolve(route, state) {
8
+ const textData = route.routeConfig?.data != null ? route.routeConfig?.data['text'] : null;
9
+ const breadcrumbData = route.routeConfig?.data != null ? route.routeConfig?.data['breadcrumbs'] : null;
10
+ const path = this.getFullPath(route);
11
+ let text = breadcrumbData != null && typeof (breadcrumbData === 'string') ? breadcrumbData : breadcrumbData?.text ?? textData ?? path;
12
+ text = BreadcrumbsUtils.stringFormat(text, route.data);
13
+ const crumbs = [{
14
+ text,
15
+ path
16
+ }];
17
+ return of(crumbs);
18
+ }
19
+ getFullPath(route) {
20
+ return this.fetchFullPath(route.pathFromRoot);
21
+ }
22
+ fetchFullPath(routes) {
23
+ return routes.reduce((path, route) => path += this.fetchRelativePath(route.url), '');
24
+ }
25
+ fetchRelativePath(urlSegments) {
26
+ return urlSegments.reduce((path, urlSegment) => path += '/' + urlSegment.path, '');
27
+ }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMucmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYnJlYWRjcnVtYnMvc3JjL2xpYi9zZXJ2aWNlcy9icmVhZGNydW1icy5yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTlELGtGQUFrRjtBQUNsRixvQ0FBb0M7QUFDcEMsS0FBSztBQUdMLE1BQU0sT0FBTyxtQkFBbUI7SUFDdkIsT0FBTyxDQUFDLEtBQTZCLEVBQUUsS0FBMEI7UUFHdEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzFGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUV2RyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJDLElBQUksSUFBSSxHQUFHLGNBQWMsSUFBSSxJQUFJLElBQUksT0FBTSxDQUFDLGNBQWMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFDckksSUFBSSxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZELE1BQU0sTUFBTSxHQUFpQixDQUFDO2dCQUM1QixJQUFJO2dCQUNKLElBQUk7YUFDTCxDQUFDLENBQUM7UUFFSCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQTZCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFnQztRQUNwRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRU8saUJBQWlCLENBQUMsV0FBeUI7UUFDakQsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgUmVzb2x2ZUZuLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxTZWdtZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJyZWFkY3J1bWIgfSBmcm9tICcuLi9tb2RlbHMvYnJlYWRjcnVtYic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYnNVdGlscyB9IGZyb20gJy4uL3V0aWxzL2JyZWFkY3J1bWJzLnV0aWxzJztcblxuLy8gZXhwb3J0IGNvbnN0IGJyZWFkY3J1bWJzUmVzb2x2ZXI6IFJlc29sdmVGbjxCcmVhZGNydW1iW10+ID0gKHJvdXRlLCBzdGF0ZSkgPT4ge1xuLy8gICByZXR1cm4gbmV3IEFycmF5PEJyZWFkY3J1bWI+KCk7XG4vLyB9O1xuXG5cbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1ic1Jlc29sdmVyICB7XG4gIHB1YmxpYyByZXNvbHZlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB8IFByb21pc2U8QnJlYWRjcnVtYltdPiB8IEJyZWFkY3J1bWJbXSB7XG5cbiAgICBcbiAgICBjb25zdCB0ZXh0RGF0YSA9IHJvdXRlLnJvdXRlQ29uZmlnPy5kYXRhICE9IG51bGwgPyByb3V0ZS5yb3V0ZUNvbmZpZz8uZGF0YVsndGV4dCddIDogbnVsbDtcbiAgICBjb25zdCBicmVhZGNydW1iRGF0YSA9IHJvdXRlLnJvdXRlQ29uZmlnPy5kYXRhICE9IG51bGwgPyByb3V0ZS5yb3V0ZUNvbmZpZz8uZGF0YVsnYnJlYWRjcnVtYnMnXSA6IG51bGw7XG5cbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZXRGdWxsUGF0aChyb3V0ZSk7XG5cbiAgICBsZXQgdGV4dCA9IGJyZWFkY3J1bWJEYXRhICE9IG51bGwgJiYgdHlwZW9mKGJyZWFkY3J1bWJEYXRhID09PSAnc3RyaW5nJykgPyBicmVhZGNydW1iRGF0YSA6IGJyZWFkY3J1bWJEYXRhPy50ZXh0ID8/IHRleHREYXRhID8/IHBhdGg7XG4gICAgdGV4dCA9IEJyZWFkY3J1bWJzVXRpbHMuc3RyaW5nRm9ybWF0KHRleHQsIHJvdXRlLmRhdGEpO1xuXG4gICAgY29uc3QgY3J1bWJzOiBCcmVhZGNydW1iW10gPSBbe1xuICAgICAgdGV4dCxcbiAgICAgIHBhdGhcbiAgICB9XTtcblxuICAgIHJldHVybiBvZihjcnVtYnMpO1xuICB9XG5cbiAgcHVibGljIGdldEZ1bGxQYXRoKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaEZ1bGxQYXRoKHJvdXRlLnBhdGhGcm9tUm9vdCk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoRnVsbFBhdGgocm91dGVzOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90W10pOiBzdHJpbmcge1xuICAgIHJldHVybiByb3V0ZXMucmVkdWNlKChwYXRoLCByb3V0ZSkgPT4gcGF0aCArPSB0aGlzLmZldGNoUmVsYXRpdmVQYXRoKHJvdXRlLnVybCksICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hSZWxhdGl2ZVBhdGgodXJsU2VnbWVudHM6IFVybFNlZ21lbnRbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybFNlZ21lbnRzLnJlZHVjZSgocGF0aCwgdXJsU2VnbWVudCkgPT4gcGF0aCArPSAnLycgKyB1cmxTZWdtZW50LnBhdGgsICcnKTtcbiAgfVxufVxuXG4iXX0=
@@ -0,0 +1,72 @@
1
+ import { inject, Injectable, Injector } from '@angular/core';
2
+ import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
3
+ import { BreadcrumbsConfig } from './breadcrumbs.config';
4
+ import { BehaviorSubject, concat, distinct, filter, first, mergeMap, of, tap, toArray } from 'rxjs';
5
+ import { BreadcrumbsUtils } from '../utils/breadcrumbs.utils';
6
+ import { BreadcrumbsResolver } from './breadcrumbs.resolver';
7
+ import * as i0 from "@angular/core";
8
+ export class BreadcrumbsService {
9
+ breadcrumbs = new BehaviorSubject([]);
10
+ defaultResolver = new BreadcrumbsResolver();
11
+ route = inject(ActivatedRoute);
12
+ router = inject(Router);
13
+ config = inject(BreadcrumbsConfig);
14
+ injector = inject(Injector);
15
+ constructor() {
16
+ this.initialize();
17
+ }
18
+ initialize() {
19
+ this.router.events.pipe(filter((x) => x instanceof NavigationEnd)).subscribe(() => {
20
+ const routeRoot = this.router.routerState.snapshot.root;
21
+ this.resolveCrumbs(routeRoot).pipe(mergeMap((crumbs) => crumbs), this.config.applyDistinctOn != null ? distinct((crumb) => crumb[this.config.applyDistinctOn]) : tap(), toArray(), mergeMap((crumbs) => {
22
+ if (this.config.postProcess) {
23
+ const postProcessedCrumb = this.config.postProcess(crumbs);
24
+ return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(first());
25
+ }
26
+ else {
27
+ return of(crumbs);
28
+ }
29
+ })).subscribe((crumbs) => {
30
+ this.breadcrumbs.next(crumbs);
31
+ });
32
+ });
33
+ }
34
+ get crumbs$() {
35
+ return this.breadcrumbs;
36
+ }
37
+ getCrumbs() {
38
+ return this.crumbs$;
39
+ }
40
+ resolveCrumbs(route) {
41
+ let crumbs$;
42
+ const data = route.routeConfig && route.routeConfig.data;
43
+ const breadcrumbData = data != null ? data['breadcrumbs'] : null;
44
+ if (breadcrumbData != null) {
45
+ let resolver;
46
+ if (breadcrumbData.prototype instanceof BreadcrumbsResolver) {
47
+ resolver = this.injector.get(breadcrumbData);
48
+ }
49
+ else {
50
+ resolver = this.defaultResolver;
51
+ }
52
+ const result = resolver.resolve(route, this.router.routerState.snapshot);
53
+ crumbs$ = BreadcrumbsUtils.wrapIntoObservable(result).pipe(first());
54
+ }
55
+ else {
56
+ crumbs$ = of([]);
57
+ }
58
+ if (route.firstChild) {
59
+ crumbs$ = concat(crumbs$, this.resolveCrumbs(route.firstChild));
60
+ }
61
+ return crumbs$;
62
+ }
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
64
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsService, providedIn: 'root' });
65
+ }
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsService, decorators: [{
67
+ type: Injectable,
68
+ args: [{
69
+ providedIn: 'root'
70
+ }]
71
+ }], ctorParameters: () => [] });
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1icmVhZGNydW1icy9zcmMvbGliL3NlcnZpY2VzL2JyZWFkY3J1bWJzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQTBCLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFaEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBSzdELE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsV0FBVyxHQUFHLElBQUksZUFBZSxDQUFlLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELGVBQWUsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFFN0MsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNuQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXBDO1FBQ0UsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxVQUFVO1FBQ2hCLElBQUks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T0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7dUdBckVVLGtCQUFrQjsyR0FBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzJGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1ic0NvbmZpZyB9IGZyb20gJy4vYnJlYWRjcnVtYnMuY29uZmlnJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb25jYXQsIGRpc3RpbmN0LCBmaWx0ZXIsIGZpcnN0LCBtZXJnZU1hcCwgT2JzZXJ2YWJsZSwgb2YsIHRhcCwgdG9BcnJheSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1iIH0gZnJvbSAnLi4vbW9kZWxzL2JyZWFkY3J1bWInO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1ic1V0aWxzIH0gZnJvbSAnLi4vdXRpbHMvYnJlYWRjcnVtYnMudXRpbHMnO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1ic1Jlc29sdmVyIH0gZnJvbSAnLi9icmVhZGNydW1icy5yZXNvbHZlcic7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1ic1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgYnJlYWRjcnVtYnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEJyZWFkY3J1bWJbXT4oW10pO1xyXG4gICBwcml2YXRlIGRlZmF1bHRSZXNvbHZlciA9IG5ldyBCcmVhZGNydW1ic1Jlc29sdmVyKCk7XHJcbiAgIFxyXG4gIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xyXG4gIHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XHJcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoQnJlYWRjcnVtYnNDb25maWcpO1xyXG4gIHByaXZhdGUgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKCkgeyBcclxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoXHJcbiAgICAgIGZpbHRlcigoeCkgPT4geCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLCAvLyB8fCB4Wydyb3V0ZXJFdmVudCddIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZFxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBjb25zdCByb3V0ZVJvb3QgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC5yb290O1xyXG5cclxuICAgICAgdGhpcy5yZXNvbHZlQ3J1bWJzKHJvdXRlUm9vdCkucGlwZShcclxuICAgICAgICBtZXJnZU1hcCgoY3J1bWJzOiBCcmVhZGNydW1iW10pID0+IGNydW1icyksIHRoaXMuY29uZmlnLmFwcGx5RGlzdGluY3RPbiAhPSBudWxsID8gZGlzdGluY3QoKGNydW1iOiBCcmVhZGNydW1iKSA9PiBjcnVtYlt0aGlzLmNvbmZpZy5hcHBseURpc3RpbmN0T24hXSkgOiB0YXAoKSxcclxuICAgICAgICB0b0FycmF5KCksXHJcbiAgICAgICAgbWVyZ2VNYXAoKGNydW1iczogQnJlYWRjcnVtYltdKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWcucG9zdFByb2Nlc3MpIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zdFByb2Nlc3NlZENydW1iID0gdGhpcy5jb25maWcucG9zdFByb2Nlc3MoY3J1bWJzKTtcclxuICAgICAgICAgICAgcmV0dXJuIEJyZWFkY3J1bWJzVXRpbHMud3JhcEludG9PYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ocG9zdFByb2Nlc3NlZENydW1iKS5waXBlKGZpcnN0KCkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGNydW1icyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKS5zdWJzY3JpYmUoKGNydW1iczogQnJlYWRjcnVtYltdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5icmVhZGNydW1icy5uZXh0KGNydW1icyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3J1bWJzJCgpOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYnJlYWRjcnVtYnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q3J1bWJzKCk6IE9ic2VydmFibGU8QnJlYWRjcnVtYltdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jcnVtYnMkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXNvbHZlQ3J1bWJzKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxCcmVhZGNydW1iW10+IHtcclxuICAgIGxldCBjcnVtYnMkOiBPYnNlcnZhYmxlPEJyZWFkY3J1bWJbXT47XHJcbiAgICBjb25zdCBkYXRhID0gcm91dGUucm91dGVDb25maWcgJiYgcm91dGUucm91dGVDb25maWcuZGF0YTtcclxuICAgIGNvbnN0IGJyZWFkY3J1bWJEYXRhID0gZGF0YSAhPSBudWxsID8gZGF0YVsnYnJlYWRjcnVtYnMnXSA6IG51bGw7XHJcbiAgICBcclxuICAgIGlmIChicmVhZGNydW1iRGF0YSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCByZXNvbHZlcjogQnJlYWRjcnVtYnNSZXNvbHZlcjtcclxuXHJcbiAgICAgIGlmIChicmVhZGNydW1iRGF0YS5wcm90b3R5cGUgaW5zdGFuY2VvZiBCcmVhZGNydW1ic1Jlc29sdmVyKSB7XHJcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLmluamVjdG9yLmdldChicmVhZGNydW1iRGF0YSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZXIgPSB0aGlzLmRlZmF1bHRSZXNvbHZlcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZXIucmVzb2x2ZShyb3V0ZSwgdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xyXG4gICAgICBjcnVtYnMkID0gQnJlYWRjcnVtYnNVdGlscy53cmFwSW50b09ic2VydmFibGU8QnJlYWRjcnVtYltdPihyZXN1bHQpLnBpcGUoZmlyc3QoKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjcnVtYnMkID0gb2YoW10pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyb3V0ZS5maXJzdENoaWxkKSB7XHJcbiAgICAgIGNydW1icyQgPSBjb25jYXQoY3J1bWJzJCwgdGhpcy5yZXNvbHZlQ3J1bWJzKHJvdXRlLmZpcnN0Q2hpbGQpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3J1bWJzJDtcclxuICB9XHJcbiAgXHJcbn1cclxuIl19
@@ -0,0 +1,4 @@
1
+ export * from './breadcrumbs.config';
2
+ export * from './breadcrumbs.resolver';
3
+ export * from './breadcrumbs.service';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYnJlYWRjcnVtYnMvc3JjL2xpYi9zZXJ2aWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYnJlYWRjcnVtYnMuY29uZmlnJztcclxuZXhwb3J0ICogZnJvbSAnLi9icmVhZGNydW1icy5yZXNvbHZlcic7XHJcbmV4cG9ydCAqIGZyb20gJy4vYnJlYWRjcnVtYnMuc2VydmljZSc7XHJcbiJdfQ==
@@ -0,0 +1,62 @@
1
+ import { Observable, of, from } from 'rxjs';
2
+ export class BreadcrumbsUtils {
3
+ static stringFormat(rawTemplate, data) {
4
+ const templateRegex = new RegExp('{{[\\s]*[a-zA-Z._]+?[\\s]*}}', 'g');
5
+ return rawTemplate.replace(templateRegex, (match) => {
6
+ const keyRegex = new RegExp('([a-zA-Z._]+)', 'g');
7
+ const key = match.match(keyRegex);
8
+ if (!key || !key.length) {
9
+ return match;
10
+ }
11
+ const value = BreadcrumbsUtils.leaf(data, key[0]);
12
+ if (!value) {
13
+ return key[0];
14
+ }
15
+ return value;
16
+ });
17
+ }
18
+ static wrapIntoObservable(value) {
19
+ if (value instanceof Observable) {
20
+ return value;
21
+ }
22
+ if (this.isPromise(value)) {
23
+ return from(Promise.resolve(value));
24
+ }
25
+ return of(value);
26
+ }
27
+ static isPromise(value) {
28
+ return value && (typeof value.then === 'function');
29
+ }
30
+ /**
31
+ * Access object nested value by giving a path
32
+ *
33
+ * @param obj The object you want to access value from
34
+ * @param path The value path. e.g: `bar.baz`
35
+ * @example
36
+ * const obj = { foo: { bar: 'Baz' } };
37
+ * const path = 'foo.bar';
38
+ * leaf(obj, path) // 'Baz'
39
+ */
40
+ static leaf(obj, path) {
41
+ const result = path.split('.').reduce((value, el) => value[el] || {}, obj);
42
+ return BreadcrumbsUtils.isEmptyObject(result) ? null : result;
43
+ }
44
+ /**
45
+ * checks whether an object is empty or not
46
+ *
47
+ * @param obj object to extract values from
48
+ * @returns boolean
49
+ */
50
+ static isEmptyObject(obj) {
51
+ if (typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]') {
52
+ for (const key in obj) {
53
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
54
+ return false;
55
+ }
56
+ }
57
+ return true;
58
+ }
59
+ return false;
60
+ }
61
+ }
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYnMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtYnJlYWRjcnVtYnMvc3JjL2xpYi91dGlscy9icmVhZGNydW1icy51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUMsTUFBTSxPQUFnQixnQkFBZ0I7SUFDN0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFtQixFQUFFLElBQVM7UUFDdkQsTUFBTSxhQUFhLEdBQUcsSUFBSSxNQUFNLENBQUMsOEJBQThCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFdEUsT0FBTyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWxDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBSSxLQUFxQztRQUN2RSxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDLEtBQVUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQVU7UUFDakMsT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBUSxFQUFFLElBQVk7UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sZ0JBQWdCLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQVE7UUFDbEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLGlCQUFpQixFQUFFLENBQUM7WUFDekYsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25ELE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJyZWFkY3J1bWJzVXRpbHMge1xyXG4gIHB1YmxpYyBzdGF0aWMgc3RyaW5nRm9ybWF0KHJhd1RlbXBsYXRlOiBzdHJpbmcsIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZVJlZ2V4ID0gbmV3IFJlZ0V4cCgne3tbXFxcXHNdKlthLXpBLVouX10rP1tcXFxcc10qfX0nLCAnZycpO1xyXG5cclxuICAgIHJldHVybiByYXdUZW1wbGF0ZS5yZXBsYWNlKHRlbXBsYXRlUmVnZXgsIChtYXRjaCkgPT4ge1xyXG4gICAgICBjb25zdCBrZXlSZWdleCA9IG5ldyBSZWdFeHAoJyhbYS16QS1aLl9dKyknLCAnZycpO1xyXG4gICAgICBjb25zdCBrZXkgPSBtYXRjaC5tYXRjaChrZXlSZWdleCk7XHJcblxyXG4gICAgICBpZiAoIWtleSB8fCAha2V5Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBtYXRjaDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgdmFsdWUgPSBCcmVhZGNydW1ic1V0aWxzLmxlYWYoZGF0YSwga2V5WzBdKTtcclxuXHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICByZXR1cm4ga2V5WzBdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgd3JhcEludG9PYnNlcnZhYmxlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZTxUPiB8IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzUHJvbWlzZSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIGZyb20oUHJvbWlzZS5yZXNvbHZlKHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKHZhbHVlIGFzIFQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgaXNQcm9taXNlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiAodHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWNjZXNzIG9iamVjdCBuZXN0ZWQgdmFsdWUgYnkgZ2l2aW5nIGEgcGF0aFxyXG4gICAqXHJcbiAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHlvdSB3YW50IHRvIGFjY2VzcyB2YWx1ZSBmcm9tXHJcbiAgICogQHBhcmFtIHBhdGggVGhlIHZhbHVlIHBhdGguIGUuZzogYGJhci5iYXpgXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiAgIGNvbnN0IG9iaiA9IHsgZm9vOiB7IGJhcjogJ0JheicgfSB9O1xyXG4gICAqICAgY29uc3QgcGF0aCA9ICdmb28uYmFyJztcclxuICAgKiAgIGxlYWYob2JqLCBwYXRoKSAvLyAnQmF6J1xyXG4gICAqL1xyXG4gIHB1YmxpYyBzdGF0aWMgbGVhZihvYmo6IGFueSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBwYXRoLnNwbGl0KCcuJykucmVkdWNlKCh2YWx1ZSwgZWwpID0+IHZhbHVlW2VsXSB8fCB7fSwgb2JqKTtcclxuXHJcbiAgICByZXR1cm4gQnJlYWRjcnVtYnNVdGlscy5pc0VtcHR5T2JqZWN0KHJlc3VsdCkgPyBudWxsIDogcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogY2hlY2tzIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGVtcHR5IG9yIG5vdFxyXG4gICAqXHJcbiAgICogQHBhcmFtIG9iaiBvYmplY3QgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbVxyXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIGlzRW1wdHlPYmplY3Qob2JqOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0ZXJsaW1pdHN0ZWNoLW5neC1icmVhZGNydW1icy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1icmVhZGNydW1icy9zcmMvb3V0ZXJsaW1pdHN0ZWNoLW5neC1icmVhZGNydW1icy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Public API Surface of ngx-breadcrumbs
3
+ */
4
+ export * from './lib/services/index';
5
+ export * from './lib/breadcrumbs.component';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1icmVhZGNydW1icy9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZ3gtYnJlYWRjcnVtYnNcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9pbmRleCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2JyZWFkY3J1bWJzLmNvbXBvbmVudCc7XHJcbiJdfQ==
@@ -0,0 +1,228 @@
1
+ import * as i0 from '@angular/core';
2
+ import { Injectable, inject, Injector, Component } from '@angular/core';
3
+ import { Observable, from, of, BehaviorSubject, filter, mergeMap, distinct, tap, toArray, first, concat } from 'rxjs';
4
+ import * as i2 from '@angular/router';
5
+ import { ActivatedRoute, Router, NavigationEnd, RouterModule } from '@angular/router';
6
+ import * as i1 from '@angular/common';
7
+ import { CommonModule } from '@angular/common';
8
+
9
+ class BreadcrumbsConfig {
10
+ postProcess = null;
11
+ applyDistinctOn = 'text';
12
+ constructor(options) {
13
+ this.postProcess = options?.postProcess ?? null;
14
+ this.applyDistinctOn = options?.applyDistinctOn ?? 'text';
15
+ }
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsConfig, deps: [{ token: BreadcrumbsConfig }], target: i0.ɵɵFactoryTarget.Injectable });
17
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsConfig });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsConfig, decorators: [{
20
+ type: Injectable
21
+ }], ctorParameters: () => [{ type: BreadcrumbsConfig }] });
22
+
23
+ class BreadcrumbsUtils {
24
+ static stringFormat(rawTemplate, data) {
25
+ const templateRegex = new RegExp('{{[\\s]*[a-zA-Z._]+?[\\s]*}}', 'g');
26
+ return rawTemplate.replace(templateRegex, (match) => {
27
+ const keyRegex = new RegExp('([a-zA-Z._]+)', 'g');
28
+ const key = match.match(keyRegex);
29
+ if (!key || !key.length) {
30
+ return match;
31
+ }
32
+ const value = BreadcrumbsUtils.leaf(data, key[0]);
33
+ if (!value) {
34
+ return key[0];
35
+ }
36
+ return value;
37
+ });
38
+ }
39
+ static wrapIntoObservable(value) {
40
+ if (value instanceof Observable) {
41
+ return value;
42
+ }
43
+ if (this.isPromise(value)) {
44
+ return from(Promise.resolve(value));
45
+ }
46
+ return of(value);
47
+ }
48
+ static isPromise(value) {
49
+ return value && (typeof value.then === 'function');
50
+ }
51
+ /**
52
+ * Access object nested value by giving a path
53
+ *
54
+ * @param obj The object you want to access value from
55
+ * @param path The value path. e.g: `bar.baz`
56
+ * @example
57
+ * const obj = { foo: { bar: 'Baz' } };
58
+ * const path = 'foo.bar';
59
+ * leaf(obj, path) // 'Baz'
60
+ */
61
+ static leaf(obj, path) {
62
+ const result = path.split('.').reduce((value, el) => value[el] || {}, obj);
63
+ return BreadcrumbsUtils.isEmptyObject(result) ? null : result;
64
+ }
65
+ /**
66
+ * checks whether an object is empty or not
67
+ *
68
+ * @param obj object to extract values from
69
+ * @returns boolean
70
+ */
71
+ static isEmptyObject(obj) {
72
+ if (typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]') {
73
+ for (const key in obj) {
74
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
75
+ return false;
76
+ }
77
+ }
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+ }
83
+
84
+ // export const breadcrumbsResolver: ResolveFn<Breadcrumb[]> = (route, state) => {
85
+ // return new Array<Breadcrumb>();
86
+ // };
87
+ class BreadcrumbsResolver {
88
+ resolve(route, state) {
89
+ const textData = route.routeConfig?.data != null ? route.routeConfig?.data['text'] : null;
90
+ const breadcrumbData = route.routeConfig?.data != null ? route.routeConfig?.data['breadcrumbs'] : null;
91
+ const path = this.getFullPath(route);
92
+ let text = breadcrumbData != null && typeof (breadcrumbData === 'string') ? breadcrumbData : breadcrumbData?.text ?? textData ?? path;
93
+ text = BreadcrumbsUtils.stringFormat(text, route.data);
94
+ const crumbs = [{
95
+ text,
96
+ path
97
+ }];
98
+ return of(crumbs);
99
+ }
100
+ getFullPath(route) {
101
+ return this.fetchFullPath(route.pathFromRoot);
102
+ }
103
+ fetchFullPath(routes) {
104
+ return routes.reduce((path, route) => path += this.fetchRelativePath(route.url), '');
105
+ }
106
+ fetchRelativePath(urlSegments) {
107
+ return urlSegments.reduce((path, urlSegment) => path += '/' + urlSegment.path, '');
108
+ }
109
+ }
110
+
111
+ class BreadcrumbsService {
112
+ breadcrumbs = new BehaviorSubject([]);
113
+ defaultResolver = new BreadcrumbsResolver();
114
+ route = inject(ActivatedRoute);
115
+ router = inject(Router);
116
+ config = inject(BreadcrumbsConfig);
117
+ injector = inject(Injector);
118
+ constructor() {
119
+ this.initialize();
120
+ }
121
+ initialize() {
122
+ this.router.events.pipe(filter((x) => x instanceof NavigationEnd)).subscribe(() => {
123
+ const routeRoot = this.router.routerState.snapshot.root;
124
+ this.resolveCrumbs(routeRoot).pipe(mergeMap((crumbs) => crumbs), this.config.applyDistinctOn != null ? distinct((crumb) => crumb[this.config.applyDistinctOn]) : tap(), toArray(), mergeMap((crumbs) => {
125
+ if (this.config.postProcess) {
126
+ const postProcessedCrumb = this.config.postProcess(crumbs);
127
+ return BreadcrumbsUtils.wrapIntoObservable(postProcessedCrumb).pipe(first());
128
+ }
129
+ else {
130
+ return of(crumbs);
131
+ }
132
+ })).subscribe((crumbs) => {
133
+ this.breadcrumbs.next(crumbs);
134
+ });
135
+ });
136
+ }
137
+ get crumbs$() {
138
+ return this.breadcrumbs;
139
+ }
140
+ getCrumbs() {
141
+ return this.crumbs$;
142
+ }
143
+ resolveCrumbs(route) {
144
+ let crumbs$;
145
+ const data = route.routeConfig && route.routeConfig.data;
146
+ const breadcrumbData = data != null ? data['breadcrumbs'] : null;
147
+ if (breadcrumbData != null) {
148
+ let resolver;
149
+ if (breadcrumbData.prototype instanceof BreadcrumbsResolver) {
150
+ resolver = this.injector.get(breadcrumbData);
151
+ }
152
+ else {
153
+ resolver = this.defaultResolver;
154
+ }
155
+ const result = resolver.resolve(route, this.router.routerState.snapshot);
156
+ crumbs$ = BreadcrumbsUtils.wrapIntoObservable(result).pipe(first());
157
+ }
158
+ else {
159
+ crumbs$ = of([]);
160
+ }
161
+ if (route.firstChild) {
162
+ crumbs$ = concat(crumbs$, this.resolveCrumbs(route.firstChild));
163
+ }
164
+ return crumbs$;
165
+ }
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
167
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsService, providedIn: 'root' });
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsService, decorators: [{
170
+ type: Injectable,
171
+ args: [{
172
+ providedIn: 'root'
173
+ }]
174
+ }], ctorParameters: () => [] });
175
+
176
+ class BreadcrumbsComponent {
177
+ breadcrumbsService = inject(BreadcrumbsService);
178
+ crumbs$ = this.breadcrumbsService.getCrumbs();
179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: BreadcrumbsComponent, isStandalone: true, selector: "olt-ngx-breadcrumbs", providers: [
181
+ BreadcrumbsService,
182
+ {
183
+ provide: BreadcrumbsConfig,
184
+ useFactory: () => new BreadcrumbsConfig()
185
+ }
186
+ ], ngImport: i0, template: `
187
+ <ol *ngIf="crumbs$ | async as crumbs" class="breadcrumbs__container">
188
+ <li *ngFor="let crumb of crumbs; let last = last"
189
+ [ngClass]="{ 'breadcrumbs__item--active': last }"
190
+ class="breadcrumbs__item"
191
+ >
192
+ <a *ngIf="!last" [routerLink]="crumb.path">{{ crumb.text }}</a>
193
+ <span *ngIf="last">{{ crumb.text }}</span>
194
+ </li>
195
+ </ol>
196
+ `, isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
197
+ }
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: BreadcrumbsComponent, decorators: [{
199
+ type: Component,
200
+ args: [{ selector: 'olt-ngx-breadcrumbs', standalone: true, imports: [CommonModule, RouterModule], providers: [
201
+ BreadcrumbsService,
202
+ {
203
+ provide: BreadcrumbsConfig,
204
+ useFactory: () => new BreadcrumbsConfig()
205
+ }
206
+ ], template: `
207
+ <ol *ngIf="crumbs$ | async as crumbs" class="breadcrumbs__container">
208
+ <li *ngFor="let crumb of crumbs; let last = last"
209
+ [ngClass]="{ 'breadcrumbs__item--active': last }"
210
+ class="breadcrumbs__item"
211
+ >
212
+ <a *ngIf="!last" [routerLink]="crumb.path">{{ crumb.text }}</a>
213
+ <span *ngIf="last">{{ crumb.text }}</span>
214
+ </li>
215
+ </ol>
216
+ ` }]
217
+ }] });
218
+
219
+ /*
220
+ * Public API Surface of ngx-breadcrumbs
221
+ */
222
+
223
+ /**
224
+ * Generated bundle index. Do not edit.
225
+ */
226
+
227
+ export { BreadcrumbsComponent, BreadcrumbsConfig, BreadcrumbsResolver, BreadcrumbsService };
228
+ //# sourceMappingURL=outerlimitstech-ngx-breadcrumbs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outerlimitstech-ngx-breadcrumbs.mjs","sources":["../../../projects/ngx-breadcrumbs/src/lib/services/breadcrumbs.config.ts","../../../projects/ngx-breadcrumbs/src/lib/utils/breadcrumbs.utils.ts","../../../projects/ngx-breadcrumbs/src/lib/services/breadcrumbs.resolver.ts","../../../projects/ngx-breadcrumbs/src/lib/services/breadcrumbs.service.ts","../../../projects/ngx-breadcrumbs/src/lib/breadcrumbs.component.ts","../../../projects/ngx-breadcrumbs/src/public-api.ts","../../../projects/ngx-breadcrumbs/src/outerlimitstech-ngx-breadcrumbs.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { Breadcrumb } from '../models/breadcrumb';\r\n\r\nexport type PostProcessFunction = (crumbs: Breadcrumb[]) => Promise<Breadcrumb[]> | Observable<Breadcrumb[]> | Breadcrumb[];\r\n\r\nexport type DistinctKey = keyof Breadcrumb;\r\n\r\n@Injectable()\r\nexport class BreadcrumbsConfig {\r\n public postProcess: PostProcessFunction | null = null;\r\n public applyDistinctOn: DistinctKey | null = 'text';\r\n\r\n constructor(options?: BreadcrumbsConfig) {\r\n this.postProcess = options?.postProcess ?? null;\r\n this.applyDistinctOn = options?.applyDistinctOn ?? 'text';\r\n }\r\n}\r\n","import { Observable, of, from } from 'rxjs';\r\n\r\nexport abstract class BreadcrumbsUtils {\r\n public static stringFormat(rawTemplate: string, data: any): string {\r\n const templateRegex = new RegExp('{{[\\\\s]*[a-zA-Z._]+?[\\\\s]*}}', 'g');\r\n\r\n return rawTemplate.replace(templateRegex, (match) => {\r\n const keyRegex = new RegExp('([a-zA-Z._]+)', 'g');\r\n const key = match.match(keyRegex);\r\n\r\n if (!key || !key.length) {\r\n return match;\r\n }\r\n\r\n const value = BreadcrumbsUtils.leaf(data, key[0]);\r\n\r\n if (!value) {\r\n return key[0];\r\n }\r\n\r\n return value;\r\n });\r\n }\r\n\r\n public static wrapIntoObservable<T>(value: T | Promise<T> | Observable<T>): Observable<T> {\r\n if (value instanceof Observable) {\r\n return value;\r\n }\r\n\r\n if (this.isPromise(value)) {\r\n return from(Promise.resolve(value));\r\n }\r\n\r\n return of(value as T);\r\n }\r\n\r\n private static isPromise(value: any): boolean {\r\n return value && (typeof value.then === 'function');\r\n }\r\n\r\n /**\r\n * Access object nested value by giving a path\r\n *\r\n * @param obj The object you want to access value from\r\n * @param path The value path. e.g: `bar.baz`\r\n * @example\r\n * const obj = { foo: { bar: 'Baz' } };\r\n * const path = 'foo.bar';\r\n * leaf(obj, path) // 'Baz'\r\n */\r\n public static leaf(obj: any, path: string) {\r\n const result = path.split('.').reduce((value, el) => value[el] || {}, obj);\r\n\r\n return BreadcrumbsUtils.isEmptyObject(result) ? null : result;\r\n }\r\n\r\n /**\r\n * checks whether an object is empty or not\r\n *\r\n * @param obj object to extract values from\r\n * @returns boolean\r\n */\r\n public static isEmptyObject(obj: any): boolean {\r\n if (typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]') {\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n","import type { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot, UrlSegment } from '@angular/router';\nimport { Breadcrumb } from '../models/breadcrumb';\nimport { Observable, of } from 'rxjs';\nimport { BreadcrumbsUtils } from '../utils/breadcrumbs.utils';\n\n// export const breadcrumbsResolver: ResolveFn<Breadcrumb[]> = (route, state) => {\n// return new Array<Breadcrumb>();\n// };\n\n\nexport class BreadcrumbsResolver {\n public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Breadcrumb[]> | Promise<Breadcrumb[]> | Breadcrumb[] {\n\n \n const textData = route.routeConfig?.data != null ? route.routeConfig?.data['text'] : null;\n const breadcrumbData = route.routeConfig?.data != null ? route.routeConfig?.data['breadcrumbs'] : null;\n\n const path = this.getFullPath(route);\n\n let text = breadcrumbData != null && typeof(breadcrumbData === 'string') ? breadcrumbData : breadcrumbData?.text ?? textData ?? path;\n text = BreadcrumbsUtils.stringFormat(text, route.data);\n\n const crumbs: Breadcrumb[] = [{\n text,\n path\n }];\n\n return of(crumbs);\n }\n\n public getFullPath(route: ActivatedRouteSnapshot): string {\n return this.fetchFullPath(route.pathFromRoot);\n }\n\n private fetchFullPath(routes: ActivatedRouteSnapshot[]): string {\n return routes.reduce((path, route) => path += this.fetchRelativePath(route.url), '');\n }\n\n private fetchRelativePath(urlSegments: UrlSegment[]): string {\n return urlSegments.reduce((path, urlSegment) => path += '/' + urlSegment.path, '');\n }\n}\n\n","import { inject, Injectable, Injector } from '@angular/core';\r\nimport { ActivatedRoute, ActivatedRouteSnapshot, NavigationEnd, Router } from '@angular/router';\r\nimport { BreadcrumbsConfig } from './breadcrumbs.config';\r\nimport { BehaviorSubject, concat, distinct, filter, first, mergeMap, Observable, of, tap, toArray } from 'rxjs';\r\nimport { Breadcrumb } from '../models/breadcrumb';\r\nimport { BreadcrumbsUtils } from '../utils/breadcrumbs.utils';\r\nimport { BreadcrumbsResolver } from './breadcrumbs.resolver';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class BreadcrumbsService {\r\n private breadcrumbs = new BehaviorSubject<Breadcrumb[]>([]);\r\n private defaultResolver = new BreadcrumbsResolver();\r\n \r\n private route = inject(ActivatedRoute);\r\n private router = inject(Router);\r\n private config = inject(BreadcrumbsConfig);\r\n private injector = inject(Injector);\r\n \r\n constructor() { \r\n this.initialize();\r\n }\r\n\r\n private initialize() {\r\n this.router.events.pipe(\r\n filter((x) => x instanceof NavigationEnd), // || x['routerEvent'] instanceof NavigationEnd\r\n ).subscribe(() => {\r\n const routeRoot = this.router.routerState.snapshot.root;\r\n\r\n this.resolveCrumbs(routeRoot).pipe(\r\n mergeMap((crumbs: Breadcrumb[]) => crumbs), this.config.applyDistinctOn != null ? distinct((crumb: Breadcrumb) => crumb[this.config.applyDistinctOn!]) : tap(),\r\n toArray(),\r\n mergeMap((crumbs: Breadcrumb[]) => {\r\n if (this.config.postProcess) {\r\n const postProcessedCrumb = this.config.postProcess(crumbs);\r\n return BreadcrumbsUtils.wrapIntoObservable<Breadcrumb[]>(postProcessedCrumb).pipe(first());\r\n } else {\r\n return of(crumbs);\r\n }\r\n })\r\n ).subscribe((crumbs: Breadcrumb[]) => {\r\n this.breadcrumbs.next(crumbs);\r\n });\r\n });\r\n }\r\n\r\n get crumbs$(): Observable<Breadcrumb[]> {\r\n return this.breadcrumbs;\r\n }\r\n\r\n public getCrumbs(): Observable<Breadcrumb[]> {\r\n return this.crumbs$;\r\n }\r\n\r\n private resolveCrumbs(route: ActivatedRouteSnapshot): Observable<Breadcrumb[]> {\r\n let crumbs$: Observable<Breadcrumb[]>;\r\n const data = route.routeConfig && route.routeConfig.data;\r\n const breadcrumbData = data != null ? data['breadcrumbs'] : null;\r\n \r\n if (breadcrumbData != null) {\r\n let resolver: BreadcrumbsResolver;\r\n\r\n if (breadcrumbData.prototype instanceof BreadcrumbsResolver) {\r\n resolver = this.injector.get(breadcrumbData);\r\n } else {\r\n resolver = this.defaultResolver;\r\n }\r\n\r\n const result = resolver.resolve(route, this.router.routerState.snapshot);\r\n crumbs$ = BreadcrumbsUtils.wrapIntoObservable<Breadcrumb[]>(result).pipe(first());\r\n } else {\r\n crumbs$ = of([]);\r\n }\r\n\r\n if (route.firstChild) {\r\n crumbs$ = concat(crumbs$, this.resolveCrumbs(route.firstChild));\r\n }\r\n\r\n return crumbs$;\r\n }\r\n \r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { Breadcrumb } from './models/breadcrumb';\r\nimport { Observable } from 'rxjs';\r\nimport { BreadcrumbsService } from './services/breadcrumbs.service';\r\nimport { BreadcrumbsConfig } from './services';\r\nimport { RouterModule } from '@angular/router';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'olt-ngx-breadcrumbs',\r\n standalone: true,\r\n imports: [CommonModule, RouterModule],\r\n providers: [\r\n BreadcrumbsService,\r\n { \r\n provide: BreadcrumbsConfig, \r\n useFactory: () => new BreadcrumbsConfig() \r\n } \r\n ], \r\n template: `\r\n <ol *ngIf=\"crumbs$ | async as crumbs\" class=\"breadcrumbs__container\">\r\n <li *ngFor=\"let crumb of crumbs; let last = last\"\r\n [ngClass]=\"{ 'breadcrumbs__item--active': last }\"\r\n class=\"breadcrumbs__item\"\r\n >\r\n <a *ngIf=\"!last\" [routerLink]=\"crumb.path\">{{ crumb.text }}</a>\r\n <span *ngIf=\"last\">{{ crumb.text }}</span>\r\n </li>\r\n </ol>\r\n `,\r\n styles: ``\r\n})\r\nexport class BreadcrumbsComponent {\r\n breadcrumbsService = inject(BreadcrumbsService);\r\n\r\n public crumbs$: Observable<Breadcrumb[]> = this.breadcrumbsService.getCrumbs();\r\n\r\n \r\n}\r\n","/*\r\n * Public API Surface of ngx-breadcrumbs\r\n */\r\n\r\nexport * from './lib/services/index';\r\nexport * from './lib/breadcrumbs.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@outerlimitstech/ngx-breadcrumbs" />
5
+ export * from './public-api';
@@ -0,0 +1,10 @@
1
+ import { Breadcrumb } from './models/breadcrumb';
2
+ import { Observable } from 'rxjs';
3
+ import { BreadcrumbsService } from './services/breadcrumbs.service';
4
+ import * as i0 from "@angular/core";
5
+ export declare class BreadcrumbsComponent {
6
+ breadcrumbsService: BreadcrumbsService;
7
+ crumbs$: Observable<Breadcrumb[]>;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbsComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<BreadcrumbsComponent, "olt-ngx-breadcrumbs", never, {}, {}, never, never, true, never>;
10
+ }
@@ -0,0 +1,4 @@
1
+ export interface Breadcrumb {
2
+ text: string;
3
+ path: string;
4
+ }
@@ -0,0 +1,12 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Breadcrumb } from '../models/breadcrumb';
3
+ import * as i0 from "@angular/core";
4
+ export type PostProcessFunction = (crumbs: Breadcrumb[]) => Promise<Breadcrumb[]> | Observable<Breadcrumb[]> | Breadcrumb[];
5
+ export type DistinctKey = keyof Breadcrumb;
6
+ export declare class BreadcrumbsConfig {
7
+ postProcess: PostProcessFunction | null;
8
+ applyDistinctOn: DistinctKey | null;
9
+ constructor(options?: BreadcrumbsConfig);
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbsConfig, never>;
11
+ static ɵprov: i0.ɵɵInjectableDeclaration<BreadcrumbsConfig>;
12
+ }
@@ -0,0 +1,9 @@
1
+ import type { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
2
+ import { Breadcrumb } from '../models/breadcrumb';
3
+ import { Observable } from 'rxjs';
4
+ export declare class BreadcrumbsResolver {
5
+ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Breadcrumb[]> | Promise<Breadcrumb[]> | Breadcrumb[];
6
+ getFullPath(route: ActivatedRouteSnapshot): string;
7
+ private fetchFullPath;
8
+ private fetchRelativePath;
9
+ }
@@ -0,0 +1,18 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Breadcrumb } from '../models/breadcrumb';
3
+ import * as i0 from "@angular/core";
4
+ export declare class BreadcrumbsService {
5
+ private breadcrumbs;
6
+ private defaultResolver;
7
+ private route;
8
+ private router;
9
+ private config;
10
+ private injector;
11
+ constructor();
12
+ private initialize;
13
+ get crumbs$(): Observable<Breadcrumb[]>;
14
+ getCrumbs(): Observable<Breadcrumb[]>;
15
+ private resolveCrumbs;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<BreadcrumbsService, never>;
17
+ static ɵprov: i0.ɵɵInjectableDeclaration<BreadcrumbsService>;
18
+ }
@@ -0,0 +1,3 @@
1
+ export * from './breadcrumbs.config';
2
+ export * from './breadcrumbs.resolver';
3
+ export * from './breadcrumbs.service';
@@ -0,0 +1,24 @@
1
+ import { Observable } from 'rxjs';
2
+ export declare abstract class BreadcrumbsUtils {
3
+ static stringFormat(rawTemplate: string, data: any): string;
4
+ static wrapIntoObservable<T>(value: T | Promise<T> | Observable<T>): Observable<T>;
5
+ private static isPromise;
6
+ /**
7
+ * Access object nested value by giving a path
8
+ *
9
+ * @param obj The object you want to access value from
10
+ * @param path The value path. e.g: `bar.baz`
11
+ * @example
12
+ * const obj = { foo: { bar: 'Baz' } };
13
+ * const path = 'foo.bar';
14
+ * leaf(obj, path) // 'Baz'
15
+ */
16
+ static leaf(obj: any, path: string): any;
17
+ /**
18
+ * checks whether an object is empty or not
19
+ *
20
+ * @param obj object to extract values from
21
+ * @returns boolean
22
+ */
23
+ static isEmptyObject(obj: any): boolean;
24
+ }
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@outerlimitstech/ngx-breadcrumbs",
3
+ "version": "18.0.0-beta.1",
4
+ "description": "Angular breadcrumbs built on the native Angular router - Clone of @exalif/ngx-breadcrumbs",
5
+ "bugs": "https://github.com/OuterlimitsTech/olt-ngx-breadcrumbs/issues",
6
+ "homepage": "https://github.com/OuterlimitsTech/olt-ngx-breadcrumbs#readme",
7
+ "repository": "https://github.com/OuterlimitsTech/olt-ngx-breadcrumbs.git",
8
+ "license": "MIT",
9
+ "author": "Chris Straw",
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "keywords": [
14
+ "angular",
15
+ "breadcrumb",
16
+ "ngx-breadcrumbs"
17
+ ],
18
+ "peerDependencies": {
19
+ "@angular/common": ">=18.0.0",
20
+ "@angular/core": ">=18.0.0",
21
+ "@angular/router": ">= 18.0.0",
22
+ "rxjs": ">= 7.0.0"
23
+ },
24
+ "dependencies": {
25
+ "tslib": "^2.3.0"
26
+ },
27
+ "sideEffects": false,
28
+ "module": "fesm2022/outerlimitstech-ngx-breadcrumbs.mjs",
29
+ "typings": "index.d.ts",
30
+ "exports": {
31
+ "./package.json": {
32
+ "default": "./package.json"
33
+ },
34
+ ".": {
35
+ "types": "./index.d.ts",
36
+ "esm2022": "./esm2022/outerlimitstech-ngx-breadcrumbs.mjs",
37
+ "esm": "./esm2022/outerlimitstech-ngx-breadcrumbs.mjs",
38
+ "default": "./fesm2022/outerlimitstech-ngx-breadcrumbs.mjs"
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,2 @@
1
+ export * from './lib/services/index';
2
+ export * from './lib/breadcrumbs.component';