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 19ec288a5..acba817b3 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 @@ -115,7 +115,7 @@ export class EditDossierDeletedDocumentsComponent extends ListingComponent f.fileId); await this._fileManagementService.restore(fileIds, this.dossier.id).toPromise(); this._removeFromList(fileIds); - await this._appStateService.reloadActiveDossierFiles(); + await this._appStateService.reloadDossierFiles(); this.updateDossier.emit(); } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html index 5a41d4587..f95dc48ab 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/screen/dossier-overview-screen.component.html @@ -52,11 +52,11 @@ - - - - + + + + diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index 762de56cc..353dd2552 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -477,11 +477,11 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni case 'reanalyse': await this._loadFileData(true); this._updateCanPerformActions(); - await this.appStateService.reloadActiveDossierFiles(); + await this.appStateService.reloadDossierFiles(); return; case 'exclude-pages': - await this.appStateService.reloadActiveDossierFiles(); + await this.appStateService.reloadDossierFiles(); await this._loadFileData(true); this._cleanupAndRedrawManualAnnotations$(); await this._stampPDF(); diff --git a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts index 43769c4a3..5f14565ed 100644 --- a/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/shared/components/file-actions/file-actions.component.ts @@ -117,7 +117,7 @@ export class FileActionsComponent extends AutoUnsubscribe implements OnDestroy, .catch(error => { this._toaster.error(_('error.http.generic'), { params: error }); }); - await this.appStateService.reloadActiveDossierFiles(); + await this.appStateService.reloadDossierFiles(); this.actionPerformed.emit('delete'); this._loadingService.stop(); }, diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts index cbecbbc14..880abbc58 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts @@ -1,8 +1,8 @@ -import { ApplicationRef, Injectable, Injector } from '@angular/core'; +import { ApplicationRef, Injectable, Injector, OnDestroy } from '@angular/core'; import { FileUploadModel } from '../model/file-upload.model'; import { AppStateService } from '@state/app-state.service'; import { HttpErrorResponse, HttpEventType } from '@angular/common/http'; -import { interval, Subscription } from 'rxjs'; +import { interval, Subject, Subscription } from 'rxjs'; import { ConfigService } from '@services/config.service'; import { TranslateService } from '@ngx-translate/core'; import { UploadDownloadDialogService } from './upload-download-dialog.service'; @@ -10,6 +10,7 @@ import { IFileUploadResult } from '@red/domain'; import { isCsv } from '@utils/file-drop-utils'; import { ErrorMessageService, GenericService, HeadersConfiguration, RequiredParam, Validate } from '@iqser/common-ui'; import { FilesMapService } from '@services/entity-services/files-map.service'; +import { switchMap, tap, throttleTime } from 'rxjs/operators'; export interface ActiveUpload { subscription: Subscription; @@ -17,15 +18,17 @@ export interface ActiveUpload { } @Injectable() -export class FileUploadService extends GenericService { +export class FileUploadService extends GenericService implements OnDestroy { static readonly MAX_PARALLEL_UPLOADS = 5; files: FileUploadModel[] = []; groupedFiles: { [key: string]: FileUploadModel[] } = {}; - activeUploads = 0; private _pendingUploads: FileUploadModel[] = []; private _activeUploads: ActiveUpload[] = []; + private readonly _fetchFiles$ = new Subject(); + private readonly _subscriptions = new Subscription(); + constructor( private readonly _appStateService: AppStateService, private readonly _filesMapService: FilesMapService, @@ -37,18 +40,23 @@ export class FileUploadService extends GenericService { protected readonly _injector: Injector, ) { super(_injector, 'upload'); - interval(2500).subscribe(async () => { - if (this.activeUploads > 0) { - await this._appStateService.reloadActiveDossierFiles(); - } - this._handleUploads(); - }); + const fileFetch$ = this._fetchFiles$.pipe( + throttleTime(1500), + switchMap(dossierId => this._appStateService.reloadDossierFiles(dossierId)), + ); + this._subscriptions.add(fileFetch$.subscribe()); + const interval$ = interval(2500).pipe(tap(() => this._handleUploads())); + this._subscriptions.add(interval$.subscribe()); } get activeDossierKeys() { return Object.keys(this.groupedFiles).filter(dossierId => this.groupedFiles[dossierId].length > 0); } + ngOnDestroy() { + this._subscriptions.unsubscribe(); + } + scheduleUpload(item: FileUploadModel) { if (!item.sizeError) { item.progress = 0; @@ -119,6 +127,7 @@ export class FileUploadService extends GenericService { const index = this.files.indexOf(item); if (index > -1) { this._removeFileFromGroup(item); + this._fetchFiles$.next(item.dossierId); this.files.splice(index, 1); } } @@ -221,6 +230,7 @@ export class FileUploadService extends GenericService { console.error(e); } } + this._activeUploads.splice(index, 1); this.activeUploads--; } diff --git a/apps/red-ui/src/app/state/app-state.service.ts b/apps/red-ui/src/app/state/app-state.service.ts index 9e656a460..cdfcbc566 100644 --- a/apps/red-ui/src/app/state/app-state.service.ts +++ b/apps/red-ui/src/app/state/app-state.service.ts @@ -161,9 +161,9 @@ export class AppStateService { this._appState.activeDictionaryType = null; } - async reloadActiveDossierFiles() { - if (this._activeDossierId) { - return this.getFiles(this._dossiersService.find(this._activeDossierId)); + async reloadDossierFiles(dossierId = this._activeDossierId) { + if (dossierId) { + return this.getFiles(this._dossiersService.find(dossierId)); } }