From 0235f1f91263a8378d40d5dd9a09891dcd4f7210 Mon Sep 17 00:00:00 2001 From: Erik Tiekstra Date: Thu, 11 Nov 2021 17:15:40 +0100 Subject: [PATCH] Handle empty response when status 204 --- .../deltagare-export.component.html | 8 ++++++ .../deltagare-export.component.ts | 28 ++++++++++++++----- .../deltagare-export.service.ts | 3 +- .../src/app/shared/models/export.model.ts | 4 +++ .../shared/services/api/export.api.service.ts | 16 ++++++++--- 5 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 apps/mina-sidor-fa/src/app/shared/models/export.model.ts diff --git a/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.html b/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.html index 31dfc36..5aa7be0 100644 --- a/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.html +++ b/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.html @@ -53,6 +53,14 @@

Kunde inte hämta exportfilen för deltagare. Ladda om sidan och försök igen.

{{error.message}}

+ +

Det finns inga deltagare att exportera. Försök att ändra filtreringen och försök igen.

+
Exportera deltagare
diff --git a/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.ts b/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.ts index 8b14d87..b9b71a0 100644 --- a/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.ts +++ b/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { FormControl, FormGroup } from '@angular/forms'; import { DeltagareExportRequest } from '@msfa-models/api/deltagare-export.request.model'; import { CustomError } from '@msfa-models/error/custom-error'; +import { Export } from '@msfa-models/export.model'; import { formatDate } from '@msfa-shared/utils/format-to-date.util'; import { saveAs } from 'file-saver'; import { BehaviorSubject } from 'rxjs'; @@ -21,6 +22,7 @@ export class DeltagareExportComponent { shouldValidate$ = new BehaviorSubject(false); fetchIsLoading$ = new BehaviorSubject(false); fetchError$ = new BehaviorSubject(null); + exportIsEmpty$ = new BehaviorSubject(false); formGroup = new FormGroup( { startDate: new FormControl(null), @@ -30,7 +32,11 @@ export class DeltagareExportComponent { }, [DeltagareExportValidator.isDeltagareExportValid()] ); - constructor(private deltagareExportService: DeltagareExportService) {} + constructor(private deltagareExportService: DeltagareExportService) { + this.formGroup.valueChanges.subscribe(() => { + this._removeAlerts(); + }); + } get startDateFormControl(): FormControl { return this.formGroup.get('startDate') as FormControl; @@ -57,8 +63,13 @@ export class DeltagareExportComponent { return this.formErrors?.datesMismatch && this.shouldValidate$.getValue(); } - fetchExportFile(): void { + private _removeAlerts(): void { this.fetchError$.next(null); + this.exportIsEmpty$.next(false); + } + + fetchExportFile(): void { + this._removeAlerts(); if (this.formGroup.invalid) { this.shouldValidate$.next(true); return; @@ -69,12 +80,15 @@ export class DeltagareExportComponent { .fetchExportFile$(this._formDataToRequestData) .pipe(take(1)) .subscribe({ - next: response => { - const isExcel = this._formDataToRequestData.exportToExcel; - const blob = new Blob([response], { type: this._getFileType(isExcel) }); - saveAs(blob, this._getFileName(isExcel)); + next: ({ empty, blob }: Export) => { + if (empty) { + this.exportIsEmpty$.next(true); + } else { + const isExcel = this._formDataToRequestData.exportToExcel; + saveAs(blob, this._getFileName(isExcel)); + this.formGroup.reset(); + } this.fetchIsLoading$.next(false); - this.formGroup.reset(); }, error: (customError: CustomError) => { this.fetchError$.next({ ...customError, message: customError.error.message }); diff --git a/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.service.ts b/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.service.ts index 236a390..3b427d4 100644 --- a/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.service.ts +++ b/apps/mina-sidor-fa/src/app/pages/exports/pages/deltagare-export/deltagare-export.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { DeltagareExportRequest } from '@msfa-models/api/deltagare-export.request.model'; +import { Export } from '@msfa-models/export.model'; import { ExportApiService } from '@msfa-services/api/export.api.service'; import { Observable } from 'rxjs'; @@ -7,7 +8,7 @@ import { Observable } from 'rxjs'; export class DeltagareExportService { constructor(private exportApiService: ExportApiService) {} - public fetchExportFile$(requestData: DeltagareExportRequest): Observable { + public fetchExportFile$(requestData: DeltagareExportRequest): Observable { return this.exportApiService.fetchDeltagareExportFile$(requestData); } } diff --git a/apps/mina-sidor-fa/src/app/shared/models/export.model.ts b/apps/mina-sidor-fa/src/app/shared/models/export.model.ts new file mode 100644 index 0000000..bf84534 --- /dev/null +++ b/apps/mina-sidor-fa/src/app/shared/models/export.model.ts @@ -0,0 +1,4 @@ +export interface Export { + blob?: Blob; + empty: boolean; +} diff --git a/apps/mina-sidor-fa/src/app/shared/services/api/export.api.service.ts b/apps/mina-sidor-fa/src/app/shared/services/api/export.api.service.ts index 9217d18..f9b9b87 100644 --- a/apps/mina-sidor-fa/src/app/shared/services/api/export.api.service.ts +++ b/apps/mina-sidor-fa/src/app/shared/services/api/export.api.service.ts @@ -1,12 +1,13 @@ -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Params } from '@angular/router'; import { ErrorType } from '@msfa-enums/error-type.enum'; import { environment } from '@msfa-environment'; import { DeltagareExportRequest } from '@msfa-models/api/deltagare-export.request.model'; import { CustomError } from '@msfa-models/error/custom-error'; +import { Export } from '@msfa-models/export.model'; import { Observable } from 'rxjs'; -import { catchError } from 'rxjs/operators'; +import { catchError, map } from 'rxjs/operators'; @Injectable({ providedIn: 'root', @@ -16,15 +17,22 @@ export class ExportApiService { constructor(private httpClient: HttpClient) {} - public fetchDeltagareExportFile$(requestData: DeltagareExportRequest): Observable { + public fetchDeltagareExportFile$(requestData: DeltagareExportRequest): Observable { const params: Params = { ...requestData, includeExportedDeltagare: requestData.includeExportedDeltagare.toString(), }; return this.httpClient - .get(`${this._apiBaseUrl}/deltagare`, { params, responseType: 'blob' as 'json' }) + .get(`${this._apiBaseUrl}/deltagare`, { + params, + observe: 'response', + responseType: 'blob' as 'json', + }) .pipe( + map((response: HttpResponse) => { + return response.status === 204 ? { empty: true } : { empty: false, blob: response.body }; + }), catchError((error: Error) => { throw new CustomError({ error,