Fixing auto-refresh for jobs
[portal/nonrtric-controlpanel.git] / webapp-frontend / src / app / ei-coordinator / jobs-list / jobs-list.component.ts
index 58e437a..178400e 100644 (file)
@@ -22,19 +22,9 @@ import { FormControl, FormGroup } from "@angular/forms";
 import { MatPaginator } from "@angular/material/paginator";
 import { Sort } from "@angular/material/sort";
 import { MatTableDataSource } from "@angular/material/table";
-import {
-  forkJoin,
-  Subscription,
-  timer,
-} from "rxjs";
+import { EMPTY, forkJoin, Subscription, timer } from "rxjs";
 import { BehaviorSubject } from "rxjs/BehaviorSubject";
-import {
-  mergeMap,
-  finalize,
-  map,
-  tap,
-  switchMap,
-} from "rxjs/operators";
+import { mergeMap, finalize, map, tap, switchMap } from "rxjs/operators";
 import { EIJob } from "@interfaces/ei.types";
 import { EIService } from "@services/ei/ei.service";
 import { UiService } from "@services/ui/ui.service";
@@ -59,11 +49,14 @@ export class JobsListComponent implements OnInit {
   jobForm: FormGroup;
   darkMode: boolean;
 
-  private jobsSubject = new BehaviorSubject<Job[]>([]);
+  private jobsSubject$ = new BehaviorSubject<Job[]>([]);
   private refresh$ = new BehaviorSubject("");
-  private loadingSubject = new BehaviorSubject<boolean>(false);
-  public loading$ = this.loadingSubject.asObservable();
+  private loadingSubject$ = new BehaviorSubject<boolean>(false);
+  private polling$ = new BehaviorSubject(0);
+  public loading$ = this.loadingSubject$.asObservable();
   subscription: Subscription;
+  checked: boolean = false;
+  firstTime: boolean = true;
 
   constructor(private eiSvc: EIService, private ui: UiService) {
     this.jobForm = new FormGroup({
@@ -78,7 +71,7 @@ export class JobsListComponent implements OnInit {
   ngOnInit(): void {
     this.subscription = this.dataSubscription();
 
-    this.jobsSubject.subscribe((data) => {
+    this.jobsSubject$.subscribe((data) => {
       this.jobsDataSource = new MatTableDataSource<Job>(data);
       this.jobsDataSource.paginator = this.paginator;
 
@@ -110,21 +103,28 @@ export class JobsListComponent implements OnInit {
       mergeMap((prodIds) =>
         forkJoin(prodIds.map((id) => this.eiSvc.getJobsForProducer(id)))
       ),
-      finalize(() => this.loadingSubject.next(false))
+      finalize(() => this.loadingSubject$.next(false))
     );
 
-    return this.refresh$
-      .pipe(
-        switchMap((_) =>
-          timer(0, 10000).pipe(
-            tap((_) => {
-              this.loadingSubject.next(true);
-            }),
-            switchMap((_) => jobs$),
-            map((response) => this.extractJobs(prodId, response))
-          )
+    const refreshedJobs$ = this.refresh$.pipe(
+      switchMap((_) =>
+        timer(0, 10000).pipe(
+          tap((_) => {
+            this.loadingSubject$.next(true);
+          }),
+          switchMap((_) => jobs$),
+          map((response) => this.extractJobs(prodId, response))
         )
       )
+    );
+
+    return this.polling$
+      .pipe(
+        switchMap((value) => {
+          let pollCondition = value == 0 || this.checked;
+          return pollCondition ? refreshedJobs$ : EMPTY;
+        })
+      )
       .subscribe();
   }
 
@@ -162,6 +162,11 @@ export class JobsListComponent implements OnInit {
     this.jobsDataSource.data = data;
   }
 
+  stopPolling(checked) {
+    this.checked = checked;
+    this.polling$.next(this.jobs().length);
+  }
+
   compare(a: any, b: any, isAsc: boolean) {
     return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
   }
@@ -190,17 +195,21 @@ export class JobsListComponent implements OnInit {
   }
 
   public jobs(): Job[] {
-    return this.jobsSubject.value;
+    return this.jobsSubject$.value;
   }
 
   private extractJobs(prodId: number[], res: EIJob[][]) {
-    console.log(res.length);
+    this.clearFilter();
     let jobList = [];
     prodId.forEach((element, index) => {
       let jobs = res[index];
       jobList = jobList.concat(jobs.map((job) => this.createJob(element, job)));
     });
-    this.jobsSubject.next(jobList);
+    this.jobsSubject$.next(jobList);
+    if (this.firstTime && jobList.length > 0) {
+      this.polling$.next(jobList.length);
+      this.firstTime = false;
+    }
     return jobList;
   }