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 index b85825a9e99bc0c532e61ee9cf5391131d21f96c..e424fdf316e9ea2fa0ecb85d90a5bad124d5d9f9 100644 --- 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 @@ -8,4 +8,4 @@ </div> </div> -<ng-template #noFilesMessage> <em>No files exist for this request.</em> </ng-template> +<ng-template #noFilesMessage> <em>No files are attached to this request.</em> </ng-template> diff --git a/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.html b/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.html index 03a2fed684a363ba5c13d8c0d8de98d60f99b335..0d39260ea4bff17939eac34f255404a2c139db5e 100644 --- a/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.html +++ b/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.html @@ -1,9 +1,13 @@ <div id="parameters-container" class="container-fluid rounded-top rounded-3 p-3"> - <div class="row my-2" *ngFor="let parameter of capabilityRequest.parameters | keyvalue"> - <div class="col"> - <span class="rounded-pill px-2 py-1 argument-key">{{ parameter.key }}</span> - <span class="px-1"> = </span> - <span class="rounded-pill px-2 py-1 argument-value">{{ parameter.value }}</span> + <div *ngIf="isEmpty(capabilityRequest.parameters) === false; else noParametersMessage"> + <div class="row my-2" *ngFor="let parameter of capabilityRequest.parameters | keyvalue"> + <div class="col"> + <span class="rounded-pill px-2 py-1 argument-key">{{ parameter.key }}</span> + <span class="px-1"> = </span> + <span class="rounded-pill px-2 py-1 argument-value">{{ parameter.value }}</span> + </div> </div> </div> </div> + +<ng-template #noParametersMessage> <em>This request has no parameters.</em> </ng-template> diff --git a/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.ts b/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.ts index 855cf97d98b49d314deaaf932e9e76bd0796eb31..dd780717582c0af3d591575cf751e54e5f278874 100644 --- a/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.ts +++ b/apps/web/src/app/workspaces/components/capability-request/components/parameters/parameters.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnInit } from "@angular/core"; import { CapabilityRequest } from "../../../../model/capability-request"; +import { JsonObject } from "@angular/compiler-cli/ngcc/src/packages/entry_point"; @Component({ selector: "app-parameters", @@ -12,4 +13,20 @@ export class ParametersComponent implements OnInit { constructor() {} ngOnInit(): void {} + + /** + * Check if JsonObject is empty + * Taken from: https://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object + * @param obj Object to be checked + * @return boolean true if object is empty; else false + */ + isEmpty(obj: JsonObject): boolean { + for (const prop in obj) { + if (obj.hasOwnProperty(prop)) { + return false; + } + } + + return true; + } } diff --git a/apps/web/src/app/workspaces/workspaces.component.html b/apps/web/src/app/workspaces/workspaces.component.html index 29b5c9d9d711ec71b05e6235e7a425071401c51f..71cfca09fc1fd5fb0285b9dc0c262978c5bc8e25 100644 --- a/apps/web/src/app/workspaces/workspaces.component.html +++ b/apps/web/src/app/workspaces/workspaces.component.html @@ -31,6 +31,16 @@ Launch null at NMT </button> </div> + <div class="d-flex px-2"> + <button + type="button" + id="launchNullDagCapability" + class="btn btn-secondary btn-lg" + (click)="nullDagButtonOnClick()" + > + Launch multi-stage null capability + </button> + </div> </div> </div> <div class="container border rounded py-3 my-3"> diff --git a/apps/web/src/app/workspaces/workspaces.component.ts b/apps/web/src/app/workspaces/workspaces.component.ts index 5e9d5d4686f3e7b7ac75469bd2d5d1270fe42b45..3b995cc0812516c77ec5727f9ceae9f8c8806cb5 100644 --- a/apps/web/src/app/workspaces/workspaces.component.ts +++ b/apps/web/src/app/workspaces/workspaces.component.ts @@ -1,9 +1,7 @@ import { Component, OnInit } from "@angular/core"; import { CapabilityLauncherService } from "./services/capability-launcher.service"; import { CapabilityRequest } from "./model/capability-request"; -import { CapabilityExecution } from "./model/capability-execution"; import { JsonObject } from "@angular/compiler-cli/ngcc/src/packages/entry_point"; -import { ActivatedRoute, Router } from "@angular/router"; import { CapabilityRequestService } from "./services/capability-request.service"; @Component({ @@ -51,6 +49,13 @@ export class WorkspacesComponent implements OnInit { this.launchCapability("null", { arguments: "-g", remote: true }); } + /** + * OnClick method that creates a capability request for the null_dag capability + */ + nullDagButtonOnClick(): void { + this.launchCapability("null_dag", {}); + } + /** * OnClick method that creates a capability request a given capability and submits it with the standard parameters: * - Product locator diff --git a/schema/versions/c717f781828d_add_null_dag_capability.py b/schema/versions/c717f781828d_add_null_dag_capability.py new file mode 100644 index 0000000000000000000000000000000000000000..fc9c8907736d6ab4cbe3692a9fbc5e9efc830f9b --- /dev/null +++ b/schema/versions/c717f781828d_add_null_dag_capability.py @@ -0,0 +1,25 @@ +"""add null_dag capability + +Revision ID: c717f781828d +Revises: 990c5cd70082 +Create Date: 2021-09-15 14:58:45.780793 + +""" +from alembic import op + +# revision identifiers, used by Alembic. +revision = "c717f781828d" +down_revision = "990c5cd70082" +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute( + "INSERT INTO capabilities (capability_name, capability_steps, max_jobs) VALUES " + "('null_dag', 'prepare-and-run-workflow null_dag\nawait-workflow', 2)" + ) + + +def downgrade(): + op.execute("DELETE FROM capabilities WHERE capability_name = 'null_dag'")