diff --git a/awx/ui/src/screens/Job/JobOutput/HostEventModal.js b/awx/ui/src/screens/Job/JobOutput/HostEventModal.js
index 95d8ee989b..9aa7012358 100644
--- a/awx/ui/src/screens/Job/JobOutput/HostEventModal.js
+++ b/awx/ui/src/screens/Job/JobOutput/HostEventModal.js
@@ -1,7 +1,6 @@
import React, { useEffect, useState } from 'react';
import { Modal, Tab, Tabs, TabTitleText } from '@patternfly/react-core';
import PropTypes from 'prop-types';
-
import { t } from '@lingui/macro';
import { encode } from 'html-entities';
import StatusLabel from '../../../components/StatusLabel';
@@ -37,10 +36,8 @@ const processEventStatus = (event) => {
const processCodeEditorValue = (value) => {
let codeEditorValue;
- if (value === undefined) {
- codeEditorValue = false;
- } else if (value === '') {
- codeEditorValue = ' ';
+ if (!value) {
+ codeEditorValue = '';
} else if (typeof value === 'string') {
codeEditorValue = encode(value);
} else {
@@ -49,8 +46,8 @@ const processCodeEditorValue = (value) => {
return codeEditorValue;
};
-const processStdOutValue = (hostEvent) => {
- const taskAction = hostEvent?.event_data?.taskAction;
+const getStdOutValue = (hostEvent) => {
+ const taskAction = hostEvent?.event_data?.task_action;
const res = hostEvent?.event_data?.res;
let stdOut;
@@ -61,8 +58,8 @@ const processStdOutValue = (hostEvent) => {
res.results &&
Array.isArray(res.results)
) {
- [stdOut] = res.results;
- } else if (res) {
+ stdOut = res.results.join('\n');
+ } else if (res?.stdout) {
stdOut = res.stdout;
}
return stdOut;
@@ -81,8 +78,8 @@ function HostEventModal({ onClose, hostEvent = {}, isOpen = false }) {
};
const jsonObj = processCodeEditorValue(hostEvent?.event_data?.res);
- const stdErr = processCodeEditorValue(hostEvent?.event_data?.res?.stderr);
- const stdOut = processCodeEditorValue(processStdOutValue(hostEvent));
+ const stdErr = hostEvent?.event_data?.res?.stderr;
+ const stdOut = processCodeEditorValue(getStdOutValue(hostEvent));
return (
)}
- {t`Standard Out`}}
- aria-label={t`Standard out tab`}
- ouiaId="standard-out-tab"
- >
- {activeTabKey === 2 && stdOut ? (
+ {stdOut?.length ? (
+ {t`Output`}}
+ aria-label={t`Output tab`}
+ ouiaId="standard-out-tab"
+ >
- ) : (
-
- )}
-
- {t`Standard Error`}}
- aria-label={t`Standard error tab`}
- ouiaId="standard-error-tab"
- >
- {activeTabKey === 3 && stdErr ? (
+
+ ) : null}
+ {stdErr?.length ? (
+ {t`Standard Error`}}
+ aria-label={t`Standard error tab`}
+ ouiaId="standard-error-tab"
+ >
- ) : (
-
- )}
-
+
+ ) : null}
);
diff --git a/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js b/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js
index 2882ba8ce3..1c429c4dd3 100644
--- a/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js
+++ b/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js
@@ -17,6 +17,7 @@ const hostEvent = {
msg: 'This is a debug message: 1',
stdout:
' total used free shared buff/cache available\nMem: 7973 3005 960 30 4007 4582\nSwap: 1023 0 1023',
+ stderr: 'problems',
cmd: ['free', '-m'],
stderr_lines: [],
stdout_lines: [
@@ -51,6 +52,7 @@ const jsonValue = `{
\"item\": \"1\",
\"msg\": \"This is a debug message: 1\",
\"stdout\": \" total used free shared buff/cache available\\nMem: 7973 3005 960 30 4007 4582\\nSwap: 1023 0 1023\",
+ \"stderr\": \"problems\",
\"cmd\": [
\"free\",
\"-m\"
@@ -169,7 +171,7 @@ describe('HostEventModal', () => {
handleTabClick(null, 1);
wrapper.update();
- const codeEditor = wrapper.find('CodeEditor');
+ const codeEditor = wrapper.find('Tab[eventKey=1] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual(jsonValue);
@@ -184,7 +186,7 @@ describe('HostEventModal', () => {
handleTabClick(null, 2);
wrapper.update();
- const codeEditor = wrapper.find('CodeEditor');
+ const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual(hostEvent.event_data.res.stdout);
@@ -195,7 +197,7 @@ describe('HostEventModal', () => {
...hostEvent,
event_data: {
res: {
- stderr: '',
+ stderr: 'error content',
},
},
};
@@ -207,10 +209,10 @@ describe('HostEventModal', () => {
handleTabClick(null, 3);
wrapper.update();
- const codeEditor = wrapper.find('CodeEditor');
+ const codeEditor = wrapper.find('Tab[eventKey=3] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true);
- expect(codeEditor.prop('value')).toEqual(' ');
+ expect(codeEditor.prop('value')).toEqual('error content');
});
test('should pass onClose to Modal', () => {
@@ -226,7 +228,7 @@ describe('HostEventModal', () => {
const debugTaskAction = {
...hostEvent,
event_data: {
- taskAction: 'debug',
+ task_action: 'debug',
res: {
result: {
stdout: 'foo bar',
@@ -242,7 +244,7 @@ describe('HostEventModal', () => {
handleTabClick(null, 2);
wrapper.update();
- const codeEditor = wrapper.find('CodeEditor');
+ const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual('foo bar');
@@ -252,7 +254,7 @@ describe('HostEventModal', () => {
const yumTaskAction = {
...hostEvent,
event_data: {
- taskAction: 'yum',
+ task_action: 'yum',
res: {
results: ['baz', 'bar'],
},
@@ -266,9 +268,9 @@ describe('HostEventModal', () => {
handleTabClick(null, 2);
wrapper.update();
- const codeEditor = wrapper.find('CodeEditor');
+ const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true);
- expect(codeEditor.prop('value')).toEqual('baz');
+ expect(codeEditor.prop('value')).toEqual('baz\nbar');
});
});