diff --git a/awx/ui_next/src/screens/Job/JobDetail/JobDetail.jsx b/awx/ui_next/src/screens/Job/JobDetail/JobDetail.jsx index 9e79d4de1b..9ee8e2a94e 100644 --- a/awx/ui_next/src/screens/Job/JobDetail/JobDetail.jsx +++ b/awx/ui_next/src/screens/Job/JobDetail/JobDetail.jsx @@ -133,13 +133,15 @@ function JobDetail({ job, i18n }) { return ( - {/* TODO: hookup status to websockets */} {job.status && } - {toTitleCase(job.status)} + {job.job_explanation + ? job.job_explanation + : toTitleCase(job.status)} } /> diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 88e32be49f..7d7519d3f6 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -261,6 +261,8 @@ class JobOutput extends Component { this._isMounted = true; this.loadJobEvents(); + if (job.result_traceback) return; + connectJobSocket(job, data => { if (data.counter && data.counter > this.jobSocketCounter) { this.jobSocketCounter = data.counter; @@ -326,10 +328,32 @@ class JobOutput extends Component { }); this._isMounted && this.setState(({ results }) => { + let countOffset = 1; + if (job?.result_traceback) { + const tracebackEvent = { + counter: -1, + created: null, + event: null, + type: null, + stdout: job?.result_traceback, + start_line: 0, + }; + const firstIndex = newResults.findIndex( + jobEvent => jobEvent.counter === 1 + ); + if (firstIndex) { + const stdoutLines = newResults[firstIndex].stdout.split('\r\n'); + stdoutLines[0] = tracebackEvent.stdout; + newResults[firstIndex].stdout = stdoutLines.join('\r\n'); + } else { + countOffset += 1; + newResults.unshift(tracebackEvent); + } + } newResults.forEach(jobEvent => { results[jobEvent.counter] = jobEvent; }); - return { results, remoteRowCount: count + 1 }; + return { results, remoteRowCount: count + countOffset }; }); } catch (err) { this.setState({ contentError: err });