return "";
};
+export const msToTime = (time: number) => {
+ const minutes = Math.floor(time / (1000 * 60) % 60).toFixed(0);
+ const hours = Math.floor(time / (1000 * 60 * 60)).toFixed(0);
+
+ return hours + "h " + minutes + "m";
+};
+
+export const getDiffTime = (endTime: string, startTime: string) => {
+ return new Date(endTime).getTime() - new Date(startTime).getTime();
+};
+
export const formatProgress = (loaded: number, total: number) => {
const progress = loaded >= 0 && total > 0 ? loaded * 100 / total : 0;
return `${progress.toFixed(2)}%`;
import { ResourcesState, getResource } from '~/store/resources/resources';
import { filterResources } from '../resources/resources';
import { ResourceKind, Resource } from '~/models/resource';
+import { getDiffTime } from '~/common/formatters';
export interface Process {
containerRequest: ContainerRequestResource;
return [];
};
+export const getProcessRuntime = (subprocess: Process) =>
+ subprocess.container
+ ? getDiffTime(subprocess.container.finishedAt || '', subprocess.container.startedAt || '')
+ : 0;
+
export const getProcessStatus = (process: Process) =>
process.container
? process.container.state
import { Process } from '~/store/processes/process';
import { SubprocessesCard } from './subprocesses-card';
import { ProcessSubprocesses } from '~/views-components/process-subprocesses/process-subprocesses';
-import { SubprocessesStatus } from '~/views/process-panel/process-subprocesses';
+import { SubprocessesStatus } from '~/views/process-panel/process-subprocesses-card';
type CssRules = 'headerActive' | 'headerCompleted' | 'headerQueued' | 'headerFailed' | 'headerCanceled';
export interface ProcessPanelRootDataProps {
process?: Process;
+ subprocesses: Array<Process>;
}
export interface ProcessPanelRootActionProps {
onToggle={() => { return; }}
/>
</Grid>
- <ProcessSubprocesses />
+ <Grid item xs={12}>
+ <ProcessSubprocesses
+ subprocesses={props.subprocesses} />
+ </Grid>
</Grid>
: <Grid container
alignItems='center'
import * as React from 'react';
import { RootState } from '~/store/store';
import { connect } from 'react-redux';
-import { getProcess } from '~/store/processes/process';
+import { getProcess, getSubprocesses } from '~/store/processes/process';
import { Dispatch } from 'redux';
import { openProcessContextMenu } from '~/store/context-menu/context-menu-actions';
import { matchProcessRoute } from '~/routes/routes';
const match = matchProcessRoute(pathname);
const uuid = match ? match.params.id : '';
return {
- process: getProcess(uuid)(resources)
+ process: getProcess(uuid)(resources),
+ subprocesses: getSubprocesses(uuid)(resources)
};
};
import { MoreOptionsIcon } from '~/components/icon/icon';
import { DetailsAttribute } from '~/components/details-attribute/details-attribute';
import { getBackgroundColorStatus } from '~/views/process-panel/process-panel-root';
+import { Process, getProcessStatus, getProcessRuntime } from '~/store/processes/process';
+import { msToTime } from '~/common/formatters';
export type CssRules = 'label' | 'value' | 'title' | 'content' | 'action' | 'options' | 'status' | 'rightSideHeader' | 'titleHeader'
| 'header' | 'headerActive' | 'headerCompleted' | 'headerQueued' | 'headerFailed' | 'headerCanceled';
},
});
+export enum SubprocessesStatus {
+ ACTIVE = 'Active',
+ COMPLETED = 'Completed',
+ QUEUED = 'Queued',
+ FAILED = 'Failed',
+ CANCELED = 'Canceled'
+}
+
+export interface SubprocessItemProps {
+ title: string;
+ status: string;
+ runtime?: string;
+}
+
export interface ProcessSubprocessesCardDataProps {
onContextMenu: (event: React.MouseEvent<HTMLElement>) => void;
- items: any;
+ subprocess: Process;
}
type ProcessSubprocessesCardProps = ProcessSubprocessesCardDataProps & WithStyles<CssRules>;
export const ProcessSubprocessesCard = withStyles(styles)(
- ({ classes, onContextMenu, items }: ProcessSubprocessesCardProps) => {
+ ({ classes, onContextMenu, subprocess }: ProcessSubprocessesCardProps) => {
return <Card>
<CardHeader
- className={classnames([classes.header, getBackgroundColorStatus(items.status, classes)])}
+ className={classnames([classes.header, getBackgroundColorStatus(getProcessStatus(subprocess), classes)])}
classes={{ content: classes.title, action: classes.action }}
action={
<div className={classes.rightSideHeader}>
<Typography noWrap variant="body2" className={classes.status}>
- {items.status}
+ {getProcessStatus(subprocess)}
</Typography>
<IconButton
className={classes.options}
</div>
}
title={
- <Tooltip title={items.title}>
+ <Tooltip title={subprocess.containerRequest.name}>
<Typography noWrap variant="body2" className={classes.titleHeader}>
- {items.title}
+ {subprocess.containerRequest.name}
</Typography>
</Tooltip>
} />
<CardContent className={classes.content}>
<DetailsAttribute classLabel={classes.label} classValue={classes.value}
- label='Runtime' value="0h 2m" />
+ label="Runtime" value={msToTime(getProcessRuntime(subprocess))} />
</CardContent>
</Card>;
});
\ No newline at end of file
import * as React from 'react';
import { Grid } from '@material-ui/core';
import { ProcessSubprocessesCard } from '~/views/process-panel/process-subprocesses-card';
-
-export enum SubprocessesStatus {
- ACTIVE = 'Active',
- COMPLETED = 'Completed',
- QUEUED = 'Queued',
- FAILED = 'Failed',
- CANCELED = 'Canceled'
-}
+import { Process } from '~/store/processes/process';
export interface ProcessSubprocessesDataProps {
+ subprocesses: Array<Process>;
onContextMenu: (event: React.MouseEvent<HTMLElement>) => void;
}
-interface SubprocessesProps {
- title: string;
- status: string;
- runtime?: string;
-}
-
-export const ProcessSubprocesses = ({ onContextMenu }: ProcessSubprocessesDataProps) => {
+export const ProcessSubprocesses = ({ onContextMenu, subprocesses }: ProcessSubprocessesDataProps) => {
return <Grid container spacing={16}>
- {items.map(it =>
- <Grid item xs={2} key={it.title}>
- <ProcessSubprocessesCard onContextMenu={onContextMenu} items={it} />
+ {subprocesses.map(subprocess =>
+ <Grid item xs={2} key={subprocess.containerRequest.uuid}>
+ <ProcessSubprocessesCard onContextMenu={onContextMenu} subprocess={subprocess}/>
</Grid>
)}
</Grid>;
};
-
-const items: Array<SubprocessesProps> = [
- {
- title: 'cos1',
- status: SubprocessesStatus.ACTIVE
- },
- {
- title: 'cos2',
- status: SubprocessesStatus.FAILED
- },
- {
- title: 'cos3',
- status: SubprocessesStatus.QUEUED
- },
- {
- title: 'cos4',
- status: SubprocessesStatus.CANCELED
- },
- {
- title: 'cos5',
- status: SubprocessesStatus.COMPLETED
- },
- {
- title: 'cos6',
- status: SubprocessesStatus.COMPLETED
- },
- {
- title: 'cos7',
- status: SubprocessesStatus.COMPLETED
- },
-];
-