diff --git a/awx/ui/src/screens/Job/JobOutput/EmptyOutput.js b/awx/ui/src/screens/Job/JobOutput/EmptyOutput.js index 69e21eba5cdc..aaa92878ffd7 100644 --- a/awx/ui/src/screens/Job/JobOutput/EmptyOutput.js +++ b/awx/ui/src/screens/Job/JobOutput/EmptyOutput.js @@ -1,17 +1,29 @@ import React, { useEffect } from 'react'; +import { Link, useParams } from 'react-router-dom'; import 'styled-components/macro'; import { t } from '@lingui/macro'; -import { SearchIcon } from '@patternfly/react-icons'; +import { + SearchIcon, + ExclamationCircleIcon as PFExclamationCircleIcon, +} from '@patternfly/react-icons'; import ContentEmpty from 'components/ContentEmpty'; +import styled from 'styled-components'; + +const ExclamationCircleIcon = styled(PFExclamationCircleIcon)` + color: var(--pf-global--danger-color--100); +`; + export default function EmptyOutput({ hasQueryParams, isJobRunning, onUnmount, + job, }) { let title; let message; let icon; + const { typeSegment, id } = useParams(); useEffect(() => onUnmount); @@ -21,6 +33,21 @@ export default function EmptyOutput({ icon = SearchIcon; } else if (isJobRunning) { title = t`Waiting for job output…`; + } else if (job.status === 'failed') { + title = t`This job failed and has no output.`; + message = ( + <> + {t`Return to `}{' '} + {t`details.`} +
+ {job.job_explanation && ( + <> + {t`Failure Explanation:`} {`${job.job_explanation}`} + + )} + + ); + icon = ExclamationCircleIcon; } else { title = t`No output found for this job.`; } diff --git a/awx/ui/src/screens/Job/JobOutput/JobOutput.js b/awx/ui/src/screens/Job/JobOutput/JobOutput.js index ac5383e0d699..386fb87c56df 100644 --- a/awx/ui/src/screens/Job/JobOutput/JobOutput.js +++ b/awx/ui/src/screens/Job/JobOutput/JobOutput.js @@ -687,6 +687,7 @@ function JobOutput({ job, eventRelatedSearchableKeys, eventSearchableKeys }) { ) { return ( 1} isJobRunning={isJobRunning(jobStatus)} onUnmount={() => { diff --git a/awx/ui/src/screens/Job/JobOutput/JobOutput.test.js b/awx/ui/src/screens/Job/JobOutput/JobOutput.test.js index 19af8a76d6d3..423595d0f96b 100644 --- a/awx/ui/src/screens/Job/JobOutput/JobOutput.test.js +++ b/awx/ui/src/screens/Job/JobOutput/JobOutput.test.js @@ -134,4 +134,20 @@ describe('', () => { }); await waitForElement(wrapper, 'ContentError', (el) => el.length === 1); }); + test('should show failed empty output screen', async () => { + JobsAPI.readEvents.mockResolvedValue({ + data: { + count: 0, + next: null, + previous: null, + results: [], + }, + }); + await act(async () => { + wrapper = mountWithContexts( + + ); + }); + await waitForElement(wrapper, 'EmptyOutput', (el) => el.length === 1); + }); });