diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts index 667b37f53..909b4d090 100644 --- a/apps/red-ui/src/app/app-routing.module.ts +++ b/apps/red-ui/src/app/app-routing.module.ts @@ -67,6 +67,16 @@ const routes: Routes = [ routeGuards: [AuthGuard, RedRoleGuard], }, }, + { + path: 'main/search', + component: BaseScreenComponent, + loadChildren: () => import('./modules/search/search.module').then(m => m.SearchModule), + canActivate: [CompositeRouteGuard], + data: { + routeGuards: [AuthGuard, RedRoleGuard, DossiersGuard], + requiredRoles: ['RED_USER', 'RED_MANAGER'], + }, + }, { path: '**', redirectTo: 'main/dossiers', 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 d16e358c5..de080c4e6 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 @@ -57,7 +57,12 @@ export class BaseScreenComponent { action: (query): void => this._searchThisDossier(query), }, { - text: this._translateService.instant('search.entire-platform'), + text: this._translateService.instant('search.active-dossiers'), + icon: 'red:enter', + action: (query): void => this._search(query, [], true), + }, + { + text: this._translateService.instant('search.all-dossiers'), icon: 'red:enter', action: (query): void => this._search(query, []), }, @@ -85,7 +90,7 @@ export class BaseScreenComponent { return true; } - const isDossierOverview = routerLink.includes('dossiers') && routerLink.length === 3; + const isDossierOverview = (routerLink.includes('dossiers') || routerLink.includes('archive')) && routerLink.length === 3; return !isDossierOverview; } @@ -93,9 +98,9 @@ export class BaseScreenComponent { return item.name; } - private _search(query: string, dossierIds: string[]) { - const queryParams = { query, dossierIds: dossierIds.join(',') }; - this._router.navigate(['main/dossiers/search'], { queryParams }).then(); + private _search(query: string, dossierIds: string[], onlyActive = false) { + const queryParams = { query, dossierIds: dossierIds.join(','), onlyActive }; + this._router.navigate(['main/search'], { queryParams }).then(); } private _searchThisDossier(query: string) { diff --git a/apps/red-ui/src/app/guards/dossiers.guard.ts b/apps/red-ui/src/app/guards/dossiers.guard.ts index e870a7b04..84cb937a1 100644 --- a/apps/red-ui/src/app/guards/dossiers.guard.ts +++ b/apps/red-ui/src/app/guards/dossiers.guard.ts @@ -1,16 +1,29 @@ import { Injectable, Injector, ProviderToken } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate } from '@angular/router'; -import { firstValueFrom } from 'rxjs'; +import { firstValueFrom, forkJoin } from 'rxjs'; import { DossiersService } from '@services/entity-services/dossiers.service'; +import { ActiveDossiersService } from '@services/entity-services/active-dossiers.service'; +import { ArchivedDossiersService } from '@services/entity-services/archived-dossiers.service'; +import { take } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class DossiersGuard implements CanActivate { - constructor(private readonly _injector: Injector) {} + constructor( + private readonly _injector: Injector, + private readonly _activeDossiersService: ActiveDossiersService, + private readonly _archivedDossiersService: ArchivedDossiersService, + ) {} async canActivate(route: ActivatedRouteSnapshot): Promise { const token: ProviderToken = route.data.dossiersService; - const dossiersService: DossiersService = this._injector.get(token); - await firstValueFrom(dossiersService.loadAll()); + if (token) { + const dossiersService: DossiersService = this._injector.get(token); + await firstValueFrom(dossiersService.loadAll()); + } else { + const services = [this._archivedDossiersService, this._activeDossiersService]; + const loading$ = forkJoin(services.map(service => service.loadAll().pipe(take(1)))); + await firstValueFrom(loading$); + } return true; } } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts index 14c3693b9..47ccbb79a 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/deleted-documents/edit-dossier-deleted-documents.component.ts @@ -22,7 +22,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators'; import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; import { FilesService } from '@services/entity-services/files.service'; import { FileManagementService } from '@services/entity-services/file-management.service'; -import { workflowFileStatusTranslations } from '../../../translations/file-status-translations'; +import { workflowFileStatusTranslations } from '../../../../../translations/file-status-translations'; import { PermissionsService } from '@services/permissions.service'; import { UserService } from '@services/user.service'; diff --git a/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts index 74723fcf3..5615e188d 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers-routing.module.ts @@ -1,6 +1,5 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { SearchScreenComponent } from './screens/search-screen/search-screen.component'; import { FilePreviewGuard } from '@guards/file-preview.guard'; import { DossierFilesGuard } from '@guards/dossier-files-guard'; import { CompositeRouteGuard } from '@iqser/common-ui'; @@ -9,10 +8,6 @@ import { DOSSIER_ID, FILE_ID } from '@utils/constants'; import { ACTIVE_DOSSIERS_SERVICE } from '../../tokens'; const routes: Routes = [ - { - path: 'search', - component: SearchScreenComponent, - }, { path: `:${DOSSIER_ID}`, canActivate: [CompositeRouteGuard], diff --git a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts index d28eed19e..94222f209 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -8,15 +8,12 @@ import { DossiersRoutingModule } from './dossiers-routing.module'; import { FileUploadDownloadModule } from '@upload-download/file-upload-download.module'; import { ChangeLegalBasisDialogComponent } from './dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component'; import { RecategorizeImageDialogComponent } from './dialogs/recategorize-image-dialog/recategorize-image-dialog.component'; -import { SearchScreenComponent } from './screens/search-screen/search-screen.component'; import { OverlayModule } from '@angular/cdk/overlay'; import { SharedDossiersModule } from './shared/shared-dossiers.module'; import { ResizeAnnotationDialogComponent } from './dialogs/resize-annotation-dialog/resize-annotation-dialog.component'; import { HighlightActionDialogComponent } from './screens/file-preview-screen/dialogs/highlight-action-dialog/highlight-action-dialog.component'; import { ColorPickerModule } from 'ngx-color-picker'; -const screens = [SearchScreenComponent]; - const dialogs = [ ManualAnnotationDialogComponent, ForceAnnotationDialogComponent, @@ -27,10 +24,8 @@ const dialogs = [ HighlightActionDialogComponent, ]; -const components = [...screens, ...dialogs]; - @NgModule({ - declarations: [...components], + declarations: [...dialogs], imports: [ CommonModule, SharedModule, diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts index 15e995f4f..d041ee93d 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.ts @@ -3,7 +3,7 @@ import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/si import { TranslateChartService } from '@services/translate-chart.service'; import { UserService } from '@services/user.service'; import { FilterService, ProgressBarConfigModel, shareLast, Toaster } from '@iqser/common-ui'; -import { workflowFileStatusTranslations } from '../../../../translations/file-status-translations'; +import { workflowFileStatusTranslations } from '../../../../../../translations/file-status-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { Dossier, DossierAttributeWithValue, DossierStats, IDossierRequest, StatusSorter, User } from '@red/domain'; import { ActivatedRoute } from '@angular/router'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/config.service.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/config.service.ts index 5d5ad670c..bdf5820af 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/config.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/config.service.ts @@ -12,7 +12,7 @@ import { WorkflowConfig, } from '@iqser/common-ui'; import { File, IFileAttributeConfig, StatusSorter, WorkflowFileStatus, WorkflowFileStatuses } from '@red/domain'; -import { workflowFileStatusTranslations } from '../../translations/file-status-translations'; +import { workflowFileStatusTranslations } from '../../../../translations/file-status-translations'; import { PermissionsService } from '@services/permissions.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { TranslateService } from '@ngx-translate/core'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts index 093747465..8e5e32872 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts @@ -4,7 +4,7 @@ import { FilterService, mapEach } from '@iqser/common-ui'; import { ActiveDossiersService } from '@services/entity-services/active-dossiers.service'; import { combineLatest, Observable } from 'rxjs'; import { DossierStats, FileCountPerWorkflowStatus, StatusSorter } from '@red/domain'; -import { workflowFileStatusTranslations } from '../../../../translations/file-status-translations'; +import { workflowFileStatusTranslations } from '../../../../../../translations/file-status-translations'; import { TranslateChartService } from '@services/translate-chart.service'; import { filter, map, switchMap } from 'rxjs/operators'; import { DossierStatsService } from '@services/entity-services/dossier-stats.service'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts index 4e54ab5e5..221a5f10d 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/config.service.ts @@ -5,7 +5,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { TranslateService } from '@ngx-translate/core'; import { UserPreferenceService } from '@services/user-preference.service'; import { UserService } from '@services/user.service'; -import { workflowFileStatusTranslations } from '../../translations/file-status-translations'; +import { workflowFileStatusTranslations } from '../../../../translations/file-status-translations'; import { dossierMemberChecker, dossierStateChecker, dossierTemplateChecker, RedactionFilterSorter } from '@utils/index'; import { workloadTranslations } from '../../translations/workload-translations'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/user-management/user-management.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/user-management/user-management.component.ts index 97df238a6..6d7decb5f 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/user-management/user-management.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/user-management/user-management.component.ts @@ -3,7 +3,7 @@ import { Dossier, File, StatusBarConfigs, User } from '@red/domain'; import { List, LoadingService, Toaster } from '@iqser/common-ui'; import { PermissionsService } from '@services/permissions.service'; import { FileAssignService } from '../../../../shared/services/file-assign.service'; -import { workflowFileStatusTranslations } from '../../../../translations/file-status-translations'; +import { workflowFileStatusTranslations } from '../../../../../../translations/file-status-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { FilesService } from '@services/entity-services/files.service'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.html b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.html similarity index 93% rename from apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.html rename to apps/red-ui/src/app/modules/search/search-screen/search-screen.component.html index 5c44f4aca..b63970902 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.html +++ b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.html @@ -74,8 +74,11 @@ > -
- {{ item.dossierName }} +
+
+ + {{ item.dossierName }} +
diff --git a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.scss b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.scss similarity index 100% rename from apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.scss rename to apps/red-ui/src/app/modules/search/search-screen/search-screen.component.scss diff --git a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts similarity index 74% rename from apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts rename to apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts index c5acc767d..7638d3f02 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/search-screen/search-screen.component.ts +++ b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts @@ -14,13 +14,14 @@ 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 { workflowFileStatusTranslations } from '../../../translations/file-status-translations'; import { TranslateService } from '@ngx-translate/core'; import { RouterHistoryService } from '@services/router-history.service'; import { ActiveDossiersService } from '@services/entity-services/active-dossiers.service'; -import { Dossier, IMatchedDocument, ISearchListItem, ISearchResponse } from '@red/domain'; +import { Dossier, DossierStatuses, IMatchedDocument, ISearchListItem, ISearchResponse } from '@red/domain'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { PlatformSearchService } from '@services/entity-services/platform-search.service'; +import { ArchivedDossiersService } from '@services/entity-services/archived-dossiers.service'; @Component({ templateUrl: './search-screen.component.html', @@ -43,8 +44,14 @@ export class SearchScreenComponent extends ListingComponent imp readonly searchResults$ = combineLatest([this._queryChanged, this._filtersChanged$]).pipe( tap(() => this._loadingService.start()), - tap(([query, dossierIds]) => this._updateNavigation(query, dossierIds)), - switchMap(([query, dossierIds]) => this._platformSearchService.search({ query, dossierIds })), + tap(([query, [dossierIds, onlyActive]]) => this._updateNavigation(query, dossierIds, onlyActive)), + switchMap(([query, [dossierIds, onlyActive]]) => + this._platformSearchService.search({ + query, + dossierIds, + dossierStatus: onlyActive ? [] : [DossierStatuses.ACTIVE, DossierStatuses.ARCHIVED], + }), + ), map(searchResult => this._toMatchedDocuments(searchResult)), map(docs => this._toListItems(docs)), tap(result => this.entitiesService.setEntities(result)), @@ -57,6 +64,7 @@ export class SearchScreenComponent extends ListingComponent imp private readonly _activatedRoute: ActivatedRoute, private readonly _loadingService: LoadingService, private readonly _activeDossiersService: ActiveDossiersService, + private readonly _archivedDossiersService: ArchivedDossiersService, readonly routerHistoryService: RouterHistoryService, private readonly _translateService: TranslateService, private readonly _filesMapService: FilesMapService, @@ -71,12 +79,13 @@ export class SearchScreenComponent extends ListingComponent imp const checked = dossierIds.includes(id); return new NestedFilter({ id, label: dossierName, checked }); }; + const allDossiers = [...this._activeDossiersService.all, ...this._archivedDossiersService.all]; const dossierNameFilter: IFilterGroup = { slug: 'dossiers', label: this._translateService.instant('search-screen.filters.by-dossier'), filterceptionPlaceholder: this._translateService.instant('search-screen.filters.search-placeholder'), icon: 'red:folder', - filters: this._activeDossiersService.all.map(dossierToFilter), + filters: allDossiers.map(dossierToFilter), checker: keyChecker('dossierId'), }; this.filterService.addFilterGroups([dossierNameFilter]); @@ -86,6 +95,10 @@ export class SearchScreenComponent extends ListingComponent imp return this._activatedRoute.snapshot.queryParamMap.get('dossierIds').split(','); } + private get _routeOnlyActive(): boolean { + return this._activatedRoute.snapshot.queryParamMap.get('onlyActive') === 'true'; + } + private get _routeQuery(): string { return this._activatedRoute.snapshot.queryParamMap.get('query'); } @@ -98,10 +111,14 @@ export class SearchScreenComponent extends ListingComponent imp ); } - private get _filtersChanged$(): Observable { + private get _filtersChanged$(): Observable<[string[], boolean]> { return this.filterService.filterGroups$.pipe( - map(groups => groups[0].filters.filter(v => v.checked).map(v => v.id)), - startWith(this._routeDossierIds), + map(groups => { + const dossierIds: string[] = groups[0].filters.filter(v => v.checked).map(v => v.id); + // TODO: Only active filter + return [dossierIds, this._routeOnlyActive]; + }), + startWith<[string[], boolean]>([this._routeDossierIds, this._routeOnlyActive]), ); } @@ -110,8 +127,8 @@ export class SearchScreenComponent extends ListingComponent imp this.searchService.searchValue = newQuery ?? ''; } - private _updateNavigation(query?: string, dossierIds?: string[]): Promise { - const queryParams = { query, dossierIds: dossierIds.join(',') }; + private _updateNavigation(query?: string, dossierIds?: string[], onlyActive?: boolean): Promise { + const queryParams = { query, dossierIds: dossierIds.join(','), onlyActive }; return this._router.navigate([], { queryParams, replaceUrl: true }); } @@ -123,24 +140,29 @@ export class SearchScreenComponent extends ListingComponent imp return matchedDocuments.map(document => this._toListItem(document)).filter(value => value); } - private _toListItem({ dossierId, fileId, unmatchedTerms, highlights, score }: IMatchedDocument): ISearchListItem { + private _toListItem({ dossierId, fileId, unmatchedTerms, highlights, score, dossierStatus }: IMatchedDocument): ISearchListItem { const file = this._filesMapService.get(dossierId, fileId); if (!file) { return undefined; } + const dossier = (dossierStatus === DossierStatuses.ARCHIVED ? this._archivedDossiersService : this._activeDossiersService).find( + dossierId, + ); + return { id: fileId, dossierId, + dossierStatus, unmatched: unmatchedTerms || null, highlights, status: file.workflowStatus, assignee: file.assignee, numberOfPages: file.numberOfPages, - dossierName: this._activeDossiersService.find(dossierId).dossierName, + dossierName: dossier.dossierName, filename: file.filename, searchKey: score.toString(), - routerLink: `/main/dossiers/${dossierId}/file/${fileId}`, + routerLink: file.routerLink, }; } } diff --git a/apps/red-ui/src/app/modules/search/search.module.ts b/apps/red-ui/src/app/modules/search/search.module.ts new file mode 100644 index 000000000..7a79b48ab --- /dev/null +++ b/apps/red-ui/src/app/modules/search/search.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SearchScreenComponent } from './search-screen/search-screen.component'; +import { RouterModule } from '@angular/router'; +import { CommonUiModule } from '@iqser/common-ui'; +import { SharedModule } from '../shared/shared.module'; + +const routes = [{ path: '', component: SearchScreenComponent }]; + +@NgModule({ + declarations: [SearchScreenComponent], + imports: [CommonModule, RouterModule.forChild(routes), CommonUiModule, SharedModule], +}) +export class SearchModule {} diff --git a/apps/red-ui/src/app/services/entity-services/platform-search.service.ts b/apps/red-ui/src/app/services/entity-services/platform-search.service.ts index 920b89753..e8c545c23 100644 --- a/apps/red-ui/src/app/services/entity-services/platform-search.service.ts +++ b/apps/red-ui/src/app/services/entity-services/platform-search.service.ts @@ -6,6 +6,8 @@ import { mapTo, switchMap } from 'rxjs/operators'; import { ActiveDossiersService } from './active-dossiers.service'; import { FilesMapService } from './files-map.service'; import { FilesService } from './files.service'; +import { DossiersService } from './dossiers.service'; +import { ArchivedDossiersService } from './archived-dossiers.service'; @Injectable({ providedIn: 'root' }) export class PlatformSearchService extends GenericService { @@ -13,12 +15,13 @@ export class PlatformSearchService extends GenericService { protected readonly _injector: Injector, private readonly _filesService: FilesService, private readonly _activeDossiersService: ActiveDossiersService, + private readonly _archivedDossiersService: ArchivedDossiersService, private readonly _filesMapService: FilesMapService, ) { super(_injector, 'search-v2'); } - search({ dossierIds, query }: ISearchInput): Observable { + search({ dossierIds, query, dossierStatus }: ISearchInput): Observable { if (!query) { return of({ matchedDocuments: [], @@ -32,19 +35,22 @@ export class PlatformSearchService extends GenericService { page: 0, returnSections: false, pageSize: 300, + dossierStatus, }; return this._post(body).pipe(switchMap(searchValue => this._loadMissingFiles$(searchValue))); } - private _loadMissingFiles$(searchResponse: ISearchResponse): Observable { - const documentsOfActiveDossiers = searchResponse.matchedDocuments.filter(document => - this._activeDossiersService.has(document.dossierId), - ); + private _dossiersWithMissingFiles(searchResponse: ISearchResponse, service: DossiersService): Dossier[] { + const documentsOfType = searchResponse.matchedDocuments.filter(document => service.has(document.dossierId)); const fileNotLoaded = ({ dossierId, fileId }: IMatchedDocument) => !this._filesMapService.get(dossierId, fileId); - const dossiersWithNotLoadedFiles = documentsOfActiveDossiers.filter(fileNotLoaded).map(document => document.dossierId); + const dossiersWithNotLoadedFiles = documentsOfType.filter(fileNotLoaded).map(document => document.dossierId); + return Array.from(new Set(dossiersWithNotLoadedFiles)).map(dossierId => service.find(dossierId)); + } - const dossiers = Array.from(new Set(dossiersWithNotLoadedFiles)).map(dossierId => this._activeDossiersService.find(dossierId)); + private _loadMissingFiles$(searchResponse: ISearchResponse): Observable { + const services = [this._activeDossiersService, this._archivedDossiersService]; + const dossiers = services.map(service => this._dossiersWithMissingFiles(searchResponse, service)).flat(); return dossiers.length ? this._loadFilesFor$(dossiers).pipe(mapTo(searchResponse)) : of(searchResponse); } diff --git a/apps/red-ui/src/app/services/router-history.service.ts b/apps/red-ui/src/app/services/router-history.service.ts index bbd98d1c2..5e87a8b82 100644 --- a/apps/red-ui/src/app/services/router-history.service.ts +++ b/apps/red-ui/src/app/services/router-history.service.ts @@ -10,7 +10,7 @@ export class RouterHistoryService { constructor(private readonly _router: Router) { this._router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((event: NavigationEnd) => { - if (event.url.startsWith('/main/dossiers') && !event.url.includes('/search')) { + if (event.url.startsWith('/main/dossiers')) { this._lastDossiersScreen = event.url; } }); diff --git a/apps/red-ui/src/app/modules/dossier/translations/file-status-translations.ts b/apps/red-ui/src/app/translations/file-status-translations.ts similarity index 100% rename from apps/red-ui/src/app/modules/dossier/translations/file-status-translations.ts rename to apps/red-ui/src/app/translations/file-status-translations.ts diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index 2dc1c9db5..9becd128f 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -1587,7 +1587,7 @@ "table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}" }, "search": { - "entire-platform": "ganze Plattform", + "active-dossiers": "ganze Plattform", "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen", "this-dossier": "in diesem Dossier" }, diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 8978b6a64..94a13c81c 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1763,7 +1763,8 @@ "table-header": "{length} search {length, plural, one{result} other{results}}" }, "search": { - "entire-platform": "across all dossiers", + "active-dossiers": "documents in active dossiers", + "all-dossiers": "all documents", "placeholder": "Search documents...", "this-dossier": "in this dossier" }, diff --git a/libs/red-domain/src/lib/search/matched-document.ts b/libs/red-domain/src/lib/search/matched-document.ts index e6b8b5f3b..65d41ddce 100644 --- a/libs/red-domain/src/lib/search/matched-document.ts +++ b/libs/red-domain/src/lib/search/matched-document.ts @@ -1,10 +1,12 @@ import { IMatchedSection } from './matched-section'; import { List } from '@iqser/common-ui'; +import { DossierStatus } from '../dossiers'; export interface IMatchedDocument { containsAllMatchedSections?: boolean; dossierId?: string; dossierTemplateId?: string; + dossierStatus?: DossierStatus; fileId?: string; highlights?: { [key: string]: List }; matchedSections?: List; diff --git a/libs/red-domain/src/lib/search/search-input.ts b/libs/red-domain/src/lib/search/search-input.ts index 597b6391f..dc0786951 100644 --- a/libs/red-domain/src/lib/search/search-input.ts +++ b/libs/red-domain/src/lib/search/search-input.ts @@ -1,6 +1,8 @@ import { List } from '@iqser/common-ui'; +import { DossierStatus } from '../dossiers'; export interface ISearchInput { readonly query: string; readonly dossierIds?: List; + readonly dossierStatus?: List; } diff --git a/libs/red-domain/src/lib/search/search-list-item.ts b/libs/red-domain/src/lib/search/search-list-item.ts index 1b5006a56..0091366b8 100644 --- a/libs/red-domain/src/lib/search/search-list-item.ts +++ b/libs/red-domain/src/lib/search/search-list-item.ts @@ -1,7 +1,9 @@ import { IListable, List } from '@iqser/common-ui'; +import { DossierStatus } from '../dossiers'; export interface ISearchListItem extends IListable { readonly dossierId: string; + readonly dossierStatus: DossierStatus; readonly filename: string; readonly assignee: string; readonly unmatched: List | null; diff --git a/libs/red-domain/src/lib/search/search.request.ts b/libs/red-domain/src/lib/search/search.request.ts index 104e9b097..e9ae5c23e 100644 --- a/libs/red-domain/src/lib/search/search.request.ts +++ b/libs/red-domain/src/lib/search/search.request.ts @@ -1,11 +1,13 @@ import { List } from '@iqser/common-ui'; +import { DossierStatus } from '../dossiers'; export interface ISearchRequest { - dossierIds?: List; - dossierTemplateIds?: List; - fileId?: string; - page?: number; - pageSize?: number; - queryString?: string; - returnSections?: boolean; + readonly dossierIds?: List; + readonly dossierTemplateIds?: List; + readonly dossierStatus?: List; + readonly fileId?: string; + readonly page?: number; + readonly pageSize?: number; + readonly queryString?: string; + readonly returnSections?: boolean; }