From 74b8f9f13e868c078bde49f6da606c32198e48b0 Mon Sep 17 00:00:00 2001
From: jgrogan <james.grogan@ichec.ie>
Date: Sat, 2 Nov 2024 11:54:49 +0000
Subject: [PATCH] Start adding applicaiton view to facilities

---
 .../detail/access-call-detail.component.ts    | 49 ++++++++++++++++++-
 .../edit/application-edit.component.html      | 10 ++--
 .../edit/application-edit.component.ts        | 40 +++++++--------
 .../detail/facility-detail.component.ts       | 35 ++++++++-----
 .../edit/facility-edit.component.html         |  2 +-
 .../facility/edit/facility-edit.component.ts  |  7 ++-
 .../api/facility/list/facility.component.html | 16 ++++--
 .../api/facility/list/facility.component.ts   |  2 +-
 .../base/list-view/list-view.component.ts     |  2 +-
 src/environments/environment.development.ts   |  3 +-
 10 files changed, 118 insertions(+), 48 deletions(-)

diff --git a/src/app/views/api/access-call/detail/access-call-detail.component.ts b/src/app/views/api/access-call/detail/access-call-detail.component.ts
index 2e02ca1..6a13496 100644
--- a/src/app/views/api/access-call/detail/access-call-detail.component.ts
+++ b/src/app/views/api/access-call/detail/access-call-detail.component.ts
@@ -37,7 +37,11 @@ export class AccessCallDetailComponent extends DetailViewComponent<IAccessCall>
 
     user?: IPortalMember;
     coordinator?: IPortalMember;
+    chair?: IPortalMember;
+    board: IPortalMember[] = [];
+    
     application: IAccessApplication | null = null;
+    applications: IAccessApplication[] = [];
     
     constructor(
         _route: ActivatedRoute,
@@ -61,18 +65,61 @@ export class AccessCallDetailComponent extends DetailViewComponent<IAccessCall>
                         this.application = applications[0];
                     }
                 })
+
+            this._applicationService.get().subscribe(applications => this.applications = applications);
+            
             if (this.item.coordinator)
             {
                this._userService.getUrl(this.item.coordinator).subscribe(coordinator => this.coordinator = coordinator);
             }
 
+            if (this.item.board_chair)
+            {
+               this._userService.getUrl(this.item.board_chair).subscribe(chair => this.chair = chair);                
+            }
         }
     }
 
