Add YAML tab for Job Output event modal.

This commit is contained in:
Mikhail Yohman
2023-09-23 22:05:27 -06:00
committed by Dave
parent 0bdb01a9e9
commit 81d88df757
2 changed files with 50 additions and 12 deletions

View File

@@ -3,6 +3,7 @@ import { Modal, Tab, Tabs, TabTitleText } from '@patternfly/react-core';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { encode } from 'html-entities'; import { encode } from 'html-entities';
import { jsonToYaml } from 'util/yaml';
import StatusLabel from '../../../components/StatusLabel'; import StatusLabel from '../../../components/StatusLabel';
import { DetailList, Detail } from '../../../components/DetailList'; import { DetailList, Detail } from '../../../components/DetailList';
import ContentEmpty from '../../../components/ContentEmpty'; import ContentEmpty from '../../../components/ContentEmpty';
@@ -144,9 +145,28 @@ function HostEventModal({ onClose, hostEvent = {}, isOpen = false }) {
<ContentEmpty title={t`No JSON Available`} /> <ContentEmpty title={t`No JSON Available`} />
)} )}
</Tab> </Tab>
<Tab
eventKey={2}
title={<TabTitleText>{t`YAML`}</TabTitleText>}
aria-label={t`YAML tab`}
ouiaId="yaml-tab"
>
{activeTabKey === 2 && jsonObj ? (
<CodeEditor
mode="javascript"
readOnly
value={jsonToYaml(JSON.stringify(jsonObj))}
onChange={() => {}}
rows={20}
hasErrors={false}
/>
) : (
<ContentEmpty title={t`No YAML Available`} />
)}
</Tab>
{stdOut?.length ? ( {stdOut?.length ? (
<Tab <Tab
eventKey={2} eventKey={3}
title={<TabTitleText>{t`Output`}</TabTitleText>} title={<TabTitleText>{t`Output`}</TabTitleText>}
aria-label={t`Output tab`} aria-label={t`Output tab`}
ouiaId="standard-out-tab" ouiaId="standard-out-tab"
@@ -163,7 +183,7 @@ function HostEventModal({ onClose, hostEvent = {}, isOpen = false }) {
) : null} ) : null}
{stdErr?.length ? ( {stdErr?.length ? (
<Tab <Tab
eventKey={3} eventKey={4}
title={<TabTitleText>{t`Standard Error`}</TabTitleText>} title={<TabTitleText>{t`Standard Error`}</TabTitleText>}
aria-label={t`Standard error tab`} aria-label={t`Standard error tab`}
ouiaId="standard-error-tab" ouiaId="standard-error-tab"

View File

@@ -2,6 +2,7 @@ import React from 'react';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import { mountWithContexts } from '../../../../testUtils/enzymeHelpers'; import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import HostEventModal from './HostEventModal'; import HostEventModal from './HostEventModal';
import { jsonToYaml } from 'util/yaml';
const hostEvent = { const hostEvent = {
changed: true, changed: true,
@@ -167,6 +168,8 @@ const jsonValue = `{
] ]
}`; }`;
const yamlValue = jsonToYaml(jsonValue);
describe('HostEventModal', () => { describe('HostEventModal', () => {
test('initially renders successfully', () => { test('initially renders successfully', () => {
const wrapper = shallow( const wrapper = shallow(
@@ -187,7 +190,7 @@ describe('HostEventModal', () => {
<HostEventModal hostEvent={hostEvent} onClose={() => {}} isOpen /> <HostEventModal hostEvent={hostEvent} onClose={() => {}} isOpen />
); );
expect(wrapper.find('Tabs Tab').length).toEqual(4); expect(wrapper.find('Tabs Tab').length).toEqual(5);
}); });
test('should initially show details tab', () => { test('should initially show details tab', () => {
@@ -287,7 +290,7 @@ describe('HostEventModal', () => {
expect(codeEditor.prop('value')).toEqual(jsonValue); expect(codeEditor.prop('value')).toEqual(jsonValue);
}); });
test('should display Standard Out tab content on tab click', () => { test('should display YAML tab content on tab click', () => {
const wrapper = shallow( const wrapper = shallow(
<HostEventModal hostEvent={hostEvent} onClose={() => {}} isOpen /> <HostEventModal hostEvent={hostEvent} onClose={() => {}} isOpen />
); );
@@ -299,6 +302,21 @@ describe('HostEventModal', () => {
const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor'); const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript'); expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true); expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual(yamlValue);
});
test('should display Standard Out tab content on tab click', () => {
const wrapper = shallow(
<HostEventModal hostEvent={hostEvent} onClose={() => {}} isOpen />
);
const handleTabClick = wrapper.find('Tabs').prop('onSelect');
handleTabClick(null, 3);
wrapper.update();
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(hostEvent.event_data.res.stdout); expect(codeEditor.prop('value')).toEqual(hostEvent.event_data.res.stdout);
}); });
@@ -316,10 +334,10 @@ describe('HostEventModal', () => {
); );
const handleTabClick = wrapper.find('Tabs').prop('onSelect'); const handleTabClick = wrapper.find('Tabs').prop('onSelect');
handleTabClick(null, 3); handleTabClick(null, 4);
wrapper.update(); wrapper.update();
const codeEditor = wrapper.find('Tab[eventKey=3] CodeEditor'); const codeEditor = wrapper.find('Tab[eventKey=4] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript'); expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true); expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual('error content'); expect(codeEditor.prop('value')).toEqual('error content');
@@ -351,10 +369,10 @@ describe('HostEventModal', () => {
); );
const handleTabClick = wrapper.find('Tabs').prop('onSelect'); const handleTabClick = wrapper.find('Tabs').prop('onSelect');
handleTabClick(null, 2); handleTabClick(null, 3);
wrapper.update(); wrapper.update();
const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor'); const codeEditor = wrapper.find('Tab[eventKey=3] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript'); expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true); expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual('foo bar'); expect(codeEditor.prop('value')).toEqual('foo bar');
@@ -375,10 +393,10 @@ describe('HostEventModal', () => {
); );
const handleTabClick = wrapper.find('Tabs').prop('onSelect'); const handleTabClick = wrapper.find('Tabs').prop('onSelect');
handleTabClick(null, 2); handleTabClick(null, 3);
wrapper.update(); wrapper.update();
const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor'); const codeEditor = wrapper.find('Tab[eventKey=3] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript'); expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true); expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual('baz\nbar'); expect(codeEditor.prop('value')).toEqual('baz\nbar');
@@ -394,10 +412,10 @@ describe('HostEventModal', () => {
); );
const handleTabClick = wrapper.find('Tabs').prop('onSelect'); const handleTabClick = wrapper.find('Tabs').prop('onSelect');
handleTabClick(null, 2); handleTabClick(null, 3);
wrapper.update(); wrapper.update();
const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor'); const codeEditor = wrapper.find('Tab[eventKey=3] CodeEditor');
expect(codeEditor.prop('mode')).toBe('javascript'); expect(codeEditor.prop('mode')).toBe('javascript');
expect(codeEditor.prop('readOnly')).toBe(true); expect(codeEditor.prop('readOnly')).toBe(true);
expect(codeEditor.prop('value')).toEqual( expect(codeEditor.prop('value')).toEqual(