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