Container req state up & properties removed
authorLisa Knox <lisaknox83@gmail.com>
Tue, 29 Nov 2022 22:32:28 +0000 (17:32 -0500)
committerLisa Knox <lisaknox83@gmail.com>
Tue, 29 Nov 2022 22:33:40 +0000 (17:33 -0500)
Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox@curii.com>

src/common/formatters.ts
src/models/container-request.ts
src/services/groups-service/groups-service.ts
src/views-components/data-explorer/renderers.tsx
src/views/project-panel/project-panel.tsx

index c03bf04b71b2e237143a5b29ed66875978538b28..b4b9bc41381085bb1691a1a4908c14c58ec471b8 100644 (file)
@@ -129,12 +129,3 @@ export const formatContainerCost = (cost: number): string => {
     return `$${rounded}`;
   }
 };
-
-export const formatObjectProperties = (untypedObj: Object) => {
-  type kVPair = [string, string];
-  let formattedObject: Array<kVPair> = [];
-  for (const key in untypedObj) {
-    formattedObject.push([key, untypedObj[key]]);
-  }
-  return formattedObject;
-};
index dc6bd84fb01690e857e740f3e0775c02fc0ed6b9..90e7dea9a90dbc8286c08b804a3a68fc82208612 100644 (file)
@@ -2,41 +2,43 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { Resource, ResourceKind, ResourceWithProperties } from "./resource";
-import { MountType } from "models/mount-types";
+import { Resource, ResourceKind, ResourceWithProperties } from './resource';
+import { MountType } from 'models/mount-types';
 import { RuntimeConstraints } from './runtime-constraints';
 import { SchedulingParameters } from './scheduling-parameters';
 
 export enum ContainerRequestState {
-    UNCOMMITTED = "Uncommitted",
-    COMMITTED = "Committed",
-    FINAL = "Final"
+  UNCOMMITTED = 'Uncommitted',
+  COMMITTED = 'Committed',
+  FINAL = 'Final',
 }
 
