{"version":3,"file":"xng-breadcrumb.mjs","sources":["../../../xng-breadcrumb/src/lib/breadcrumb-item.directive.ts","../../../xng-breadcrumb/src/lib/breadcrumb.service.ts","../../../xng-breadcrumb/src/lib/breadcrumb.component.ts","../../../xng-breadcrumb/src/lib/breadcrumb.component.html","../../../xng-breadcrumb/src/xng-breadcrumb.ts"],"sourcesContent":["import { Directive } from '@angular/core';\n\n/**\n * This directive is used to customize the breadcrumb label behavior\n * *xngBreadcrumbItem directive can be used in the child element of xng-breadcrumb\n * Usage: refer to the demo - app.component.html\n */\n@Directive({\n  selector: '[xngBreadcrumbItem]',\n  standalone: true,\n})\nexport class BreadcrumbItemDirective {}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRoute, ActivatedRouteSnapshot, GuardsCheckEnd, Router } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { BreadcrumbDefinition, Breadcrumb, BreadcrumbConfig, BreadcrumbObject } from './types';\n\ntype StoreMatcherKey = 'routeLink' | 'routeRegex' | 'alias';\n\nconst PATH_PARAM = {\n  PREFIX: ':',\n  REGEX_IDENTIFIER: '/:[^/]+',\n  REGEX_REPLACER: '/[^/]+',\n};\nconst ALIAS_PREFIX = '@';\nconst isNonEmpty = (obj: unknown): boolean => {\n  return !!obj && Object.keys(obj).length > 0;\n};\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class BreadcrumbService {\n  private baseHref = '/';\n\n  /**\n   * dynamicBreadcrumbStore holds information about dynamically updated breadcrumbs.\n   * Breadcrumbs can be set from anywhere (component, service) in the app.\n   * On every breadcrumb update check this store and use the info if available.\n   */\n  private dynamicBreadcrumbStore: BreadcrumbDefinition[] = [];\n\n  /**\n   * breadcrumbList for the current route\n   * When breadcrumb info is changed dynamically, check if the currentBreadcrumbs is effected\n   * If effected, update the change and emit a new stream\n   */\n  private currentBreadcrumbs: BreadcrumbDefinition[] = [];\n  private previousBreadcrumbs: BreadcrumbDefinition[] = [];\n\n  /**\n   * Breadcrumbs observable to be subscribed by BreadcrumbComponent\n   * Emits on every route change OR dynamic update of breadcrumb\n   */\n  private breadcrumbs = new BehaviorSubject<BreadcrumbDefinition[]>([]);\n  public breadcrumbs$ = this.breadcrumbs.asObservable();\n\n  constructor(private activatedRoute: ActivatedRoute, private router: Router) {\n    this.detectRouteChanges();\n  }\n\n  /**\n   * Whenever route changes build breadcrumb list again\n   */\n  private detectRouteChanges() {\n    // Special case where breadcrumb service & component instantiates after a route is navigated.\n    // Ex: put breadcrumbs within *ngIf and this.router.events would be empty\n    // This check is also required where  { initialNavigation: 'enabledBlocking' } is applied to routes\n    this.setupBreadcrumbs(this.activatedRoute.snapshot);\n\n    this.router.events.pipe(filter((event): event is GuardsCheckEnd => event instanceof GuardsCheckEnd)).subscribe((event) => {\n      // activatedRoute doesn't carry data when shouldReuseRoute returns false\n      // use the event data with GuardsCheckEnd as workaround\n      // Check for shouldActivate in case where the authGuard returns false the breadcrumbs shouldn't be changed\n      if (event.shouldActivate) {\n        this.setupBreadcrumbs(event.state.root);\n      }\n    });\n  }\n\n  private setupBreadcrumbs(activatedRouteSnapshot: ActivatedRouteSnapshot) {\n    this.previousBreadcrumbs = this.currentBreadcrumbs;\n    // breadcrumb label for base OR root path. Usually, this can be set as 'Home'\n    const rootBreadcrumb = this.getRootBreadcrumb();\n    this.currentBreadcrumbs = rootBreadcrumb ? [rootBreadcrumb] : [];\n    this.prepareBreadcrumbList(activatedRouteSnapshot, this.baseHref);\n  }\n\n  private getRootBreadcrumb(): Breadcrumb | void {\n    const rootConfig = this.router.config.find((config) => config.path === '');\n    const rootBreadcrumb = this.extractObject(rootConfig?.data?.['breadcrumb']);\n    const storeItem = this.getFromStore(rootBreadcrumb.alias, '/');\n\n    if (isNonEmpty(rootBreadcrumb) || isNonEmpty(storeItem)) {\n      return {\n        ...storeItem,\n        ...rootBreadcrumb,\n        routeLink: this.baseHref,\n        ...this.getQueryParamsFromPreviousList('/'),\n      };\n    }\n  }\n\n  private prepareBreadcrumbItem(activatedRouteSnapshot: ActivatedRouteSnapshot, routeLinkPrefix: string): BreadcrumbDefinition {\n    const { path, breadcrumb } = this.parseRouteData(activatedRouteSnapshot.routeConfig);\n    const resolvedSegment = this.resolvePathSegment(path, activatedRouteSnapshot);\n    const routeLink = `${routeLinkPrefix}${resolvedSegment}`;\n    const storeItem = this.getFromStore(breadcrumb.alias, routeLink);\n\n    const label = this.extractLabel(storeItem?.label || breadcrumb?.label, resolvedSegment);\n    let isAutoGeneratedLabel = false;\n    let autoGeneratedLabel = '';\n    if (!label) {\n      isAutoGeneratedLabel = true;\n      autoGeneratedLabel = resolvedSegment;\n    }\n\n    return {\n      ...storeItem,\n      ...breadcrumb,\n      label: isAutoGeneratedLabel ? autoGeneratedLabel : label,\n      routeLink,\n      isAutoGeneratedLabel,\n      ...this.getQueryParamsFromPreviousList(routeLink),\n    };\n  }\n\n  private prepareBreadcrumbList(activatedRouteSnapshot: ActivatedRouteSnapshot, routeLinkPrefix: string): Breadcrumb[] | void {\n    if (activatedRouteSnapshot.routeConfig?.path) {\n      const breadcrumbItem = this.prepareBreadcrumbItem(activatedRouteSnapshot, routeLinkPrefix);\n      this.currentBreadcrumbs.push(breadcrumbItem);\n\n      if (activatedRouteSnapshot.firstChild) {\n        return this.prepareBreadcrumbList(activatedRouteSnapshot.firstChild, breadcrumbItem.routeLink + '/');\n      }\n    } else if (activatedRouteSnapshot.firstChild) {\n      return this.prepareBreadcrumbList(activatedRouteSnapshot.firstChild, routeLinkPrefix);\n    }\n    const lastCrumb = this.currentBreadcrumbs[this.currentBreadcrumbs.length - 1];\n    this.setQueryParamsForActiveBreadcrumb(lastCrumb, activatedRouteSnapshot);\n\n    // remove breadcrumb items that needs to be hidden\n    const breadcrumbsToShow = this.currentBreadcrumbs.filter((item) => !item.skip);\n\n    this.breadcrumbs.next(breadcrumbsToShow);\n  }\n\n  private getFromStore(alias: string, routeLink: string): BreadcrumbDefinition {\n    return this.dynamicBreadcrumbStore.find((item) => {\n      return (alias && alias === item.alias) || (routeLink && routeLink === item.routeLink) || this.matchRegex(routeLink, item.routeRegex);\n    });\n  }\n\n  /**\n   * use exact match instead of regexp.test\n   * for /mentor/[^/]+ we should match '/mentor/12' but not '/mentor/12/abc'\n   */\n  private matchRegex(routeLink: string, routeRegex: string) {\n    const match = routeLink.match(new RegExp(routeRegex));\n    return match?.[0] === routeLink;\n  }\n\n  /**\n   * if the path segment has route params, read the param value from url\n   * for each segment of route this gets called\n   *\n   * for mentor/:id/view - it gets called with mentor, :id, view 3 times\n   */\n  private resolvePathSegment(segment: string, activatedRouteSnapshot: ActivatedRouteSnapshot) {\n    //quirk -segment can be defined as view/:id in route config in which case you need to make it view/<resolved-param>\n    if (segment.includes(PATH_PARAM.PREFIX)) {\n      Object.entries(activatedRouteSnapshot.params).forEach(([key, value]) => {\n        segment = segment.replace(`:${key}`, `${value}`);\n      });\n    }\n    return segment;\n  }\n\n  /**\n   * queryParams & fragments for previous breadcrumb path are copied over to new list\n   */\n  private getQueryParamsFromPreviousList(routeLink: string): Breadcrumb {\n    const { queryParams, fragment } = this.previousBreadcrumbs.find((item) => item.routeLink === routeLink) || {};\n    return { queryParams, fragment };\n  }\n\n  /**\n   * set current activated route query params to the last breadcrumb item\n   */\n  private setQueryParamsForActiveBreadcrumb(lastItem: Breadcrumb, activatedRouteSnapshot: ActivatedRouteSnapshot) {\n    if (lastItem) {\n      const { queryParams, fragment } = activatedRouteSnapshot;\n      lastItem.queryParams = queryParams ? { ...queryParams } : undefined;\n      lastItem.fragment = fragment;\n    }\n  }\n\n  /**\n   * For a specific route, breadcrumb can be defined either on parent OR it's child(which has empty path)\n   * When both are defined, child takes precedence\n   *\n   * Ex: Below we are setting breadcrumb on both parent and child.\n   * So, child takes precedence and \"Defined On Child\" is displayed for the route 'home'\n   * { path: 'home', loadChildren: () => import('./home/home.module').then((m) => m.HomeModule) , data: {breadcrumb: \"Defined On Module\"}}\n   *                                                AND\n   * children: [\n   *   { path: '', component: ShowUserComponent, data: {breadcrumb: \"Defined On Child\" }\n   * ]\n   */\n  private parseRouteData(routeConfig) {\n    const { path, data } = routeConfig;\n    const breadcrumb = this.mergeWithBaseChildData(routeConfig, data?.breadcrumb);\n\n    return { path, breadcrumb };\n  }\n\n  /**\n   * get empty children of a module or Component. Empty child is the one with path: ''\n   * When parent and it's children (that has empty route path) define data merge them both with child taking precedence\n   */\n  private mergeWithBaseChildData(\n    routeConfig: any, // TODO: add proper type\n    config: BreadcrumbConfig\n  ): BreadcrumbObject {\n    if (!routeConfig) {\n      return this.extractObject(config);\n    }\n\n    let baseChild;\n    if (routeConfig.loadChildren) {\n      // To handle a module with empty child route\n      baseChild = routeConfig._loadedRoutes.find((route) => route.path === '');\n    } else if (routeConfig.children) {\n      // To handle a component with empty child route\n      baseChild = routeConfig.children.find((route) => route.path === '');\n    }\n\n    const childConfig = baseChild?.data?.breadcrumb;\n    return childConfig\n      ? this.mergeWithBaseChildData(baseChild, {\n          ...this.extractObject(config),\n          ...this.extractObject(childConfig),\n        })\n      : this.extractObject(config);\n  }\n\n  /**\n   * Update breadcrumb dynamically\n   *\n   * key can be a path | alias\n   *\n   * 1) Using complete route path. route can be passed the same way you define angular routes\n   * - path can be passed as 'exact path(routeLink)' or 'path with params(routeRegex)'\n   * - update label Ex: set('/mentor', 'Mentor'), set('/mentor/:id', 'Mentor Details')\n   * - change visibility Ex: set('/mentor/:id/edit', { skip: true })\n   * ------------------------------------------ OR ------------------------------------------\n   * 2) Using route alias (prefixed with '@'). alias should be unique for a route\n   * - update label Ex: set('@mentor', 'Enabler')\n   * - change visibility Ex: set('@mentorEdit', { skip: true })\n   *\n   *\n   * value can be string | BreadcrumbObject | BreadcrumbFunction\n   */\n  set(key: string, breadcrumb: string | BreadcrumbObject) {\n    const breadcrumbObject = this.extractObject(breadcrumb);\n    let updateArgs: [StoreMatcherKey, BreadcrumbDefinition];\n\n    if (key.startsWith(ALIAS_PREFIX)) {\n      updateArgs = ['alias', { ...breadcrumbObject, alias: key.slice(1) }];\n    } else if (key.includes(PATH_PARAM.PREFIX)) {\n      updateArgs = ['routeRegex', { ...breadcrumbObject, routeRegex: this.buildRegex(key) }];\n    } else {\n      updateArgs = ['routeLink', { ...breadcrumbObject, routeLink: this.ensureLeadingSlash(key) }];\n    }\n\n    // For this route if previously a breadcrumb is not defined that sets isAutoGeneratedLabel: true\n    // change it to false since this is user supplied value\n    updateArgs[1].isAutoGeneratedLabel = false;\n\n    this.updateStore(...updateArgs);\n    this.updateCurrentBreadcrumbs(...updateArgs);\n  }\n\n  /**\n   * Update the store to reuse for dynamic declarations\n   * If the store already has this route definition update it, else add\n   */\n  private updateStore(key: string, breadcrumb: BreadcrumbDefinition) {\n    const storeItemIndex = this.dynamicBreadcrumbStore.findIndex((item) => {\n      return breadcrumb[key] === item[key];\n    });\n    if (storeItemIndex > -1) {\n      this.dynamicBreadcrumbStore[storeItemIndex] = {\n        ...this.dynamicBreadcrumbStore[storeItemIndex],\n        ...breadcrumb,\n      };\n    } else {\n      this.dynamicBreadcrumbStore.push({ ...breadcrumb });\n    }\n  }\n\n  /**\n   * If breadcrumb is present in current breadcrumbs update it and emit new stream\n   */\n  private updateCurrentBreadcrumbs(key: string, breadcrumb: BreadcrumbDefinition) {\n    const itemIndex = this.currentBreadcrumbs.findIndex((item) => {\n      return key === 'routeRegex' ? this.matchRegex(item.routeLink, breadcrumb[key]) : breadcrumb[key] === item[key];\n    });\n    if (itemIndex > -1) {\n      this.currentBreadcrumbs[itemIndex] = {\n        ...this.currentBreadcrumbs[itemIndex],\n        ...breadcrumb,\n      };\n      const breadcrumbsToShow = this.currentBreadcrumbs.filter((item) => !item.skip);\n      this.breadcrumbs.next([...breadcrumbsToShow]);\n    }\n  }\n\n  /**\n   * For a route with path param, we create regex dynamically from angular route syntax\n   * '/mentor/:id' becomes '/mentor/[^/]',\n   * breadcrumbService.set('/mentor/:id', 'Uday') should update 'Uday' as label for '/mentor/2' OR 'mentor/ada'\n   */\n  private buildRegex(path: string) {\n    return this.ensureLeadingSlash(path).replace(new RegExp(PATH_PARAM.REGEX_IDENTIFIER, 'g'), PATH_PARAM.REGEX_REPLACER);\n  }\n\n  private ensureLeadingSlash(path: string) {\n    return path.startsWith('/') ? path : `/${path}`;\n  }\n\n  /**\n   * In App's RouteConfig, breadcrumb can be defined as a string OR a function OR an object\n   *\n   * string: simple static breadcrumb label for a path\n   * function: callback that gets invoked with resolved path param\n   * object: additional data defined along with breadcrumb label that gets passed to *xngBreadcrumbItem directive\n   */\n  private extractLabel(config: BreadcrumbConfig, resolvedParam?: string) {\n    const label = typeof config === 'object' ? config.label : config;\n    if (typeof label === 'function') {\n      return label(resolvedParam);\n    }\n    return label;\n  }\n\n  private extractObject(config: BreadcrumbConfig): BreadcrumbObject {\n    // don't include {label} if config is undefined. This is important since we merge the configs\n    if (config && (typeof config === 'string' || typeof config === 'function')) {\n      return { label: config };\n    }\n    return (config as BreadcrumbObject) || {};\n  }\n}\n","import { Component, ContentChild, Input, OnInit, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { Observable, map } from 'rxjs';\nimport { BreadcrumbItemDirective } from './breadcrumb-item.directive';\nimport { BreadcrumbService } from './breadcrumb.service';\nimport { BreadcrumbDefinition } from './types';\n\n@Component({\n    selector: 'xng-breadcrumb',\n    imports: [CommonModule, RouterModule],\n    templateUrl: './breadcrumb.component.html',\n    styleUrl: './breadcrumb.component.css',\n    encapsulation: ViewEncapsulation.None\n})\nexport class BreadcrumbComponent implements OnInit {\n  breadcrumbs$: Observable<BreadcrumbDefinition[]>;\n  separatorTemplate: TemplateRef<void>;\n  private _separator = '/';\n\n  /**\n   * Breadcrumb item can be customized with this template\n   * Template context is provided label, additional info, first and last indexes\n   * Use cases:\n   * 1) Add an icon along with label\n   * 2) i18n. {{breadcrumb | translate}} or {{breadcrumb | transloco}}\n   * 3) Change text case {{breadcrumb | titlecase}}\n   */\n  @ContentChild(BreadcrumbItemDirective, { static: false, read: TemplateRef })\n  itemTemplate;\n\n  /**\n   * If true, breadcrumb is auto generated even without any mapping label\n   * Default label is same as route segment\n   */\n  @Input() autoGenerate = true;\n\n  /**\n   * By default query params will be preserved with breadcrumbs\n   */\n  @Input() preserveQueryParams = true;\n\n  /**\n   * By default query fragments will be preserved with breadcrumbs\n   */\n  @Input() preserveFragment = true;\n\n  /**\n   * custom class provided by consumer to increase specificity\n   * This will benefit to override styles that are conflicting\n   */\n  @Input() class = '';\n\n  /**\n   * anchorTarget = \"_blank\" makes the breadcrumb link open in a new tab\n   */\n  @Input() anchorTarget: '_blank' | undefined;\n\n  /**\n   * separator between breadcrumbs, defaults to '/'.\n   * User can customize separator either by passing a String or Template\n   *\n   * String --> Ex: <xng-breadcrumb separator=\"-\"> </xng-breadcrumb>\n   *\n   * Template --> Ex: <xng-breadcrumb [separator]=\"separatorTemplate\"> </xng-breadcrumb>\n   * <ng-template #separatorTemplate><mat-icon>arrow_right</mat-icon></ng-template>\n   */\n  @Input()\n  set separator(value: string | TemplateRef<void>) {\n    if (value instanceof TemplateRef) {\n      this.separatorTemplate = value;\n      this._separator = undefined;\n    } else {\n      this.separatorTemplate = undefined;\n      this._separator = value || '/';\n    }\n  }\n  get separator() {\n    return this._separator;\n  }\n\n  setupMessage = 'not set up yet';\n  someParameterValue = null;\n\n  constructor(private breadcrumbService: BreadcrumbService, activateRoute: ActivatedRoute) {\n    // breadcrumb inside ngIf works only this way\n    activateRoute.params.subscribe((params) => {\n      this.setupComponent(params['someParam']);\n    });\n  }\n\n  setupComponent(someParam) {\n    this.setupMessage = 'set up at ' + new Date();\n    this.someParameterValue = someParam;\n  }\n\n  ngOnInit() {\n    this.breadcrumbs$ = this.breadcrumbService.breadcrumbs$.pipe(\n      map((breadcrumbs: BreadcrumbDefinition[]) => {\n        return breadcrumbs\n          .filter((breadcrumb: BreadcrumbDefinition) => {\n            // Usually, breadcrumb list can contain a combination of auto generated and user specified labels\n            // this filters autogenerated labels in case of \"[autoGenerate]: false\"\n            if (this.autoGenerate) {\n              return true;\n            }\n            return !breadcrumb.isAutoGeneratedLabel;\n          })\n          .map((breadcrumb: BreadcrumbDefinition) => {\n            // Do not mutate breadcrumb as its source of truth.\n            // There can be scenarios where we can have multiple xng-breadcrumb instances in page\n            const { routeInterceptor, routeLink } = breadcrumb;\n            return {\n              ...breadcrumb,\n              routeLink: routeInterceptor?.(routeLink, breadcrumb) || routeLink,\n            };\n          });\n      })\n    );\n  }\n}\n","<nav aria-label=\"breadcrumb\" class=\"xng-breadcrumb-root\" [ngClass]=\"class\">\n  <ol class=\"xng-breadcrumb-list\">\n    <ng-container *ngFor=\"let breadcrumb of breadcrumbs$ | async; last as isLast; first as isFirst; index as index; count as count\">\n      <li class=\"xng-breadcrumb-item\">\n        <a\n          *ngIf=\"!isLast\"\n          class=\"xng-breadcrumb-link\"\n          [ngClass]=\"{ 'xng-breadcrumb-link-disabled': breadcrumb.disable }\"\n          [attr.aria-disabled]=\"breadcrumb.disable\"\n          [attr.tabIndex]=\"breadcrumb.disable ? -1 : 0\"\n          rel=\"noopener noreferrer\"\n          [routerLink]=\"breadcrumb.routeInterceptor ? breadcrumb.routeInterceptor(breadcrumb.routeLink, breadcrumb) : breadcrumb.routeLink\"\n          [queryParams]=\"preserveQueryParams ? breadcrumb.queryParams : undefined\"\n          [fragment]=\"preserveFragment ? breadcrumb.fragment : undefined\"\n          [target]=\"anchorTarget ? anchorTarget : '_self'\"\n        >\n          <ng-container\n            *ngTemplateOutlet=\"\n              itemTemplate;\n              context: {\n                $implicit: breadcrumb.label,\n                info: breadcrumb.info,\n                last: isLast,\n                first: isFirst,\n                index: index,\n                count: count\n              }\n            \"\n          ></ng-container>\n          <ng-container *ngIf=\"!itemTemplate\">{{ breadcrumb.label }}</ng-container>\n        </a>\n\n        <span *ngIf=\"isLast\" class=\"xng-breadcrumb-trail\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              itemTemplate;\n              context: {\n                $implicit: breadcrumb.label,\n                info: breadcrumb.info,\n                last: isLast,\n                first: isFirst,\n                index: index,\n                count: count\n              }\n            \"\n          ></ng-container>\n          <ng-container *ngIf=\"!itemTemplate\">{{ breadcrumb.label }}</ng-container>\n        </span>\n      </li>\n\n      <li *ngIf=\"!isLast\" class=\"xng-breadcrumb-separator\" aria-hidden=\"true\">\n        <ng-container *ngTemplateOutlet=\"separatorTemplate\"></ng-container>\n        <ng-container *ngIf=\"!separatorTemplate\">{{ separator }}</ng-container>\n      </li>\n    </ng-container>\n  </ol>\n</nav>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.BreadcrumbService","i2"],"mappings":"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"}