From 66167831e6e2c0e4c945f14cd9c1b2e2fc93001e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jovan=20Kruni=C4=87?= Date: Fri, 28 May 2021 14:31:31 +0200 Subject: [PATCH] refactor: show top of the list if query changed (no setTimeout) --- .../modules/data/list/data-list.component.ts | 12 +++++- .../data/list/search-page.component.ts | 42 +++++++++---------- src/app/modules/data/list/search-page.html | 2 +- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/app/modules/data/list/data-list.component.ts b/src/app/modules/data/list/data-list.component.ts index e79a34ee..0c3582e8 100644 --- a/src/app/modules/data/list/data-list.component.ts +++ b/src/app/modules/data/list/data-list.component.ts @@ -43,10 +43,18 @@ export class DataListComponent implements OnChanges, OnInit { * Output binding to trigger pagination fetch */ @Output('loadmore') loadMore = new EventEmitter(); + /** + * Emits when scroll view should reset to top + */ + @Input() resetToTop?: Observable; /** * Indicates whether or not the list is to display SCThings of a single type */ @Input() singleType = false; + /** + * Array of all subscriptions to Observables + */ + subscriptions: Subscription[] = []; // tslint:disable-next-line: completed-docs @ViewChild(CdkVirtualScrollViewport) viewPort: CdkVirtualScrollViewport; @@ -72,8 +80,8 @@ export class DataListComponent implements OnChanges, OnInit { // tslint:disable-next-line: completed-docs ngOnInit(): void { - if (typeof this.queryChanged !== 'undefined') { - this.subscriptions.push(this.queryChanged.subscribe(() => { + if (typeof this.resetToTop !== 'undefined') { + this.subscriptions.push(this.resetToTop.subscribe(() => { this.viewPort.scrollToIndex(0); })); } diff --git a/src/app/modules/data/list/search-page.component.ts b/src/app/modules/data/list/search-page.component.ts index 823ad0e9..16586af7 100644 --- a/src/app/modules/data/list/search-page.component.ts +++ b/src/app/modules/data/list/search-page.component.ts @@ -23,8 +23,8 @@ import { SCThings, } from '@openstapps/core'; import {NGXLogger} from 'ngx-logger'; -import {Subject, Subscription} from 'rxjs'; -import {debounceTime, distinctUntilChanged} from 'rxjs/operators'; +import {combineLatest, Subject, Subscription} from 'rxjs'; +import {debounceTime, distinctUntilChanged, startWith} from 'rxjs/operators'; import {ContextMenuService} from '../../menu/context/context-menu.service'; import {SettingsProvider} from '../../settings/settings.provider'; import {DataRoutingService} from '../data-routing.service'; @@ -64,6 +64,10 @@ export class SearchPageComponent implements OnInit { * Search value from search bar */ queryText: string; + /** + * Emits when there is a change in the query (search, sort or filter changed) + */ + queryChanged = new Subject(); /** * Subject to handle search text changes */ @@ -107,26 +111,22 @@ export class SearchPageComponent implements OnInit { ) { this.initialize(); - this.subscriptions.push(this.queryTextChanged - .pipe( - debounceTime(this.searchQueryDueTime), - distinctUntilChanged()) - .subscribe((model) => { + combineLatest( + [this.queryTextChanged.pipe(debounceTime(this.searchQueryDueTime), + distinctUntilChanged(), + startWith(this.queryText), + ), + this.contextMenuService.filterQueryChanged$.pipe(startWith(this.filterQuery)), + this.contextMenuService.sortQueryChanged$.pipe(startWith(this.sortQuery)), + ]) + .subscribe(async (query) => { + this.queryText = query[0]; + this.filterQuery = query[1]; + this.sortQuery = query[2]; this.from = 0; - this.queryText = model; - this.fetchAndUpdateItems(); - })); - - this.subscriptions.push(this.contextMenuService.filterQueryChanged$.subscribe((query) => { - this.filterQuery = query; - this.from = 0; - this.fetchAndUpdateItems(); - })); - this.subscriptions.push(this.contextMenuService.sortQueryChanged$.subscribe((query) => { - this.sortQuery = query; - this.from = 0; - this.fetchAndUpdateItems(); - })); + await this.fetchAndUpdateItems(); + this.queryChanged.next(); + }); this.fetchAndUpdateItems(); diff --git a/src/app/modules/data/list/search-page.html b/src/app/modules/data/list/search-page.html index 22172e2b..6fd11d45 100644 --- a/src/app/modules/data/list/search-page.html +++ b/src/app/modules/data/list/search-page.html @@ -15,5 +15,5 @@ - +