1- import React , { useState } from 'react' ;
1+ import React , { useCallback , useState } from 'react' ;
22
33import { JupyterFrontEnd } from '@jupyterlab/application' ;
44
77 ConfirmDialogStopButton
88} from '../../components/confirm-dialog-buttons' ;
99import { JobFileLink } from '../../components/job-file-link' ;
10- import { SchedulerService } from '../../handler' ;
10+ import { Scheduler , SchedulerService } from '../../handler' ;
1111import { useTranslator } from '../../hooks' ;
1212import { ICreateJobModel , IJobDetailModel , JobsView } from '../../model' ;
1313import { Scheduler as SchedulerTokens } from '../../tokens' ;
@@ -65,6 +65,31 @@ export function JobDetail(props: IJobDetailProps): JSX.Element {
6565
6666 const ss = new SchedulerService ( { } ) ;
6767
68+ const translateStatus = useCallback (
69+ ( status : Scheduler . Status ) => {
70+ // This may look inefficient, but it's intended to call the `trans` function
71+ // with distinct, static values, so that code analyzers can pick up all the
72+ // needed source strings.
73+ switch ( status ) {
74+ case 'CREATED' :
75+ return trans . __ ( 'Created' ) ;
76+ case 'QUEUED' :
77+ return trans . __ ( 'Queued' ) ;
78+ case 'COMPLETED' :
79+ return trans . __ ( 'Completed' ) ;
80+ case 'FAILED' :
81+ return trans . __ ( 'Failed' ) ;
82+ case 'IN_PROGRESS' :
83+ return trans . __ ( 'In progress' ) ;
84+ case 'STOPPED' :
85+ return trans . __ ( 'Stopped' ) ;
86+ case 'STOPPING' :
87+ return trans . __ ( 'Stopping' ) ;
88+ }
89+ } ,
90+ [ trans ]
91+ ) ;
92+
6893 const handleDeleteJob = async ( ) => {
6994 await ss . deleteJob ( props . model . jobId ?? '' ) ;
7095 props . setJobsView ( JobsView . ListJobs ) ;
@@ -90,15 +115,17 @@ export function JobDetail(props: IJobDetailProps): JSX.Element {
90115
91116 const ButtonBar = (
92117 < Stack direction = "row" gap = { 2 } justifyContent = "flex-end" flexWrap = { 'wrap' } >
93- { props . model . downloaded === false && props . model . status === 'COMPLETED' && (
94- < Button
95- variant = "outlined"
96- onClick = { downloadFiles }
97- disabled = { downloading }
98- >
99- { trans . __ ( 'Download Job Files' ) }
100- </ Button >
101- ) }
118+ { props . model . downloaded === false &&
119+ ( props . model . status === 'COMPLETED' ||
120+ props . model . status === 'FAILED' ) && (
121+ < Button
122+ variant = "outlined"
123+ onClick = { downloadFiles }
124+ disabled = { downloading }
125+ >
126+ { trans . __ ( 'Download Job Files' ) }
127+ </ Button >
128+ ) }
102129 { props . model . status === 'IN_PROGRESS' && (
103130 < ConfirmDialogStopButton
104131 handleStop = { handleStopJob }
@@ -140,7 +167,10 @@ export function JobDetail(props: IJobDetailProps): JSX.Element {
140167 }
141168 ] ,
142169 [
143- { value : props . model . status ?? '' , label : trans . __ ( 'Status' ) } ,
170+ {
171+ value : translateStatus ( props . model . status ! ) ,
172+ label : trans . __ ( 'Status' )
173+ } ,
144174 {
145175 value : timestampLocalize ( props . model . createTime ?? '' ) ,
146176 label : trans . __ ( 'Created at' )
@@ -165,7 +195,7 @@ export function JobDetail(props: IJobDetailProps): JSX.Element {
165195 ] ;
166196
167197 const hasOutputs =
168- props . model . status === 'COMPLETED' &&
198+ ( props . model . status === 'COMPLETED' || props . model . status === 'FAILED' ) &&
169199 props . model . job_files . some (
170200 jobFile => jobFile . file_format !== 'input' && jobFile . file_path
171201 ) ;
0 commit comments