From 28441c1890422116230e6979dfb8dcf17df84f81 Mon Sep 17 00:00:00 2001 From: Ludek Novy <13610612+ludeknovy@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:32:11 +0200 Subject: [PATCH] Add loading indicators and error handling for async data (#422) --- src/app/dashboard/dashboard.component.html | 2 +- src/app/dashboard/dashboard.component.ts | 24 +++++++++++++++------- src/app/scenario/scenario.component.html | 2 +- src/app/scenario/scenario.component.ts | 13 +++++++++++- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index 64bdc1ca..6cfec026 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -80,7 +80,7 @@
Recent Test Runs
- + Nothing here yet! Upload some test reports. Show me how! diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 6752e9ef..85539715 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -4,21 +4,24 @@ import { ItemsListing, ProjectsOverallStats } from "../items.service.model"; import { Router } from "@angular/router"; import { SharedMainBarService } from "../shared-main-bar.service"; import { getValidationResults } from "../utils/showZeroErrorTolerance"; +import { catchError } from "rxjs/operators"; +import { of } from "rxjs"; @Component({ - selector: "app-dashboard", - templateUrl: "./dashboard.component.html", - styleUrls: ["./dashboard.component.css", "../shared-styles.css"] + selector: 'app-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.css', '../shared-styles.css'] }) export class DashboardComponent implements OnInit { latestItems: ItemsListing[]; overallStats: ProjectsOverallStats; Math: Math; + isLoading = true; constructor( private projectService: ProjectApiService, private router: Router, - private sharedMainBarService: SharedMainBarService + private sharedMainBarService: SharedMainBarService, ) { this.Math = Math; } @@ -31,8 +34,13 @@ export class DashboardComponent implements OnInit { fetchLatestItems() { this.projectService.fetchLatestItems() + .pipe(catchError(r => { + this.isLoading = false; + return of(r); + })) .subscribe(_ => { this.latestItems = _; + this.isLoading = false; }); } @@ -45,12 +53,14 @@ export class DashboardComponent implements OnInit { } displayItemValidationError(zeroErrorEnabled, errorCount, errorRate, duration, minTestDuration) { - const { zeroErrorToleranceValidation, minTestDurationValidation } = getValidationResults(zeroErrorEnabled, errorRate, errorCount, duration, minTestDuration); - return zeroErrorToleranceValidation || minTestDurationValidation + const { + zeroErrorToleranceValidation, + minTestDurationValidation + } = getValidationResults(zeroErrorEnabled, errorRate, errorCount, duration, minTestDuration); + return zeroErrorToleranceValidation || minTestDurationValidation; } - isValidationEnabled(zeroErrorEnabled, minTestDuration): boolean { return zeroErrorEnabled || minTestDuration > 0; } diff --git a/src/app/scenario/scenario.component.html b/src/app/scenario/scenario.component.html index 13e1ddf0..28eea52f 100644 --- a/src/app/scenario/scenario.component.html +++ b/src/app/scenario/scenario.component.html @@ -74,7 +74,7 @@
Test Runs - + Nothing here yet! Please upload some test reports. diff --git a/src/app/scenario/scenario.component.ts b/src/app/scenario/scenario.component.ts index 1c195a49..cd481801 100644 --- a/src/app/scenario/scenario.component.ts +++ b/src/app/scenario/scenario.component.ts @@ -32,6 +32,7 @@ export class ScenarioComponent implements OnInit, OnDestroy { isAnonymous = false; validationEnabled = false minTestDuration = null + isLoading = true; constructor( private route: ActivatedRoute, @@ -59,7 +60,17 @@ export class ScenarioComponent implements OnInit, OnDestroy { }); if (!this.isAnonymous) { - this.items$ = this.itemsService.items$; + this.items$ = this.itemsService.items$ + this.items$ + .pipe(catchError(r => { + this.isLoading = false; + return of(r); + })) + .subscribe(items => { + if (items.name) { + this.isLoading = false; + } + }) this.environment$ = this.environmentService.environment$.subscribe(value => this.page = 1); this.route.params.pipe(