-export interface ContainerRequestResource extends Resource, ResourceWithProperties {
-    kind: ResourceKind.CONTAINER_REQUEST;
-    name: string;
-    description: string;
-    state: ContainerRequestState;
-    requestingContainerUuid: string | null;
-    cumulativeCost: number;
-    containerUuid: string | null;
-    containerCountMax: number;
-    mounts: {[path: string]: MountType};
-    runtimeConstraints: RuntimeConstraints;
-    schedulingParameters: SchedulingParameters;
-    containerImage: string;
-    environment: any;
-    cwd: string;
-    command: string[];
-    outputPath: string;
-    outputName: string;
-    outputTtl: number;
-    priority: number | null;
-    expiresAt: string;
-    useExisting: boolean;
-    logUuid: string | null;
-    outputUuid: string | null;
-    filters: string;
-    containerCount: number;
+export interface ContainerRequestResource
+  extends Resource,
+    ResourceWithProperties {
+  kind: ResourceKind.CONTAINER_REQUEST;
+  name: string;
+  description: string;
+  state: ContainerRequestState;
+  requestingContainerUuid: string | null;
+  cumulativeCost: number;
+  containerUuid: string | null;
+  containerCountMax: number;
+  mounts: { [path: string]: MountType };
+  runtimeConstraints: RuntimeConstraints;
+  schedulingParameters: SchedulingParameters;
+  containerImage: string;
+  environment: any;
+  cwd: string;
+  command: string[];
+  outputPath: string;
+  outputName: string;
+  outputTtl: number;
+  priority: number | null;
+  expiresAt: string;
+  useExisting: boolean;
+  logUuid: string | null;
+  outputUuid: string | null;
+  filters: string;
+  containerCount: number;
 }
index dc6a798cf1c48c0ae4fa168c707a5266cc13495a..1e9078d9382ecb508c36100a2c7246a0396f74d3 100644 (file)
@@ -2,79 +2,95 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { snakeCase, camelCase } from "lodash";
+import { snakeCase, camelCase } from 'lodash';
 import { CommonResourceService } from 'services/common-service/common-resource-service';
-import { ListResults, ListArguments } from 'services/common-service/common-service';
-import { AxiosInstance, AxiosRequestConfig } from "axios";
-import { CollectionResource } from "models/collection";
-import { ProjectResource } from "models/project";
-import { ProcessResource } from "models/process";
-import { WorkflowResource } from "models/workflow";
-import { TrashableResourceService } from "services/common-service/trashable-resource-service";
-import { ApiActions } from "services/api/api-actions";
-import { GroupResource } from "models/group";
-import { Session } from "models/session";
+import {
+  ListResults,
+  ListArguments,
+} from 'services/common-service/common-service';
+import { AxiosInstance, AxiosRequestConfig } from 'axios';
+import { CollectionResource } from 'models/collection';
+import { ProjectResource } from 'models/project';
+import { ProcessResource } from 'models/process';
+import { WorkflowResource } from 'models/workflow';
+import { TrashableResourceService } from 'services/common-service/trashable-resource-service';
+import { ApiActions } from 'services/api/api-actions';
+import { GroupResource } from 'models/group';
+import { Session } from 'models/session';
 
 export interface ContentsArguments {
-    limit?: number;
-    offset?: number;
-    order?: string;
-    filters?: string;
-    recursive?: boolean;
-    includeTrash?: boolean;
-    excludeHomeProject?: boolean;
+  limit?: number;
+  offset?: number;
+  order?: string;
+  filters?: string;
+  recursive?: boolean;
+  includeTrash?: boolean;
+  excludeHomeProject?: boolean;
 }
 
 export interface SharedArguments extends ListArguments {
-    include?: string;
+  include?: string;
 }
 
 export type GroupContentsResource =
-    CollectionResource |
-    ProjectResource |
-    ProcessResource |
-    WorkflowResource;
+  | CollectionResource
+  | ProjectResource
+  | ProcessResource
+  | WorkflowResource;
 
-export class GroupsService<T extends GroupResource = GroupResource> extends TrashableResourceService<T> {
+export class GroupsService<
+  T extends GroupResource = GroupResource
+> extends TrashableResourceService<T> {
+  constructor(serverApi: AxiosInstance, actions: ApiActions) {
+    super(serverApi, 'groups', actions);
+  }
 
-    constructor(serverApi: AxiosInstance, actions: ApiActions) {
-        super(serverApi, "groups", actions);
-    }
+  async contents(
+    uuid: string,
+    args: ContentsArguments = {},
+    session?: Session
+  ): Promise<ListResults<GroupContentsResource>> {
+    const { filters, order, ...other } = args;
+    const params = {
+      ...other,
+      filters: filters ? `[${filters}]` : undefined,
+      order: order ? order : undefined,
+    };
+    const pathUrl = uuid ? `/${uuid}/contents` : '/contents';
 
-    async contents(uuid: string, args: ContentsArguments = {}, session?: Session): Promise<ListResults<GroupContentsResource>> {
-        const { filters, order, ...other } = args;
-        const params = {
-            ...other,
-            filters: filters ? `[${filters}]` : undefined,
-            order: order ? order : undefined
-        };
-        const pathUrl = uuid ? `/${uuid}/contents` : '/contents';
+    const cfg: AxiosRequestConfig = {
+      params: CommonResourceService.mapKeys(snakeCase)(params),
+    };
+    if (session) {
+      cfg.baseURL = session.baseUrl;
+      cfg.headers = { Authorization: 'Bearer ' + session.token };
+    }
 
-        const cfg: AxiosRequestConfig = { params: CommonResourceService.mapKeys(snakeCase)(params) };
-        if (session) {
-            cfg.baseURL = session.baseUrl;
-            cfg.headers = { 'Authorization': 'Bearer ' + session.token };
-        }
+    const response = await CommonResourceService.defaultResponse(
+      this.serverApi.get(this.resourceType + pathUrl, cfg),
+      this.actions,
+      false
+    );
 
-        const response = await CommonResourceService.defaultResponse(
-            this.serverApi.get(this.resourceType + pathUrl, cfg), this.actions, false
-        );
+    return {
+      ...TrashableResourceService.mapKeys(camelCase)(response),
+      clusterId: session && session.clusterId,
+    };
+  }
 
-        return { ...TrashableResourceService.mapKeys(camelCase)(response), clusterId: session && session.clusterId };
-    }
-
-    shared(params: SharedArguments = {}): Promise<ListResults<GroupContentsResource>> {
-        return CommonResourceService.defaultResponse(
-            this.serverApi
-                .get(this.resourceType + '/shared', { params }),
-            this.actions
-        );
-    }
+  shared(
+    params: SharedArguments = {}
+  ): Promise<ListResults<GroupContentsResource>> {
+    return CommonResourceService.defaultResponse(
+      this.serverApi.get(this.resourceType + '/shared', { params }),
+      this.actions
+    );
+  }
 }
 
 export enum GroupContentsResourcePrefix {
-    COLLECTION = "collections",
-    PROJECT = "groups",
-    PROCESS = "container_requests",
-    WORKFLOW = "workflows"
+  COLLECTION = 'collections',
+  PROJECT = 'groups',
+  PROCESS = 'container_requests',
+  WORKFLOW = 'workflows',
 }
index 1623f17674622a8791f3c6e36efdae3efcbdd0ab..17bd3f2a884c3f25b25c170cec7363fd58695fde 100644 (file)
@@ -30,7 +30,7 @@ import {
     SetupIcon,
     InactiveIcon,
 } from 'components/icon/icon';
-import { formatDate, formatFileSize, formatTime, formatObjectProperties} from 'common/formatters';
+import { formatDate, formatFileSize, formatTime } from 'common/formatters';
 import { resourceLabel } from 'common/labels';
 import { connect, DispatchProp } from 'react-redux';
 import { RootState } from 'store/store';
@@ -61,6 +61,7 @@ import { getUserUuid } from 'common/getuser';
 import { VirtualMachinesResource } from 'models/virtual-machines';
 import { CopyToClipboardSnackbar } from 'components/copy-to-clipboard-snackbar/copy-to-clipboard-snackbar';
 import { ProjectResource } from 'models/project';
+import {ContainerRequestResource} from 'models/container-request'
 
 const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
 
@@ -664,6 +665,14 @@ export const ResourceWorkflowStatus = connect(
         };
     })((props: { ownerUuid?: string, uuidPrefix: string }) => renderWorkflowStatus(props.uuidPrefix, props.ownerUuid));
 
