From dec8483d714c2d9bb59dd5d9d435a8301ae7913a Mon Sep 17 00:00:00 2001
From: Daniel Nemergut <dnemergu@nrao.edu>
Date: Wed, 5 Apr 2023 12:13:53 -0400
Subject: [PATCH] WS-1568 Execution status filtering

---
 .../active-capability-requests.component.html |  5 ++-
 .../active-capability-requests.component.ts   | 33 +++++++++++++++++--
 .../filter-menu/filter-menu.component.html    |  8 +++++
 .../filter-menu/filter-menu.component.ts      |  1 +
 4 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html
index d092e9b36..4810bc05d 100644
--- a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html
+++ b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html
@@ -50,7 +50,7 @@
 <br />
 
 <div>
-  <app-filter-menu *ngIf="showFilterMenu" [state]="statesToFilter" [daStaff]="qaStaff['DA']" [aodStaff]="qaStaff['AOD']" [srdpStatus]="srdpOptions" [filters]="filters" (filterMenuEventEmitter)="emitFilterEvent($event)"></app-filter-menu>
+  <app-filter-menu *ngIf="showFilterMenu" [state]="statesToFilter" [exec_status]="execStatusToFilter" [daStaff]="qaStaff['DA']" [aodStaff]="qaStaff['AOD']" [srdpStatus]="srdpOptions" [filters]="filters" (filterMenuEventEmitter)="emitFilterEvent($event)"></app-filter-menu>
   <mat-paginator #requestPaginator
     [length]="(sortedActiveRequests$ | async)?.length"
     [pageSize]="pageSize"
@@ -82,6 +82,9 @@
           ><i class="text-dark small fas fa-arrow-up"></i
           ></span>
         </button>
+        <button class="btn bg-transparent border-0 btn-light btn-sm" (click)="toggleFilterMenu()">
+          <span><i class="text-dark small fas fa-filter"></i></span>
+        </button>
       </th>
       <th>SDM ID</th>
       <th>Bands</th>
diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts
index bc8612201..92f8da1e7 100644
--- a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts
+++ b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts
@@ -80,6 +80,7 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
   private paramsObj: any;
   private filters: any;
   public showFilterMenu = false;
+  private notSubmittedState = "Latest version has not been submitted";
   private newParams: Params;
   private filterSets = {};
   private availableFilters: any;
@@ -88,6 +89,7 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
 
   // Filter sets
   public statesSet = new Set<string>();
+  public execStatusSet = new Set<string>();
   public daSet = new Set<string>();
   public aodSet = new Set<string>();
   public srdpSet = new Set<string>();
@@ -123,6 +125,20 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
     {"name":"Cancelled"},
     {"name":"Failed"},
   ]
+  public execStatusToFilter = [
+    {"name":"Not submitted", "filter_val":this.notSubmittedState},
+    {"name":"Start", "filter_val":"Start"},
+    {"name":"Queued", "filter_val":"Queued"},
+    {"name":"Executing", "filter_val":"Executing"},
+    {"name":"Ingesting", "filter_val":"Ingesting"},
+    {"name":"Awaiting QA", "filter_val":"Awaiting QA"},
+    {"name":"Stage 2 Review", "filter_val":"Stage 2 Review"},
+    {"name":"QA Closed", "filter_val":"QA Closed"},
+    {"name":"Failed", "filter_val":"Failed"},
+    {"name":"Error", "filter_val":"Error"},
+    {"name":"Cancelled", "filter_val":"Cancelled"},
+    {"name":"Complete", "filter_val":"Complete"},
+  ]
   public srdpOptions = [
     {"name":"true"},
     {"name":"false"},
@@ -274,6 +290,7 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
   private setupAvailableFilters() {
     this.availableFilters = {
       'state': this.statesToFilter,
+      'exec_status': this.execStatusToFilter,
       'is_srdp': this.srdpOptions,
       'obs_min': this.obsDateOptions,
       'obs_max': this.obsDateOptions
@@ -328,7 +345,11 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
   }
 
   public filterFrontendFilters(activeRequests: any): any {
-    if (this.filters && (this.filters.hasOwnProperty("is_srdp") || this.filters.hasOwnProperty("obs_min") || this.filters.hasOwnProperty("obs_max"))) {
+    if (this.filters && (
+        this.filters.hasOwnProperty("is_srdp") ||
+        this.filters.hasOwnProperty("obs_min") ||
+        this.filters.hasOwnProperty("obs_max") ||
+        this.filters.hasOwnProperty("exec_status"))) {
       // SRDP filter
       if (this.filters.hasOwnProperty("is_srdp")) {
         return activeRequests.filter(r => {
@@ -363,6 +384,12 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
         });
         return filteredDates;
       }
+      // Execution Status filter
+      else if (this.filters.hasOwnProperty("exec_status")) {
+        return activeRequests.filter(r => {
+          return this.filters.exec_status.includes(this.getExecutionStatusName(r));
+        });
+      }
     } else {
       // return unfiltered activeRequests
       return activeRequests
@@ -496,7 +523,7 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
     }
     if (request.state === 'Created' ||
       (request.state === 'Submitted' && request.versions[request.versions.length - 1].state === 'Created')) {
-      statusName = "Latest version has not been submitted";
+      statusName = this.notSubmittedState;
     }
 
     return statusName;
@@ -595,6 +622,8 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy {
     switch(s) {
       case "state":
         return this.statesSet
+      case "exec_status":
+        return this.execStatusSet
       case "assigned_da":
         return this.daSet
       case "assigned_aod":
diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.html b/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.html
index ccbfd6627..e0e59f6ab 100644
--- a/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.html
+++ b/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.html
@@ -8,6 +8,14 @@
     </div>
   </div>
 
+  <div class="bg-light p-2">
+    <p>Execution Status</p>
+    <div *ngFor="let s of exec_status" class="form-check">
+      <input class="form-check-input" type="checkbox" [id]="s.name" [value]="s.filter_val" (change)="addFilter(s.filter_val, 'exec_status', $event.target.checked)" [checked]="s.isChecked" />
+      <label class="form-check-label" [for]="s.name">{{s.name}}</label>
+    </div>
+  </div>
+
   <div class="bg-light p-2">
     <p>DA staff</p>
     <div *ngFor="let da of daStaff" class="form-check">
diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.ts b/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.ts
index c6a5fcccb..3fb1d4364 100644
--- a/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.ts
+++ b/apps/web/src/app/workspaces/components/active-capability-requests/components/filter-menu/filter-menu.component.ts
@@ -34,6 +34,7 @@ export interface Filter {
 
 export class FilterMenuComponent implements OnInit {
   @Input() state: any;
+  @Input() exec_status: any;
   @Input() daStaff: any;
   @Input() aodStaff: any;
   @Input() srdpStatus: any;
-- 
GitLab