{ "version": 3, "sources": ["src/app/services/url.service.ts", "src/app/shared/directives/scroll-to-and-focus.directive.ts", "src/app/services/navigation.service.ts", "src/app/services/merkliste/merklist.service.ts", "src/app/shared/utils/replace-all.ts", "src/app/shared/utils/break-word-at-slash.ts", "src/app/shared/utils/check-params.util.ts", "src/app/shared/utils/create-valid-url-parameter.util.ts", "src/app/shared/utils/validiere-such-umkreis.util.ts", "src/app/shared/utils/strip-html.ts"], "sourcesContent": ["import { Injectable } from '@angular/core';\nimport { ActivatedRoute, Params, Router } from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { distinctUntilChanged, map, shareReplay } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * Dieser technische Service schreibt Parameter in die URL und liest sie aus.\n * Darüber hinaus beinhaltet er Funktionalität fürs programmatische Routing.\n *\n * Vorlage: WBSUCHE\n */\nexport class UrlService {\n public static VALUE_SEPARATOR = ',';\n public static BILDUNGSZIEL = 'sprachfoerderVorschlag';\n public static SUCHWORTE = 'suchworte';\n public static ORTE = 'ort';\n public static UMKREIS = 'umkreis';\n public static UMKREIS_VALUE_BUNDESWEIT = 'Bundesweit';\n public static REGION = 'regionen'; // Bundesländer und Nachbarländer\n public static AKTUELLE_SEITE = 'seite';\n public static CURRENT_SEARCH_PAGE = 'csp';\n\n constructor(\n private router: Router,\n private activeRoute: ActivatedRoute\n ) {}\n\n public static createValidUrlParameter(paramsAsArray: Array): string | null {\n if (paramsAsArray === null || paramsAsArray === undefined) {\n return null;\n }\n return paramsAsArray.length !== 0 ? paramsAsArray.join(UrlService.VALUE_SEPARATOR) : null;\n }\n\n public getQueryParameterValue(key: string): Observable {\n return this.activeRoute.queryParamMap.pipe(\n map((params) => params.get(key)),\n distinctUntilChanged()\n );\n }\n\n public getQueryParameterValues(key: string): Observable {\n return this.getQueryParameterValue(key).pipe(\n map((values) => values?.split(UrlService.VALUE_SEPARATOR) ?? [])\n );\n }\n\n /**\n * Angular bietet die URL nur in komplexen Datentypen an.\n * Manchmal ist aber der String sinnvoll oder nötig, der hier wieder zusammengebaut wird.\n * So können z.B. URLs auf Links hinterlegt werden fürs Öffnen in einem neuen Tab.\n * @returns Url Query Parameter String, e.g. \"?sort=ta&seite=1\"\n */\n public getQueryParameterString(): Observable {\n return this.activeRoute.queryParamMap.pipe(\n map((params) => {\n return '?' + params.keys.map((key) => key + '=' + params.get(key)).join('&');\n }),\n distinctUntilChanged(),\n shareReplay()\n );\n }\n\n public getAllQueryParameterAsKeyValue() {\n return this.activeRoute.queryParamMap.pipe(distinctUntilChanged());\n }\n\n public async updateView(params?: Params): Promise {\n await this.updateUrl(params, null);\n }\n\n public async updateUrl(params: Params, path: string | null): Promise {\n await this.router.navigate(path ? [path] : [], {\n queryParams: params,\n queryParamsHandling: 'merge'\n });\n }\n\n public async updateUrlQueryParamsWithoutHistoryPush(params: Params): Promise {\n await this.router.navigate([], {\n queryParams: params,\n replaceUrl: true,\n queryParamsHandling: 'merge'\n });\n }\n}\n", "import { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n Directive,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output\n} from '@angular/core';\nimport { Observable, Subject, delay, filter, of, takeUntil, tap } from 'rxjs';\n\n@Directive({\n selector: '[baSprafScrollToAndFocus]'\n})\nexport class ScrollToAndFocusDirective implements OnDestroy, OnInit, AfterViewInit {\n @Input() shouldScroll: boolean | Observable = true;\n @Input() shouldFocus: boolean | Observable = true;\n @Input() elementToFocus?: HTMLElement;\n @Input() debounce = 0;\n @Input() threshold = 1;\n\n @Output() visible = new EventEmitter();\n\n private observer: IntersectionObserver | undefined;\n private subject$ = new Subject<{\n entry: IntersectionObserverEntry;\n observer: IntersectionObserver;\n }>();\n private ngUnsubscribe = new Subject();\n\n constructor(\n private element: ElementRef,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n ngOnInit() {\n this.createObserver();\n }\n\n ngAfterViewInit() {\n this.waitForCondition(this.shouldScroll)\n .pipe(takeUntil(this.ngUnsubscribe), delay(this.debounce))\n .subscribe(() => {\n this.scrollToElement();\n });\n this.startObservingElements();\n }\n\n ngOnDestroy() {\n if (this.observer) {\n this.observer.disconnect();\n this.observer = undefined;\n }\n\n this.subject$.next(null);\n this.subject$.complete();\n\n this.ngUnsubscribe.next();\n this.ngUnsubscribe.complete();\n }\n\n private isVisible(element: HTMLElement) {\n return new Promise((resolve) => {\n const observer = new this.document.defaultView.IntersectionObserver(([entry]) => {\n resolve(entry.intersectionRatio === 1);\n observer.disconnect();\n });\n\n observer.observe(element);\n });\n }\n\n private createObserver() {\n const options = {\n rootMargin: '0px',\n threshold: this.threshold\n };\n\n const isIntersecting = (entry: IntersectionObserverEntry) =>\n entry.isIntersecting || entry.intersectionRatio > 0;\n\n // Oberver pattern helps focusing in Firefox\n // The observer \"triggers\" as soon as the intersecting element\n // is in the viewport of the browser\n this.observer = new this.document.defaultView.IntersectionObserver((entries, observer) => {\n entries.forEach((entry) => {\n if (isIntersecting(entry)) {\n this.subject$.next({ entry, observer });\n }\n });\n }, options);\n }\n\n private startObservingElements() {\n if (!this.observer) {\n return;\n }\n\n this.observer.observe(this.element.nativeElement);\n\n this.subject$\n .pipe(takeUntil(this.ngUnsubscribe), delay(this.debounce), filter(Boolean))\n .subscribe(async ({ entry, observer }) => {\n const target = entry.target as HTMLElement;\n const isStillVisible = await this.isVisible(target);\n\n if (isStillVisible) {\n this.visible.emit(target);\n this.waitForCondition(this.shouldFocus)\n .pipe(takeUntil(this.ngUnsubscribe))\n .subscribe(() => {\n this.focusElement();\n });\n\n observer?.unobserve(target);\n }\n });\n }\n\n private waitForCondition(condition: boolean | Observable): Observable {\n if (condition === true) {\n return this.runWithFirefoxWorkaround();\n } else if (condition instanceof Observable) {\n return condition.pipe(\n tap(() => {\n return this.runWithFirefoxWorkaround();\n })\n );\n }\n return of();\n }\n\n private runWithFirefoxWorkaround(): Observable {\n if (this.isFirefox) {\n // Firefox needs a delay before it can scroll exactly to the element.\n return of(null).pipe(delay(200));\n } else {\n return of(null);\n }\n }\n\n private scrollToElement(): void {\n const distanceToPageStart =\n this.document.documentElement.scrollTop +\n this.element.nativeElement.getBoundingClientRect().y -\n this.baHeaderHeight;\n\n this.document.defaultView.scrollTo({ top: distanceToPageStart });\n }\n\n private focusElement = () => {\n if (!!this.elementToFocus) {\n this.elementToFocus.focus();\n } else {\n this.element.nativeElement.focus();\n }\n };\n\n get isFirefox(): boolean {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n }\n\n get baHeaderHeight(): number {\n const header = this.document.getElementsByTagName('bahf-header')[0];\n const shadow = header.shadowRoot;\n return shadow?.querySelector('.ba-header.ba-header-element')?.getBoundingClientRect().height;\n }\n}\n", "import { Injectable } from '@angular/core';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { Observable, ReplaySubject, Subject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NavigationService {\n // speichert immer das zuletzt angesehene Angebot für korrektes Fokus- und Scrollverhalten\n letztesAngebot$ = new ReplaySubject(1);\n\n // speichert gewählte Seite für korrektes Fokus- und Scrollverhalten, Subject wegen Nutzung in onInit\n private seiteSubject$: Subject = new Subject();\n public seitePushed$: Observable = this.seiteSubject$.asObservable();\n private previousUrl = '';\n private currentUrl = '';\n\n constructor(private router: Router) {\n this.currentUrl = this.router.url;\n router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n this.previousUrl = this.currentUrl;\n this.currentUrl = event.url;\n }\n });\n }\n\n public setLetztesAngebot(angebotsId: number) {\n this.letztesAngebot$.next(angebotsId);\n }\n\n public triggerSeite() {\n this.seiteSubject$.next();\n }\n\n public getPreviousUrl() {\n return this.previousUrl;\n }\n}\n", "import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MerklistService implements OnDestroy {\n private static readonly KEY = 'spraf_merklistitems';\n private static readonly SEPERATOR = ',';\n\n public merkListTerminIds$: BehaviorSubject = new BehaviorSubject([]);\n\n private sub: Subscription;\n\n constructor() {\n const items: string | null = window.sessionStorage.getItem(MerklistService.KEY);\n this.merkListTerminIds$.next(items?.split(MerklistService.SEPERATOR) ?? []);\n\n this.sub = this.merkListTerminIds$.subscribe(MerklistService.syncSessionStorage);\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n }\n\n public numberOfElements$ = this.merkListTerminIds$.pipe(map((ids) => ids?.length ?? 0));\n\n public addToMerklist(item: string | number): void {\n this.merkListTerminIds$.next([...this.merkListTerminIds$.value, String(item)]);\n }\n\n public removeFromMerklist(item: string | number): void {\n this.merkListTerminIds$.next(\n this.merkListTerminIds$.value.filter((val) => val != String(item))\n );\n }\n\n public clearMerkliste(): void {\n this.merkListTerminIds$.next([]);\n }\n\n private static syncSessionStorage(ids: string[]) {\n if (ids.length === 0) {\n window.sessionStorage.removeItem(MerklistService.KEY);\n } else {\n window.sessionStorage.setItem(MerklistService.KEY, ids.join(MerklistService.SEPERATOR));\n }\n }\n\n public isOnMerkliste(id: string): boolean {\n return this.merkListTerminIds$.value.findIndex((terminId) => terminId === id) >= 0;\n }\n}\n", "export function replaceAll(str: string, find: string, replace: string): string {\n return str.replace(new RegExp(find, 'g'), replace);\n}\n", "export function breakWordAtSlash(word: string): string {\n const regex = /(?)/gi;\n return word.replaceAll(regex, '/');\n}\n", "import { HttpParams } from '@angular/common/http';\n\nexport function checkParams(urlParams: HttpParams): HttpParams {\n urlParams.keys().forEach((key) => {\n const param = urlParams.get(key);\n if (!param || param === 'undefined' || param === '') {\n urlParams = urlParams.delete(key);\n }\n });\n return urlParams;\n}\n", "import { UrlService } from '../../services/url.service';\n\nexport function createValidUrlParameter(paramsAsArray: string[] | number[]): string | null {\n if (paramsAsArray === null || paramsAsArray === undefined) {\n return null;\n }\n return paramsAsArray.length !== 0 ? paramsAsArray.join(UrlService.VALUE_SEPARATOR) : null;\n}\n", "import { UrlService } from '../../services/url.service';\n\nconst MAXIMALER_SUCH_UMKREIS = 100;\nconst MINIMALER_SUCH_UMKREIS = 5;\n\nexport function validiereSuchUmkreis(umkreis: string): string {\n if (umkreis === UrlService.UMKREIS_VALUE_BUNDESWEIT || !umkreis) {\n return UrlService.UMKREIS_VALUE_BUNDESWEIT;\n } else if (umkreis && !isNaN(parseInt(umkreis, 10))) {\n return Math.max(MINIMALER_SUCH_UMKREIS, Math.min(+umkreis, MAXIMALER_SUCH_UMKREIS)).toString();\n } else {\n return '50';\n }\n}\n", "export function stripHtml(html: string): string {\n return html?.replace(/<[^>]*>/g, '');\n}\n"], "mappings": "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", "names": ["UrlService", "constructor", "router", "activeRoute", "createValidUrlParameter", "paramsAsArray", "length", "join", "VALUE_SEPARATOR", "getQueryParameterValue", "key", "queryParamMap", "pipe", "map", "params", "get", "distinctUntilChanged", "getQueryParameterValues", "values", "split", "getQueryParameterString", "keys", "shareReplay", "getAllQueryParameterAsKeyValue", "updateView", "__async", "updateUrl", "path", "navigate", "queryParams", "queryParamsHandling", "updateUrlQueryParamsWithoutHistoryPush", "replaceUrl", "_UrlService", "BILDUNGSZIEL", "SUCHWORTE", "ORTE", "UMKREIS", "UMKREIS_VALUE_BUNDESWEIT", "REGION", "AKTUELLE_SEITE", "CURRENT_SEARCH_PAGE", "\u0275\u0275inject", "Router", "ActivatedRoute", "factory", "\u0275fac", "providedIn", "ScrollToAndFocusDirective", "constructor", "element", "document", "shouldScroll", "shouldFocus", "debounce", "threshold", "visible", "EventEmitter", "subject$", "Subject", "ngUnsubscribe", "focusElement", "elementToFocus", "focus", "nativeElement", "ngOnInit", "createObserver", "ngAfterViewInit", "waitForCondition", "pipe", "takeUntil", "delay", "subscribe", "scrollToElement", "startObservingElements", "ngOnDestroy", "observer", "disconnect", "undefined", "next", "complete", "isVisible", "Promise", "resolve", "defaultView", "IntersectionObserver", "entry", "intersectionRatio", "observe", "options", "rootMargin", "isIntersecting", "entries", "forEach", "filter", "Boolean", "_0", "__async", "target", "emit", "unobserve", "condition", "runWithFirefoxWorkaround", "Observable", "tap", "of", "isFirefox", "distanceToPageStart", "documentElement", "scrollTop", "getBoundingClientRect", "y", "baHeaderHeight", "scrollTo", "top", "navigator", "userAgent", "toLowerCase", "indexOf", "getElementsByTagName", "shadowRoot", "querySelector", "height", "\u0275\u0275directiveInject", "ElementRef", "DOCUMENT", "selectors", "inputs", "outputs", "_ScrollToAndFocusDirective", "NavigationService", "constructor", "router", "letztesAngebot$", "ReplaySubject", "seiteSubject$", "Subject", "seitePushed$", "asObservable", "previousUrl", "currentUrl", "url", "events", "subscribe", "event", "NavigationEnd", "setLetztesAngebot", "angebotsId", "next", "triggerSeite", "getPreviousUrl", "\u0275\u0275inject", "Router", "factory", "\u0275fac", "providedIn", "_NavigationService", "MerklistService", "constructor", "merkListTerminIds$", "BehaviorSubject", "numberOfElements$", "pipe", "map", "ids", "length", "items", "window", "sessionStorage", "getItem", "KEY", "next", "split", "SEPERATOR", "sub", "subscribe", "syncSessionStorage", "ngOnDestroy", "unsubscribe", "addToMerklist", "item", "value", "String", "removeFromMerklist", "filter", "val", "clearMerkliste", "removeItem", "setItem", "join", "isOnMerkliste", "id", "findIndex", "terminId", "_MerklistService", "factory", "\u0275fac", "providedIn", "replaceAll", "str", "find", "replace", "RegExp", "breakWordAtSlash", "word", "regex", "replaceAll", "checkParams", "urlParams", "keys", "forEach", "key", "param", "get", "delete", "createValidUrlParameter", "paramsAsArray", "length", "join", "UrlService", "VALUE_SEPARATOR", "MAXIMALER_SUCH_UMKREIS", "MINIMALER_SUCH_UMKREIS", "validiereSuchUmkreis", "umkreis", "UrlService", "UMKREIS_VALUE_BUNDESWEIT", "isNaN", "parseInt", "Math", "max", "min", "toString", "stripHtml", "html", "replace"] }