@@ -5,29 +5,33 @@ import {
55 PageSectionVariants ,
66 Skeleton ,
77} from '@patternfly/react-core' ;
8- import React , { useEffect , useState } from 'react' ;
8+ import React , { useEffect , useMemo , useState } from 'react' ;
99import { translate as __ , documentLocale } from 'foremanReact/common/I18n' ;
1010import { useDispatch , useSelector } from 'react-redux' ;
1111import PageLayout from 'foremanReact/routes/common/PageLayout/PageLayout' ;
1212import PropTypes from 'prop-types' ;
1313import SkeletonLoader from 'foremanReact/components/common/SkeletonLoader' ;
1414import { stopInterval } from 'foremanReact/redux/middlewares/IntervalMiddleware' ;
15- import { useAPI } from 'foremanReact/common/hooks/API/APIHooks' ;
15+ import { STATUS as API_STATUS } from 'foremanReact/constants' ;
16+ import {
17+ selectAPIErrorMessage ,
18+ selectAPIHttpStatus ,
19+ selectAPIStatus ,
20+ } from 'foremanReact/redux/API/APISelectors' ;
1621
1722import { JobAdditionInfo } from './JobAdditionInfo' ;
1823import JobInvocationHostTable from './JobInvocationHostTable' ;
1924import JobInvocationOverview from './JobInvocationOverview' ;
2025import JobInvocationSystemStatusChart from './JobInvocationSystemStatusChart' ;
26+ import JobInvocationEmptyState from './JobInvocationEmptyState' ;
2127import JobInvocationToolbarButtons from './JobInvocationToolbarButtons' ;
2228import { getJobInvocation , getTask } from './JobInvocationActions' ;
2329import './JobInvocationDetail.scss' ;
2430import {
25- CURRENT_PERMISSIONS ,
2631 DATE_OPTIONS ,
2732 JOB_INVOCATION_KEY ,
2833 STATUS ,
2934 STATUS_UPPERCASE ,
30- currentPermissionsUrl ,
3135} from './JobInvocationConstants' ;
3236import { selectItems } from './JobInvocationSelectors' ;
3337
@@ -51,9 +55,15 @@ const JobInvocationDetailPage = ({
5155 statusLabel === STATUS . SUCCEEDED ||
5256 statusLabel === STATUS . CANCELLED ;
5357 const autoRefresh = task ?. state === STATUS . PENDING || false ;
54- useAPI ( 'get' , currentPermissionsUrl , {
55- key : CURRENT_PERMISSIONS ,
56- } ) ;
58+ const jobInvocationApiStatus = useSelector ( state =>
59+ selectAPIStatus ( state , JOB_INVOCATION_KEY )
60+ ) ;
61+ const jobInvocationErrorMessage = useSelector ( state =>
62+ selectAPIErrorMessage ( state , JOB_INVOCATION_KEY )
63+ ) ;
64+ const jobInvocationHttpStatus = useSelector ( state =>
65+ selectAPIHttpStatus ( state , JOB_INVOCATION_KEY )
66+ ) ;
5767 const [ selectedFilter , setSelectedFilter ] = useState ( '' ) ;
5868
5969 const handleFilterChange = newFilter => {
@@ -88,6 +98,27 @@ const JobInvocationDetailPage = ({
8898 }
8999 } , [ dispatch , taskId ] ) ;
90100
101+ const apiFailed = jobInvocationApiStatus === API_STATUS . ERROR ;
102+
103+ const backendErrorMessage = useMemo ( ( ) => {
104+ if ( jobInvocationApiStatus === API_STATUS . ERROR ) {
105+ return jobInvocationErrorMessage || null ;
106+ }
107+ return null ;
108+ } , [ jobInvocationApiStatus , jobInvocationErrorMessage ] ) ;
109+
110+ const httpStatus = jobInvocationHttpStatus ;
111+
112+ if ( apiFailed ) {
113+ return (
114+ < JobInvocationEmptyState
115+ jobInvocationId = { id }
116+ httpStatus = { httpStatus }
117+ errorMessage = { backendErrorMessage }
118+ />
119+ ) ;
120+ }
121+
91122 const pageStatus =
92123 items . id === undefined
93124 ? STATUS_UPPERCASE . PENDING
@@ -123,7 +154,11 @@ const JobInvocationDetailPage = ({
123154 < PageLayout
124155 header = { description }
125156 breadcrumbOptions = { breadcrumbOptions }
126- toolbarButtons = { < JobInvocationToolbarButtons jobId = { id } data = { items } /> }
157+ toolbarButtons = {
158+ jobInvocationApiStatus === API_STATUS . SUCCESS && (
159+ < JobInvocationToolbarButtons jobId = { id } data = { items } />
160+ )
161+ }
127162 searchable = { false }
128163 >
129164 < Flex className = "job-invocation-detail-flex" >
0 commit comments