{ "version": 3, "sources": ["src/app/services/facetten/facetten.service.ts", "src/app/services/facetten/facetten.url.service.ts", "src/app/services/facetten/combined-facetten.services.ts"], "sourcesContent": ["import { FilterSelectItem } from '@infosysbub/ng-lib-dpl3';\nimport { Observable, combineLatest } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { Aggregations, FacetteOption } from '../../model/aggregations';\nimport { SprachfoerderTerminService } from '../ergebnisseite/sprachfoerder-termin.service';\nimport { FacettenOptionInfo } from './facetten-option-info';\nimport { FacettenUrlService } from './facetten.url.service';\n\n/**\n * Basis-Klasse für alle Services, die aus der Aggregation (nur mit ID, ohne Label) und den URL-Parametern\n * eine Liste an FilterSelectItems für die Checkbox-Liste in der Facette zusammenbauen.\n */\nexport abstract class FacettenService {\n protected constructor(\n private terminService: SprachfoerderTerminService,\n private facettenUrlService: FacettenUrlService,\n protected aggregationName: keyof Omit,\n protected orderedOptions: FacettenOptionInfo[]\n ) {}\n\n // Facetten-Optionen aus dem Backend\n private _facetteOptions$: Observable = this.terminService.facettes$.pipe(\n map((aggregations) => aggregations[this.aggregationName])\n );\n\n // Facetten-Optionen kombiniert aus Backend und URL mit korrektem select-Status\n private _selectItems$: Observable = combineLatest([\n this._facetteOptions$,\n this.facettenUrlService.getSelectedOptionIds$()\n ]).pipe(\n map(([facetteOptions, ids]) => {\n return this.orderedOptions.map(({ id, bezeichnung }) => {\n const anzahl = facetteOptions.find((option) => option.id === id)?.anzahl ?? 0;\n const isSelected = ids.includes(id);\n return {\n key: id,\n ariaLabel: bezeichnung,\n treffer: anzahl,\n label: bezeichnung,\n selected: isSelected,\n active: anzahl > 0\n };\n });\n })\n );\n\n private _hasItems: Observable = this._selectItems$.pipe(\n map((items) => {\n const anzahlOptionen = items?.reduce((acc, { treffer }) => acc + treffer, 0);\n return anzahlOptionen > 0;\n })\n );\n\n /**\n * true gdw. die Summe der Treffer der selektierten Filter größer Null\n */\n public getHasItems$(): Observable {\n return this._hasItems;\n }\n\n /**\n * Anzahl der ausgewählten, aktiven Optionen\n */\n private _numberSelected$: Observable = this.getSelectItems$().pipe(\n map((items) => items.filter(({ selected, active }) => selected && active).length)\n );\n\n public getFacetteOptions$(): Observable {\n return this._facetteOptions$;\n }\n\n public getSelectItems$(): Observable {\n return this._selectItems$;\n }\n\n public getNumberSelected$(): Observable {\n return this._numberSelected$;\n }\n\n public getOrderedOptions(): FacettenOptionInfo[] {\n return [...this.orderedOptions];\n }\n}\n", "import { Directive, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { createValidUrlParameter } from '../../shared/utils';\nimport { UrlService } from '../url.service';\n\n/**\n * Basis-Klasse für alle Services, die die ausgewählten Optionen einer Facette in der URL hinterlegen.\n */\n// Directive-Annotation als Workaround, um den NGC zu besänftigen.\n// Dieser erlaubt nämlich ngOnDestroy nur in Angular-Klasse.\n@Directive()\nexport abstract class FacettenUrlService implements OnDestroy {\n private subscription: Subscription;\n\n protected constructor(\n protected urlService: UrlService,\n public urlParam: string,\n public backendParam: string\n ) {\n this.subscription = this.urlService.getQueryParameterValues(urlParam).subscribe((value) => {\n this.selectedOptions$.next(value);\n });\n }\n\n ngOnDestroy(): void {\n this.subscription.unsubscribe();\n }\n\n protected selectedOptions$: BehaviorSubject = new BehaviorSubject([]);\n\n /**\n * Ids der ausgewählten Optionen der Facette\n */\n public getSelectedOptionIds$(): Observable {\n return this.selectedOptions$;\n }\n\n /**\n * Ids der ausgewählten Optionen der Facette angepasst aufs Backend\n */\n public getBackendIds$(): Observable {\n return this.getSelectedOptionIds$();\n }\n\n /**\n * Überschreibt die selektierten Optionen der Facette\n */\n public async updateSelection(facetteOptionIds: string[]): Promise {\n await this.urlService.updateView({\n [this.urlParam]: createValidUrlParameter(facetteOptionIds),\n [UrlService.AKTUELLE_SEITE]: 0\n });\n }\n\n /**\n * Wechselt den Zustand einer Optionen von selektierten auf nicht-selektierten und umgekehrt.\n *\n * @param facetteOptionId ID der Facetten-Option\n * @param wasSelected Ehemaliger Status der Selektion vor dem auslösenden Event\n */\n public async toggleOptionSelection(facetteOptionId: string, wasSelected: boolean): Promise {\n let parameter;\n if (wasSelected) {\n parameter = this.selectedOptions$.value.filter((s) => s !== facetteOptionId);\n } else {\n parameter = this.selectedOptions$.value.concat(facetteOptionId);\n }\n await this.updateSelection(parameter);\n }\n\n /**\n * Setzt alle die gesamte Auswahl für diese Facette zurück.\n */\n public async resetOptionSelections(): Promise {\n await this.updateSelection([]);\n }\n\n /**\n * Flag, das anzeigt, dass mindestens eine Option ausgewählt wurde, welche man zurücksetzen kann.\n */\n public showReset$: Observable = this.getSelectedOptionIds$().pipe(\n map((items) => items.length > 0)\n );\n}\n", "import { Inject, Injectable } from '@angular/core';\nimport { combineLatest, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { UrlService } from '../url.service';\nimport { FacettenOptionInfo } from './facetten-option-info';\nimport { FacettenService } from './facetten.service';\nimport { FacettenUrlService } from './facetten.url.service';\n\n/*\n * Facetten-übergreifende (Hilfs-)Funktionen\n */\n\n/**\n * kombinierte / aggregierte Hilfsfunktionen über mehrere Facetten und deren URL-Parametern\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CombinedFacettenUrlService {\n constructor(\n private urlService: UrlService,\n @Inject(FacettenUrlService) private facettenUrlServices: FacettenUrlService[]\n ) {}\n\n public combinedFacetteParameters$: Observable<{ param: string; ids: string[] }[]> = combineLatest(\n this.facettenUrlServices.map((service) =>\n service.getBackendIds$().pipe(\n map((ids) => ({\n param: service.backendParam,\n ids\n }))\n )\n )\n );\n\n public async resetOptionSelections() {\n const params = { [UrlService.AKTUELLE_SEITE]: 0 };\n this.facettenUrlServices.forEach((service) => (params[service.urlParam] = null));\n await this.urlService.updateView(params);\n }\n}\n\n/**\n * Zählt die Gesamtheit aller selektierten Optionen\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FacettenSelectionCountService {\n constructor(@Inject(FacettenService) private facettenServices: FacettenService[]) {}\n public selectedFacetteCount$: Observable = combineLatest(\n this.facettenServices.map((service) => service.getNumberSelected$())\n ).pipe(map((numberSelected) => numberSelected.reduce((acc, val) => acc + val, 0)));\n}\n\n/**\n * Bietet übergreifend über alle Facetten Zugriff auf alle FacettenOptionen\n * sowie (dann) Zugriff auf einzelne Facettenoption\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class FacettenOptionsService {\n constructor(@Inject(FacettenService) private facettenServices: FacettenService[]) {}\n\n public get allOptions(): FacettenOptionInfo[] {\n return (\n this.facettenServices\n // Der AnbieterService gibt sich als FacettenService aus,\n // hat aber nicht alle Methoden implementiert, daher wird er hier herausgefiltert.\n .filter((service) => service.getOrderedOptions != undefined)\n .reduce((acc, service) => acc.concat(service.getOrderedOptions() ?? []), [])\n );\n }\n\n public getFacettenOptionInfo(id: string) {\n return this.allOptions.find((info) => id === info.id);\n }\n}\n"], "mappings": "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", "names": ["FacettenService", "constructor", "terminService", "facettenUrlService", "aggregationName", "orderedOptions", "_facetteOptions$", "facettes$", "pipe", "map", "aggregations", "_selectItems$", "combineLatest", "getSelectedOptionIds$", "facetteOptions", "ids", "id", "bezeichnung", "anzahl", "find", "option", "isSelected", "includes", "key", "ariaLabel", "treffer", "label", "selected", "active", "_hasItems", "items", "reduce", "acc", "_numberSelected$", "getSelectItems$", "filter", "length", "getHasItems$", "getFacetteOptions$", "getNumberSelected$", "getOrderedOptions", "FacettenUrlService", "constructor", "urlService", "urlParam", "backendParam", "selectedOptions$", "BehaviorSubject", "showReset$", "getSelectedOptionIds$", "pipe", "map", "items", "length", "subscription", "getQueryParameterValues", "subscribe", "value", "next", "ngOnDestroy", "unsubscribe", "getBackendIds$", "updateSelection", "facetteOptionIds", "__async", "updateView", "createValidUrlParameter", "UrlService", "AKTUELLE_SEITE", "toggleOptionSelection", "facetteOptionId", "wasSelected", "parameter", "filter", "s", "concat", "resetOptionSelections", "_FacettenUrlService", "CombinedFacettenUrlService", "constructor", "urlService", "facettenUrlServices", "combinedFacetteParameters$", "combineLatest", "map", "service", "getBackendIds$", "pipe", "ids", "param", "backendParam", "resetOptionSelections", "__async", "params", "UrlService", "AKTUELLE_SEITE", "forEach", "urlParam", "updateView", "\u0275\u0275inject", "FacettenUrlService", "factory", "\u0275fac", "providedIn", "_CombinedFacettenUrlService", "FacettenSelectionCountService", "facettenServices", "selectedFacetteCount$", "getNumberSelected$", "numberSelected", "reduce", "acc", "val", "FacettenService", "_FacettenSelectionCountService", "FacettenOptionsService", "allOptions", "filter", "getOrderedOptions", "undefined", "concat", "getFacettenOptionInfo", "id", "find", "info", "_FacettenOptionsService"] }