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' ;
@@ -14,7 +14,10 @@ import SkeletonLoader from 'foremanReact/components/common/SkeletonLoader';
1414import { stopInterval } from 'foremanReact/redux/middlewares/IntervalMiddleware' ;
1515import { useAPI } from 'foremanReact/common/hooks/API/APIHooks' ;
1616import { STATUS as API_STATUS } from 'foremanReact/constants' ;
17- import { selectAPIStatus } from 'foremanReact/redux/API/APISelectors' ;
17+ import {
18+ selectAPIResponse ,
19+ selectAPIStatus ,
20+ } from 'foremanReact/redux/API/APISelectors' ;
1821
1922import { JobAdditionInfo } from './JobAdditionInfo' ;
2023import JobInvocationHostTable from './JobInvocationHostTable' ;
@@ -32,7 +35,7 @@ import {
3235 STATUS_UPPERCASE ,
3336 currentPermissionsUrl ,
3437} from './JobInvocationConstants' ;
35- import { selectItems } from './JobInvocationSelectors' ;
38+ import { formatForemanApiError , selectItems } from './JobInvocationSelectors' ;
3639
3740const JobInvocationDetailPage = ( {
3841 match : {
@@ -54,16 +57,20 @@ const JobInvocationDetailPage = ({
5457 statusLabel === STATUS . SUCCEEDED ||
5558 statusLabel === STATUS . CANCELLED ;
5659 const autoRefresh = task ?. state === STATUS . PENDING || false ;
57- const { status : permissionsApiStatus } = useAPI (
58- 'get' ,
59- currentPermissionsUrl ,
60- {
61- key : CURRENT_PERMISSIONS ,
62- }
63- ) ;
60+ const {
61+ status : permissionsApiStatus ,
62+ response : permissionsApiResponse ,
63+ } = useAPI ( 'get' , currentPermissionsUrl , {
64+ key : CURRENT_PERMISSIONS ,
65+ } ) ;
6466 const jobInvocationApiStatus = useSelector ( state =>
6567 selectAPIStatus ( state , JOB_INVOCATION_KEY )
6668 ) ;
69+ const jobInvocationApiErrorPayload = useSelector ( state =>
70+ jobInvocationApiStatus === API_STATUS . ERROR
71+ ? selectAPIResponse ( state , JOB_INVOCATION_KEY )
72+ : null
73+ ) ;
6774 const [ selectedFilter , setSelectedFilter ] = useState ( '' ) ;
6875
6976 const handleFilterChange = newFilter => {
@@ -102,8 +109,35 @@ const JobInvocationDetailPage = ({
102109 permissionsApiStatus === API_STATUS . ERROR ||
103110 jobInvocationApiStatus === API_STATUS . ERROR ;
104111
112+ const backendErrorMessage = useMemo ( ( ) => {
113+ const parts = [ ] ;
114+ if ( jobInvocationApiStatus === API_STATUS . ERROR ) {
115+ const msg = formatForemanApiError ( jobInvocationApiErrorPayload ) ;
116+ if ( msg ) {
117+ parts . push ( msg ) ;
118+ }
119+ }
120+ if ( permissionsApiStatus === API_STATUS . ERROR ) {
121+ const msg = formatForemanApiError ( permissionsApiResponse ) ;
122+ if ( msg ) {
123+ parts . push ( msg ) ;
124+ }
125+ }
126+ return parts . length ? parts . join ( '\n\n' ) : null ;
127+ } , [
128+ jobInvocationApiStatus ,
129+ permissionsApiStatus ,
130+ jobInvocationApiErrorPayload ,
131+ permissionsApiResponse ,
132+ ] ) ;
133+
105134 if ( apiFailed ) {
106- return < JobInvocationEmptyState jobInvocationId = { id } /> ;
135+ return (
136+ < JobInvocationEmptyState
137+ jobInvocationId = { id }
138+ errorMessage = { backendErrorMessage }
139+ />
140+ ) ;
107141 }
108142
109143 const pageStatus =
0 commit comments