-    canEdit(): boolean {
+    canEdit(): boolean { 
         return this._navService.isConsortiumAdmin();
     }
 
+    isBoardChair(){
+        if(!this.user)
+        {
+            return false;
+        }
+        if (!this.item)
+        {
+            return false;
+        }
+        return this.user.url == this.item.board_chair;
+    }
+
+    isCoordinator(){
+        if(!this.user)
+        {
+            return false;
+        }
+        if (!this.item)
+        {
+            return false;
+        }
+        return this.user.url == this.item.coordinator;
+    }  
+
+    isBoardMember(){
+        if(!this.user)
+        {
+            return false;
+        }
+        if (!this.item)
+        {
+            return false;
+        }
+        return this.item.board_members.includes(this.item.url);
+    }  
+ 
     getApplicationId(): number
     {
         if(this.application)
diff --git a/src/app/views/api/application/edit/application-edit.component.html b/src/app/views/api/application/edit/application-edit.component.html
index 34982ef..2ad9598 100644
--- a/src/app/views/api/application/edit/application-edit.component.html
+++ b/src/app/views/api/application/edit/application-edit.component.html
@@ -14,6 +14,7 @@
 
        <h4>Objectives and Requirements</h4>
        <mat-form-field class="form_field">
+         <mat-label *ngIf="!createMode">Device details</mat-label>
          <textarea matInput
                    placeholder="Device Details"
                    type="text"
@@ -21,7 +22,8 @@
                    name="device_details"></textarea>
        </mat-form-field>
        
-        <mat-form-field class="form_field">
+       <mat-form-field class="form_field">
+         <mat-label *ngIf="!createMode">Technology Readiness Level</mat-label>
           <input matInput
                  placeholder="TRL Stage"
                  type="number"
@@ -30,7 +32,8 @@
                  name="trl_stage">
         </mat-form-field>
         
-        <mat-form-field class="form_field">
+       <mat-form-field class="form_field">
+         <mat-label *ngIf="!createMode">Objectives</mat-label>
           <textarea matInput
                     placeholder="Objectives"
                     type="text"
@@ -38,7 +41,8 @@
                     name="objectives"></textarea>
         </mat-form-field>
         
-        <mat-form-field class="form_field">
+       <mat-form-field class="form_field">
+         <mat-label *ngIf="!createMode">Requirements</mat-label>
           <textarea matInput
                     placeholder="Requirements"
                     type="text"
diff --git a/src/app/views/api/application/edit/application-edit.component.ts b/src/app/views/api/application/edit/application-edit.component.ts
index 9244b09..885d42d 100644
--- a/src/app/views/api/application/edit/application-edit.component.ts
+++ b/src/app/views/api/application/edit/application-edit.component.ts
@@ -74,10 +74,13 @@ export class ApplicationEditComponent extends EditViewComponent<IAccessApplicati
             return;
         }
 
-        const call_id = this._route.snapshot.paramMap.get('id');
-        if (call_id) {
-            this._accessCallService.getItem(Number(call_id)).subscribe(access_call => this.createInitial(access_call));
+        if (this.createMode) {
+            const call_id = this._route.snapshot.paramMap.get('id');
+            if (call_id) {
+                this._accessCallService.getItem(Number(call_id)).subscribe(access_call => this.createInitial(access_call));
+            }
         }
+
     }
 
     createInitial(access_call: IAccessCall) {
@@ -97,40 +100,33 @@ export class ApplicationEditComponent extends EditViewComponent<IAccessApplicati
             item => this.item = item);
     }
 
-   override save() {
-        if (!this.item)
-        {
+    override save() {
+        if (!this.item) {
             return;
         }
-        
+
         this._restService.putItem(this.item).subscribe(
-            item => {this.saveFiles(item);});
-   }
+            item => { this.saveFiles(item); });
+    }
 
