ng-hub-ui-breadcrumbs 1.0.0
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 +24 -0
- package/esm2022/lib/components/hub-breadcrumbs/hub-breadcrumbs.component.mjs +25 -0
- package/esm2022/lib/directives/hub-breadcrumb-item.directive.mjs +17 -0
- package/esm2022/lib/hub-breadcrumbs.module.mjs +18 -0
- package/esm2022/lib/services/hub-breadcrumbs.service.mjs +72 -0
- package/esm2022/lib/types/breadcrumb-item.mjs +2 -0
- package/esm2022/lib/types/breadcrumb-template-context.mjs +2 -0
- package/esm2022/ng-hub-ui-breadcrumbs.mjs +5 -0
- package/esm2022/public-api.mjs +8 -0
- package/fesm2022/ng-hub-ui-breadcrumbs.mjs +132 -0
- package/fesm2022/ng-hub-ui-breadcrumbs.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/hub-breadcrumbs/hub-breadcrumbs.component.d.ts +9 -0
- package/lib/directives/hub-breadcrumb-item.directive.d.ts +7 -0
- package/lib/hub-breadcrumbs.module.d.ts +8 -0
- package/lib/services/hub-breadcrumbs.service.d.ts +12 -0
- package/lib/types/breadcrumb-item.d.ts +5 -0
- package/lib/types/breadcrumb-template-context.d.ts +5 -0
- package/ng-hub-ui-breadcrumbs-1.0.0.tgz +0 -0
- package/package.json +47 -0
- package/public-api.d.ts +4 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# NgHubUiBreadcrumb
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project breadcrumbs` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project breadcrumbs`.
|
|
8
|
+
> Note: Don't forget to add `--project breadcrumbs` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build breadcrumbs` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build breadcrumbs`, go to the dist folder `cd dist/breadcrumbs` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test breadcrumbs` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import { Component, ContentChild, inject } from '@angular/core';
|
|
3
|
+
import { RouterLink } from '@angular/router';
|
|
4
|
+
import { HubBreadcrumbItemDirective } from '../../directives/hub-breadcrumb-item.directive';
|
|
5
|
+
import { HubBreadcrumbsService } from '../../services/hub-breadcrumbs.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class HubBreadcrumbsComponent {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.#breadcrumbsSvc = inject(HubBreadcrumbsService);
|
|
10
|
+
this.breadcrumbs$ = this.#breadcrumbsSvc.breadcrumbs$;
|
|
11
|
+
}
|
|
12
|
+
#breadcrumbsSvc;
|
|
13
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
14
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: HubBreadcrumbsComponent, isStandalone: true, selector: "hub-breadcrumbs", host: { classAttribute: "hub-breadcrumb" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: HubBreadcrumbItemDirective, descendants: true }], ngImport: i0, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (item of breadcrumbs$ | async; track item; let last = $last) {\n\t\t<li\n\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t[class.hub-breadcrumb__item--active]=\"last\"\n\t\t>\n\t\t\t@if (itemTemplate) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"itemTemplate.template\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ $implicit: item, isLast: last }\"\n\t\t\t/>\n\t\t\t} @else { @if (!last) {\n\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\">\n\t\t\t\t{{ item.label }}\n\t\t\t</a>\n\t\t\t} @else {\n\t\t\t<span class=\"hub-breadcrumb__text\">{{ item.label }}</span>\n\t\t\t} }\n\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n", styles: [".hub-breadcrumb__list{--hub-breadcrumb-padding-x: 1rem;--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: 0;--hub-breadcrumb-bg: white;--hub-breadcrumb-border-radius: 50rem;--hub-breadcrumb-divider-color: black;--hub-breadcrumb-item-padding-x: .5rem;--hub-breadcrumb-item-active-color: black;display:flex;flex-wrap:wrap;padding:var(--hub-breadcrumb-padding-y) var(--hub-breadcrumb-padding-x);margin-bottom:var(--hub-breadcrumb-margin-bottom);list-style:none;background-color:var(--hub-breadcrumb-bg)}.hub-breadcrumb__item+.hub-breadcrumb__item{padding-left:var(--hub-breadcrumb-item-padding-x)}.hub-breadcrumb__item+.hub-breadcrumb__item:before{float:left;padding-right:var(--hub-breadcrumb-item-padding-x);color:var(--hub-breadcrumb-divider-color);content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
15
|
+
}
|
|
16
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsComponent, decorators: [{
|
|
17
|
+
type: Component,
|
|
18
|
+
args: [{ selector: 'hub-breadcrumbs', standalone: true, imports: [AsyncPipe, NgIf, RouterLink, NgTemplateOutlet], host: {
|
|
19
|
+
class: 'hub-breadcrumb'
|
|
20
|
+
}, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (item of breadcrumbs$ | async; track item; let last = $last) {\n\t\t<li\n\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t[class.hub-breadcrumb__item--active]=\"last\"\n\t\t>\n\t\t\t@if (itemTemplate) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"itemTemplate.template\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ $implicit: item, isLast: last }\"\n\t\t\t/>\n\t\t\t} @else { @if (!last) {\n\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\">\n\t\t\t\t{{ item.label }}\n\t\t\t</a>\n\t\t\t} @else {\n\t\t\t<span class=\"hub-breadcrumb__text\">{{ item.label }}</span>\n\t\t\t} }\n\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n", styles: [".hub-breadcrumb__list{--hub-breadcrumb-padding-x: 1rem;--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: 0;--hub-breadcrumb-bg: white;--hub-breadcrumb-border-radius: 50rem;--hub-breadcrumb-divider-color: black;--hub-breadcrumb-item-padding-x: .5rem;--hub-breadcrumb-item-active-color: black;display:flex;flex-wrap:wrap;padding:var(--hub-breadcrumb-padding-y) var(--hub-breadcrumb-padding-x);margin-bottom:var(--hub-breadcrumb-margin-bottom);list-style:none;background-color:var(--hub-breadcrumb-bg)}.hub-breadcrumb__item+.hub-breadcrumb__item{padding-left:var(--hub-breadcrumb-item-padding-x)}.hub-breadcrumb__item+.hub-breadcrumb__item:before{float:left;padding-right:var(--hub-breadcrumb-item-padding-x);color:var(--hub-breadcrumb-divider-color);content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color)}\n"] }]
|
|
21
|
+
}], propDecorators: { itemTemplate: [{
|
|
22
|
+
type: ContentChild,
|
|
23
|
+
args: [HubBreadcrumbItemDirective]
|
|
24
|
+
}] } });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JyZWFkY3J1bWJzL3NyYy9saWIvY29tcG9uZW50cy9odWItYnJlYWRjcnVtYnMvaHViLWJyZWFkY3J1bWJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JyZWFkY3J1bWJzL3NyYy9saWIvY29tcG9uZW50cy9odWItYnJlYWRjcnVtYnMvaHViLWJyZWFkY3J1bWJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUM1RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFZL0UsTUFBTSxPQUFPLHVCQUF1QjtJQVZwQztRQVdDLG9CQUFlLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFLaEQsaUJBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztLQUNqRDtJQU5BLGVBQWUsQ0FBaUM7OEdBRHBDLHVCQUF1QjtrR0FBdkIsdUJBQXVCLGlLQUdyQiwwQkFBMEIsZ0RDbkJ6QyxrdUJBdUJBLDY2QkRkVyxTQUFTLDhDQUFRLFVBQVUsb09BQUUsZ0JBQWdCOzsyRkFPM0MsdUJBQXVCO2tCQVZuQyxTQUFTOytCQUNDLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFFBR2xEO3dCQUNMLEtBQUssRUFBRSxnQkFBZ0I7cUJBQ3ZCOzhCQU1ELFlBQVk7c0JBRFgsWUFBWTt1QkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBIdWJCcmVhZGNydW1iSXRlbURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvaHViLWJyZWFkY3J1bWItaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSHViQnJlYWRjcnVtYnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHViLWJyZWFkY3J1bWJzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICdodWItYnJlYWRjcnVtYnMnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRpbXBvcnRzOiBbQXN5bmNQaXBlLCBOZ0lmLCBSb3V0ZXJMaW5rLCBOZ1RlbXBsYXRlT3V0bGV0XSxcblx0dGVtcGxhdGVVcmw6ICcuL2h1Yi1icmVhZGNydW1icy5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsOiAnLi9odWItYnJlYWRjcnVtYnMuY29tcG9uZW50LnNjc3MnLFxuXHRob3N0OiB7XG5cdFx0Y2xhc3M6ICdodWItYnJlYWRjcnVtYidcblx0fVxufSlcbmV4cG9ydCBjbGFzcyBIdWJCcmVhZGNydW1ic0NvbXBvbmVudCB7XG5cdCNicmVhZGNydW1ic1N2YyA9IGluamVjdChIdWJCcmVhZGNydW1ic1NlcnZpY2UpO1xuXG5cdEBDb250ZW50Q2hpbGQoSHViQnJlYWRjcnVtYkl0ZW1EaXJlY3RpdmUpXG5cdGl0ZW1UZW1wbGF0ZT86IEh1YkJyZWFkY3J1bWJJdGVtRGlyZWN0aXZlO1xuXG5cdGJyZWFkY3J1bWJzJCA9IHRoaXMuI2JyZWFkY3J1bWJzU3ZjLmJyZWFkY3J1bWJzJDtcbn1cbiIsIjxuYXYgYXJpYS1sYWJlbD1cImJyZWFkY3J1bWJcIiBjbGFzcz1cImh1Yi1icmVhZGNydW1iX19uYXZcIj5cblx0PG9sIGNsYXNzPVwiaHViLWJyZWFkY3J1bWJfX2xpc3RcIj5cblx0XHRAZm9yIChpdGVtIG9mIGJyZWFkY3J1bWJzJCB8IGFzeW5jOyB0cmFjayBpdGVtOyBsZXQgbGFzdCA9ICRsYXN0KSB7XG5cdFx0PGxpXG5cdFx0XHRjbGFzcz1cImh1Yi1icmVhZGNydW1iX19pdGVtXCJcblx0XHRcdFtjbGFzcy5odWItYnJlYWRjcnVtYl9faXRlbS0tYWN0aXZlXT1cImxhc3RcIlxuXHRcdD5cblx0XHRcdEBpZiAoaXRlbVRlbXBsYXRlKSB7XG5cdFx0XHQ8bmctY29udGFpbmVyXG5cdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZS50ZW1wbGF0ZVwiXG5cdFx0XHRcdFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbSwgaXNMYXN0OiBsYXN0IH1cIlxuXHRcdFx0Lz5cblx0XHRcdH0gQGVsc2UgeyBAaWYgKCFsYXN0KSB7XG5cdFx0XHQ8YSBbcm91dGVyTGlua109XCJpdGVtLnVybFwiIGNsYXNzPVwiaHViLWJyZWFkY3J1bWJfX2xpbmtcIj5cblx0XHRcdFx0e3sgaXRlbS5sYWJlbCB9fVxuXHRcdFx0PC9hPlxuXHRcdFx0fSBAZWxzZSB7XG5cdFx0XHQ8c3BhbiBjbGFzcz1cImh1Yi1icmVhZGNydW1iX190ZXh0XCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cblx0XHRcdH0gfVxuXHRcdDwvbGk+XG5cdFx0fVxuXHQ8L29sPlxuPC9uYXY+XG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Directive, inject, TemplateRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class HubBreadcrumbItemDirective {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.template = inject((TemplateRef));
|
|
6
|
+
}
|
|
7
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
8
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: HubBreadcrumbItemDirective, isStandalone: true, selector: "[hubBreadcrumbItem]", ngImport: i0 }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbItemDirective, decorators: [{
|
|
11
|
+
type: Directive,
|
|
12
|
+
args: [{
|
|
13
|
+
selector: '[hubBreadcrumbItem]',
|
|
14
|
+
standalone: true
|
|
15
|
+
}]
|
|
16
|
+
}] });
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViLWJyZWFkY3J1bWItaXRlbS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icmVhZGNydW1icy9zcmMvbGliL2RpcmVjdGl2ZXMvaHViLWJyZWFkY3J1bWItaXRlbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8vRCxNQUFNLE9BQU8sMEJBQTBCO0lBSnZDO1FBS0MsYUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFBLFdBQXNDLENBQUEsQ0FBQyxDQUFDO0tBQzFEOzhHQUZZLDBCQUEwQjtrR0FBMUIsMEJBQTBCOzsyRkFBMUIsMEJBQTBCO2tCQUp0QyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFVBQVUsRUFBRSxJQUFJO2lCQUNoQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgaW5qZWN0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYlRlbXBsYXRlQ29udGV4dCB9IGZyb20gJy4uL3R5cGVzL2JyZWFkY3J1bWItdGVtcGxhdGUtY29udGV4dCc7XG5cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ1todWJCcmVhZGNydW1iSXRlbV0nLFxuXHRzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIEh1YkJyZWFkY3J1bWJJdGVtRGlyZWN0aXZlIHtcblx0dGVtcGxhdGUgPSBpbmplY3QoVGVtcGxhdGVSZWY8QnJlYWRjcnVtYlRlbXBsYXRlQ29udGV4dD4pO1xufVxuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { HubBreadcrumbsComponent } from './components/hub-breadcrumbs/hub-breadcrumbs.component';
|
|
3
|
+
import { HubBreadcrumbItemDirective } from './directives/hub-breadcrumb-item.directive';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class HubBreadcrumbsModule {
|
|
6
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
7
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule, imports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective], exports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective] }); }
|
|
8
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule }); }
|
|
9
|
+
}
|
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule, decorators: [{
|
|
11
|
+
type: NgModule,
|
|
12
|
+
args: [{
|
|
13
|
+
declarations: [],
|
|
14
|
+
imports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective],
|
|
15
|
+
exports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective]
|
|
16
|
+
}]
|
|
17
|
+
}] });
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViLWJyZWFkY3J1bWJzLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JyZWFkY3J1bWJzL3NyYy9saWIvaHViLWJyZWFkY3J1bWJzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQU94RixNQUFNLE9BQU8sb0JBQW9COzhHQUFwQixvQkFBb0I7K0dBQXBCLG9CQUFvQixZQUh0Qix1QkFBdUIsRUFBRSwwQkFBMEIsYUFDbkQsdUJBQXVCLEVBQUUsMEJBQTBCOytHQUVqRCxvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBTGhDLFFBQVE7bUJBQUM7b0JBQ1QsWUFBWSxFQUFFLEVBQUU7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLHVCQUF1QixFQUFFLDBCQUEwQixDQUFDO29CQUM5RCxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSwwQkFBMEIsQ0FBQztpQkFDOUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHViQnJlYWRjcnVtYnNDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvaHViLWJyZWFkY3J1bWJzL2h1Yi1icmVhZGNydW1icy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSHViQnJlYWRjcnVtYkl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvaHViLWJyZWFkY3J1bWItaXRlbS5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuXHRkZWNsYXJhdGlvbnM6IFtdLFxuXHRpbXBvcnRzOiBbSHViQnJlYWRjcnVtYnNDb21wb25lbnQsIEh1YkJyZWFkY3J1bWJJdGVtRGlyZWN0aXZlXSxcblx0ZXhwb3J0czogW0h1YkJyZWFkY3J1bWJzQ29tcG9uZW50LCBIdWJCcmVhZGNydW1iSXRlbURpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgSHViQnJlYWRjcnVtYnNNb2R1bGUge31cbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
|
3
|
+
import { filter, startWith, map } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class HubBreadcrumbsService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.#router = inject(Router);
|
|
8
|
+
this.#activatedRoute = inject(ActivatedRoute);
|
|
9
|
+
this.breadcrumbs$ = this.#router.events.pipe(filter((event) => event instanceof NavigationEnd), startWith(undefined), map(() => this.createBreadcrumbs(this.#activatedRoute.root)));
|
|
10
|
+
}
|
|
11
|
+
#router;
|
|
12
|
+
#activatedRoute;
|
|
13
|
+
createBreadcrumbs(route, url = '', breadcrumbs = []) {
|
|
14
|
+
const children = route.children;
|
|
15
|
+
if (children.length === 0) {
|
|
16
|
+
return breadcrumbs;
|
|
17
|
+
}
|
|
18
|
+
for (const child of children) {
|
|
19
|
+
const routeSegments = child.snapshot.url;
|
|
20
|
+
// Construir la URL para este nivel
|
|
21
|
+
const routeURL = routeSegments
|
|
22
|
+
.map((segment) => segment.path)
|
|
23
|
+
.join('/');
|
|
24
|
+
const nextUrl = routeURL ? `${url}/${routeURL}` : url;
|
|
25
|
+
// Verificar si esta ruta específica tiene datos de breadcrumb
|
|
26
|
+
const hasBreadcrumbData = this.hasOwnBreadcrumbData(child);
|
|
27
|
+
if (hasBreadcrumbData) {
|
|
28
|
+
const label = this.getBreadcrumbLabel(child);
|
|
29
|
+
breadcrumbs.push({
|
|
30
|
+
label,
|
|
31
|
+
url: nextUrl,
|
|
32
|
+
data: child.snapshot.data
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// Continuar con los hijos
|
|
36
|
+
return this.createBreadcrumbs(child, nextUrl, breadcrumbs);
|
|
37
|
+
}
|
|
38
|
+
return breadcrumbs;
|
|
39
|
+
}
|
|
40
|
+
hasOwnBreadcrumbData(route) {
|
|
41
|
+
// Verificar si la ruta tiene su propia configuración de breadcrumb
|
|
42
|
+
const routeConfig = route.routeConfig;
|
|
43
|
+
return !!(routeConfig &&
|
|
44
|
+
routeConfig.data &&
|
|
45
|
+
routeConfig.data['breadcrumb']);
|
|
46
|
+
}
|
|
47
|
+
getBreadcrumbLabel(route) {
|
|
48
|
+
const data = route.snapshot.data;
|
|
49
|
+
let label = data['breadcrumb'];
|
|
50
|
+
if (typeof label === 'function') {
|
|
51
|
+
label = label(data);
|
|
52
|
+
}
|
|
53
|
+
if (data['resolvedData']) {
|
|
54
|
+
label = this.getResolvedBreadcrumb(label, data['resolvedData']);
|
|
55
|
+
}
|
|
56
|
+
return label;
|
|
57
|
+
}
|
|
58
|
+
getResolvedBreadcrumb(template, data) {
|
|
59
|
+
return template.replace(/\{([^}]+)\}/g, (match, key) => {
|
|
60
|
+
return data[key] || match;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
64
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsService, providedIn: 'root' }); }
|
|
65
|
+
}
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsService, decorators: [{
|
|
67
|
+
type: Injectable,
|
|
68
|
+
args: [{
|
|
69
|
+
providedIn: 'root'
|
|
70
|
+
}]
|
|
71
|
+
}] });
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViLWJyZWFkY3J1bWJzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9icmVhZGNydW1icy9zcmMvbGliL3NlcnZpY2VzL2h1Yi1icmVhZGNydW1icy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFLOUMsTUFBTSxPQUFPLHFCQUFxQjtJQUhsQztRQUlDLFlBQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsb0JBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekMsaUJBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLGFBQWEsQ0FBQyxFQUNqRCxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQ3BCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUM1RCxDQUFDO0tBd0VGO0lBL0VBLE9BQU8sQ0FBa0I7SUFDekIsZUFBZSxDQUEwQjtJQVFqQyxpQkFBaUIsQ0FDeEIsS0FBcUIsRUFDckIsTUFBYyxFQUFFLEVBQ2hCLGNBQWdDLEVBQUU7UUFFbEMsTUFBTSxRQUFRLEdBQXFCLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFFbEQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLFdBQVcsQ0FBQztTQUNuQjtRQUVELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFO1lBQzdCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBRXpDLG1DQUFtQztZQUNuQyxNQUFNLFFBQVEsR0FBVyxhQUFhO2lCQUNwQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7aUJBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVaLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUV0RCw4REFBOEQ7WUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0QsSUFBSSxpQkFBaUIsRUFBRTtnQkFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QyxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNoQixLQUFLO29CQUNMLEdBQUcsRUFBRSxPQUFPO29CQUNaLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUk7aUJBQ3pCLENBQUMsQ0FBQzthQUNIO1lBRUQsMEJBQTBCO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDM0Q7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNwQixDQUFDO0lBRU8sb0JBQW9CLENBQUMsS0FBcUI7UUFDakQsbUVBQW1FO1FBQ25FLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7UUFDdEMsT0FBTyxDQUFDLENBQUMsQ0FDUixXQUFXO1lBQ1gsV0FBVyxDQUFDLElBQUk7WUFDaEIsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDOUIsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFxQjtRQUMvQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNqQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFL0IsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUU7WUFDaEMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3pCLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO0lBRU8scUJBQXFCLENBQUMsUUFBZ0IsRUFBRSxJQUFTO1FBQ3hELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs4R0EvRVcscUJBQXFCO2tIQUFyQixxQkFBcUIsY0FGckIsTUFBTTs7MkZBRU4scUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkl0ZW0gfSBmcm9tICcuLi90eXBlcy9icmVhZGNydW1iLWl0ZW0nO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgbWFwIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEh1YkJyZWFkY3J1bWJzU2VydmljZSB7XG5cdCNyb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcblx0I2FjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcblxuXHRicmVhZGNydW1icyQgPSB0aGlzLiNyb3V0ZXIuZXZlbnRzLnBpcGUoXG5cdFx0ZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcblx0XHRzdGFydFdpdGgodW5kZWZpbmVkKSxcblx0XHRtYXAoKCkgPT4gdGhpcy5jcmVhdGVCcmVhZGNydW1icyh0aGlzLiNhY3RpdmF0ZWRSb3V0ZS5yb290KSlcblx0KTtcblxuXHRwcml2YXRlIGNyZWF0ZUJyZWFkY3J1bWJzKFxuXHRcdHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcblx0XHR1cmw6IHN0cmluZyA9ICcnLFxuXHRcdGJyZWFkY3J1bWJzOiBCcmVhZGNydW1iSXRlbVtdID0gW11cblx0KTogQnJlYWRjcnVtYkl0ZW1bXSB7XG5cdFx0Y29uc3QgY2hpbGRyZW46IEFjdGl2YXRlZFJvdXRlW10gPSByb3V0ZS5jaGlsZHJlbjtcblxuXHRcdGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBicmVhZGNydW1icztcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRjb25zdCByb3V0ZVNlZ21lbnRzID0gY2hpbGQuc25hcHNob3QudXJsO1xuXG5cdFx0XHQvLyBDb25zdHJ1aXIgbGEgVVJMIHBhcmEgZXN0ZSBuaXZlbFxuXHRcdFx0Y29uc3Qgcm91dGVVUkw6IHN0cmluZyA9IHJvdXRlU2VnbWVudHNcblx0XHRcdFx0Lm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC5wYXRoKVxuXHRcdFx0XHQuam9pbignLycpO1xuXG5cdFx0XHRjb25zdCBuZXh0VXJsID0gcm91dGVVUkwgPyBgJHt1cmx9LyR7cm91dGVVUkx9YCA6IHVybDtcblxuXHRcdFx0Ly8gVmVyaWZpY2FyIHNpIGVzdGEgcnV0YSBlc3BlY8OtZmljYSB0aWVuZSBkYXRvcyBkZSBicmVhZGNydW1iXG5cdFx0XHRjb25zdCBoYXNCcmVhZGNydW1iRGF0YSA9IHRoaXMuaGFzT3duQnJlYWRjcnVtYkRhdGEoY2hpbGQpO1xuXG5cdFx0XHRpZiAoaGFzQnJlYWRjcnVtYkRhdGEpIHtcblx0XHRcdFx0Y29uc3QgbGFiZWwgPSB0aGlzLmdldEJyZWFkY3J1bWJMYWJlbChjaGlsZCk7XG5cdFx0XHRcdGJyZWFkY3J1bWJzLnB1c2goe1xuXHRcdFx0XHRcdGxhYmVsLFxuXHRcdFx0XHRcdHVybDogbmV4dFVybCxcblx0XHRcdFx0XHRkYXRhOiBjaGlsZC5zbmFwc2hvdC5kYXRhXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb250aW51YXIgY29uIGxvcyBoaWpvc1xuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQnJlYWRjcnVtYnMoY2hpbGQsIG5leHRVcmwsIGJyZWFkY3J1bWJzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYnJlYWRjcnVtYnM7XG5cdH1cblxuXHRwcml2YXRlIGhhc093bkJyZWFkY3J1bWJEYXRhKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IGJvb2xlYW4ge1xuXHRcdC8vIFZlcmlmaWNhciBzaSBsYSBydXRhIHRpZW5lIHN1IHByb3BpYSBjb25maWd1cmFjacOzbiBkZSBicmVhZGNydW1iXG5cdFx0Y29uc3Qgcm91dGVDb25maWcgPSByb3V0ZS5yb3V0ZUNvbmZpZztcblx0XHRyZXR1cm4gISEoXG5cdFx0XHRyb3V0ZUNvbmZpZyAmJlxuXHRcdFx0cm91dGVDb25maWcuZGF0YSAmJlxuXHRcdFx0cm91dGVDb25maWcuZGF0YVsnYnJlYWRjcnVtYiddXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0QnJlYWRjcnVtYkxhYmVsKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSk6IHN0cmluZyB7XG5cdFx0Y29uc3QgZGF0YSA9IHJvdXRlLnNuYXBzaG90LmRhdGE7XG5cdFx0bGV0IGxhYmVsID0gZGF0YVsnYnJlYWRjcnVtYiddO1xuXG5cdFx0aWYgKHR5cGVvZiBsYWJlbCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0bGFiZWwgPSBsYWJlbChkYXRhKTtcblx0XHR9XG5cblx0XHRpZiAoZGF0YVsncmVzb2x2ZWREYXRhJ10pIHtcblx0XHRcdGxhYmVsID0gdGhpcy5nZXRSZXNvbHZlZEJyZWFkY3J1bWIobGFiZWwsIGRhdGFbJ3Jlc29sdmVkRGF0YSddKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGFiZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldFJlc29sdmVkQnJlYWRjcnVtYih0ZW1wbGF0ZTogc3RyaW5nLCBkYXRhOiBhbnkpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHsoW159XSspXFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG5cdFx0XHRyZXR1cm4gZGF0YVtrZXldIHx8IG1hdGNoO1xuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi1pdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnJlYWRjcnVtYnMvc3JjL2xpYi90eXBlcy9icmVhZGNydW1iLWl0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQnJlYWRjcnVtYkl0ZW0ge1xuXHRsYWJlbDogc3RyaW5nO1xuXHR1cmw6IHN0cmluZztcblx0ZGF0YTogYW55O1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi10ZW1wbGF0ZS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnJlYWRjcnVtYnMvc3JjL2xpYi90eXBlcy9icmVhZGNydW1iLXRlbXBsYXRlLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFkY3J1bWJJdGVtIH0gZnJvbSAnLi9icmVhZGNydW1iLWl0ZW0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFkY3J1bWJUZW1wbGF0ZUNvbnRleHQge1xuXHQkaW1wbGljaXQ6IEJyZWFkY3J1bWJJdGVtO1xuXHRpc0xhc3Q6IGJvb2xlYW47XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctaHViLXVpLWJyZWFkY3J1bWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYnJlYWRjcnVtYnMvc3JjL25nLWh1Yi11aS1icmVhZGNydW1icy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of breadcrumbs
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/hub-breadcrumbs.module';
|
|
5
|
+
export * from './lib/services/hub-breadcrumbs.service';
|
|
6
|
+
export * from './lib/components/hub-breadcrumbs/hub-breadcrumbs.component';
|
|
7
|
+
export * from './lib/directives/hub-breadcrumb-item.directive';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2JyZWFkY3J1bWJzL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyxnREFBZ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgYnJlYWRjcnVtYnNcbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaHViLWJyZWFkY3J1bWJzLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9odWItYnJlYWRjcnVtYnMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2h1Yi1icmVhZGNydW1icy9odWItYnJlYWRjcnVtYnMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvaHViLWJyZWFkY3J1bWItaXRlbS5kaXJlY3RpdmUnO1xuIl19
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, TemplateRef, Directive, Injectable, Component, ContentChild, NgModule } from '@angular/core';
|
|
3
|
+
import { AsyncPipe, NgTemplateOutlet, NgIf } from '@angular/common';
|
|
4
|
+
import { Router, ActivatedRoute, NavigationEnd, RouterLink } from '@angular/router';
|
|
5
|
+
import { filter, startWith, map } from 'rxjs';
|
|
6
|
+
|
|
7
|
+
class HubBreadcrumbItemDirective {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.template = inject((TemplateRef));
|
|
10
|
+
}
|
|
11
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
12
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.5", type: HubBreadcrumbItemDirective, isStandalone: true, selector: "[hubBreadcrumbItem]", ngImport: i0 }); }
|
|
13
|
+
}
|
|
14
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbItemDirective, decorators: [{
|
|
15
|
+
type: Directive,
|
|
16
|
+
args: [{
|
|
17
|
+
selector: '[hubBreadcrumbItem]',
|
|
18
|
+
standalone: true
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
|
+
|
|
22
|
+
class HubBreadcrumbsService {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.#router = inject(Router);
|
|
25
|
+
this.#activatedRoute = inject(ActivatedRoute);
|
|
26
|
+
this.breadcrumbs$ = this.#router.events.pipe(filter((event) => event instanceof NavigationEnd), startWith(undefined), map(() => this.createBreadcrumbs(this.#activatedRoute.root)));
|
|
27
|
+
}
|
|
28
|
+
#router;
|
|
29
|
+
#activatedRoute;
|
|
30
|
+
createBreadcrumbs(route, url = '', breadcrumbs = []) {
|
|
31
|
+
const children = route.children;
|
|
32
|
+
if (children.length === 0) {
|
|
33
|
+
return breadcrumbs;
|
|
34
|
+
}
|
|
35
|
+
for (const child of children) {
|
|
36
|
+
const routeSegments = child.snapshot.url;
|
|
37
|
+
// Construir la URL para este nivel
|
|
38
|
+
const routeURL = routeSegments
|
|
39
|
+
.map((segment) => segment.path)
|
|
40
|
+
.join('/');
|
|
41
|
+
const nextUrl = routeURL ? `${url}/${routeURL}` : url;
|
|
42
|
+
// Verificar si esta ruta específica tiene datos de breadcrumb
|
|
43
|
+
const hasBreadcrumbData = this.hasOwnBreadcrumbData(child);
|
|
44
|
+
if (hasBreadcrumbData) {
|
|
45
|
+
const label = this.getBreadcrumbLabel(child);
|
|
46
|
+
breadcrumbs.push({
|
|
47
|
+
label,
|
|
48
|
+
url: nextUrl,
|
|
49
|
+
data: child.snapshot.data
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Continuar con los hijos
|
|
53
|
+
return this.createBreadcrumbs(child, nextUrl, breadcrumbs);
|
|
54
|
+
}
|
|
55
|
+
return breadcrumbs;
|
|
56
|
+
}
|
|
57
|
+
hasOwnBreadcrumbData(route) {
|
|
58
|
+
// Verificar si la ruta tiene su propia configuración de breadcrumb
|
|
59
|
+
const routeConfig = route.routeConfig;
|
|
60
|
+
return !!(routeConfig &&
|
|
61
|
+
routeConfig.data &&
|
|
62
|
+
routeConfig.data['breadcrumb']);
|
|
63
|
+
}
|
|
64
|
+
getBreadcrumbLabel(route) {
|
|
65
|
+
const data = route.snapshot.data;
|
|
66
|
+
let label = data['breadcrumb'];
|
|
67
|
+
if (typeof label === 'function') {
|
|
68
|
+
label = label(data);
|
|
69
|
+
}
|
|
70
|
+
if (data['resolvedData']) {
|
|
71
|
+
label = this.getResolvedBreadcrumb(label, data['resolvedData']);
|
|
72
|
+
}
|
|
73
|
+
return label;
|
|
74
|
+
}
|
|
75
|
+
getResolvedBreadcrumb(template, data) {
|
|
76
|
+
return template.replace(/\{([^}]+)\}/g, (match, key) => {
|
|
77
|
+
return data[key] || match;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
81
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsService, providedIn: 'root' }); }
|
|
82
|
+
}
|
|
83
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsService, decorators: [{
|
|
84
|
+
type: Injectable,
|
|
85
|
+
args: [{
|
|
86
|
+
providedIn: 'root'
|
|
87
|
+
}]
|
|
88
|
+
}] });
|
|
89
|
+
|
|
90
|
+
class HubBreadcrumbsComponent {
|
|
91
|
+
constructor() {
|
|
92
|
+
this.#breadcrumbsSvc = inject(HubBreadcrumbsService);
|
|
93
|
+
this.breadcrumbs$ = this.#breadcrumbsSvc.breadcrumbs$;
|
|
94
|
+
}
|
|
95
|
+
#breadcrumbsSvc;
|
|
96
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
97
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: HubBreadcrumbsComponent, isStandalone: true, selector: "hub-breadcrumbs", host: { classAttribute: "hub-breadcrumb" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: HubBreadcrumbItemDirective, descendants: true }], ngImport: i0, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (item of breadcrumbs$ | async; track item; let last = $last) {\n\t\t<li\n\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t[class.hub-breadcrumb__item--active]=\"last\"\n\t\t>\n\t\t\t@if (itemTemplate) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"itemTemplate.template\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ $implicit: item, isLast: last }\"\n\t\t\t/>\n\t\t\t} @else { @if (!last) {\n\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\">\n\t\t\t\t{{ item.label }}\n\t\t\t</a>\n\t\t\t} @else {\n\t\t\t<span class=\"hub-breadcrumb__text\">{{ item.label }}</span>\n\t\t\t} }\n\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n", styles: [".hub-breadcrumb__list{--hub-breadcrumb-padding-x: 1rem;--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: 0;--hub-breadcrumb-bg: white;--hub-breadcrumb-border-radius: 50rem;--hub-breadcrumb-divider-color: black;--hub-breadcrumb-item-padding-x: .5rem;--hub-breadcrumb-item-active-color: black;display:flex;flex-wrap:wrap;padding:var(--hub-breadcrumb-padding-y) var(--hub-breadcrumb-padding-x);margin-bottom:var(--hub-breadcrumb-margin-bottom);list-style:none;background-color:var(--hub-breadcrumb-bg)}.hub-breadcrumb__item+.hub-breadcrumb__item{padding-left:var(--hub-breadcrumb-item-padding-x)}.hub-breadcrumb__item+.hub-breadcrumb__item:before{float:left;padding-right:var(--hub-breadcrumb-item-padding-x);color:var(--hub-breadcrumb-divider-color);content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsComponent, decorators: [{
|
|
100
|
+
type: Component,
|
|
101
|
+
args: [{ selector: 'hub-breadcrumbs', standalone: true, imports: [AsyncPipe, NgIf, RouterLink, NgTemplateOutlet], host: {
|
|
102
|
+
class: 'hub-breadcrumb'
|
|
103
|
+
}, template: "<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (item of breadcrumbs$ | async; track item; let last = $last) {\n\t\t<li\n\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t[class.hub-breadcrumb__item--active]=\"last\"\n\t\t>\n\t\t\t@if (itemTemplate) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"itemTemplate.template\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ $implicit: item, isLast: last }\"\n\t\t\t/>\n\t\t\t} @else { @if (!last) {\n\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\">\n\t\t\t\t{{ item.label }}\n\t\t\t</a>\n\t\t\t} @else {\n\t\t\t<span class=\"hub-breadcrumb__text\">{{ item.label }}</span>\n\t\t\t} }\n\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n", styles: [".hub-breadcrumb__list{--hub-breadcrumb-padding-x: 1rem;--hub-breadcrumb-padding-y: .25rem;--hub-breadcrumb-margin-bottom: 0;--hub-breadcrumb-bg: white;--hub-breadcrumb-border-radius: 50rem;--hub-breadcrumb-divider-color: black;--hub-breadcrumb-item-padding-x: .5rem;--hub-breadcrumb-item-active-color: black;display:flex;flex-wrap:wrap;padding:var(--hub-breadcrumb-padding-y) var(--hub-breadcrumb-padding-x);margin-bottom:var(--hub-breadcrumb-margin-bottom);list-style:none;background-color:var(--hub-breadcrumb-bg)}.hub-breadcrumb__item+.hub-breadcrumb__item{padding-left:var(--hub-breadcrumb-item-padding-x)}.hub-breadcrumb__item+.hub-breadcrumb__item:before{float:left;padding-right:var(--hub-breadcrumb-item-padding-x);color:var(--hub-breadcrumb-divider-color);content:var(--hub-breadcrumb-divider, \">\")}.hub-breadcrumb__item--active{color:var(--hub-breadcrumb-item-active-color)}\n"] }]
|
|
104
|
+
}], propDecorators: { itemTemplate: [{
|
|
105
|
+
type: ContentChild,
|
|
106
|
+
args: [HubBreadcrumbItemDirective]
|
|
107
|
+
}] } });
|
|
108
|
+
|
|
109
|
+
class HubBreadcrumbsModule {
|
|
110
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
111
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule, imports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective], exports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective] }); }
|
|
112
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule }); }
|
|
113
|
+
}
|
|
114
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubBreadcrumbsModule, decorators: [{
|
|
115
|
+
type: NgModule,
|
|
116
|
+
args: [{
|
|
117
|
+
declarations: [],
|
|
118
|
+
imports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective],
|
|
119
|
+
exports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective]
|
|
120
|
+
}]
|
|
121
|
+
}] });
|
|
122
|
+
|
|
123
|
+
/*
|
|
124
|
+
* Public API Surface of breadcrumbs
|
|
125
|
+
*/
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Generated bundle index. Do not edit.
|
|
129
|
+
*/
|
|
130
|
+
|
|
131
|
+
export { HubBreadcrumbItemDirective, HubBreadcrumbsComponent, HubBreadcrumbsModule, HubBreadcrumbsService };
|
|
132
|
+
//# sourceMappingURL=ng-hub-ui-breadcrumbs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ng-hub-ui-breadcrumbs.mjs","sources":["../../../projects/breadcrumbs/src/lib/directives/hub-breadcrumb-item.directive.ts","../../../projects/breadcrumbs/src/lib/services/hub-breadcrumbs.service.ts","../../../projects/breadcrumbs/src/lib/components/hub-breadcrumbs/hub-breadcrumbs.component.ts","../../../projects/breadcrumbs/src/lib/components/hub-breadcrumbs/hub-breadcrumbs.component.html","../../../projects/breadcrumbs/src/lib/hub-breadcrumbs.module.ts","../../../projects/breadcrumbs/src/public-api.ts","../../../projects/breadcrumbs/src/ng-hub-ui-breadcrumbs.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\nimport { BreadcrumbTemplateContext } from '../types/breadcrumb-template-context';\n\n@Directive({\n\tselector: '[hubBreadcrumbItem]',\n\tstandalone: true\n})\nexport class HubBreadcrumbItemDirective {\n\ttemplate = inject(TemplateRef<BreadcrumbTemplateContext>);\n}\n","import { inject, Injectable } from '@angular/core';\nimport { BreadcrumbItem } from '../types/breadcrumb-item';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { filter, startWith, map } from 'rxjs';\n\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class HubBreadcrumbsService {\n\t#router = inject(Router);\n\t#activatedRoute = inject(ActivatedRoute);\n\n\tbreadcrumbs$ = this.#router.events.pipe(\n\t\tfilter((event) => event instanceof NavigationEnd),\n\t\tstartWith(undefined),\n\t\tmap(() => this.createBreadcrumbs(this.#activatedRoute.root))\n\t);\n\n\tprivate createBreadcrumbs(\n\t\troute: ActivatedRoute,\n\t\turl: string = '',\n\t\tbreadcrumbs: BreadcrumbItem[] = []\n\t): BreadcrumbItem[] {\n\t\tconst children: ActivatedRoute[] = route.children;\n\n\t\tif (children.length === 0) {\n\t\t\treturn breadcrumbs;\n\t\t}\n\n\t\tfor (const child of children) {\n\t\t\tconst routeSegments = child.snapshot.url;\n\n\t\t\t// Construir la URL para este nivel\n\t\t\tconst routeURL: string = routeSegments\n\t\t\t\t.map((segment) => segment.path)\n\t\t\t\t.join('/');\n\n\t\t\tconst nextUrl = routeURL ? `${url}/${routeURL}` : url;\n\n\t\t\t// Verificar si esta ruta específica tiene datos de breadcrumb\n\t\t\tconst hasBreadcrumbData = this.hasOwnBreadcrumbData(child);\n\n\t\t\tif (hasBreadcrumbData) {\n\t\t\t\tconst label = this.getBreadcrumbLabel(child);\n\t\t\t\tbreadcrumbs.push({\n\t\t\t\t\tlabel,\n\t\t\t\t\turl: nextUrl,\n\t\t\t\t\tdata: child.snapshot.data\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Continuar con los hijos\n\t\t\treturn this.createBreadcrumbs(child, nextUrl, breadcrumbs);\n\t\t}\n\n\t\treturn breadcrumbs;\n\t}\n\n\tprivate hasOwnBreadcrumbData(route: ActivatedRoute): boolean {\n\t\t// Verificar si la ruta tiene su propia configuración de breadcrumb\n\t\tconst routeConfig = route.routeConfig;\n\t\treturn !!(\n\t\t\trouteConfig &&\n\t\t\trouteConfig.data &&\n\t\t\trouteConfig.data['breadcrumb']\n\t\t);\n\t}\n\n\tprivate getBreadcrumbLabel(route: ActivatedRoute): string {\n\t\tconst data = route.snapshot.data;\n\t\tlet label = data['breadcrumb'];\n\n\t\tif (typeof label === 'function') {\n\t\t\tlabel = label(data);\n\t\t}\n\n\t\tif (data['resolvedData']) {\n\t\t\tlabel = this.getResolvedBreadcrumb(label, data['resolvedData']);\n\t\t}\n\n\t\treturn label;\n\t}\n\n\tprivate getResolvedBreadcrumb(template: string, data: any): string {\n\t\treturn template.replace(/\\{([^}]+)\\}/g, (match, key) => {\n\t\t\treturn data[key] || match;\n\t\t});\n\t}\n}\n","import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';\nimport { Component, ContentChild, inject } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { HubBreadcrumbItemDirective } from '../../directives/hub-breadcrumb-item.directive';\nimport { HubBreadcrumbsService } from '../../services/hub-breadcrumbs.service';\n\n@Component({\n\tselector: 'hub-breadcrumbs',\n\tstandalone: true,\n\timports: [AsyncPipe, NgIf, RouterLink, NgTemplateOutlet],\n\ttemplateUrl: './hub-breadcrumbs.component.html',\n\tstyleUrl: './hub-breadcrumbs.component.scss',\n\thost: {\n\t\tclass: 'hub-breadcrumb'\n\t}\n})\nexport class HubBreadcrumbsComponent {\n\t#breadcrumbsSvc = inject(HubBreadcrumbsService);\n\n\t@ContentChild(HubBreadcrumbItemDirective)\n\titemTemplate?: HubBreadcrumbItemDirective;\n\n\tbreadcrumbs$ = this.#breadcrumbsSvc.breadcrumbs$;\n}\n","<nav aria-label=\"breadcrumb\" class=\"hub-breadcrumb__nav\">\n\t<ol class=\"hub-breadcrumb__list\">\n\t\t@for (item of breadcrumbs$ | async; track item; let last = $last) {\n\t\t<li\n\t\t\tclass=\"hub-breadcrumb__item\"\n\t\t\t[class.hub-breadcrumb__item--active]=\"last\"\n\t\t>\n\t\t\t@if (itemTemplate) {\n\t\t\t<ng-container\n\t\t\t\t[ngTemplateOutlet]=\"itemTemplate.template\"\n\t\t\t\t[ngTemplateOutletContext]=\"{ $implicit: item, isLast: last }\"\n\t\t\t/>\n\t\t\t} @else { @if (!last) {\n\t\t\t<a [routerLink]=\"item.url\" class=\"hub-breadcrumb__link\">\n\t\t\t\t{{ item.label }}\n\t\t\t</a>\n\t\t\t} @else {\n\t\t\t<span class=\"hub-breadcrumb__text\">{{ item.label }}</span>\n\t\t\t} }\n\t\t</li>\n\t\t}\n\t</ol>\n</nav>\n","import { NgModule } from '@angular/core';\nimport { HubBreadcrumbsComponent } from './components/hub-breadcrumbs/hub-breadcrumbs.component';\nimport { HubBreadcrumbItemDirective } from './directives/hub-breadcrumb-item.directive';\n\n@NgModule({\n\tdeclarations: [],\n\timports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective],\n\texports: [HubBreadcrumbsComponent, HubBreadcrumbItemDirective]\n})\nexport class HubBreadcrumbsModule {}\n","/*\n * Public API Surface of breadcrumbs\n */\nexport * from './lib/hub-breadcrumbs.module';\nexport * from './lib/services/hub-breadcrumbs.service';\nexport * from './lib/components/hub-breadcrumbs/hub-breadcrumbs.component';\nexport * from './lib/directives/hub-breadcrumb-item.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;MAOa,0BAA0B,CAAA;AAJvC,IAAA,WAAA,GAAA;AAKC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,EAAC,WAAsC,EAAC,CAAC;AAC1D,KAAA;8GAFY,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE,IAAI;AAChB,iBAAA,CAAA;;;MCEY,qBAAqB,CAAA;AAHlC,IAAA,WAAA,GAAA;AAIC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACzB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAEzC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CACtC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,YAAY,aAAa,CAAC,EACjD,SAAS,CAAC,SAAS,CAAC,EACpB,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAC5D,CAAC;AAwEF,KAAA;AA/EA,IAAA,OAAO,CAAkB;AACzB,IAAA,eAAe,CAA0B;AAQjC,IAAA,iBAAiB,CACxB,KAAqB,EACrB,MAAc,EAAE,EAChB,cAAgC,EAAE,EAAA;AAElC,QAAA,MAAM,QAAQ,GAAqB,KAAK,CAAC,QAAQ,CAAC;AAElD,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,OAAO,WAAW,CAAC;AACnB,SAAA;AAED,QAAA,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AAC7B,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;;YAGzC,MAAM,QAAQ,GAAW,aAAa;iBACpC,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC;iBAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,YAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,QAAQ,CAAE,CAAA,GAAG,GAAG,CAAC;;YAGtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;AAE3D,YAAA,IAAI,iBAAiB,EAAE;gBACtB,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC7C,WAAW,CAAC,IAAI,CAAC;oBAChB,KAAK;AACL,oBAAA,GAAG,EAAE,OAAO;AACZ,oBAAA,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;AACzB,iBAAA,CAAC,CAAC;AACH,aAAA;;YAGD,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAC3D,SAAA;AAED,QAAA,OAAO,WAAW,CAAC;KACnB;AAEO,IAAA,oBAAoB,CAAC,KAAqB,EAAA;;AAEjD,QAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACtC,OAAO,CAAC,EACP,WAAW;AACX,YAAA,WAAW,CAAC,IAAI;AAChB,YAAA,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAC9B,CAAC;KACF;AAEO,IAAA,kBAAkB,CAAC,KAAqB,EAAA;AAC/C,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;AAE/B,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAChC,YAAA,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AACpB,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE;AACzB,YAAA,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AAChE,SAAA;AAED,QAAA,OAAO,KAAK,CAAC;KACb;IAEO,qBAAqB,CAAC,QAAgB,EAAE,IAAS,EAAA;QACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,GAAG,KAAI;AACtD,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;AAC3B,SAAC,CAAC,CAAC;KACH;8GA/EW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFrB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEN,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACX,oBAAA,UAAU,EAAE,MAAM;AAClB,iBAAA,CAAA;;;MCSY,uBAAuB,CAAA;AAVpC,IAAA,WAAA,GAAA;AAWC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAKhD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;AACjD,KAAA;AANA,IAAA,eAAe,CAAiC;8GADpC,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAGrB,0BAA0B,ECnBzC,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,kuBAuBA,66BDdW,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAQ,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAO3C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAVnC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EACf,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAGlD,IAAA,EAAA;AACL,wBAAA,KAAK,EAAE,gBAAgB;AACvB,qBAAA,EAAA,QAAA,EAAA,kuBAAA,EAAA,MAAA,EAAA,CAAA,03BAAA,CAAA,EAAA,CAAA;8BAMD,YAAY,EAAA,CAAA;sBADX,YAAY;uBAAC,0BAA0B,CAAA;;;MEV5B,oBAAoB,CAAA;8GAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAHtB,uBAAuB,EAAE,0BAA0B,CACnD,EAAA,OAAA,EAAA,CAAA,uBAAuB,EAAE,0BAA0B,CAAA,EAAA,CAAA,CAAA,EAAA;+GAEjD,oBAAoB,EAAA,CAAA,CAAA,EAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBALhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;AAC9D,oBAAA,OAAO,EAAE,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;AAC9D,iBAAA,CAAA;;;ACRD;;AAEG;;ACFH;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HubBreadcrumbItemDirective } from '../../directives/hub-breadcrumb-item.directive';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class HubBreadcrumbsComponent {
|
|
4
|
+
#private;
|
|
5
|
+
itemTemplate?: HubBreadcrumbItemDirective;
|
|
6
|
+
breadcrumbs$: import("rxjs").Observable<import("../../types/breadcrumb-item").BreadcrumbItem[]>;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HubBreadcrumbsComponent, never>;
|
|
8
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HubBreadcrumbsComponent, "hub-breadcrumbs", never, {}, {}, ["itemTemplate"], never, true, never>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TemplateRef } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class HubBreadcrumbItemDirective {
|
|
4
|
+
template: TemplateRef<any>;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HubBreadcrumbItemDirective, never>;
|
|
6
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<HubBreadcrumbItemDirective, "[hubBreadcrumbItem]", never, {}, {}, never, never, true, never>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "./components/hub-breadcrumbs/hub-breadcrumbs.component";
|
|
3
|
+
import * as i2 from "./directives/hub-breadcrumb-item.directive";
|
|
4
|
+
export declare class HubBreadcrumbsModule {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HubBreadcrumbsModule, never>;
|
|
6
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<HubBreadcrumbsModule, never, [typeof i1.HubBreadcrumbsComponent, typeof i2.HubBreadcrumbItemDirective], [typeof i1.HubBreadcrumbsComponent, typeof i2.HubBreadcrumbItemDirective]>;
|
|
7
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<HubBreadcrumbsModule>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BreadcrumbItem } from '../types/breadcrumb-item';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class HubBreadcrumbsService {
|
|
4
|
+
#private;
|
|
5
|
+
breadcrumbs$: import("rxjs").Observable<BreadcrumbItem[]>;
|
|
6
|
+
private createBreadcrumbs;
|
|
7
|
+
private hasOwnBreadcrumbData;
|
|
8
|
+
private getBreadcrumbLabel;
|
|
9
|
+
private getResolvedBreadcrumb;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HubBreadcrumbsService, never>;
|
|
11
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<HubBreadcrumbsService>;
|
|
12
|
+
}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ng-hub-ui-breadcrumbs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A flexible and reusable breadcrumb component for Angular applications that automatically generates breadcrumbs based on routing configuration",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"customizable",
|
|
8
|
+
"bootstrap",
|
|
9
|
+
"breadcrumb",
|
|
10
|
+
"breadcrumbs",
|
|
11
|
+
"navigation",
|
|
12
|
+
"routing",
|
|
13
|
+
"component",
|
|
14
|
+
"typescript"
|
|
15
|
+
],
|
|
16
|
+
"author": "Your Organization",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/carlos-morcillo/ng-hub-ui-breadcrumbs"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/carlos-morcillo/ng-hub-ui-breadcrumbs/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/carlos-morcillo/ng-hub-ui-breadcrumbs#readme",
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"@angular/common": ">=17.0.0",
|
|
28
|
+
"@angular/core": ">=17.0.0"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"tslib": "^2.3.0"
|
|
32
|
+
},
|
|
33
|
+
"sideEffects": false,
|
|
34
|
+
"module": "fesm2022/ng-hub-ui-breadcrumbs.mjs",
|
|
35
|
+
"typings": "index.d.ts",
|
|
36
|
+
"exports": {
|
|
37
|
+
"./package.json": {
|
|
38
|
+
"default": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
".": {
|
|
41
|
+
"types": "./index.d.ts",
|
|
42
|
+
"esm2022": "./esm2022/ng-hub-ui-breadcrumbs.mjs",
|
|
43
|
+
"esm": "./esm2022/ng-hub-ui-breadcrumbs.mjs",
|
|
44
|
+
"default": "./fesm2022/ng-hub-ui-breadcrumbs.mjs"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
package/public-api.d.ts
ADDED