From 6165066b0aa2a2df9ad1cc8589e9e8c80bb2cd72 Mon Sep 17 00:00:00 2001 From: Nathan Hertz <nhertz@nrao.edu> Date: Wed, 14 Jul 2021 21:35:10 +0000 Subject: [PATCH] WS-516: UI for showing ingestion complete (archived status) and some UI styling updates --- .../capability-request.component.html | 51 +++++++------------ .../capability-request.component.ts | 14 +---- .../components/files/files.component.html | 11 ++++ .../components/files/files.component.scss | 9 ++++ .../components/files/files.component.spec.ts | 25 +++++++++ .../components/files/files.component.ts | 15 ++++++ .../request-header.component.html | 12 ++++- .../request-operations.component.html | 23 +++++++++ .../request-operations.component.scss | 0 .../request-operations.component.spec.ts | 25 +++++++++ .../request-operations.component.ts | 29 +++++++++++ .../workspaces/model/capability-request.ts | 1 + .../app/workspaces/workspaces.component.html | 17 ++++--- .../app/workspaces/workspaces.component.scss | 6 +++ .../src/app/workspaces/workspaces.module.ts | 10 ++-- .../workspaces/capability/schema.py | 1 + 16 files changed, 191 insertions(+), 58 deletions(-) create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/files/files.component.html create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/files/files.component.scss create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/files/files.component.spec.ts create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/files/files.component.ts create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.html create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.scss create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.spec.ts create mode 100644 apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.ts diff --git a/apps/web/src/app/workspaces/components/capability-request/capability-request.component.html b/apps/web/src/app/workspaces/components/capability-request/capability-request.component.html index e78310c5f..d5ffe5995 100644 --- a/apps/web/src/app/workspaces/components/capability-request/capability-request.component.html +++ b/apps/web/src/app/workspaces/components/capability-request/capability-request.component.html @@ -40,40 +40,27 @@ > </div> </div> - <div id="parameters-container" class="col"> + <div id="parameters-files-container" class="col"> <span id="parameters-label">Parameters</span> - <app-parameters id="parameters" [capabilityRequest]="capabilityRequest"></app-parameters> + <app-parameters + id="parameters" + class="pt-2" + [capabilityRequest]="capabilityRequest" + ></app-parameters> + <br /> <span id="files-label">Files</span> - <div id="files" *ngIf="currentVersion !== undefined"> - <div *ngFor="let file of currentVersion.files"> - {{ file.filename }} - </div> - </div> - <div class="d-flex justify-content-center py-3"> - <div class="col d-flex justify-content-center align-items-start"> - <app-create-new-version-form - id="create-new-version-form" - [capabilityRequest]="capabilityRequest" - ></app-create-new-version-form> - </div> - <div - class="col d-flex justify-content-center align-items-start" - *ngIf="capabilityRequest.state === 'Created'" - > - <button - id="submit-button" - type="button" - class="btn btn-info" - (click)=" - capabilityLauncherService - .submit(capabilityRequest.id) - .subscribe(submitRequestObserver) - " - > - <span class="fas fa-paper-plane"></span><span class="pl-2">Submit Request</span> - </button> - </div> - </div> + <app-files + id="files" + class="pt-2" + [capabilityVersion]="currentVersion" + *ngIf="currentVersion !== undefined" + ></app-files> + <br /> + <app-request-operations + id="operations" + class="pt-2" + [capabilityRequest]="capabilityRequest" + ></app-request-operations> </div> </div> </div> diff --git a/apps/web/src/app/workspaces/components/capability-request/capability-request.component.ts b/apps/web/src/app/workspaces/components/capability-request/capability-request.component.ts index 5494e8a64..09708c19d 100644 --- a/apps/web/src/app/workspaces/components/capability-request/capability-request.component.ts +++ b/apps/web/src/app/workspaces/components/capability-request/capability-request.component.ts @@ -1,11 +1,10 @@ -import { Component, Input, OnInit } from "@angular/core"; +import { Component, OnInit } from "@angular/core"; import { CapabilityRequest } from "../../model/capability-request"; import { ActivatedRoute } from "@angular/router"; import { DataRetrieverService } from "../../services/data-retriever.service"; import { CapabilityExecution } from "../../model/capability-execution"; import { Capability } from "../../model/capability"; import { CapabilityRequestService } from "../../services/capability-request.service"; -import { CapabilityLauncherService } from "../../services/capability-launcher.service"; import { CapabilityVersion } from "../../model/capability-version"; @Component({ @@ -30,16 +29,6 @@ export class CapabilityRequestComponent implements OnInit { }, error: (error) => console.error("Error when retrieving capability request:" + error), }; - // Observer for submitting capability request objects (returns a capability execution) - private submitRequestObserver = { - next: (submitResponse: CapabilityExecution) => { - this.capabilityExecution = submitResponse; - window.location.reload(); - }, - error: (error) => { - console.log(error); - }, - }; // Observer for capability objects private capabilityObserver = { next: (capability) => { @@ -63,7 +52,6 @@ export class CapabilityRequestComponent implements OnInit { private route: ActivatedRoute, private dataRetriever: DataRetrieverService, private capabilityRequestService: CapabilityRequestService, - private capabilityLauncherService: CapabilityLauncherService, ) { const requestID = parseInt(this.route.snapshot.paramMap.get("id")); this.capabilityRequestService diff --git a/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.html b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.html new file mode 100644 index 000000000..b85825a9e --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.html @@ -0,0 +1,11 @@ +<div id="files-container" class="container-fluid rounded-top rounded-3 p-3"> + <div *ngIf="capabilityVersion.files.length > 0; else noFilesMessage"> + <div class="row my-2" *ngFor="let file of capabilityVersion.files"> + <div class="col"> + <span class="rounded-pill px-2 py-1 filename">{{ file.filename }}</span> + </div> + </div> + </div> +</div> + +<ng-template #noFilesMessage> <em>No files exist for this request.</em> </ng-template> diff --git a/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.scss b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.scss new file mode 100644 index 000000000..7823b986b --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.scss @@ -0,0 +1,9 @@ +@import "src/variables"; + +.filename { + background-color: $parameters-pill-color; +} + +#files-container { + background-color: $parameters-container-bg; +} diff --git a/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.spec.ts b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.spec.ts new file mode 100644 index 000000000..ceac57e00 --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FilesComponent } from './files.component'; + +describe('FilesComponent', () => { + let component: FilesComponent; + let fixture: ComponentFixture<FilesComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ FilesComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(FilesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.ts b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.ts new file mode 100644 index 000000000..87bf9351d --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/files/files.component.ts @@ -0,0 +1,15 @@ +import { Component, Input, OnInit } from "@angular/core"; +import { CapabilityVersion } from "../../../../model/capability-version"; + +@Component({ + selector: "app-files", + templateUrl: "./files.component.html", + styleUrls: ["./files.component.scss"], +}) +export class FilesComponent implements OnInit { + @Input() capabilityVersion: CapabilityVersion; + + constructor() {} + + ngOnInit(): void {} +} diff --git a/apps/web/src/app/workspaces/components/capability-request/components/request-header/request-header.component.html b/apps/web/src/app/workspaces/components/capability-request/components/request-header/request-header.component.html index 9d3c3d504..8ff2030b1 100644 --- a/apps/web/src/app/workspaces/components/capability-request/components/request-header/request-header.component.html +++ b/apps/web/src/app/workspaces/components/capability-request/components/request-header/request-header.component.html @@ -8,15 +8,23 @@ [capabilityRequest]="capabilityRequest" ></app-status-badge> </h5> + <h5 *ngIf="capabilityRequest.ingested === true"> + <span id="ingestion-status-badge" class="badge badge-pill badge-warning py-2"> + <span class="fas fa-archive"></span> + <span class="pl-2"><strong>ARCHIVED</strong></span> + </span> + </h5> </div> <div id="created-and-updated-timestamps" class="row px-5"> <div class="col text-left p-2"> - <h5 id="created-time" class="timestamp">Created at {{ capabilityRequest.created_at }}</h5> + <h5 id="created-time" class="timestamp"> + Created <strong>{{ capabilityRequest.created_at | date: "medium" }}</strong> + </h5> </div> <div class="col text-right p-2"> <h5 id="last-updated-time" class="timestamp"> - Updated at {{ capabilityRequest.updated_at }} + Last Updated <strong>{{ capabilityRequest.updated_at | date: "medium" }}</strong> </h5> </div> </div> diff --git a/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.html b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.html new file mode 100644 index 000000000..6589cf74b --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.html @@ -0,0 +1,23 @@ +<div id="operations-container" class="d-flex justify-content-center align-content-center p-3"> + <div class="d-flex row"> + <div class="col-auto d-flex"> + <app-create-new-version-form + id="create-new-version-form" + class="d-flex align-self-center" + [capabilityRequest]="capabilityRequest" + ></app-create-new-version-form> + </div> + <div class="col-auto d-flex" *ngIf="capabilityRequest.state === 'Created'"> + <button + id="submit-button" + type="button" + class="btn btn-info" + (click)=" + capabilityLauncherService.submit(capabilityRequest.id).subscribe(submitRequestObserver) + " + > + <span class="fas fa-paper-plane"></span><span class="pl-2">Submit Request</span> + </button> + </div> + </div> +</div> diff --git a/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.scss b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.spec.ts b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.spec.ts new file mode 100644 index 000000000..002ad0562 --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RequestOperationsComponent } from './request-operations.component'; + +describe('RequestOperationsComponent', () => { + let component: RequestOperationsComponent; + let fixture: ComponentFixture<RequestOperationsComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RequestOperationsComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RequestOperationsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.ts b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.ts new file mode 100644 index 000000000..a7dc8a97e --- /dev/null +++ b/apps/web/src/app/workspaces/components/capability-request/components/request-operations/request-operations.component.ts @@ -0,0 +1,29 @@ +import { Component, Input, OnInit } from "@angular/core"; +import { CapabilityRequest } from "../../../../model/capability-request"; +import { CapabilityLauncherService } from "../../../../services/capability-launcher.service"; +import { CapabilityExecution } from "../../../../model/capability-execution"; + +@Component({ + selector: "app-request-operations", + templateUrl: "./request-operations.component.html", + styleUrls: ["./request-operations.component.scss"], +}) +export class RequestOperationsComponent implements OnInit { + @Input() capabilityRequest: CapabilityRequest; + public capabilityExecution: CapabilityExecution; + + // Observer for submitting capability request objects (returns a capability execution) + public submitRequestObserver = { + next: (submitResponse: CapabilityExecution) => { + this.capabilityExecution = submitResponse; + window.location.reload(); + }, + error: (error) => { + console.log(error); + }, + }; + + constructor(public capabilityLauncherService: CapabilityLauncherService) {} + + ngOnInit(): void {} +} diff --git a/apps/web/src/app/workspaces/model/capability-request.ts b/apps/web/src/app/workspaces/model/capability-request.ts index a45bbe108..c8ca3f2a9 100644 --- a/apps/web/src/app/workspaces/model/capability-request.ts +++ b/apps/web/src/app/workspaces/model/capability-request.ts @@ -7,6 +7,7 @@ export interface CapabilityRequest { state: string; parameters: JsonObject; current_execution: CapabilityExecution; + ingested: boolean; created_at: string; updated_at: string; type: string; diff --git a/apps/web/src/app/workspaces/workspaces.component.html b/apps/web/src/app/workspaces/workspaces.component.html index f5dfb17c0..9920bc6de 100644 --- a/apps/web/src/app/workspaces/workspaces.component.html +++ b/apps/web/src/app/workspaces/workspaces.component.html @@ -1,6 +1,6 @@ -<div class="container border border-dark rounded py-3 mt-2"> +<div class="container border rounded py-3 my-3"> <h4>Null Capability</h4> - <div id="button-container" class="d-flex justify-content-left py-2"> + <div id="null-button-container" class="d-flex justify-content-left py-2"> <div class="d-flex px-2"> <button type="button" @@ -13,7 +13,7 @@ </div> </div> </div> -<div class="container border border-dark rounded py-3 mt-2"> +<div class="container border rounded py-3 my-3"> <h4>Download or Calibration</h4> <div class="row p-3"> <div class="col-6"> @@ -55,7 +55,7 @@ </div> </div> </div> - <div id="button-container" class="d-flex justify-content-left py-2"> + <div id="download-calibration-button-container" class="d-flex justify-content-left py-2"> <div class="d-flex px-2"> <button type="button" @@ -78,7 +78,7 @@ </div> </div> </div> -<div class="container border rounded border-dark py-3 my-2"> +<div class="container border rounded py-3 my-3"> <h4>Standard CMS Imaging</h4> <div class="row p-3 mt-4"> <div class="col-4"> @@ -116,12 +116,13 @@ </div> </div> </div> - <div id="button-container" class="d-flex justify-content-left py-2"> + <div id="imaging-button-container" class="d-flex justify-content-left py-2"> <div class="d-flex px-2"> - <button + <button class="btn btn-lg btn-warning" id="cms-imaging-submit" - (click)="LaunchImagingCapabilityOnClick('std_cms_imaging')"> + (click)="LaunchImagingCapabilityOnClick('std_cms_imaging')" + > Launch standard CMS imaging </button> </div> diff --git a/apps/web/src/app/workspaces/workspaces.component.scss b/apps/web/src/app/workspaces/workspaces.component.scss index e69de29bb..f4bcbf9b2 100644 --- a/apps/web/src/app/workspaces/workspaces.component.scss +++ b/apps/web/src/app/workspaces/workspaces.component.scss @@ -0,0 +1,6 @@ +@import "src/variables.scss"; + +.container { + background: $capability-request-bg-gradient; + border-color: $request-status-page-border-dark; +} diff --git a/apps/web/src/app/workspaces/workspaces.module.ts b/apps/web/src/app/workspaces/workspaces.module.ts index ab88abf3b..f3256d770 100644 --- a/apps/web/src/app/workspaces/workspaces.module.ts +++ b/apps/web/src/app/workspaces/workspaces.module.ts @@ -7,10 +7,12 @@ import { CapabilityRequestComponent } from "./components/capability-request/capa import { RequestHeaderComponent } from "./components/capability-request/components/request-header/request-header.component"; import { CapabilityDefinitionComponent } from "./components/capability-request/components/capability-definition/capability-definition.component"; import { ParametersComponent } from "./components/capability-request/components/parameters/parameters.component"; -import { CreateNewVersionFormComponent } from './components/capability-request/components/create-new-version-form/create-new-version-form.component'; +import { CreateNewVersionFormComponent } from "./components/capability-request/components/create-new-version-form/create-new-version-form.component"; import { StatusBadgeComponent } from "./components/capability-request/components/status-buttons/status-badge.component"; -import { AnalystToolsComponent } from './components/analyst-tools/analyst-tools.component'; -import { ListOfCalibratablesComponent } from './components/list-of-calibratables/list-of-calibratables.component'; +import { AnalystToolsComponent } from "./components/analyst-tools/analyst-tools.component"; +import { ListOfCalibratablesComponent } from "./components/list-of-calibratables/list-of-calibratables.component"; +import { FilesComponent } from "./components/capability-request/components/files/files.component"; +import { RequestOperationsComponent } from "./components/capability-request/components/request-operations/request-operations.component"; @NgModule({ declarations: [ @@ -23,6 +25,8 @@ import { ListOfCalibratablesComponent } from './components/list-of-calibratables CreateNewVersionFormComponent, AnalystToolsComponent, ListOfCalibratablesComponent, + FilesComponent, + RequestOperationsComponent, ], imports: [CommonModule, WorkspacesRoutingModule, ReactiveFormsModule, FormsModule], }) diff --git a/shared/workspaces/workspaces/capability/schema.py b/shared/workspaces/workspaces/capability/schema.py index e0438c05f..5666addf7 100644 --- a/shared/workspaces/workspaces/capability/schema.py +++ b/shared/workspaces/workspaces/capability/schema.py @@ -171,6 +171,7 @@ class CapabilityRequest(Base, CapabilityRequestIF): "capability_name": self.capability_name, "state": self.state, "parameters": self.current_version.parameters if self.current_version else None, + "ingested": self.ingested, "created_at": self.created_at.isoformat(), "updated_at": self.updated_at.isoformat(), "current_execution": self.current_execution.__json__() -- GitLab