-    saveFiles(item: IAccessApplication){
-        if (this.fundingStatement || this.safetyStatement)
-        {
+    saveFiles(item: IAccessApplication) {
+        if (this.fundingStatement || this.safetyStatement) {
             const form = new FormData();
-            if (this.fundingStatement)
-            {
-                console.log("Attaching funding statement");
+            if (this.fundingStatement) {
                 form.append("funding_statement", this.fundingStatement);
             }
-            if (this.safetyStatement)
-            {
+            if (this.safetyStatement) {
                 form.append("safety_statement", this.safetyStatement);
             }
-            this._restService.patchItemMedia(item.id, form).subscribe(item=>this.onItemUpdated(item));
+            this._restService.patchItemMedia(item.id, form).subscribe(item => this.onItemUpdated(item));
         }
         else {
             this.onItemUpdated(item);
         }
     }
 
-    submit()
-    {
-        if(this.item)
-        {
+    submit() {
+        if (this.item) {
             this.item.status = "SUBMITTED";
             this.save();
         }
diff --git a/src/app/views/api/facility/detail/facility-detail.component.ts b/src/app/views/api/facility/detail/facility-detail.component.ts
index dffa1ee..ce1ef36 100644
--- a/src/app/views/api/facility/detail/facility-detail.component.ts
+++ b/src/app/views/api/facility/detail/facility-detail.component.ts
@@ -10,10 +10,12 @@ import { MatTableModule } from '@angular/material/table';
 import { DetailViewComponent } from '../../../base/detail-view/detail-view.component';
 
 import { ITestFacility } from '../../../../models/facility';
+import { IAccessApplication } from '../../../../models/access_application';
 import { IPortalMember } from '../../../../models/core';
 
 import { LeftNavService } from '../../../../services/left-nav.service';
 import { FacilityService } from '../../../../services/api/facility.service';
+import { ApplicationService } from '../../../../services/api/application.service';
 import { UserService } from '../../../../services/user.service';
 
 @Component({
@@ -22,42 +24,51 @@ import { UserService } from '../../../../services/user.service';
     imports: [NgIf, NgFor,
         RouterModule,
         MatButtonModule,
-              MatIconModule,
-              MatTableModule
+        MatIconModule,
+        MatTableModule
     ],
     templateUrl: './facility-detail.component.html',
     styleUrl: './facility-detail.component.css'
 })
 export class FacilityDetailComponent extends DetailViewComponent<ITestFacility> implements OnInit {
 
-    currentUser?: IPortalMember;
+    user?: IPortalMember;
     members: IPortalMember[] = [];
     memberColumns = ["first_name", "last_name", "email"];
- 
+
+    applications: IAccessApplication[] = [];
+
     constructor(
         _route: ActivatedRoute,
         _location: Location,
         private _navService: LeftNavService,
         _restService: FacilityService,
+        private _applicationService: ApplicationService,
         _userService: UserService
     ) {
         super(_route, _location, _userService, _restService);
     }
 
     override onItemAndUserAvailable(user: IPortalMember) {
-        this.currentUser = user;
-        if (this.item)
-        {
-            this._userService.get("?organization=" + this.item.id).subscribe(users => this.members = users);
+        this.user = user;
+        if (this.item) {
+            this._userService.get("?organization=" + this.item.id).subscribe(users => this.onMembers(users));
+        }
+    }
+
+    onMembers(members: IPortalMember[]) {
+        this.members = members;
+        if (this.item && this.isMember()) {
+            this._applicationService.get("?facility=" + this.item.id).subscribe(applications => this.applications = applications);
         }
     }
 
     isMember(): boolean {
-        if (!this.currentUser)
-        {
-            return false;
+        if (this.user) {
+            return this.members.some(m => m.id == this.user?.id);
         }
-        return this.members.includes(this.currentUser);
+        return false;
+
     }
 
     canEdit(): boolean {
diff --git a/src/app/views/api/facility/edit/facility-edit.component.html b/src/app/views/api/facility/edit/facility-edit.component.html
index 7a2d421..b078811 100644
--- a/src/app/views/api/facility/edit/facility-edit.component.html
+++ b/src/app/views/api/facility/edit/facility-edit.component.html
@@ -78,7 +78,7 @@
            </mat-checkbox>
          </div>
 
-      <div>
+      <div style="display:flex; text-align: center; justify-content: center; flex-direction: column">
         <p style="padding:5px">
           <b>Members</b>
         </p>
diff --git a/src/app/views/api/facility/edit/facility-edit.component.ts b/src/app/views/api/facility/edit/facility-edit.component.ts
index 2b294ae..08d3c86 100644
--- a/src/app/views/api/facility/edit/facility-edit.component.ts
+++ b/src/app/views/api/facility/edit/facility-edit.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, ViewChild } from '@angular/core';
 import { NgIf, NgFor } from '@angular/common';
 import { FormsModule } from '@angular/forms';
 import { ActivatedRoute } from '@angular/router'
@@ -10,7 +10,7 @@ import { MatButtonModule } from '@angular/material/button';
 import { MatInputModule } from '@angular/material/input';
 import { MatFormFieldModule } from '@angular/material/form-field';
 import { MatCheckboxModule } from '@angular/material/checkbox';
-import { MatTableModule } from '@angular/material/table';
+import { MatTable, MatTableModule } from '@angular/material/table';
 
 import { EditViewComponent } from '../../..//base/edit-view/edit-view.component';
 
@@ -44,6 +44,7 @@ export class FacilityEditComponent extends EditViewComponent<ITestFacility> impl
     currentUser?: IPortalMember;
     selectedUser: IPortalMember | null = null;
     members: IPortalMember[] = [];
+    @ViewChild(MatTable) table: MatTable<IPortalMember>;
     portalUsers: IPortalMember[] = [];
     memberColumns = ["first_name", "last_name", "email", "remove"];
 
@@ -77,6 +78,7 @@ export class FacilityEditComponent extends EditViewComponent<ITestFacility> impl
         {
             this.item.members = this.item.members.filter(url => url != user.url);
         }
+        this.table.renderRows();
     }
 
     addUser()
@@ -89,6 +91,7 @@ export class FacilityEditComponent extends EditViewComponent<ITestFacility> impl
                 this.item.members.push(this.selectedUser.url);
             }
             this.selectedUser = null;
+            this.table.renderRows();
         }
     }
 
diff --git a/src/app/views/api/facility/list/facility.component.html b/src/app/views/api/facility/list/facility.component.html
index 6e89634..13a52f9 100644
--- a/src/app/views/api/facility/list/facility.component.html
+++ b/src/app/views/api/facility/list/facility.component.html
@@ -5,9 +5,17 @@
 </div>
 
 <div class="container">  
-  <div *ngIf="items.length === 0">
-    <p *ngIf="canAddItem()">There are currently no facilities, click below to add one.</p>
-    <p *ngIf="!canAddItem()">There are currently no active facilities.</p>
+  <div *ngIf="items.length === 0" style="text-align: center">
+
+    <ng-template #nonSelfList>
+      <p *ngIf="canAddItem()">There are currently no facilities, click below to add one.</p>
+      <p *ngIf="!canAddItem()">There are currently no active facilities.</p>
+    </ng-template>
+
+    <p *ngIf="isSelfList; else nonSelfList">
+      You are not currently a member of any facilities.
+    </p>
+    
   </div>
   
   <div *ngIf="items.length > 0">
@@ -42,7 +50,7 @@
           <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
           <tr mat-row
               *matRowDef="let row; columns: displayedColumns;"
-              [routerLink]="['detail/', row.id]"
+              [routerLink]="['/facilities/detail/', row.id]"
               [routerLinkActive]="['is-active']"
               ></tr>
     </table>
diff --git a/src/app/views/api/facility/list/facility.component.ts b/src/app/views/api/facility/list/facility.component.ts
index d1fc2ea..3f09fb8 100644
--- a/src/app/views/api/facility/list/facility.component.ts
+++ b/src/app/views/api/facility/list/facility.component.ts
@@ -39,7 +39,7 @@ export class FacilityComponent extends ListViewComponent<ITestFacility> implemen
 
     canAddItem(): boolean 
     {
-        return this._navService.isConsortiumAdmin(); 
+        return this._navService.isConsortiumAdmin() && !this.isSelfList(); 
     }
 
     goBack(): void {
diff --git a/src/app/views/base/list-view/list-view.component.ts b/src/app/views/base/list-view/list-view.component.ts
index 620b4e4..9957678 100644
--- a/src/app/views/base/list-view/list-view.component.ts
+++ b/src/app/views/base/list-view/list-view.component.ts
@@ -58,7 +58,7 @@ export class ListViewComponent<T extends Identifiable> implements OnInit{
         this._restService.getForUser(this.user).subscribe(items => this.items = items);
     }
 
-    private isSelfList()
+    protected isSelfList()
     {
         const url_segments = this._route.snapshot.url;
         if (url_segments.length == 2)
diff --git a/src/environments/environment.development.ts b/src/environments/environment.development.ts
index b1b57b2..4deddab 100644
--- a/src/environments/environment.development.ts
+++ b/src/environments/environment.development.ts
@@ -1,7 +1,8 @@
 export const environment = {
     development: true,
     endpoint_url: "http://localhost:8000",
-    default_username: "consortium_admin",
+    // default_username: "consortium_admin",
     //default_username: "regular_user",
+    default_username: "",
     default_password: "change_me123"
 };
-- 
GitLab