@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 +15 -0
- package/esm2022/lib/breadcrumbs.component.mjs +51 -0
- package/esm2022/lib/models/breadcrumb.mjs +2 -0
- package/esm2022/lib/services/breadcrumbs.config.mjs +16 -0
- package/esm2022/lib/services/breadcrumbs.resolver.mjs +29 -0
- package/esm2022/lib/services/breadcrumbs.service.mjs +72 -0
- package/esm2022/lib/services/index.mjs +4 -0
- package/esm2022/lib/utils/breadcrumbs.utils.mjs +62 -0
- package/esm2022/outerlimitstech-ngx-breadcrumbs.mjs +5 -0
- package/esm2022/public-api.mjs +6 -0
- package/fesm2022/outerlimitstech-ngx-breadcrumbs.mjs +228 -0
- package/fesm2022/outerlimitstech-ngx-breadcrumbs.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/breadcrumbs.component.d.ts +10 -0
- package/lib/models/breadcrumb.d.ts +4 -0
- package/lib/services/breadcrumbs.config.d.ts +12 -0
- package/lib/services/breadcrumbs.resolver.d.ts +9 -0
- package/lib/services/breadcrumbs.service.d.ts +18 -0
- package/lib/services/index.d.ts +3 -0
- package/lib/utils/breadcrumbs.utils.d.ts +24 -0
- package/package.json +41 -0
- package/public-api.d.ts +2 -0
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,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,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,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
|
+
}
|
package/public-api.d.ts
ADDED