From 92e7644dfdd474fc096d32bdd7d8fa357fa53b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Fri, 10 Dec 2021 13:44:16 +0200 Subject: [PATCH] RED-2670: Fix 2 --- .../base-screen/base-screen.component.ts | 10 ++-- .../search-screen/search-screen.component.ts | 56 ++++++++----------- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts index 90bcddc2d..1771c2bdd 100644 --- a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts +++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts @@ -68,7 +68,7 @@ export class BaseScreenComponent { { text: this._translateService.instant('search.entire-platform'), icon: 'red:enter', - action: (query): void => this._search(query), + action: (query): void => this._search(query, []), }, ]; private readonly _navigationStart$ = this._router.events.pipe( @@ -105,17 +105,17 @@ export class BaseScreenComponent { return item.name; } - private _search(query: string, dossierId?: string) { - const queryParams = { query, dossierId }; + private _search(query: string, dossierIds: string[]) { + const queryParams = { query, dossierIds: dossierIds.join(',') }; this._router.navigate(['main/dossiers/search'], { queryParams }).then(); } private _searchThisDossier(query: string) { const routerLink = this.breadcrumbsService.breadcrumbs[1]?.routerLink; if (!routerLink) { - return this._search(query); + return this._search(query, []); } const dossierId = routerLink[2]; - return this._search(query, dossierId); + return this._search(query, [dossierId]); } } diff --git a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts index 43bec627a..17ed6ba82 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts @@ -3,7 +3,6 @@ import { DefaultListingServices, IFilterGroup, keyChecker, - List, ListingComponent, LoadingService, NestedFilter, @@ -11,25 +10,18 @@ import { SortingOrders, TableColumnConfig, } from '@iqser/common-ui'; -import { merge, Observable } from 'rxjs'; -import { debounceTime, map, skip, startWith, switchMap, tap } from 'rxjs/operators'; +import { combineLatest, Observable } from 'rxjs'; +import { debounceTime, map, startWith, switchMap, tap } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { workflowFileStatusTranslations } from '../../translations/file-status-translations'; import { TranslateService } from '@ngx-translate/core'; import { RouterHistoryService } from '@services/router-history.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; -import { Dossier, IMatchedDocument, ISearchInput, ISearchListItem, ISearchResponse } from '@red/domain'; +import { Dossier, IMatchedDocument, ISearchListItem, ISearchResponse } from '@red/domain'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { PlatformSearchService } from '@services/entity-services/platform-search.service'; -function toSearchInput(query: string, dossierIds: List | string): ISearchInput { - return { - query, - dossierIds: dossierIds ? (typeof dossierIds === 'string' ? [dossierIds] : dossierIds) : [], - }; -} - @Component({ templateUrl: './search-screen.component.html', styleUrls: ['./search-screen.component.scss'], @@ -48,12 +40,10 @@ export class SearchScreenComponent extends ListingComponent imp { label: _('search-screen.cols.pages'), width: 'auto' }, ]; - readonly searchResults$ = merge(this._searchChanged$, this._filtersChanged$).pipe( - startWith(this._routeQuery), - tap(value => (this.searchService.searchValue = value.query)), + readonly searchResults$ = combineLatest([this._queryChanged, this._filtersChanged$]).pipe( tap(() => this._loadingService.start()), - tap(value => this._updateNavigation(value.query)), - switchMap(query => this._platformSearchService.search(query)), + tap(([query, dossierIds]) => this._updateNavigation(query, dossierIds)), + switchMap(([query, dossierIds]) => this._platformSearchService.search({ query, dossierIds })), map(searchResult => this._toMatchedDocuments(searchResult)), map(docs => this._toListItems(docs)), tap(result => this.entitiesService.setEntities(result)), @@ -75,9 +65,9 @@ export class SearchScreenComponent extends ListingComponent imp this.searchService.skip = true; this.sortingService.setSortingOption({ column: 'searchKey', order: SortingOrders.desc }); - const dossierId = _activatedRoute.snapshot.queryParamMap.get('dossierId'); + const dossierIds = this._routeDossierIds; const dossierToFilter = ({ dossierName, id }: Dossier) => { - const checked = id === dossierId; + const checked = dossierIds.includes(id); return new NestedFilter({ id, label: dossierName, checked }); }; const dossierNameFilter: IFilterGroup = { @@ -91,35 +81,37 @@ export class SearchScreenComponent extends ListingComponent imp this.filterService.addFilterGroups([dossierNameFilter]); } - private get _searchChanged$(): Observable { + private get _routeDossierIds(): string[] { + return this._activatedRoute.snapshot.queryParamMap.get('dossierIds').split(','); + } + + private get _routeQuery(): string { + return this._activatedRoute.snapshot.queryParamMap.get('query'); + } + + private get _queryChanged(): Observable { return this.searchService.valueChanges$.pipe( - skip(1), + startWith(this._routeQuery), + tap(query => (this.searchService.searchValue = query)), debounceTime(300), - map(value => ({ query: value, dossierIds: [] })), ); } - private get _filtersChanged$() { + private get _filtersChanged$(): Observable { return this.filterService.filterGroups$.pipe( - skip(1), map(groups => groups[0].filters.filter(v => v.checked).map(v => v.id)), - map(dossierIds => toSearchInput(this.searchService.searchValue, dossierIds)), + startWith(this._routeDossierIds), ); } - private get _routeQuery(): ISearchInput { - const query = this._activatedRoute.snapshot.queryParamMap.get('query'); - const dossierId = this._activatedRoute.snapshot.queryParamMap.get('dossierId'); - return { query, dossierIds: dossierId ? [dossierId] : [] }; - } - mustContain(value: string) { const newQuery = this.searchService.searchValue.replace(value, `"${value}"`); this.searchService.searchValue = newQuery ?? ''; } - private _updateNavigation(query: string) { - return this._router.navigate([], { queryParams: { query } }); + private _updateNavigation(query?: string, dossierIds?: string[]): Promise { + const queryParams = { query, dossierIds: dossierIds.join(',') }; + return this._router.navigate([], { queryParams, replaceUrl: true }); } private _toMatchedDocuments({ matchedDocuments }: ISearchResponse): IMatchedDocument[] {