diff --git a/projects/components/src/paginator/paginator.component.ts b/projects/components/src/paginator/paginator.component.ts index 67a346e89..b3d5dc214 100644 --- a/projects/components/src/paginator/paginator.component.ts +++ b/projects/components/src/paginator/paginator.component.ts @@ -9,7 +9,7 @@ import { } from '@angular/core'; import { IconType } from '@hypertrace/assets-library'; import { TypedSimpleChanges } from '@hypertrace/common'; -import { Observable } from 'rxjs'; +import { merge, Observable, Subject } from 'rxjs'; import { ButtonSize, ButtonStyle } from '../button/button'; import { PageEvent } from './page.event'; import { PaginationProvider } from './paginator-api'; @@ -90,10 +90,13 @@ export class PaginatorComponent implements OnChanges, PaginationProvider { } private _totalItems: number = 0; + private readonly pageSizeInputSubject: Subject = new Subject(); + @Output() public readonly pageChange: EventEmitter = new EventEmitter(); - public readonly pageEvent$: Observable = this.pageChange.asObservable(); + // Caused either by a change in the provided page, or user change being emitted + public readonly pageEvent$: Observable = merge(this.pageChange, this.pageSizeInputSubject); public constructor(private readonly changeDetectorRef: ChangeDetectorRef) {} @@ -101,6 +104,12 @@ export class PaginatorComponent implements OnChanges, PaginationProvider { if (changes.totalItems) { this.gotoFirstPage(); } + if (changes.pageIndex || changes.pageSize) { + this.pageSizeInputSubject.next({ + pageSize: this.pageSize, + pageIndex: this.pageIndex + }); + } } public onPageSizeChange(pageSize: number): void { diff --git a/projects/components/src/table/table.component.ts b/projects/components/src/table/table.component.ts index 9e68330a4..4a634b42d 100644 --- a/projects/components/src/table/table.component.ts +++ b/projects/components/src/table/table.component.ts @@ -24,7 +24,7 @@ import { TypedSimpleChanges } from '@hypertrace/common'; import { without } from 'lodash-es'; -import { BehaviorSubject, combineLatest, Observable } from 'rxjs'; +import { BehaviorSubject, combineLatest, merge, Observable, Subject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import { FilterAttribute } from '../filtering/filter/filter-attribute'; import { PageEvent } from '../paginator/page.event'; @@ -172,7 +172,7 @@ import { TableColumnConfigExtended, TableService } from './table.service'; [style.position]="this.isTableFullPage ? 'fixed' : 'sticky'" > | undefined> = this.activatedRoute.queryParamMap.pipe( - map(params => this.getPagination(params)) - ); + // For pushing changes to the page explicitly + private readonly pageSubject: Subject> = new Subject(); + // When route, sort or filters change, reset pagination + public readonly paginationReset$: Observable> = combineLatest([ + this.activatedRoute.queryParamMap, + this.columnState$, + this.filters$ + ]).pipe(map(([params]) => this.calculateDefaultPagination(params))); + public readonly currentPage$: Observable> = merge(this.pageSubject, this.paginationReset$); public dataSource?: TableCdkDataSource; public isTableFullPage: boolean = false; @@ -704,6 +710,7 @@ export class TableComponent } public onPageChange(pageEvent: PageEvent): void { + this.pageSubject.next(pageEvent); if (this.syncWithUrl) { this.navigationService.addQueryParametersToUrl({ [TableComponent.PAGE_INDEX_URL_PARAM]: pageEvent.pageIndex, @@ -719,7 +726,7 @@ export class TableComponent this.pageChange.emit(pageEvent); } - private getPagination(params: ParamMap): Partial { + private calculateDefaultPagination(params: ParamMap): Partial { return this.syncWithUrl ? { pageSize: new NumberCoercer({ defaultValue: this.pageSize }).coerce(