{"version":3,"file":"spinque-angular-ui-result-base.mjs","sources":["../../../projects/spinque-angular-ui/result-base/src/result-base.component.ts","../../../projects/spinque-angular-ui/result-base/spinque-angular-ui-result-base.ts"],"sourcesContent":["import { booleanAttribute, Directive, inject, input, OnChanges, output, signal, SimpleChanges } from '@angular/core';\nimport { SpinqueApiService } from '@spinque/angular-ui';\nimport { Query, ResultItem, ResultsResponse, TupleTypes } from '@spinque/query-api';\nimport { Observable, of, throwError } from 'rxjs';\nimport { catchError, map, switchMap, tap } from 'rxjs/operators';\n\n/**\n * Base functionality for components that want to display a custom result view.\n * This class implements OnChanges, so it is important to call super.ngOnChanges when implementing OnChanges yourself as well.\n */\n@Directive()\nexport class SpinqueResultBase<EndpointOutputType extends TupleTypes[], MappedItemType> implements OnChanges {\n  public api = inject(SpinqueApiService);\n\n  // Status variables\n  allLoaded = signal(false);\n  isLoading = signal(false);\n  error = signal<any>(undefined);\n\n  // Array containing all result items\n  items = signal<MappedItemType[]>([]);\n\n  offset = 0;\n\n  afterLoad = function(data: any) {};\n\n  /**\n   * How many items should be displayed\n   */\n  count = input(40);\n\n  /**\n   * The SpinqueQuery for which the results should be displayed\n   */\n  queryStack = input.required<Query[]>();\n\n  /**\n   * A mapping that is to be applied to the SpinqueResultItems in order to get a custom format\n   */\n  itemMapping = input<(item: ResultItem<EndpointOutputType>) => MappedItemType>(item => item as MappedItemType);\n\n  useEntityViews = input(false, { transform: booleanAttribute });\n\n  loaded = output<{ count: number }>();\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes['queryStack'] && changes['queryStack'].currentValue && this.queryStack()) {\n      this.items.set([]);\n      this.getResults(this.queryStack()).subscribe((data: any) => {\n        this.items.set(data.items);\n        this.loaded.emit({ count: this.items.length });\n      }, (error: any) => {\n        console.error(error);\n      });\n    }\n  }\n\n  getResults(queries: Query[], offset = 0): Observable<{ response: ResultsResponse; items: MappedItemType[] }> {\n    this.isLoading.set(true);\n    this.error.set(undefined);\n    const options = {\n      count: this.count(),\n      offset,\n    };\n\n    const results$ = this.useEntityViews() ? this.api.getResultPage<EndpointOutputType>(queries, options) : this.api.getResults<EndpointOutputType>(queries, options);\n\n    return results$.pipe(\n      switchMap(res => {\n        if (!('count' in res)) {\n          return throwError(res);\n        } else {\n          return of(res);\n        }\n      }),\n      map((response) => ({ response, items: response.items.map((item) => this.itemMapping()(item)) })),\n      tap((data) => {\n        this.isLoading.set(false);\n        this.allLoaded.set(data.items.length < this.count());\n        this.afterLoad(data);\n      }),\n      catchError((error) => {\n        this.isLoading.set(false);\n        this.error.set(error.error || error);\n        return throwError(error);\n      })\n    );\n  }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}