{ "version": 3, "sources": ["src/lib/amg-breadcrumbs/breadcrumb.service.ts"], "sourcesContent": ["import { Injectable, OnDestroy } from '@angular/core';\r\nimport {\r\n ActivatedRoute,\r\n ActivatedRouteSnapshot,\r\n NavigationEnd,\r\n Router,\r\n UrlSerializer,\r\n} from '@angular/router';\r\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\r\nimport { Logger } from 'src/app/shared/tcs-logging/logger';\r\nimport { takeUntil } from 'rxjs/operators';\r\nimport { getOrElse } from 'src/util/values';\r\n\r\nexport interface Breadcrumb {\r\n name: string;\r\n url?: string;\r\n extras?: any;\r\n}\r\n\r\ntype LinkBehavior = 'match' | 'none';\r\ninterface LinkBehaviorConfig {\r\n link?: LinkBehavior;\r\n}\r\n\r\ntype BreadcrumbRouteResolverConfig = {\r\n resolver: string;\r\n} & ({ key?: string } | { nameSelector: (resolved: any) => string });\r\n\r\ntype BreadcrumbRouteConfig =\r\n | string\r\n | (({ name: string } | BreadcrumbRouteResolverConfig) & LinkBehaviorConfig);\r\n\r\nexport function breadcrumbs(...breadcrumbConfig: BreadcrumbRouteConfig[]): BreadcrumbRouteConfig[] {\r\n return breadcrumbConfig;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class BreadcrumbService implements OnDestroy {\r\n private _onDestroy$ = new Subject();\r\n private _breadcrumbs$: BehaviorSubject = new BehaviorSubject([]);\r\n public get value$(): Observable {\r\n return this._breadcrumbs$.asObservable();\r\n }\r\n constructor(\r\n private readonly _router: Router,\r\n private _activatedRoute: ActivatedRoute,\r\n private _urlSerializer: UrlSerializer,\r\n private _logger: Logger,\r\n ) {\r\n _router.events.pipe(takeUntil(this._onDestroy$)).subscribe((event) => {\r\n if (event instanceof NavigationEnd) {\r\n const crumbs: Breadcrumb[] = [];\r\n let route: ActivatedRouteSnapshot | null = this._activatedRoute.snapshot;\r\n while (route != null) {\r\n const segCrumbs: Breadcrumb[] = [];\r\n const segCfgsData: BreadcrumbRouteConfig[] | null | BreadcrumbRouteConfig =\r\n route.routeConfig != null && route.routeConfig.data != null\r\n ? route.routeConfig.data.breadcrumbs\r\n : null;\r\n\r\n if (segCfgsData != null) {\r\n const segConfigsArr: BreadcrumbRouteConfig[] =\r\n segCfgsData instanceof Array ? segCfgsData : [segCfgsData];\r\n const segCfgs = segConfigsArr.slice().reverse();\r\n for (let index = 0; index < segCfgs.length; index++) {\r\n const cfg = segCfgs[index];\r\n let name: string | undefined;\r\n let linkBehavior: LinkBehavior = 'match';\r\n if (typeof cfg === 'string') {\r\n name = cfg;\r\n } else if (typeof cfg === 'object' && 'resolver' in cfg) {\r\n const resolverData = route.data[cfg.resolver];\r\n if (resolverData != null) {\r\n if ('key' in cfg && cfg.key != null) {\r\n name = resolverData[cfg.key];\r\n } else if ('nameSelector' in cfg && cfg.nameSelector != null) {\r\n name = cfg.nameSelector(resolverData);\r\n }\r\n name = name != null ? name : resolverData.name;\r\n } else {\r\n this._logger.warning(\r\n `Breadcrumb was configured to get data from resolver named ${cfg.resolver}, but no resolved data was found.`,\r\n );\r\n }\r\n linkBehavior = getOrElse(cfg.link, linkBehavior);\r\n } else {\r\n name = cfg.name;\r\n linkBehavior = getOrElse(cfg.link, linkBehavior);\r\n }\r\n if (name != null) {\r\n const segMatchIndex = route.url.length - index;\r\n if (segMatchIndex > 0 || route.url.length === 0) {\r\n const segs = route.url.slice(0, segMatchIndex);\r\n const segsFromRoot = route.pathFromRoot\r\n .slice(0, route.pathFromRoot.length - 1)\r\n .flatMap((r) => r.url.map((u) => u.path))\r\n .concat(segs.map((s) => s.path));\r\n const url = '/' + segsFromRoot.join('/');\r\n const crumb = linkBehavior !== 'none' ? { name, url } : { name };\r\n segCrumbs.push(crumb);\r\n }\r\n }\r\n }\r\n crumbs.push(...segCrumbs.slice().reverse());\r\n }\r\n route = route.firstChild;\r\n }\r\n this._breadcrumbs$.next(crumbs);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._onDestroy$.next(null);\r\n this._onDestroy$.complete();\r\n }\r\n}\r\n"], "mappings": "uHAgCM,SAAUA,KAAeC,EAAyC,CACtE,OAAOA,CACT,CAKA,IAAaC,GAAiB,IAAA,CAAxB,MAAOA,CAAiB,CAG5B,IAAWC,QAAM,CACf,OAAO,KAAKC,cAAcC,aAAY,CACxC,CACAC,YACmBC,EACTC,EACAC,EACAC,EAAe,CAHN,KAAAH,QAAAA,EACT,KAAAC,gBAAAA,EACA,KAAAC,eAAAA,EACA,KAAAC,QAAAA,EATF,KAAAC,YAAc,IAAIC,EAClB,KAAAR,cAA+C,IAAIS,EAA8B,CAAA,CAAE,EAUzFN,EAAQO,OAAOC,KAAKC,EAAU,KAAKL,WAAW,CAAC,EAAEM,UAAWC,GAAS,CACnE,GAAIA,aAAiBC,EAAe,CAClC,IAAMC,EAAuB,CAAA,EACzBC,EAAuC,KAAKb,gBAAgBc,SAChE,KAAOD,GAAS,MAAM,CACpB,IAAME,EAA0B,CAAA,EAC1BC,EACJH,EAAMI,aAAe,MAAQJ,EAAMI,YAAYC,MAAQ,KACnDL,EAAMI,YAAYC,KAAK1B,YACvB,KAEN,GAAIwB,GAAe,KAAM,CAGvB,IAAMG,GADJH,aAAuBI,MAAQJ,EAAc,CAACA,CAAW,GAC7BK,MAAK,EAAGC,QAAO,EAC7C,QAASC,EAAQ,EAAGA,EAAQJ,EAAQK,OAAQD,IAAS,CACnD,IAAME,EAAMN,EAAQI,CAAK,EACrBG,EACAC,EAA6B,QACjC,GAAI,OAAOF,GAAQ,SACjBC,EAAOD,UACE,OAAOA,GAAQ,UAAY,aAAcA,EAAK,CACvD,IAAMG,EAAef,EAAMK,KAAKO,EAAII,QAAQ,EACxCD,GAAgB,MACd,QAASH,GAAOA,EAAIK,KAAO,KAC7BJ,EAAOE,EAAaH,EAAIK,GAAG,EAClB,iBAAkBL,GAAOA,EAAIM,cAAgB,OACtDL,EAAOD,EAAIM,aAAaH,CAAY,GAEtCF,EAAOA,GAAsBE,EAAaF,MAE1C,KAAKxB,QAAQ8B,QACX,6DAA6DP,EAAII,QAAQ,mCAAmC,EAGhHF,EAAeM,EAAUR,EAAIS,KAAMP,CAAY,OAE/CD,EAAOD,EAAIC,KACXC,EAAeM,EAAUR,EAAIS,KAAMP,CAAY,EAEjD,GAAID,GAAQ,KAAM,CAChB,IAAMS,EAAgBtB,EAAMuB,IAAIZ,OAASD,EACzC,GAAIY,EAAgB,GAAKtB,EAAMuB,IAAIZ,SAAW,EAAG,CAC/C,IAAMa,EAAOxB,EAAMuB,IAAIf,MAAM,EAAGc,CAAa,EAKvCC,EAAM,IAJSvB,EAAMyB,aACxBjB,MAAM,EAAGR,EAAMyB,aAAad,OAAS,CAAC,EACtCe,QAASC,GAAMA,EAAEJ,IAAIK,IAAKC,GAAMA,EAAEC,IAAI,CAAC,EACvCC,OAAOP,EAAKI,IAAKI,GAAMA,EAAEF,IAAI,CAAC,EACFG,KAAK,GAAG,EACjCC,EAAQpB,IAAiB,OAAS,CAAED,KAAAA,EAAMU,IAAAA,CAAG,EAAK,CAAEV,KAAAA,CAAI,EAC9DX,EAAUiC,KAAKD,CAAK,IAI1BnC,EAAOoC,KAAK,GAAGjC,EAAUM,MAAK,EAAGC,QAAO,CAAE,EAE5CT,EAAQA,EAAMoC,WAEhB,KAAKrD,cAAcsD,KAAKtC,CAAM,EAElC,CAAC,CACH,CAEOuC,aAAW,CAChB,KAAKhD,YAAY+C,KAAK,IAAI,EAC1B,KAAK/C,YAAYiD,SAAQ,CAC3B,iDA9EW1D,GAAiB2D,EAAAC,CAAA,EAAAD,EAAAE,CAAA,EAAAF,EAAAG,CAAA,EAAAH,EAAAI,CAAA,CAAA,CAAA,CAAA,iCAAjB/D,EAAiBgE,QAAjBhE,EAAiBiE,UAAAC,WAFhB,MAAM,CAAA,CAAA,SAEPlE,CAAiB,GAAA", "names": ["breadcrumbs", "breadcrumbConfig", "BreadcrumbService", "value$", "_breadcrumbs$", "asObservable", "constructor", "_router", "_activatedRoute", "_urlSerializer", "_logger", "_onDestroy$", "Subject", "BehaviorSubject", "events", "pipe", "takeUntil", "subscribe", "event", "NavigationEnd", "crumbs", "route", "snapshot", "segCrumbs", "segCfgsData", "routeConfig", "data", "segCfgs", "Array", "slice", "reverse", "index", "length", "cfg", "name", "linkBehavior", "resolverData", "resolver", "key", "nameSelector", "warning", "getOrElse", "link", "segMatchIndex", "url", "segs", "pathFromRoot", "flatMap", "r", "map", "u", "path", "concat", "s", "join", "crumb", "push", "firstChild", "next", "ngOnDestroy", "complete", "\u0275\u0275inject", "Router", "ActivatedRoute", "UrlSerializer", "Logger", "factory", "\u0275fac", "providedIn"] }