{"version":3,"file":"odata-data-source.mjs","sources":["../../../projects/odata-data-source/src/lib/odata-data-source.ts","../../../projects/odata-data-source/src/public_api.ts","../../../projects/odata-data-source/src/odata-data-source.ts"],"sourcesContent":["import { DataSource } from '@angular/cdk/table';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { EventEmitter } from '@angular/core';\r\nimport { Observable, of as observableOf, merge, BehaviorSubject, ObservableInput, Subscription } from 'rxjs';\r\nimport { switchMap, tap, map, catchError } from 'rxjs/operators';\r\nimport buildQuery from 'odata-query';\r\nimport { ODataFilter } from './odata-filter';\r\n\r\ntype SingleSort = {\r\n  active: string,\r\n  direction: 'asc' | 'desc' | '',\r\n  sortChange: EventEmitter<any>\r\n};\r\n\r\ntype MultiSort = {\r\n  sortedBy: { id: string, direction: 'asc' | 'desc' }[],\r\n  multiSortChange: EventEmitter<any>\r\n};\r\n\r\ntype Paginator = {\r\n  pageIndex: number,\r\n  pageSize: number,\r\n  length: number,\r\n  page: EventEmitter<any>\r\n}\r\n\r\nexport class ODataDataSource extends DataSource<any> {\r\n\r\n  sort: SingleSort | MultiSort;\r\n  paginator: Paginator;\r\n  selectedFields: string[];\r\n  initialSort: string[];\r\n  expandedFields: string[] | object;\r\n\r\n  protected readonly filtersSubject = new BehaviorSubject<ODataFilter[]>(null);\r\n\r\n  protected subscription: Subscription;\r\n  protected readonly dataSubject: BehaviorSubject<any[]> = new BehaviorSubject<any[]>(null);\r\n  protected readonly loadingSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n  protected readonly errorSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);\r\n\r\n  constructor(\r\n    private readonly httpClient: HttpClient,\r\n    private readonly resourcePath: string) {\r\n      super();      \r\n  }\r\n\r\n  private createObservablePipe(): Observable<any[]> {\r\n    const observable = this.getObservable();\r\n\r\n    return observable.pipe(\r\n      switchMap(() => {\r\n        this.loadingSubject.next(true);\r\n\r\n        let page = 0;\r\n        if (this.paginator) {\r\n          page = this.paginator.pageIndex;\r\n        }\r\n\r\n        let sortedBy: { id: string, direction: 'asc' | 'desc' }[] = [];\r\n\r\n        if (this.sort) {\r\n          if (('multiSortChange' in this.sort)) {\r\n            sortedBy = this.sort.sortedBy;\r\n          }\r\n          else if ('direction' in this.sort && this.sort.active && this.sort.direction) {\r\n            sortedBy.push({ id: this.sort.active, direction: this.sort.direction });\r\n          }\r\n        }        \r\n\r\n        const result = this.getData(page, sortedBy, this.filtersSubject.value);\r\n        \r\n        return result.pipe(\r\n          tap(() => {\r\n            if (this.errorSubject.value != null) {\r\n              this.errorSubject.next(null);\r\n            }\r\n          }),\r\n          catchError(error => {\r\n          this.errorSubject.next(error);\r\n          return observableOf({ data: [] }, );\r\n        }));\r\n      }),\r\n      tap(result => {        \r\n        if (this.paginator) {\r\n          this.paginator.length = result['@odata.count'];\r\n        }\r\n        this.loadingSubject.next(false);\r\n      }),\r\n      map(this.mapResult)\r\n    );\r\n  }  \r\n  \r\n  private getObservable() {\r\n    const toObserve = [this.filtersSubject] as Array<ObservableInput<any>>;\r\n\r\n    if (this.paginator) {\r\n      toObserve.push(this.paginator.page);\r\n    }\r\n    if (this.sort) {\r\n      if (('multiSortChange' in this.sort)) {\r\n        toObserve.push(this.sort.multiSortChange);\r\n      } else if ('sortChange' in this.sort) {\r\n        toObserve.push(this.sort.sortChange);\r\n      }     \r\n    }\r\n\r\n    return merge(...toObserve);\r\n  }\r\n\r\n  connect(): Observable<any[]> {\r\n    if (!this.subscription || this.subscription.closed) {\r\n      this.subscription = this.createObservablePipe().subscribe(result => this.dataSubject.next(result));\r\n    }\r\n\r\n    return this.dataSubject.asObservable();    \r\n  }\r\n\r\n  disconnect(): void {\r\n    if (this.subscription && this.dataSubject.observers.length === 0) {\r\n      this.subscription.unsubscribe();\r\n    }\r\n  }\r\n\r\n  get data() {\r\n    return this.dataSubject.value;\r\n  }\r\n  set data(data) {\r\n    this.dataSubject.next(data);\r\n  }\r\n\r\n  get loading() {\r\n    return this.loadingSubject.asObservable();\r\n  }\r\n\r\n  get errors() {\r\n    return this.errorSubject.asObservable();\r\n  }\r\n\r\n  get filters() { return this.filtersSubject.value; }\r\n  set filters(filters: ODataFilter[]) { this.filtersSubject.next(filters); }\r\n\r\n  refresh() {\r\n    this.filtersSubject.next(this.filtersSubject.value);\r\n  }\r\n\r\n  protected getData(page: number, sortedBy: { id: string, direction: 'asc' | 'desc' }[], filters: ODataFilter[]): Observable<object> {\r\n    let url = this.resourcePath;\r\n    const query = {} as any;\r\n\r\n    if (this.paginator) {\r\n      const perPage = this.paginator.pageSize;\r\n      query.top = perPage;\r\n      query.skip = perPage * page;\r\n      query.count = true;\r\n    }\r\n\r\n    if (this.selectedFields) {\r\n      query.select = this.selectedFields;\r\n    }\r\n\r\n    if (sortedBy?.length) {\r\n      query.orderBy = sortedBy.map(s => `${s.id} ${s.direction}`);\r\n    } else if (this.initialSort && this.initialSort.length) {\r\n      query.orderBy = this.initialSort;\r\n    }\r\n\r\n    if (filters) {\r\n      const filterQuery = { and: [] };\r\n      filters.forEach(filter => {\r\n        filterQuery.and.push(filter.getFilter());\r\n      });\r\n\r\n      query.filter = filterQuery;\r\n    }\r\n\r\n    if (this.expandedFields) {\r\n      query.expand = this.expandedFields;\r\n    }\r\n\r\n    url = url + buildQuery(query);\r\n      \r\n    return this.httpClient.get(url) as Observable<object>;\r\n  }\r\n\r\n  mapResult(result): any[] {\r\n    return result.value;\r\n  }  \r\n}\r\n","/*\r\n * Public API Surface of odata-data-source\r\n */\r\n\r\nexport * from './lib/odata-data-source';\r\nexport * from './lib/odata-filter';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["observableOf"],"mappings":"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"}