+const renderProcessState = (processState: string) => <Typography>{processState}</Typography>
+
+export const ResourceProcessState = connect(
+    (state: RootState, props: { uuid: string }) => {
+        const resource = getResource<ContainerRequestResource>(props.uuid)(state.resources);
+        return { state: resource?.state ? resource.state: '' };
+    })((props: { state: string }) => renderProcessState(props.state));
+
 export const ResourceCreatedAtDate = connect(
     (state: RootState, props: { uuid: string }) => {
         const resource = getResource<GroupContentsResource>(props.uuid)(state.resources);
@@ -726,23 +735,21 @@ export const ResourceOwnerName = connect(
 export const ResourceUUID = connect(
     (state: RootState, props: { uuid: string }) => {
         const resource = getResource<CollectionResource>(props.uuid)(state.resources);
-        console.log('COLLECTION_RESOIRCE', resource)
         return { uuid: resource ? resource.uuid : '' };
     })((props: { uuid: string }) => renderUuid({uuid: props.uuid}));
-
-const renderMetadata = (metadata:any) => {
-    return <>{formatObjectProperties(metadata).map((property, i)=>
-        <Typography key={i} noWrap>{property[0]}: {property[1]}</Typography>
-    )}</>
-}
-
-export const ResourceMetadata = connect(
+    
+const renderPortableDataHash = (portableDataHash:string | null) => 
+    <Typography noWrap>
+        {portableDataHash ? <>{portableDataHash}
+        <CopyToClipboardSnackbar value={portableDataHash} /></> : '-' }
+    </Typography>
+    
+export const ResourcePortableDataHash = connect(
     (state: RootState, props: { uuid: string }) => {
         const resource = getResource<CollectionResource>(props.uuid)(state.resources);
-        const metadata = resource && Object.keys(resource.properties).length ? resource.properties : {}
-        if(resource && resource.portableDataHash) metadata['Portable Data Hash'] = resource.portableDataHash
-        return { properties: metadata };
-    })((props: { properties: string }) => renderMetadata(props.properties));
+        // console.log('COLLECTION_RESOIRCE', resource)
+        return { portableDataHash: resource ? resource.portableDataHash : '' };    
+    })((props: { portableDataHash: string }) => renderPortableDataHash(props.portableDataHash));
 
 const renderVersion = (version: number) =>{
     return <Typography>{version ?? '-'}</Typography>
index 4723e409aab649b384aaa47aca9357ca7f62f434..465178e7ffeca7b608bd13d594e749adb641901a 100644 (file)
@@ -25,7 +25,8 @@ import {
     ProcessStatus,
     ResourceType,
     ResourceUUID,
-    ResourceMetadata,
+    ResourceProcessState,
+    ResourcePortableDataHash,
     ResourceVersion,
     ResourceDescription,
     ResourceOwnerWithName
@@ -74,12 +75,13 @@ export enum ProjectPanelColumnNames {
     FILE_SIZE = "File size",
     FILE_COUNT = "File count",
     UUID = "UUID",
+    STATE = 'State',
     CREATED_AT = "Date created",
     LAST_MODIFIED = "Last modified",
     TRASH_AT = "Trash at",
     DELETE_AT = "Delete at",
     DESCRIPTION = "Description",
-    METADATA = "Metadata",
+    PORTABLE_DATA_HASH = "Portable Data Hash",
     VERSION = "Version"
 }
 
@@ -140,11 +142,18 @@ export const projectPanelColumns: DataColumns<string> = [
         render: uuid => <ResourceUUID uuid={uuid}/>
     },
     {
-        name: ProjectPanelColumnNames.METADATA,
-        selected: false,
+        name: ProjectPanelColumnNames.STATE,
+        selected: true,
+        configurable: true,
+        filters: createTree(),
+        render: uuid => <ResourceProcessState uuid={uuid}/>
+    },
+    {
+        name: ProjectPanelColumnNames.PORTABLE_DATA_HASH,
+        selected: true,
         configurable: true,
         filters: createTree(),
-        render: uuid => <ResourceMetadata uuid={uuid}/>
+        render: uuid => <ResourcePortableDataHash uuid={uuid}/>
     },
     {
         name: ProjectPanelColumnNames.CREATED_AT,