From 2d45f05b7204f9a40b2cff66ced2aed004628496 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Mon, 11 Oct 2021 13:13:27 +0300 Subject: [PATCH] add share replay --- src/lib/filtering/filter.service.ts | 4 +++- src/lib/listing/listing-component.directive.ts | 4 ++-- src/lib/listing/services/entities.service.ts | 4 ++-- src/lib/listing/services/listing.service.ts | 12 +++++++----- src/lib/listing/table/table.component.html | 14 ++++++++++++-- src/lib/listing/table/table.component.ts | 2 +- src/lib/search/search.service.ts | 3 ++- src/lib/sorting/sorting.service.ts | 3 ++- 8 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/lib/filtering/filter.service.ts b/src/lib/filtering/filter.service.ts index 64dd02d..a76d68a 100644 --- a/src/lib/filtering/filter.service.ts +++ b/src/lib/filtering/filter.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; -import { distinctUntilChanged, map, startWith, switchMap } from 'rxjs/operators'; +import { distinctUntilChanged, map, shareReplay, startWith, switchMap } from 'rxjs/operators'; import { processFilters, toFlatFilters } from './filter-utils'; import { IFilterGroup } from './models/filter-group.model'; import { INestedFilter } from './models/nested-filter.model'; @@ -19,6 +19,7 @@ export class FilterService { this.filterGroups$ = this._refresh$.pipe( startWith(''), switchMap(() => this._filterGroups$.asObservable()), + shareReplay(), ); this.showResetFilters$ = this._showResetFilters$; @@ -33,6 +34,7 @@ export class FilterService { map(toFlatFilters), map(f => !!f.find(el => el.checked)), distinctUntilChanged(), + shareReplay(), ); } diff --git a/src/lib/listing/listing-component.directive.ts b/src/lib/listing/listing-component.directive.ts index ed6b0a5..214ce35 100644 --- a/src/lib/listing/listing-component.directive.ts +++ b/src/lib/listing/listing-component.directive.ts @@ -28,7 +28,7 @@ export abstract class ListingComponent extends AutoUnsubscr abstract readonly tableHeaderLabel: string; @ViewChild('tableItemTemplate') readonly tableItemTemplate?: TemplateRef; - @ViewChild('worflowItemTemplate') readonly workflowItemTemplate?: TemplateRef; + @ViewChild('workflowItemTemplate') readonly workflowItemTemplate?: TemplateRef; private readonly _listingMode$ = new BehaviorSubject(ListingModes.table); @@ -48,7 +48,7 @@ export abstract class ListingComponent extends AutoUnsubscr private get _sortedDisplayedEntities$(): Observable { const sort = (entities: T[]) => this.sortingService.defaultSort(entities); const sortedEntities = () => this.listingService.displayed$.pipe(map(sort)); - return this.sortingService.sortingOption$.pipe(switchMap(sortedEntities)); + return this.sortingService.sortingOption$.pipe(switchMap(sortedEntities), distinctUntilChanged(), shareReplay()); } private get _noMatch$(): Observable { diff --git a/src/lib/listing/services/entities.service.ts b/src/lib/listing/services/entities.service.ts index 6a01e56..ab80a34 100644 --- a/src/lib/listing/services/entities.service.ts +++ b/src/lib/listing/services/entities.service.ts @@ -30,8 +30,8 @@ export class EntitiesService extends GenericService< @Optional() @Inject(ENTITY_PATH) protected readonly _defaultModelPath = '', ) { super(_injector, _defaultModelPath); - this.all$ = this._all$.asObservable().pipe(distinctUntilChanged(), shareReplay(1)); - this.allLength$ = this._all$.pipe(getLength, distinctUntilChanged(), shareReplay(1)); + this.all$ = this._all$.asObservable().pipe(distinctUntilChanged(), shareReplay()); + this.allLength$ = this._all$.pipe(getLength, distinctUntilChanged(), shareReplay()); this.noData$ = this._noData$; } diff --git a/src/lib/listing/services/listing.service.ts b/src/lib/listing/services/listing.service.ts index 6236426..21e87cf 100644 --- a/src/lib/listing/services/listing.service.ts +++ b/src/lib/listing/services/listing.service.ts @@ -25,15 +25,15 @@ export class ListingService { private readonly _searchService: SearchService, private readonly _entitiesService: EntitiesService, ) { - this.displayed$ = this._getDisplayed$.pipe(shareReplay(1)); - this.displayedLength$ = this.displayed$.pipe(getLength, distinctUntilChanged(), shareReplay(1)); + this.displayed$ = this._getDisplayed$.pipe(shareReplay()); + this.displayedLength$ = this.displayed$.pipe(getLength, distinctUntilChanged(), shareReplay()); - this.selected$ = this._selected$.asObservable().pipe(shareReplay(1)); + this.selected$ = this._selected$.asObservable().pipe(shareReplay()); this.selectedEntities$ = this._selected$.asObservable().pipe( map(() => this.selected), - shareReplay(1), + shareReplay(), ); - this.selectedLength$ = this._selected$.pipe(getLength, distinctUntilChanged(), shareReplay(1)); + this.selectedLength$ = this._selected$.pipe(getLength, distinctUntilChanged(), shareReplay()); this.areAllSelected$ = this._areAllSelected$; this.areSomeSelected$ = this._areSomeSelected$; @@ -59,6 +59,8 @@ export class ListingService { tap(displayed => { this._displayed = displayed; }), + distinctUntilChanged(), + shareReplay(), ); } diff --git a/src/lib/listing/table/table.component.html b/src/lib/listing/table/table.component.html index 28752cb..32f27c6 100644 --- a/src/lib/listing/table/table.component.html +++ b/src/lib/listing/table/table.component.html @@ -22,7 +22,13 @@ - +
- + diff --git a/src/lib/listing/table/table.component.ts b/src/lib/listing/table/table.component.ts index 7c111a6..7c68818 100644 --- a/src/lib/listing/table/table.component.ts +++ b/src/lib/listing/table/table.component.ts @@ -70,7 +70,7 @@ export class TableComponent implements OnInit { ngOnInit(): void { this.listingComponent.noContent$.subscribe(() => { setTimeout(() => { - this.scrollViewport.checkViewportSize(); + this.scrollViewport?.checkViewportSize(); }, 0); }); this._patchConfig(); diff --git a/src/lib/search/search.service.ts b/src/lib/search/search.service.ts index 482c582..ec37028 100644 --- a/src/lib/search/search.service.ts +++ b/src/lib/search/search.service.ts @@ -1,12 +1,13 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { IListable } from '../listing'; +import { distinctUntilChanged, shareReplay } from 'rxjs/operators'; @Injectable() export class SearchService { skip = false; private readonly _query$ = new BehaviorSubject(''); - readonly valueChanges$ = this._query$.asObservable(); + readonly valueChanges$ = this._query$.asObservable().pipe(distinctUntilChanged(), shareReplay()); get searchValue(): string { return this._query$.getValue(); diff --git a/src/lib/sorting/sorting.service.ts b/src/lib/sorting/sorting.service.ts index f9fd53f..78ff90e 100644 --- a/src/lib/sorting/sorting.service.ts +++ b/src/lib/sorting/sorting.service.ts @@ -5,6 +5,7 @@ import { SortingOption } from './models/sorting-option.model'; import { SortingOrder, SortingOrders } from './models/sorting-order.type'; import { KeysOf } from '../utils'; import { IListable } from '../listing'; +import { distinctUntilChanged, shareReplay } from 'rxjs/operators'; @Injectable() export class SortingService { @@ -12,7 +13,7 @@ export class SortingService { column: 'searchKey', order: SortingOrders.asc, }); - readonly sortingOption$ = this._sortingOption$.asObservable(); + readonly sortingOption$ = this._sortingOption$.asObservable().pipe(distinctUntilChanged(), shareReplay()); get sortingOption(): SortingOption | undefined { return this._sortingOption$.getValue();