diff --git a/frontend/src/pages/Runs/Details/Jobs/Details/JobDetails/index.tsx b/frontend/src/pages/Runs/Details/Jobs/Details/JobDetails/index.tsx index 09252a70b..724168d07 100644 --- a/frontend/src/pages/Runs/Details/Jobs/Details/JobDetails/index.tsx +++ b/frontend/src/pages/Runs/Details/Jobs/Details/JobDetails/index.tsx @@ -9,6 +9,7 @@ import { useGetRunQuery } from 'services/run'; import { getJobError, + getJobFinishedAt, getJobListItemBackend, getJobListItemInstance, getJobListItemPrice, @@ -59,6 +60,11 @@ export const JobDetails = () => {
{getJobSubmittedAt(jobData)}
+
+ {t('projects.run.finished_at')} +
{getJobFinishedAt(jobData)}
+
+
{t('projects.run.status')}
diff --git a/frontend/src/pages/Runs/Details/Jobs/List/helpers.ts b/frontend/src/pages/Runs/Details/Jobs/List/helpers.ts index 083d80e16..71247dce6 100644 --- a/frontend/src/pages/Runs/Details/Jobs/List/helpers.ts +++ b/frontend/src/pages/Runs/Details/Jobs/List/helpers.ts @@ -39,6 +39,11 @@ export const getJobSubmittedAt = (job: IJob) => { : ''; }; +export const getJobFinishedAt = (job: IJob) => { + const finished_at = job.job_submissions?.[job.job_submissions.length - 1].finished_at; + return finished_at ? format(new Date(finished_at), DATE_TIME_FORMAT) : ''; +}; + export const getJobStatus = (job: IJob) => { return job.job_submissions?.[job.job_submissions.length - 1].status; }; diff --git a/frontend/src/pages/Runs/Details/Jobs/List/hooks.tsx b/frontend/src/pages/Runs/Details/Jobs/List/hooks.tsx index 999712c2a..a5fabd5a2 100644 --- a/frontend/src/pages/Runs/Details/Jobs/List/hooks.tsx +++ b/frontend/src/pages/Runs/Details/Jobs/List/hooks.tsx @@ -8,6 +8,7 @@ import { ROUTES } from 'routes'; import { getJobError, + getJobFinishedAt, getJobListItemBackend, getJobListItemInstance, getJobListItemPrice, @@ -48,6 +49,11 @@ export const useColumnsDefinitions = ({ header: t('projects.run.submitted_at'), cell: getJobSubmittedAt, }, + { + id: 'finished_at', + header: t('projects.run.finished_at'), + cell: getJobFinishedAt, + }, { id: 'status', header: t('projects.run.status'), diff --git a/frontend/src/pages/Runs/Details/RunDetails/index.tsx b/frontend/src/pages/Runs/Details/RunDetails/index.tsx index fae251eff..1547fa886 100644 --- a/frontend/src/pages/Runs/Details/RunDetails/index.tsx +++ b/frontend/src/pages/Runs/Details/RunDetails/index.tsx @@ -15,6 +15,7 @@ import { finishedRunStatuses } from 'pages/Runs/constants'; import { runIsStopped } from 'pages/Runs/utils'; import { + getRunListFinishedAt, getRunListItemBackend, getRunListItemInstanceId, getRunListItemPrice, @@ -59,6 +60,8 @@ export const RunDetails = () => { ? runData.latest_job_submission?.termination_reason : null; + const finishedAt = getRunListFinishedAt(runData); + return ( <> {t('common.general')}}> @@ -101,7 +104,7 @@ export const RunDetails = () => {
{t('projects.run.finished_at')} -
{runData.terminated_at ? format(new Date(runData.terminated_at), DATE_TIME_FORMAT) : '-'}
+
{finishedAt ? format(new Date(finishedAt), DATE_TIME_FORMAT) : '-'}
diff --git a/frontend/src/pages/Runs/List/Preferences/consts.ts b/frontend/src/pages/Runs/List/Preferences/consts.ts index 334b6e01f..bffa6b83f 100644 --- a/frontend/src/pages/Runs/List/Preferences/consts.ts +++ b/frontend/src/pages/Runs/List/Preferences/consts.ts @@ -9,12 +9,12 @@ export const DEFAULT_PREFERENCES: CollectionPreferencesProps.Preferences = { { id: 'hub_user_name', visible: true }, { id: 'price', visible: true }, { id: 'submitted_at', visible: true }, + { id: 'finished_at', visible: true }, { id: 'status', visible: true }, { id: 'error', visible: true }, { id: 'cost', visible: true }, // hidden by default { id: 'priority', visible: false }, - { id: 'finished_at', visible: false }, { id: 'project', visible: false }, { id: 'repo', visible: false }, { id: 'instance', visible: false }, diff --git a/frontend/src/pages/Runs/List/helpers.ts b/frontend/src/pages/Runs/List/helpers.ts index 893a5fdbc..4d9918bc7 100644 --- a/frontend/src/pages/Runs/List/helpers.ts +++ b/frontend/src/pages/Runs/List/helpers.ts @@ -2,7 +2,7 @@ import { groupBy as _groupBy } from 'lodash'; import { getBaseUrl } from 'App/helpers'; -import { finishedJobs } from '../constants'; +import { finishedJobs, finishedRunStatuses } from '../constants'; import { getJobStatus } from '../Details/Jobs/List/helpers'; export const getGroupedRunsByProjectAndRepoID = (runs: IRun[]) => { @@ -98,3 +98,10 @@ export const getRunListItemSchedule = (run: IRun) => { return run.run_spec.configuration.schedule.cron.join(', '); }; + +export const getRunListFinishedAt = (run: IRun) => { + if (!run.latest_job_submission || !run.latest_job_submission.finished_at || !finishedRunStatuses.includes(run.status)) { + return null; + } + return run.latest_job_submission.finished_at; +}; diff --git a/frontend/src/pages/Runs/List/hooks/useColumnsDefinitions.tsx b/frontend/src/pages/Runs/List/hooks/useColumnsDefinitions.tsx index c53d9688a..9f0514342 100644 --- a/frontend/src/pages/Runs/List/hooks/useColumnsDefinitions.tsx +++ b/frontend/src/pages/Runs/List/hooks/useColumnsDefinitions.tsx @@ -18,6 +18,7 @@ import { ROUTES } from 'routes'; import { finishedRunStatuses } from 'pages/Runs/constants'; import { + getRunListFinishedAt, getRunListItemBackend, getRunListItemInstance, getRunListItemPrice, @@ -68,7 +69,10 @@ export const useColumnsDefinitions = () => { { id: 'finished_at', header: t('projects.run.finished_at'), - cell: (item: IRun) => (item.terminated_at ? format(new Date(item.terminated_at), DATE_TIME_FORMAT) : null), + cell: (item: IRun) => { + const finishedAt = getRunListFinishedAt(item); + return finishedAt ? format(new Date(finishedAt), DATE_TIME_FORMAT) : '-'; + }, }, { id: 'status', diff --git a/frontend/src/types/run.d.ts b/frontend/src/types/run.d.ts index b8e464095..81146b2f6 100644 --- a/frontend/src/types/run.d.ts +++ b/frontend/src/types/run.d.ts @@ -228,6 +228,7 @@ declare interface IJobSubmission { submission_num: number; status: TJobStatus; submitted_at: number; + finished_at: string | null; termination_reason?: string | null; termination_reason_message?: string | null; exit_status?: number | null; @@ -283,7 +284,6 @@ declare interface IRun { project_name: string; user: string; submitted_at: string; - terminated_at: string | null; status: TJobStatus; error?: string | null; jobs: IJob[];