Fix tests

This commit is contained in:
Jake McDermott
2020-05-07 17:38:07 -04:00
parent abcf8fea96
commit 43f32f98a9
100 changed files with 1277 additions and 545 deletions

View File

@@ -2,7 +2,7 @@ import React from 'react';
import { mountWithContexts, waitForElement } from '../testUtils/enzymeHelpers'; import { mountWithContexts, waitForElement } from '../testUtils/enzymeHelpers';
import { ConfigAPI, MeAPI, RootAPI } from './api'; import { ConfigAPI, MeAPI, RootAPI } from './api';
import { asyncFlush } from '../jest.setup'; import { asyncFlush } from './setupTests';
import App from './App'; import App from './App';

View File

@@ -4,8 +4,8 @@ import { I18nProvider } from '@lingui/react';
import { HashRouter } from 'react-router-dom'; import { HashRouter } from 'react-router-dom';
import { getLanguageWithoutRegionCode } from './util/language'; import { getLanguageWithoutRegionCode } from './util/language';
import ja from '../build/locales/ja/messages'; import ja from './locales/ja/messages';
import en from '../build/locales/en/messages'; import en from './locales/en/messages';
class RootProvider extends Component { class RootProvider extends Component {
render() { render() {

View File

@@ -1,6 +1,9 @@
import CredentialTypes from './CredentialTypes'; import CredentialTypes from './CredentialTypes';
const typesData = [{ id: 1, kind: 'machine' }, { id: 2, kind: 'cloud' }]; const typesData = [
{ id: 1, kind: 'machine' },
{ id: 2, kind: 'cloud' },
];
describe('CredentialTypesAPI', () => { describe('CredentialTypesAPI', () => {
test('should load all types', async () => { test('should load all types', async () => {

View File

@@ -16,10 +16,9 @@ describe('TeamsAPI', () => {
await TeamsAPI.associateRole(teamId, roleId); await TeamsAPI.associateRole(teamId, roleId);
expect(mockHttp.post).toHaveBeenCalledTimes(1); expect(mockHttp.post).toHaveBeenCalledTimes(1);
expect(mockHttp.post.mock.calls[0]).toContainEqual( expect(
`/api/v2/teams/${teamId}/roles/`, mockHttp.post.mock.calls[0]
{ id: roleId } ).toContainEqual(`/api/v2/teams/${teamId}/roles/`, { id: roleId });
);
done(); done();
}); });

View File

@@ -16,10 +16,9 @@ describe('UsersAPI', () => {
await UsersAPI.associateRole(userId, roleId); await UsersAPI.associateRole(userId, roleId);
expect(mockHttp.post).toHaveBeenCalledTimes(1); expect(mockHttp.post).toHaveBeenCalledTimes(1);
expect(mockHttp.post.mock.calls[0]).toContainEqual( expect(
`/api/v2/users/${userId}/roles/`, mockHttp.post.mock.calls[0]
{ id: roleId } ).toContainEqual(`/api/v2/users/${userId}/roles/`, { id: roleId });
);
done(); done();
}); });

View File

@@ -10,7 +10,7 @@ import {
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import { BrandName } from '../../variables'; import { BrandName } from '../../variables';
import brandLogoImg from '../../../images/brand-logo.svg'; import brandLogoImg from './brand-logo.svg';
class About extends React.Component { class About extends React.Component {
static createSpeechBubble(version) { static createSpeechBubble(version) {

View File

@@ -0,0 +1,232 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;fill:#ED1C24;}
.st2{fill:#42210B;}
.st3{fill:#FFFFFF;}
.st4{fill:#C69C6D;stroke:#8C6239;stroke-width:5;stroke-miterlimit:10;}
.st5{fill:#FFFFFF;stroke:#42210B;stroke-width:3;stroke-miterlimit:10;}
.st6{fill:#ED1C24;stroke:#8C6239;stroke-width:5;stroke-miterlimit:10;}
.st7{fill:#A67C52;}
.st8{fill:#ED1C24;}
</style>
<g class="st0">
<path class="st1" d="M319.8,169.3c1.5-14.2,13.7-27.2,29.9-31.9c-13.1,1.5-27.3-1.7-36-10c-8.7-8.3-10-21.9-1.4-30.1
c-12,6.7-28.1,8.1-41.4,3.4c-13.3-4.6-23.5-15.1-26.2-26.9c-2-8.8,0-17.9,2-26.7c-6.2,9.4-17.6,17.3-30.5,17.3
c-12.9,0.1-25.7-10.2-22.9-20.7c-5.5,7.8-11.4,15.9-21,20.2c-9.5,4.3-23.7,2.7-28.2-5.5c-1.6,10.8-7.5,22-19.1,27
c-9,3.9-21.5,2.2-28-3.8c5.7,11.4,4.3,25.3-4.1,35.6c-9.9,12.2-29.1,18.6-46.4,15.6c14.7,7.2,28.5,17.7,32.1,31.5
c3.7,13.8-7.1,30.7-24.1,31.7c13.6,3.1,28,7.4,35.6,17.2c7.6,9.8,2.9,26.4-11.1,28c12.8-2.6,27.4,3.9,31.9,14.2
c4.1,9.5-0.9,20.9-10.9,26.5c18.6-8.9,41-17.1,59.6-8.8c13.9,6.2,20.8,21.6,15.1,33.8c10.4-10.6,23-21.3,39.2-23.5
c12.8-1.8,27.5,4.6,31.9,14.1c-0.3-12.7,6.1-25.5,17.5-34c13.8-10.3,34.4-14,52-9.2c-11.1-7.8-14.9-22-8.9-33
c6-11,21.3-18,35.7-16.2C327.5,198.1,318.3,183.5,319.8,169.3z"/>
</g>
<g>
<g>
<g>
<path class="st2" d="M179.7,297.3c-10.1,3.2-20.3,6-30.6,8.4c-10.7,2.5-21.7,5-32.8,5.1C96,311.1,79.9,297.2,60,296.1
c-5.8-0.3-5.8,8.7,0,9c9.9,0.5,18.9,5.1,27.9,8.8c9.8,4,19.6,6.3,30.2,5.9c21.5-0.8,43.5-7.4,64-13.8
C187.6,304.3,185.2,295.6,179.7,297.3L179.7,297.3z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M322.2,194.8c17.9-8,36-18.5,44.3-37.2c4.2-9.3,6-19.2,7.2-29.3c1.5-11.7,2.5-23.4,3.7-35.2
c0.6-5.8-8.4-5.7-9,0c-1.1,10.3-2.1,20.6-3.3,30.9c-1.1,9.7-2.5,19.7-6.4,28.7c-7.5,17.5-24.6,26.8-41.2,34.2
C312.4,189.4,316.9,197.2,322.2,194.8L322.2,194.8z"/>
</g>
</g>
<g>
<ellipse transform="matrix(0.5541 -0.8324 0.8324 0.5541 -219.4917 376.0051)" class="st2" cx="241.2" cy="392.9" rx="65.5" ry="33.7"/>
</g>
<g>
<g>
<path class="st3" d="M224.1,442.5c22-11.5,38.7-31,47.1-54.3c2-5.5-6.7-7.8-8.7-2.4c-7.6,21.1-23.1,38.5-43,48.9
C214.4,437.4,218.9,445.1,224.1,442.5L224.1,442.5z"/>
</g>
</g>
<g>
<ellipse transform="matrix(0.9684 -0.2494 0.2494 0.9684 -66.4734 109.0276)" class="st2" cx="397" cy="316.8" rx="63.9" ry="32.9"/>
</g>
<g>
<g>
<path class="st3" d="M363.8,341.5c28.3,7,58.7-0.8,80.2-20.5c4.3-3.9-2.1-10.3-6.4-6.4c-19.1,17.5-46.4,24.4-71.5,18.2
C360.5,331.5,358.1,340.1,363.8,341.5L363.8,341.5z"/>
</g>
</g>
<path class="st4" d="M156.9,96c-25.4,4.5-32.9,20.2-45,46.9c-20.2,44.4,2,90.3,5.6,97.5c18.4,36.5,42.3,36.8,60,80.6
c8.6,21.2,4.6,25.2,13.1,37.5c20.4,29.2,63.7,36.1,91.9,33.8c40.3-3.3,91.5-28.8,108.8-82.5c17.1-53.2-6-112.1-41.2-131.2
c-25.3-13.7-44.9-0.5-71.2-20.6c-21.6-16.5-18.4-33.1-37.5-48.8C227.9,98.1,203.7,87.7,156.9,96z"/>
<ellipse transform="matrix(0.6622 -0.7494 0.7494 0.6622 65.2068 309.6339)" class="st2" cx="376" cy="82.5" rx="21" ry="15.5"/>
<g>
<g>
<path class="st3" d="M379.8,75.3c0.8,0.2-0.6-0.4-0.1-0.1c0.2,0.1,0.3,0.2,0.5,0.3c0.4,0.2-0.6-0.7-0.1-0.1
c0.1,0.1,0.7,0.8,0.2,0.2c-0.4-0.5,0,0,0.1,0.1c0.4,0.7,0,0.2,0-0.2c0,0.1,0.1,0.4,0.2,0.5c0.3,0.9-0.1-1,0-0.1
c0.1,2.3,2,4.6,4.5,4.5c2.3-0.1,4.6-2,4.5-4.5c-0.3-4.4-3-8.1-7.3-9.4c-2.2-0.7-5,0.8-5.5,3.1C376.1,72.2,377.4,74.5,379.8,75.3
L379.8,75.3z"/>
</g>
</g>
<ellipse transform="matrix(0.9999 -1.433736e-02 1.433736e-02 0.9999 -4.303 0.8051)" class="st2" cx="54" cy="300.5" rx="21" ry="15.5"/>
<g>
<g>
<path class="st3" d="M52.2,297.5c1.1-0.3,1.4-0.4,2.5,0c0.8,0.3,1.3,0.7,2,1.7c1.5,1.9,4.8,1.6,6.4,0c1.9-1.9,1.5-4.4,0-6.4
c-3.1-3.9-8.6-5.4-13.3-4C44.3,290.5,46.7,299.2,52.2,297.5L52.2,297.5z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M149.3,108.8c4.9-10.8-1.3-24.2-12.9-26.9c-1.9-0.4-2.7,2.4-0.8,2.9c9.6,2.3,15.3,13.5,11.2,22.5
C145.9,109,148.5,110.5,149.3,108.8L149.3,108.8z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M141.2,112.3c2.4-9.4-5.4-19.3-15.2-19c-1.9,0.1-1.9,3.1,0,3c7.8-0.2,14.2,7.6,12.3,15.2
C137.8,113.4,140.7,114.2,141.2,112.3L141.2,112.3z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M132.6,118c-1.1-8.3-10.9-13.4-18.2-9.1c-1.7,1-0.2,3.6,1.5,2.6c5.2-3,12.9,0.4,13.7,6.5
C129.8,119.9,132.8,119.9,132.6,118L132.6,118z"/>
</g>
</g>
<path class="st5" d="M215.5,166.5l34-73c0,0,35,0,46,21c7.5,14.3,8,39,8,39L215.5,166.5z"/>
<path class="st5" d="M208.2,170.5l-79.5-12.7c0,0-19.6,29-8.4,49.9c7.6,14.2,27.8,28.5,27.8,28.5L208.2,170.5z"/>
<path class="st2" d="M210.5,164.5l33-74c0,0-2.5-5.5-8-7s-12,0-12,0L210.5,164.5z"/>
<path class="st2" d="M207.4,165.3l-73.1-35c0,0-5.6,2.4-7.2,7.8c-1.6,5.5-0.3,12-0.3,12L207.4,165.3z"/>
<path d="M215.5,166.5L234,127c0,0,17-6,25.5,7.5c8.6,13.6-3.5,25.5-3.5,25.5L215.5,166.5z"/>
<path d="M206.7,170.9l-29.6,32c0,0-18,0.5-22-14.9c-4-15.6,11.1-23.2,11.1-23.2L206.7,170.9z"/>
<g>
<g>
<path class="st3" d="M243.4,139.1c-0.6,0.2-0.7,0.3-0.4,0.2c0.3-0.1,0.2-0.1-0.5,0.1c0.7,0-0.3,0-0.4-0.1c0.1,0,0.3,0.1,0.4,0.1
c0.3,0.1,0.2,0-0.4-0.2c0,0,0.6,0.3,0.6,0.3c0.5,0.2-0.9-0.6-0.1-0.1c0.6,0.4-0.3-0.5-0.1-0.1c0.3,0.5-0.3-1-0.1-0.2
c0.2,0.8,0-1,0-0.1c0,2.4,2.1,4.6,4.5,4.5c2.5-0.1,4.5-2,4.5-4.5c0-3-1.6-5.7-4.1-7.3c-2.6-1.7-5.6-1.6-8.4-0.4
c-2.2,0.9-2.8,4.3-1.6,6.2C238.7,139.7,241,140.1,243.4,139.1L243.4,139.1z"/>
</g>
</g>
<g>
<g>
<path class="st3" d="M173.5,176.4c-0.5-0.3-0.1,0,0.2,0.1c-0.7-0.6,0.3,0.5,0.1,0c-0.3-0.5,0.4,0.8,0.1,0.2
c-0.4-0.8,0.2,0.2,0,0.1c0,0,0-0.6,0-0.6c-0.1,0.1-0.1,1,0,0.3c-0.1,0.2-0.1,0.3-0.2,0.5c0.2-0.3,0.2-0.4,0-0.1
c-0.2,0.2-0.2,0.3-0.1,0.1c0.2-0.2,0.1-0.2-0.3,0.2c1.9-1.4,3-4,1.6-6.2c-1.2-1.9-4.1-3.1-6.2-1.6c-2.4,1.7-4,4.3-3.9,7.4
c0.1,3,1.6,5.7,4.1,7.3c2,1.2,5,0.5,6.2-1.6C176.3,180.4,175.7,177.7,173.5,176.4L173.5,176.4z"/>
</g>
</g>
<ellipse transform="matrix(0.862 -0.5069 0.5069 0.862 -88.3186 186.5516)" class="st6" cx="298.5" cy="255.5" rx="79.5" ry="68.5"/>
<g>
<g>
<path class="st7" d="M173.6,109.8c-2.1,2-3.9,4.6-3.6,7.6c0.3,3.5,2.8,6.6,6.6,6.7c6,0.2,11.5-7.7,8.2-13c-1-1.7-3.1-3.1-5.2-3
c-1.7,0.1-3.1,0.8-4.4,1.9c-2,1.8-2.8,5.2-1.9,7.7c2.4,6.6,11.8,5.9,13.8-0.7c0.7-2.5-0.9-5.6-3.5-6.2c-2.7-0.6-5.4,0.8-6.2,3.5
c0.6-2.1,3.1-2.6,4.6-1c0.8,0.9,1,1.8,0.8,2.8c0.2-0.5,0.1-0.4-0.1,0.3c-0.4,0.7-1,1.2-1.8,1.4c-0.9,0-1.8,0-2.7,0
c-1.8-0.6-2.5-1.6-2.3-3.1c-0.1-0.4-0.1-0.7,0.1-1c0.2-0.3,0.1-0.3-0.1,0.1c0.1-0.1,0.2-0.2,0.3-0.4c-0.2,0.3-0.5,0.5-0.7,0.8
c-0.1,0.1-0.2,0.2-0.3,0.3c-0.3,0.2-0.2,0.2,0.1-0.1c1.3,0.2,2.6,0.4,3.9,0.6c0.2,0.4,0.5,0.9,0.7,1.3c0.2,0.6-0.2,0.9-0.2,1.4
c0,0.4,0.4-0.5-0.1,0.1c0.3-0.4,0.6-0.7,1-1c1.9-1.8,2-5.3,0-7.1C178.7,107.9,175.6,107.8,173.6,109.8L173.6,109.8z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M151.2,248.6c-5.7,7,1.7,16.9,10,13.3c3.4-1.5,6.3-5,6.3-8.9c0-4.2-2.7-7.6-7-7.8c-3.1-0.1-5.8,3.3-4.8,6.3
c1.2,3.4,3.7,6.1,7.3,7c2.6,0.6,5.4-0.8,6.2-3.5c0.7-2.5-0.9-5.5-3.5-6.2c-1.7-0.4,0,0.1-0.2,0.1c-0.4,0-0.4-0.8-0.1-0.1
c-1.6,2.1-3.2,4.2-4.8,6.3c-2.4-0.1-2.8-1.1-3-2.6c0.1,0.7-0.1,0.2,0.1-0.1c0.7-0.9-0.5,0.5,0,0c-0.5,0.5-0.3,0.1-0.2,0.2
c0.1,0,0.6,0,0.7,0c0.4,0.1,0.5,0.4,0.8,0.6c0.2,0.3,0.2,0.2-0.1-0.2c0.1,0.1,0.1,0.3,0.2,0.4c0,1,0.1,1.1-0.7,2.1
c1.7-2.1,2-5,0-7.1C156.5,246.8,152.9,246.5,151.2,248.6L151.2,248.6z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M204.1,205.7c0.8,4.8,5.3,8.6,10.1,8.6c5.1,0,9.5-3.9,10.3-8.9c0.7-4.4-0.2-12.1-5.3-13.6
c-2.7-0.8-5.2,0.5-7,2.4c-1.1,1.2-1.5,1.7-3.1,1.2c0.7,2.8,1.5,5.6,2.2,8.4c0.2-0.2-0.5,0.2-0.5,0.2c6.3,1.4,8.9-8.2,2.7-9.6
c-3.5-0.8-6.6,0-9.3,2.4c-3,2.6-1.1,7.2,2.2,8.4c2.6,0.9,5.5,0.8,8-0.2c1.3-0.5,2.4-1.2,3.4-2.1c0.4-0.3,0.7-0.6,1-1
c0.2-0.3,0.4-0.5,0.6-0.7c0.4-0.4,0.3-0.4-0.5,0.3c-0.9,0-1.8,0-2.7,0c0.2,0.1,0.3,0.1,0.5,0.2c-0.7-0.4-1.5-0.9-2.2-1.3
c0.1,0.2,0.3,0.3,0.4,0.5c-0.4-0.7-0.9-1.5-1.3-2.2c0.4,1.2,0.8,2.5,1,3.7c0,0.4,0,0.8,0,1.2c0,0.5-0.5,0.9,0,0.4
c-0.8,0.6-0.9,0.2-1.1-0.9c-0.4-2.7-3.8-4.1-6.2-3.5C204.7,200.3,203.7,203,204.1,205.7L204.1,205.7z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M265.9,179.6c0.2,0.4,0.5,0.9,0.7,1.3c0.6,1.1,1.8,2,3,2.3c1.2,0.3,2.8,0.2,3.9-0.5c1.1-0.7,2-1.7,2.3-3
c0.3-1.4,0.1-2.6-0.5-3.9c-0.2-0.4-0.5-0.9-0.7-1.3c-0.6-1.1-1.8-2-3-2.3c-1.2-0.3-2.8-0.2-3.9,0.5c-1.1,0.7-2,1.7-2.3,3
C265.1,177.1,265.3,178.3,265.9,179.6L265.9,179.6z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M200.4,295.8c-6.1,1.6-8.1,8.6-5,13.7c2.8,4.7,9.1,7.2,14.3,5.4c4.9-1.7,7.8-7.1,6.3-12.2
c-0.8-2.7-2.7-4.8-5.3-5.8c-1.4-0.5-2.8-0.7-4.2-0.8c-0.1,0-0.9-0.1-0.9-0.1c0.2-0.4,1.2,2.5,0.9,0.7c0,0.9,0,1.8,0,2.7
c-0.1,0.1-0.1,0.1-0.2,0.2c3.1-5.6-5.5-10.7-8.6-5c-1.7,3-1.1,6.6,1.4,9c1.3,1.2,2.8,2,4.5,2.3c0.8,0.1,1.6,0.2,2.4,0.3
c0.4,0,0.7,0,1.1,0.1c0.2,0.1,0.1,0.1-0.2-0.1c0,0.1-0.6-0.5-0.6-0.5c-0.1-0.1-0.1-0.2,0-0.3c0.1-0.3,0.1-0.1-0.1,0.5
c-0.3-0.1,0.7-0.2-0.3-0.3c-0.9-0.1-1.1-0.6-1.8-0.9c0,0-0.2-0.3-0.3-0.3c0.3,0-0.8,1.2-0.8,1.2
C209.3,303.8,206.6,294.2,200.4,295.8L200.4,295.8z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M244.8,355.3c-4-6.2-11.2-2.3-12,3.9c-0.8,5.9,1.8,12,6.5,15.6c4.5,3.5,11.5,4.9,16.7,2.1
c6.4-3.3,5.4-9.8,4.9-15.9c-0.5-6.3-1.9-12-9.5-12.1c-5.1-0.1-13.1,0.2-14.5,6.4c-1.2,5.4,2.5,12.8,8.2,13.8
c6.2,1.1,11.2-5.5,7.8-11c-2.2-3.5-8.1-3.1-9.1,1.2c-1.1,4.4,0.5,8,4.1,10.6c5.2,3.8,10.2-4.8,5-8.6c0.2,0.2,0.4,0.5,0.5,0.7
c-3,0.4-6.1,0.8-9.1,1.2c-0.4-0.7,3.4-3.1,2.9-4.8c-0.8-2.6-1.7,1.4-1.9,1.1c0,0.1,5.2-0.1,5.6-0.4c0.7,0.1,0.8-0.1,0.2-0.6
c-0.4-0.7-0.5-0.8-0.4-0.3c-0.2,0.3,0.2,1.9,0.2,2.3c0.2,2,0.3,4,0.5,5.9c0.1,1.6,0.4,1.7-1.1,2c-1.3,0.2-2.9-0.3-4-0.9
c-1.4-0.8-2.5-2-3.1-3.5c-0.3-0.7-0.4-1.3-0.5-2c0-0.3-0.1-0.7,0-1c0.2-1.9-1.1-1.5-3.8,1.2c-1-0.8-2-1.5-3-2.3
c0.1,0.2,0.2,0.4,0.4,0.6C239.6,365.7,248.3,360.7,244.8,355.3L244.8,355.3z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M336.5,337.4c-2.4-1.5-5.1-2.5-7.9-1.8c-2.7,0.7-4.9,3.2-5.3,6c-0.9,6.4,6.3,8.3,11.2,8.4
c4.8,0.1,10.6-2.4,10.9-7.9c0.2-5.6-5.5-9.6-10.6-6.9c-5.7,3-0.7,11.6,5,8.6c-0.1,0.1-0.2,0.1-0.3,0.2c-0.9,0-1.8,0-2.7,0
c-2.1-0.4-1.4-4.8-0.3-4.3c0,0-1.3,0.3-1.3,0.3c-0.6,0-1.2,0-1.8-0.1c-0.5-0.1-1-0.2-1.5-0.4c-1.2-0.5-1-0.2,0.6,0.7
c0.2,0.8,0.5,1.7,0.7,2.5c-3.4,1.1-4.4,1.9-2.8,2.7c0.4,0.2,0.7,0.4,1.1,0.7C336.9,349.6,341.9,340.9,336.5,337.4L336.5,337.4z"
/>
</g>
</g>
<path class="st3" d="M224.3,256.5L252,273v-40l32,20v-38l28,17l4-28l23,12l-3-24c0,0-14-8-35.5-6.4c-11.6,0.9-24.3,6.8-33.5,11.4
c-14,7-23.7,18.9-31.2,29.1C227,238,224.3,256.5,224.3,256.5z"/>
<path class="st3" d="M372.9,248.9l-28.8-14.5l2.9,39.9l-33.3-17.7l2.7,37.9l-29.1-15l-2,28.2l-23.8-10.3l4.7,23.7
c0,0,14.5,7,35.9,3.8c11.5-1.7,23.7-8.5,32.6-13.8c13.5-8,22.3-20.5,29-31.2C371.5,267.5,372.9,248.9,372.9,248.9z"/>
</g>
<g>
<g>
<path class="st8" d="M235.2,121.6c8.5-3.1,23.2-0.1,27.8,8.4c2.3,4.4,4.5,9.9,4.5,14.9c0.1,5.5-2.7,10.5-5.3,15.3
c-1.5,2.8,2.8,5.4,4.3,2.5c3.1-5.8,6.3-11.9,6-18.7c-0.3-6-2.8-12.8-5.9-17.9c-6-9.5-22.6-13.1-32.7-9.4
C230.9,117.8,232.2,122.7,235.2,121.6L235.2,121.6z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M241.1,110.5c11.6-2.3,25.6,2.3,32.2,12.4c6.6,10.2,6.1,22.8,3.1,34.2c-1.3,5,6.4,7.1,7.7,2.1
c3.8-14.3,3.8-30.3-5.5-42.6c-8.9-11.7-25.5-16.6-39.6-13.8C233.9,103.8,236.1,111.5,241.1,110.5L241.1,110.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M245.4,97.5c7.8-1.8,15.5,0,22.9,2.8c7.2,2.7,15,6.1,20.3,11.8c10.7,11.7,9.5,29.3,8.7,44
c-0.3,6.4,9.7,6.4,10,0c1-17.9,1.2-38.5-12.7-52.1c-6.4-6.3-15.3-10.2-23.6-13.3c-9.1-3.4-18.6-4.9-28.2-2.8
C236.5,89.2,239.1,98.9,245.4,97.5L245.4,97.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M155.8,158.5c-13.1,4.8-14.2,21.6-10.1,33.1c4.3,12,15.2,20.6,28.2,20.5c3.2,0,3.2-5,0-5
c-9.9,0.1-18.6-5.9-22.6-14.9c-3.9-8.6-5.2-24.8,5.8-28.9C160.2,162.3,158.9,157.4,155.8,158.5L155.8,158.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M164.1,216.5c-11.4-2.2-18.8-11.4-22.7-21.9c-3.6-9.6-7.7-25.3,1.2-33.1c3.9-3.4-1.8-9-5.7-5.7
c-11.3,9.9-7.9,28.5-3.3,40.9c4.8,13,14.1,24.7,28.3,27.5C167,225.2,169.1,217.5,164.1,216.5L164.1,216.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M152,231.7c-27.3-13.3-38.1-46.5-23.3-73.2c3.1-5.6-5.5-10.7-8.6-5c-17.3,31.2-5.3,71.1,26.9,86.9
C152.7,243.1,157.8,234.5,152,231.7L152,231.7z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -11,7 +11,10 @@ describe('<_AddResourceRole />', () => {
UsersAPI.read.mockResolvedValue({ UsersAPI.read.mockResolvedValue({
data: { data: {
count: 2, count: 2,
results: [{ id: 1, username: 'foo' }, { id: 2, username: 'bar' }], results: [
{ id: 1, username: 'foo' },
{ id: 2, username: 'bar' },
],
}, },
}); });
const roles = { const roles = {

View File

@@ -1,15 +1,13 @@
import React, { Fragment } from 'react'; import React, { Fragment } from 'react';
import { BackgroundImage, BackgroundImageSrc } from '@patternfly/react-core'; import { BackgroundImage, BackgroundImageSrc } from '@patternfly/react-core';
import bgFilter from '@patternfly/patternfly/assets/images/background-filter.svg';
const backgroundImageConfig = { const backgroundImageConfig = {
[BackgroundImageSrc.xs]: '/assets/images/pfbg_576.jpg', [BackgroundImageSrc.xs]: './images/pfbg_576.jpg',
[BackgroundImageSrc.xs2x]: '/assets/images/pfbg_576@2x.jpg', [BackgroundImageSrc.xs2x]: './images/pfbg_576@2x.jpg',
[BackgroundImageSrc.sm]: '/assets/images/pfbg_768.jpg', [BackgroundImageSrc.sm]: './images/pfbg_768.jpg',
[BackgroundImageSrc.sm2x]: '/assets/images/pfbg_768@2x.jpg', [BackgroundImageSrc.sm2x]: './images/pfbg_768@2x.jpg',
[BackgroundImageSrc.lg]: '/assets/images/pfbg_2000.jpg', [BackgroundImageSrc.lg]: './images/pfbg_2000.jpg',
[BackgroundImageSrc.filter]: `${bgFilter}#image_overlay`,
}; };
export default ({ children }) => ( export default ({ children }) => (

View File

@@ -51,7 +51,10 @@ function VariablesDetail({ value, label, rows, fullHeight }) {
</SplitItem> </SplitItem>
<SplitItem> <SplitItem>
<MultiButtonToggle <MultiButtonToggle
buttons={[[YAML_MODE, 'YAML'], [JSON_MODE, 'JSON']]} buttons={[
[YAML_MODE, 'YAML'],
[JSON_MODE, 'JSON'],
]}
value={mode} value={mode}
onChange={newMode => { onChange={newMode => {
try { try {

View File

@@ -10,7 +10,7 @@ describe('<VariablesDetail>', () => {
const wrapper = shallow( const wrapper = shallow(
<VariablesDetail value="---foo: bar" label="Variables" /> <VariablesDetail value="---foo: bar" label="Variables" />
); );
const input = wrapper.find('Styled(CodeMirrorInput)'); const input = wrapper.find('CodeMirrorInput');
expect(input).toHaveLength(1); expect(input).toHaveLength(1);
expect(input.prop('mode')).toEqual('yaml'); expect(input.prop('mode')).toEqual('yaml');
expect(input.prop('value')).toEqual('---foo: bar'); expect(input.prop('value')).toEqual('---foo: bar');
@@ -21,7 +21,7 @@ describe('<VariablesDetail>', () => {
const wrapper = shallow( const wrapper = shallow(
<VariablesDetail value='{"foo": "bar"}' label="Variables" /> <VariablesDetail value='{"foo": "bar"}' label="Variables" />
); );
const input = wrapper.find('Styled(CodeMirrorInput)'); const input = wrapper.find('CodeMirrorInput');
expect(input).toHaveLength(1); expect(input).toHaveLength(1);
expect(input.prop('mode')).toEqual('javascript'); expect(input.prop('mode')).toEqual('javascript');
expect(input.prop('value')).toEqual('{"foo": "bar"}'); expect(input.prop('value')).toEqual('{"foo": "bar"}');
@@ -32,19 +32,19 @@ describe('<VariablesDetail>', () => {
<VariablesDetail value="---foo: bar" label="Variables" /> <VariablesDetail value="---foo: bar" label="Variables" />
); );
wrapper.find('MultiButtonToggle').invoke('onChange')('javascript'); wrapper.find('MultiButtonToggle').invoke('onChange')('javascript');
const input = wrapper.find('Styled(CodeMirrorInput)'); const input = wrapper.find('CodeMirrorInput');
expect(input.prop('mode')).toEqual('javascript'); expect(input.prop('mode')).toEqual('javascript');
expect(input.prop('value')).toEqual('{\n "foo": "bar"\n}'); expect(input.prop('value')).toEqual('{\n "foo": "bar"\n}');
wrapper.find('MultiButtonToggle').invoke('onChange')('yaml'); wrapper.find('MultiButtonToggle').invoke('onChange')('yaml');
const input2 = wrapper.find('Styled(CodeMirrorInput)'); const input2 = wrapper.find('CodeMirrorInput');
expect(input2.prop('mode')).toEqual('yaml'); expect(input2.prop('mode')).toEqual('yaml');
expect(input2.prop('value')).toEqual('foo: bar\n'); expect(input2.prop('value')).toEqual('foo: bar\n');
}); });
test('should render label and value= --- when there are no values', () => { test('should render label and value= --- when there are no values', () => {
const wrapper = shallow(<VariablesDetail value="" label="Variables" />); const wrapper = shallow(<VariablesDetail value="" label="Variables" />);
expect(wrapper.find('Styled(CodeMirrorInput)').length).toBe(1); expect(wrapper.find('CodeMirrorInput').length).toBe(1);
expect(wrapper.find('div.pf-c-form__label').text()).toBe('Variables'); expect(wrapper.find('div.pf-c-form__label').text()).toBe('Variables');
}); });
@@ -59,14 +59,14 @@ describe('<VariablesDetail>', () => {
value: '---bar: baz', value: '---bar: baz',
}); });
wrapper.update(); wrapper.update();
const input = wrapper.find('Styled(CodeMirrorInput)'); const input = wrapper.find('CodeMirrorInput');
expect(input.prop('mode')).toEqual('javascript'); expect(input.prop('mode')).toEqual('javascript');
expect(input.prop('value')).toEqual('{\n "bar": "baz"\n}'); expect(input.prop('value')).toEqual('{\n "bar": "baz"\n}');
}); });
test('should default yaml value to "---"', () => { test('should default yaml value to "---"', () => {
const wrapper = shallow(<VariablesDetail value="" label="Variables" />); const wrapper = shallow(<VariablesDetail value="" label="Variables" />);
const input = wrapper.find('Styled(CodeMirrorInput)'); const input = wrapper.find('CodeMirrorInput');
expect(input.prop('value')).toEqual('---'); expect(input.prop('value')).toEqual('---');
}); });
@@ -76,7 +76,7 @@ describe('<VariablesDetail>', () => {
wrapper.find('MultiButtonToggle').invoke('onChange')('javascript'); wrapper.find('MultiButtonToggle').invoke('onChange')('javascript');
}); });
wrapper.setProps({ value: '' }); wrapper.setProps({ value: '' });
const input = wrapper.find('Styled(CodeMirrorInput)'); const input = wrapper.find('CodeMirrorInput');
expect(input.prop('value')).toEqual('{}'); expect(input.prop('value')).toEqual('{}');
}); });
}); });

View File

@@ -44,7 +44,10 @@ function VariablesField({
</SplitItem> </SplitItem>
<SplitItem> <SplitItem>
<MultiButtonToggle <MultiButtonToggle
buttons={[[YAML_MODE, 'YAML'], [JSON_MODE, 'JSON']]} buttons={[
[YAML_MODE, 'YAML'],
[JSON_MODE, 'JSON'],
]}
value={mode} value={mode}
onChange={newMode => { onChange={newMode => {
try { try {

View File

@@ -43,7 +43,10 @@ function VariablesInput(props) {
</SplitItem> </SplitItem>
<SplitItemRight> <SplitItemRight>
<MultiButtonToggle <MultiButtonToggle
buttons={[[YAML_MODE, 'YAML'], [JSON_MODE, 'JSON']]} buttons={[
[YAML_MODE, 'YAML'],
[JSON_MODE, 'JSON'],
]}
value={mode} value={mode}
onChange={newMode => { onChange={newMode => {
try { try {

View File

@@ -1,9 +1,12 @@
import { DataListCell } from '@patternfly/react-core'; import { DataListCell as PFDataListCell } from '@patternfly/react-core';
import styled from 'styled-components'; import styled from 'styled-components';
DataListCell.displayName = 'PFDataListCell'; PFDataListCell.displayName = 'PFDataListCell';
// Once https://github.com/patternfly/patternfly-react/issues/3938 // Once https://github.com/patternfly/patternfly-react/issues/3938
// has been resolved this component can be removed // has been resolved this component can be removed
export default styled(DataListCell)` const DataListCell = styled(PFDataListCell)`
word-break: break-word; word-break: break-word;
`; `;
DataListCell.displayName = 'DataListCell';
export default DataListCell;

View File

@@ -112,6 +112,12 @@ function DisassociateButton({
); );
} }
DisassociateButton.defaultProps = {
itemsToDisassociate: [],
modalNote: '',
modalTitle: '',
};
DisassociateButton.propTypes = { DisassociateButton.propTypes = {
itemsToDisassociate: arrayOf(object), itemsToDisassociate: arrayOf(object),
modalNote: string, modalNote: string,

View File

@@ -3,8 +3,8 @@ import { Wizard } from '@patternfly/react-core';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { Formik } from 'formik'; import { Formik } from 'formik';
import ContentError from '../../components/ContentError'; import ContentError from '../ContentError';
import ContentLoading from '../../components/ContentLoading'; import ContentLoading from '../ContentLoading';
import mergeExtraVars from './mergeExtraVars'; import mergeExtraVars from './mergeExtraVars';
import useSteps from './useSteps'; import useSteps from './useSteps';
import getSurveyValues from './getSurveyValues'; import getSurveyValues from './getSurveyValues';
@@ -36,7 +36,10 @@ function LaunchPrompt({ config, resource, onLaunch, onCancel, i18n }) {
}; };
const surveyValues = getSurveyValues(values); const surveyValues = getSurveyValues(values);
setValue('inventory_id', values.inventory?.id); setValue('inventory_id', values.inventory?.id);
setValue('credentials', values.credentials?.map(c => c.id)); setValue(
'credentials',
values.credentials?.map(c => c.id)
);
setValue('job_type', values.job_type); setValue('job_type', values.job_type);
setValue('limit', values.limit); setValue('limit', values.limit);
setValue('job_tags', values.job_tags); setValue('job_tags', values.job_tags);

View File

@@ -1,6 +1,9 @@
import React from 'react'; import React from 'react';
import { act, isElementOfType } from 'react-dom/test-utils'; import { act, isElementOfType } from 'react-dom/test-utils';
import { mountWithContexts, waitForElement } from '../../../testUtils/enzymeHelpers'; import {
mountWithContexts,
waitForElement,
} from '../../../testUtils/enzymeHelpers';
import LaunchPrompt from './LaunchPrompt'; import LaunchPrompt from './LaunchPrompt';
import InventoryStep from './steps/InventoryStep'; import InventoryStep from './steps/InventoryStep';
import CredentialsStep from './steps/CredentialsStep'; import CredentialsStep from './steps/CredentialsStep';

View File

@@ -5,11 +5,11 @@ import { t } from '@lingui/macro';
import { useField } from 'formik'; import { useField } from 'formik';
import { ToolbarItem } from '@patternfly/react-core'; import { ToolbarItem } from '@patternfly/react-core';
import { CredentialsAPI, CredentialTypesAPI } from '../../../api'; import { CredentialsAPI, CredentialTypesAPI } from '../../../api';
import AnsibleSelect from '../../../components/AnsibleSelect'; import AnsibleSelect from '../../AnsibleSelect';
import OptionsList from '../../../components/OptionsList'; import OptionsList from '../../OptionsList';
import ContentLoading from '../../../components/ContentLoading'; import ContentLoading from '../../ContentLoading';
import CredentialChip from '../../../components/CredentialChip'; import CredentialChip from '../../CredentialChip';
import ContentError from '../../../components/ContentError'; import ContentError from '../../ContentError';
import { getQSConfig, parseQueryString } from '../../../util/qs'; import { getQSConfig, parseQueryString } from '../../../util/qs';
import useRequest from '../../../util/useRequest'; import useRequest from '../../../util/useRequest';
import { required } from '../../../util/validators'; import { required } from '../../../util/validators';

View File

@@ -1,12 +1,12 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { Formik } from 'formik'; import { Formik } from 'formik';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import CredentialsStep from './CredentialsStep'; import CredentialsStep from './CredentialsStep';
import { CredentialsAPI, CredentialTypesAPI } from '../../api'; import { CredentialsAPI, CredentialTypesAPI } from '../../../api';
jest.mock('../../api/models/CredentialTypes'); jest.mock('../../../api/models/CredentialTypes');
jest.mock('../../api/models/Credentials'); jest.mock('../../../api/models/Credentials');
const types = [ const types = [
{ id: 1, kind: 'ssh', name: 'SSH' }, { id: 1, kind: 'ssh', name: 'SSH' },

View File

@@ -6,9 +6,9 @@ import { useField } from 'formik';
import { InventoriesAPI } from '../../../api'; import { InventoriesAPI } from '../../../api';
import { getQSConfig, parseQueryString } from '../../../util/qs'; import { getQSConfig, parseQueryString } from '../../../util/qs';
import useRequest from '../../../util/useRequest'; import useRequest from '../../../util/useRequest';
import OptionsList from '../../../components/OptionsList'; import OptionsList from '../../OptionsList';
import ContentLoading from '../../../components/ContentLoading'; import ContentLoading from '../../ContentLoading';
import ContentError from '../../../components/ContentError'; import ContentError from '../../ContentError';
import { required } from '../../../util/validators'; import { required } from '../../../util/validators';
const QS_CONFIG = getQSConfig('inventory', { const QS_CONFIG = getQSConfig('inventory', {

View File

@@ -1,11 +1,11 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { Formik } from 'formik'; import { Formik } from 'formik';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import InventoryStep from './InventoryStep'; import InventoryStep from './InventoryStep';
import { InventoriesAPI } from '../../api'; import { InventoriesAPI } from '../../../api';
jest.mock('../../api/models/Inventories'); jest.mock('../../../api/models/Inventories');
const inventories = [ const inventories = [
{ id: 1, name: 'inv one', url: '/inventories/1' }, { id: 1, name: 'inv one', url: '/inventories/1' },

View File

@@ -4,10 +4,10 @@ import { t } from '@lingui/macro';
import { useField } from 'formik'; import { useField } from 'formik';
import { Form, FormGroup, Switch } from '@patternfly/react-core'; import { Form, FormGroup, Switch } from '@patternfly/react-core';
import styled from 'styled-components'; import styled from 'styled-components';
import FormField, { FieldTooltip } from '../FormField'; import FormField, { FieldTooltip } from '../../FormField';
import { TagMultiSelect } from '../MultiSelect'; import { TagMultiSelect } from '../../MultiSelect';
import AnsibleSelect from '../AnsibleSelect'; import AnsibleSelect from '../../AnsibleSelect';
import { VariablesField } from '../CodeMirrorInput'; import { VariablesField } from '../../CodeMirrorInput';
const FieldHeader = styled.div` const FieldHeader = styled.div`
display: flex; display: flex;

View File

@@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { Formik } from 'formik'; import { Formik } from 'formik';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import OtherPromptsStep from './OtherPromptsStep'; import OtherPromptsStep from './OtherPromptsStep';
describe('OtherPromptsStep', () => { describe('OtherPromptsStep', () => {

View File

@@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import PromptDetail from '../../../components/PromptDetail'; import PromptDetail from '../../PromptDetail';
import mergeExtraVars, { maskPasswords } from '../mergeExtraVars'; import mergeExtraVars, { maskPasswords } from '../mergeExtraVars';
import getSurveyValues from '../getSurveyValues'; import getSurveyValues from '../getSurveyValues';

View File

@@ -8,8 +8,8 @@ import {
SelectOption, SelectOption,
SelectVariant, SelectVariant,
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import FormField, { FieldTooltip } from '../../../components/FormField'; import FormField, { FieldTooltip } from '../../FormField';
import AnsibleSelect from '../../../components/AnsibleSelect'; import AnsibleSelect from '../../AnsibleSelect';
import { import {
required, required,
minMaxValue, minMaxValue,

View File

@@ -8,7 +8,7 @@ import { CredentialsAPI } from '../../api';
import { Credential } from '../../types'; import { Credential } from '../../types';
import { getQSConfig, parseQueryString, mergeParams } from '../../util/qs'; import { getQSConfig, parseQueryString, mergeParams } from '../../util/qs';
import { FieldTooltip } from '../FormField'; import { FieldTooltip } from '../FormField';
import Lookup from '.'; import Lookup from './Lookup';
import OptionsList from '../OptionsList'; import OptionsList from '../OptionsList';
import LookupErrorMessage from './shared/LookupErrorMessage'; import LookupErrorMessage from './shared/LookupErrorMessage';

View File

@@ -5,7 +5,7 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { InventoriesAPI } from '../../api'; import { InventoriesAPI } from '../../api';
import { Inventory } from '../../types'; import { Inventory } from '../../types';
import Lookup from '.'; import Lookup from './Lookup';
import OptionsList from '../OptionsList'; import OptionsList from '../OptionsList';
import { getQSConfig, parseQueryString } from '../../util/qs'; import { getQSConfig, parseQueryString } from '../../util/qs';
import LookupErrorMessage from './shared/LookupErrorMessage'; import LookupErrorMessage from './shared/LookupErrorMessage';

View File

@@ -17,10 +17,10 @@ import {
InputGroup as PFInputGroup, InputGroup as PFInputGroup,
Modal, Modal,
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import ChipGroup from '../../components/ChipGroup';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import styled from 'styled-components'; import styled from 'styled-components';
import ChipGroup from '../ChipGroup';
import reducer, { initReducer } from './shared/reducer'; import reducer, { initReducer } from './shared/reducer';
import { QSConfig } from '../../types'; import { QSConfig } from '../../types';

View File

@@ -8,7 +8,10 @@ describe('<MultiButtonToggle />', () => {
beforeAll(() => { beforeAll(() => {
wrapper = mount( wrapper = mount(
<MultiButtonToggle <MultiButtonToggle
buttons={[['yaml', 'YAML'], ['json', 'JSON']]} buttons={[
['yaml', 'YAML'],
['json', 'JSON'],
]}
value="yaml" value="yaml"
onChange={onChange} onChange={onChange}
/> />

View File

@@ -42,8 +42,8 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
<DataListItemCells <DataListItemCells
dataListCells={ dataListCells={
Array [ Array [
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<Link <ForwardRef
to={ to={
Object { Object {
"pathname": "/foo", "pathname": "/foo",
@@ -55,11 +55,11 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
> >
Foo Foo
</b> </b>
</Link> </ForwardRef>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
Slack Slack
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
] ]
} }
key=".0" key=".0"
@@ -77,17 +77,19 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "DataListCell-sc-18ntxrx-0", "componentId": "sc-bdVaJa",
"isStatic": true, "isStatic": false,
"lastClassName": "flJMIO", "lastClassName": "kruorc",
"rules": Array [ "rules": Array [
"word-break:break-word;", "
word-break: break-word;
",
], ],
}, },
"displayName": "DataListCell", "displayName": "DataListCell",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "DataListCell-sc-18ntxrx-0", "styledComponentId": "sc-bdVaJa",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -97,10 +99,10 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
forwardedRef={null} forwardedRef={null}
> >
<PFDataListCell <PFDataListCell
className="DataListCell-sc-18ntxrx-0 flJMIO" className="sc-bdVaJa kruorc"
> >
<div <div
className="pf-c-data-list__cell DataListCell-sc-18ntxrx-0 flJMIO" className="pf-c-data-list__cell sc-bdVaJa kruorc"
> >
<Link <Link
to={ to={
@@ -138,17 +140,19 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "DataListCell-sc-18ntxrx-0", "componentId": "sc-bdVaJa",
"isStatic": true, "isStatic": false,
"lastClassName": "flJMIO", "lastClassName": "kruorc",
"rules": Array [ "rules": Array [
"word-break:break-word;", "
word-break: break-word;
",
], ],
}, },
"displayName": "DataListCell", "displayName": "DataListCell",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "DataListCell-sc-18ntxrx-0", "styledComponentId": "sc-bdVaJa",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -158,10 +162,10 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
forwardedRef={null} forwardedRef={null}
> >
<PFDataListCell <PFDataListCell
className="DataListCell-sc-18ntxrx-0 flJMIO" className="sc-bdVaJa kruorc"
> >
<div <div
className="pf-c-data-list__cell DataListCell-sc-18ntxrx-0 flJMIO" className="pf-c-data-list__cell sc-bdVaJa kruorc"
> >
Slack Slack
</div> </div>
@@ -170,7 +174,7 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
</DataListCell> </DataListCell>
</div> </div>
</DataListItemCells> </DataListItemCells>
<NotificationListItem__DataListAction <Styled(DataListAction)
aria-label="actions" aria-label="actions"
aria-labelledby="items-list-item-9000" aria-labelledby="items-list-item-9000"
id="items-list-item-9000" id="items-list-item-9000"
@@ -185,17 +189,22 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "NotificationListItem__DataListAction-w674ng-0", "componentId": "sc-bwzfXH",
"isStatic": true, "isStatic": false,
"lastClassName": "hhZchj", "lastClassName": "llKtln",
"rules": Array [ "rules": Array [
"align-items:center;display:grid;grid-gap:16px;grid-template-columns:repeat(3,max-content);", "
align-items: center;
display: grid;
grid-gap: 16px;
grid-template-columns: repeat(3, max-content);
",
], ],
}, },
"displayName": "NotificationListItem__DataListAction", "displayName": "Styled(DataListAction)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "NotificationListItem__DataListAction-w674ng-0", "styledComponentId": "sc-bwzfXH",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -209,12 +218,12 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
<DataListAction <DataListAction
aria-label="actions" aria-label="actions"
aria-labelledby="items-list-item-9000" aria-labelledby="items-list-item-9000"
className="NotificationListItem__DataListAction-w674ng-0 hhZchj" className="sc-bwzfXH llKtln"
id="items-list-item-9000" id="items-list-item-9000"
rowid="items-list-item-9000" rowid="items-list-item-9000"
> >
<div <div
className="pf-c-data-list__item-action NotificationListItem__DataListAction-w674ng-0 hhZchj" className="pf-c-data-list__item-action sc-bwzfXH llKtln"
rowid="items-list-item-9000" rowid="items-list-item-9000"
> >
<Component <Component
@@ -445,7 +454,7 @@ exports[`<NotificationListItem canToggleNotifications /> initially renders succe
</div> </div>
</DataListAction> </DataListAction>
</StyledComponent> </StyledComponent>
</NotificationListItem__DataListAction> </Styled(DataListAction)>
</div> </div>
</DataListItemRow> </DataListItemRow>
</li> </li>

View File

@@ -4,13 +4,13 @@ import { withI18n } from '@lingui/react';
import { t, Trans } from '@lingui/macro'; import { t, Trans } from '@lingui/macro';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import { Chip, Divider } from '@patternfly/react-core';
import { toTitleCase } from '../../util/strings'; import { toTitleCase } from '../../util/strings';
import { Chip, Divider } from '@patternfly/react-core'; import CredentialChip from '../CredentialChip';
import CredentialChip from '../../components/CredentialChip'; import ChipGroup from '../ChipGroup';
import ChipGroup from '../../components/ChipGroup'; import { DetailList, Detail, UserDateDetail } from '../DetailList';
import { DetailList, Detail, UserDateDetail } from '../../components/DetailList'; import { VariablesDetail } from '../CodeMirrorInput';
import { VariablesDetail } from '../../components/CodeMirrorInput';
import PromptProjectDetail from './PromptProjectDetail'; import PromptProjectDetail from './PromptProjectDetail';
import PromptInventorySourceDetail from './PromptInventorySourceDetail'; import PromptInventorySourceDetail from './PromptInventorySourceDetail';
@@ -43,7 +43,7 @@ function buildResourceLink(resource) {
workflow_job_template: `/templates/workflow_job_template/${resource.id}/details`, workflow_job_template: `/templates/workflow_job_template/${resource.id}/details`,
}; };
return link[(resource?.type)] ? ( return link[resource?.type] ? (
<Link to={link[resource.type]}>{resource.name}</Link> <Link to={link[resource.type]}>{resource.name}</Link>
) : ( ) : (
resource.name resource.name
@@ -241,6 +241,10 @@ function PromptDetail({ i18n, resource, launchConfig = {}, overrides = {} }) {
); );
} }
PromptDetail.defaultProps = {
launchConfig: { defaults: {} },
};
PromptDetail.propTypes = { PromptDetail.propTypes = {
resource: shape({}).isRequired, resource: shape({}).isRequired,
launchConfig: shape({}), launchConfig: shape({}),

View File

@@ -4,10 +4,10 @@ import { t } from '@lingui/macro';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Chip, List, ListItem } from '@patternfly/react-core'; import { Chip, List, ListItem } from '@patternfly/react-core';
import { Detail, DeletedDetail } from '../../components/DetailList'; import { Detail, DeletedDetail } from '../DetailList';
import { VariablesDetail } from '../../components/CodeMirrorInput'; import { VariablesDetail } from '../CodeMirrorInput';
import CredentialChip from '../../components/CredentialChip'; import CredentialChip from '../CredentialChip';
import ChipGroup from '../../components/ChipGroup'; import ChipGroup from '../ChipGroup';
function PromptInventorySourceDetail({ i18n, resource }) { function PromptInventorySourceDetail({ i18n, resource }) {
const { const {

View File

@@ -4,11 +4,11 @@ import { t } from '@lingui/macro';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Chip, List, ListItem } from '@patternfly/react-core'; import { Chip, List, ListItem } from '@patternfly/react-core';
import CredentialChip from '../../components/CredentialChip'; import CredentialChip from '../CredentialChip';
import ChipGroup from '../../components/ChipGroup'; import ChipGroup from '../ChipGroup';
import Sparkline from '../../components/Sparkline'; import Sparkline from '../Sparkline';
import { Detail, DeletedDetail } from '../../components/DetailList'; import { Detail, DeletedDetail } from '../DetailList';
import { VariablesDetail } from '../../components/CodeMirrorInput'; import { VariablesDetail } from '../CodeMirrorInput';
import { toTitleCase } from '../../util/strings'; import { toTitleCase } from '../../util/strings';
function PromptJobTemplateDetail({ i18n, resource }) { function PromptJobTemplateDetail({ i18n, resource }) {

View File

@@ -4,11 +4,11 @@ import { t } from '@lingui/macro';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Chip, List, ListItem } from '@patternfly/react-core'; import { Chip, List, ListItem } from '@patternfly/react-core';
import CredentialChip from '../../components/CredentialChip'; import CredentialChip from '../CredentialChip';
import ChipGroup from '../../components/ChipGroup'; import ChipGroup from '../ChipGroup';
import { Detail } from '../../components/DetailList'; import { Detail } from '../DetailList';
import { VariablesDetail } from '../../components/CodeMirrorInput'; import { VariablesDetail } from '../CodeMirrorInput';
import Sparkline from '../../components/Sparkline'; import Sparkline from '../Sparkline';
import { toTitleCase } from '../../util/strings'; import { toTitleCase } from '../../util/strings';
function PromptWFJobTemplateDetail({ i18n, resource }) { function PromptWFJobTemplateDetail({ i18n, resource }) {

View File

@@ -15,8 +15,8 @@ import { Link } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import DataListCell from '../DataListCell'; import DataListCell from '../DataListCell';
import ChipGroup from '../../components/ChipGroup'; import ChipGroup from '../ChipGroup';
import { DetailList, Detail } from '../../components/DetailList'; import { DetailList, Detail } from '../DetailList';
import { AccessRecord } from '../../types'; import { AccessRecord } from '../../types';
const DataListItemCells = styled(PFDataListItemCells)` const DataListItemCells = styled(PFDataListItemCells)`

View File

@@ -100,11 +100,11 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
class="pf-c-title" class="pf-c-title"
> >
<div <div
class="AlertModal__Header-sc-9waqvl-0 dYqVFx" class="sc-bdVaJa cjtBrl"
> >
<svg <svg
aria-hidden="true" aria-hidden="true"
class="sc-bdVaJa hIExGP" css="color: var(--pf-global--danger-color--100)"
fill="currentColor" fill="currentColor"
height="2em" height="2em"
role="img" role="img"
@@ -159,16 +159,20 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
ariaDescribedById="" ariaDescribedById=""
className="" className=""
header={ header={
<AlertModal__Header> <ForwardRef(styled.div)>
<Styled(ExclamationCircleIcon) <ExclamationCircleIcon
color="currentColor"
css="color: var(--pf-global--danger-color--100)"
noVerticalAlign={false}
size="lg" size="lg"
title={null}
/> />
<Title <Title
size="2xl" size="2xl"
> >
Remove Team Access Remove Team Access
</Title> </Title>
</AlertModal__Header> </ForwardRef(styled.div)>
} }
hideTitle={false} hideTitle={false}
isFooterLeftAligned={true} isFooterLeftAligned={true}
@@ -219,11 +223,11 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
class="pf-c-title" class="pf-c-title"
> >
<div <div
class="AlertModal__Header-sc-9waqvl-0 dYqVFx" class="sc-bdVaJa cjtBrl"
> >
<svg <svg
aria-hidden="true" aria-hidden="true"
class="sc-bdVaJa hIExGP" css="color: var(--pf-global--danger-color--100)"
fill="currentColor" fill="currentColor"
height="2em" height="2em"
role="img" role="img"
@@ -296,16 +300,20 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
ariaDescribedById="" ariaDescribedById=""
className="" className=""
header={ header={
<AlertModal__Header> <ForwardRef(styled.div)>
<Styled(ExclamationCircleIcon) <ExclamationCircleIcon
color="currentColor"
css="color: var(--pf-global--danger-color--100)"
noVerticalAlign={false}
size="lg" size="lg"
title={null}
/> />
<Title <Title
size="2xl" size="2xl"
> >
Remove Team Access Remove Team Access
</Title> </Title>
</AlertModal__Header> </ForwardRef(styled.div)>
} }
hideTitle={false} hideTitle={false}
id="pf-modal-0" id="pf-modal-0"
@@ -432,24 +440,29 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
<div <div
className="pf-c-title" className="pf-c-title"
> >
<AlertModal__Header> <styled.div>
<StyledComponent <StyledComponent
forwardedComponent={ forwardedComponent={
Object { Object {
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "AlertModal__Header-sc-9waqvl-0", "componentId": "sc-bdVaJa",
"isStatic": true, "isStatic": false,
"lastClassName": "dYqVFx", "lastClassName": "cjtBrl",
"rules": Array [ "rules": Array [
"display:flex;svg{margin-right:16px;}", "
display: flex;
svg {
margin-right: 16px;
}
",
], ],
}, },
"displayName": "AlertModal__Header", "displayName": "styled.div",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "AlertModal__Header-sc-9waqvl-0", "styledComponentId": "sc-bdVaJa",
"target": "div", "target": "div",
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -459,67 +472,36 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
forwardedRef={null} forwardedRef={null}
> >
<div <div
className="AlertModal__Header-sc-9waqvl-0 dYqVFx" className="sc-bdVaJa cjtBrl"
> >
<Styled(ExclamationCircleIcon) <ExclamationCircleIcon
color="currentColor"
css="color: var(--pf-global--danger-color--100)"
noVerticalAlign={false}
size="lg" size="lg"
title={null}
> >
<StyledComponent <svg
forwardedComponent={ aria-hidden={true}
aria-labelledby={null}
css="color: var(--pf-global--danger-color--100)"
fill="currentColor"
height="2em"
role="img"
style={
Object { Object {
"$$typeof": Symbol(react.forward_ref), "verticalAlign": "-0.25em",
"attrs": Array [],
"componentStyle": ComponentStyle {
"componentId": "sc-bdVaJa",
"isStatic": true,
"lastClassName": "hIExGP",
"rules": Array [
"color: var(--pf-global--danger-color--100)",
],
},
"displayName": "Styled(ExclamationCircleIcon)",
"foldedComponentIds": Array [],
"render": [Function],
"styledComponentId": "sc-bdVaJa",
"target": [Function],
"toString": [Function],
"warnTooManyClasses": [Function],
"withComponent": [Function],
} }
} }
forwardedRef={null} viewBox="0 0 512 512"
size="lg" width="2em"
> >
<ExclamationCircleIcon <path
className="sc-bdVaJa hIExGP" d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"
color="currentColor" transform=""
noVerticalAlign={false} />
size="lg" </svg>
title={null} </ExclamationCircleIcon>
>
<svg
aria-hidden={true}
aria-labelledby={null}
className="sc-bdVaJa hIExGP"
fill="currentColor"
height="2em"
role="img"
style={
Object {
"verticalAlign": "-0.25em",
}
}
viewBox="0 0 512 512"
width="2em"
>
<path
d="M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"
transform=""
/>
</svg>
</ExclamationCircleIcon>
</StyledComponent>
</Styled(ExclamationCircleIcon)>
<Title <Title
size="2xl" size="2xl"
> >
@@ -531,7 +513,7 @@ exports[`<DeleteRoleConfirmationModal /> should render initially 1`] = `
</Title> </Title>
</div> </div>
</StyledComponent> </StyledComponent>
</AlertModal__Header> </styled.div>
</div> </div>
<ModalBoxBody <ModalBoxBody
id="pf-modal-0" id="pf-modal-0"

View File

@@ -49,15 +49,16 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
<div <div
className="pf-c-data-list__item-row" className="pf-c-data-list__item-row"
> >
<ResourceAccessListItem__DataListItemCells <Styled(DataListItemCells)
dataListCells={ dataListCells={
Array [ Array [
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<TextContent> <TextContent>
<Text <Text
component="h6" component="h6"
> >
<Styled(Link) <ForwardRef
css="font-weight: bold"
to={ to={
Object { Object {
"pathname": "/users/2/details", "pathname": "/users/2/details",
@@ -65,10 +66,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
} }
> >
jane jane
</Styled(Link)> </ForwardRef>
</Text> </Text>
</TextContent> </TextContent>
<DetailList <ForwardRef(Styled(DetailList))
stacked={true} stacked={true}
> >
<Detail <Detail
@@ -77,10 +78,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
label="Name" label="Name"
value="jane brown" value="jane brown"
/> />
</DetailList> </ForwardRef(Styled(DetailList))>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<DetailList <ForwardRef(Styled(DetailList))
stacked={true} stacked={true}
> >
<Detail <Detail
@@ -101,8 +102,8 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</WithI18n> </WithI18n>
} }
/> />
</DetailList> </ForwardRef(Styled(DetailList))>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
] ]
} }
key=".0" key=".0"
@@ -111,12 +112,13 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
<StyledComponent <StyledComponent
dataListCells={ dataListCells={
Array [ Array [
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<TextContent> <TextContent>
<Text <Text
component="h6" component="h6"
> >
<Styled(Link) <ForwardRef
css="font-weight: bold"
to={ to={
Object { Object {
"pathname": "/users/2/details", "pathname": "/users/2/details",
@@ -124,10 +126,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
} }
> >
jane jane
</Styled(Link)> </ForwardRef>
</Text> </Text>
</TextContent> </TextContent>
<DetailList <ForwardRef(Styled(DetailList))
stacked={true} stacked={true}
> >
<Detail <Detail
@@ -136,10 +138,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
label="Name" label="Name"
value="jane brown" value="jane brown"
/> />
</DetailList> </ForwardRef(Styled(DetailList))>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<DetailList <ForwardRef(Styled(DetailList))
stacked={true} stacked={true}
> >
<Detail <Detail
@@ -160,8 +162,8 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</WithI18n> </WithI18n>
} }
/> />
</DetailList> </ForwardRef(Styled(DetailList))>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
] ]
} }
forwardedComponent={ forwardedComponent={
@@ -169,17 +171,19 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "ResourceAccessListItem__DataListItemCells-a3r9sq-0", "componentId": "sc-bZQynM",
"isStatic": true, "isStatic": false,
"lastClassName": "WzRoT", "lastClassName": "dLjtme",
"rules": Array [ "rules": Array [
"align-items:start;", "
align-items: start;
",
], ],
}, },
"displayName": "ResourceAccessListItem__DataListItemCells", "displayName": "Styled(DataListItemCells)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "ResourceAccessListItem__DataListItemCells-a3r9sq-0", "styledComponentId": "sc-bZQynM",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -190,15 +194,16 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
rowid="access-list-item" rowid="access-list-item"
> >
<DataListItemCells <DataListItemCells
className="ResourceAccessListItem__DataListItemCells-a3r9sq-0 WzRoT" className="sc-bZQynM dLjtme"
dataListCells={ dataListCells={
Array [ Array [
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<TextContent> <TextContent>
<Text <Text
component="h6" component="h6"
> >
<Styled(Link) <ForwardRef
css="font-weight: bold"
to={ to={
Object { Object {
"pathname": "/users/2/details", "pathname": "/users/2/details",
@@ -206,10 +211,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
} }
> >
jane jane
</Styled(Link)> </ForwardRef>
</Text> </Text>
</TextContent> </TextContent>
<DetailList <ForwardRef(Styled(DetailList))
stacked={true} stacked={true}
> >
<Detail <Detail
@@ -218,10 +223,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
label="Name" label="Name"
value="jane brown" value="jane brown"
/> />
</DetailList> </ForwardRef(Styled(DetailList))>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
<DataListCell> <ForwardRef(Styled(PFDataListCell))>
<DetailList <ForwardRef(Styled(DetailList))
stacked={true} stacked={true}
> >
<Detail <Detail
@@ -242,14 +247,14 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</WithI18n> </WithI18n>
} }
/> />
</DetailList> </ForwardRef(Styled(DetailList))>
</DataListCell>, </ForwardRef(Styled(PFDataListCell))>,
] ]
} }
rowid="access-list-item" rowid="access-list-item"
> >
<div <div
className="pf-c-data-list__item-content ResourceAccessListItem__DataListItemCells-a3r9sq-0 WzRoT" className="pf-c-data-list__item-content sc-bZQynM dLjtme"
> >
<DataListCell <DataListCell
key="name" key="name"
@@ -260,17 +265,19 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "DataListCell-sc-18ntxrx-0", "componentId": "sc-bdVaJa",
"isStatic": true, "isStatic": false,
"lastClassName": "flJMIO", "lastClassName": "kruorc",
"rules": Array [ "rules": Array [
"word-break:break-word;", "
word-break: break-word;
",
], ],
}, },
"displayName": "DataListCell", "displayName": "DataListCell",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "DataListCell-sc-18ntxrx-0", "styledComponentId": "sc-bdVaJa",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -280,10 +287,10 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
forwardedRef={null} forwardedRef={null}
> >
<PFDataListCell <PFDataListCell
className="DataListCell-sc-18ntxrx-0 flJMIO" className="sc-bdVaJa kruorc"
> >
<div <div
className="pf-c-data-list__cell DataListCell-sc-18ntxrx-0 flJMIO" className="pf-c-data-list__cell sc-bdVaJa kruorc"
> >
<TextContent> <TextContent>
<div <div
@@ -296,90 +303,33 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
className="" className=""
data-pf-content={true} data-pf-content={true}
> >
<Styled(Link) <Link
css="font-weight: bold"
to={ to={
Object { Object {
"pathname": "/users/2/details", "pathname": "/users/2/details",
} }
} }
> >
<StyledComponent <LinkAnchor
forwardedComponent={ css="font-weight: bold"
Object { href="/users/2/details"
"$$typeof": Symbol(react.forward_ref), navigate={[Function]}
"attrs": Array [],
"componentStyle": ComponentStyle {
"componentId": "sc-bdVaJa",
"isStatic": true,
"lastClassName": "fqQVUT",
"rules": Array [
"font-weight: bold",
],
},
"displayName": "Styled(Link)",
"foldedComponentIds": Array [],
"propTypes": Object {
"innerRef": [Function],
"onClick": [Function],
"replace": [Function],
"target": [Function],
"to": [Function],
},
"render": [Function],
"styledComponentId": "sc-bdVaJa",
"target": Object {
"$$typeof": Symbol(react.forward_ref),
"displayName": "Link",
"propTypes": Object {
"innerRef": [Function],
"onClick": [Function],
"replace": [Function],
"target": [Function],
"to": [Function],
},
"render": [Function],
},
"toString": [Function],
"warnTooManyClasses": [Function],
"withComponent": [Function],
}
}
forwardedRef={null}
to={
Object {
"pathname": "/users/2/details",
}
}
> >
<Link <a
className="sc-bdVaJa fqQVUT" css="font-weight: bold"
to={ href="/users/2/details"
Object { onClick={[Function]}
"pathname": "/users/2/details",
}
}
> >
<LinkAnchor jane
className="sc-bdVaJa fqQVUT" </a>
href="/users/2/details" </LinkAnchor>
navigate={[Function]} </Link>
>
<a
className="sc-bdVaJa fqQVUT"
href="/users/2/details"
onClick={[Function]}
>
jane
</a>
</LinkAnchor>
</Link>
</StyledComponent>
</Styled(Link)>
</h6> </h6>
</Text> </Text>
</div> </div>
</TextContent> </TextContent>
<DetailList <Styled(DetailList)
stacked={true} stacked={true}
> >
<StyledComponent <StyledComponent
@@ -388,18 +338,24 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "DetailList-sc-12g7m4-0", "componentId": "sc-bwzfXH",
"isStatic": false, "isStatic": false,
"lastClassName": "iAtits", "lastClassName": "kVCDmm",
"rules": Array [ "rules": Array [
"display:grid;grid-gap:20px;align-items:center;", "
display: grid;
grid-gap: 20px;
align-items: center;
",
[Function], [Function],
"
",
], ],
}, },
"displayName": "DetailList", "displayName": "Styled(DetailList)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "DetailList-sc-12g7m4-0", "styledComponentId": "sc-bwzfXH",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -410,15 +366,15 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
stacked={true} stacked={true}
> >
<DetailList <DetailList
className="DetailList-sc-12g7m4-0 iAtits" className="sc-bwzfXH kVCDmm"
stacked={true} stacked={true}
> >
<TextList <TextList
className="DetailList-sc-12g7m4-0 iAtits" className="sc-bwzfXH kVCDmm"
component="dl" component="dl"
> >
<dl <dl
className="DetailList-sc-12g7m4-0 iAtits" className="sc-bwzfXH kVCDmm"
data-pf-content={true} data-pf-content={true}
> >
<Detail <Detail
@@ -427,7 +383,7 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
label="Name" label="Name"
value="jane brown" value="jane brown"
> >
<Detail__DetailName <Styled(Component)
component="dt" component="dt"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
@@ -440,18 +396,22 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "Detail__DetailName-sc-16ypsyv-0", "componentId": "sc-htpNat",
"isStatic": false, "isStatic": false,
"lastClassName": "erdIBg", "lastClassName": "iYJcPm",
"rules": Array [ "rules": Array [
"font-weight:var(--pf-global--FontWeight--bold);", "
font-weight: var(--pf-global--FontWeight--bold);
",
[Function], [Function],
"
",
], ],
}, },
"displayName": "Detail__DetailName", "displayName": "Styled(Component)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "Detail__DetailName-sc-16ypsyv-0", "styledComponentId": "sc-htpNat",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -462,18 +422,18 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
fullWidth={false} fullWidth={false}
> >
<Component <Component
className="Detail__DetailName-sc-16ypsyv-0 erdIBg" className="sc-htpNat iYJcPm"
component="dt" component="dt"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
> >
<TextListItem <TextListItem
className="Detail__DetailName-sc-16ypsyv-0 erdIBg" className="sc-htpNat iYJcPm"
component="dt" component="dt"
data-cy={null} data-cy={null}
> >
<dt <dt
className="Detail__DetailName-sc-16ypsyv-0 erdIBg" className="sc-htpNat iYJcPm"
data-cy={null} data-cy={null}
data-pf-content={true} data-pf-content={true}
> >
@@ -482,8 +442,8 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</TextListItem> </TextListItem>
</Component> </Component>
</StyledComponent> </StyledComponent>
</Detail__DetailName> </Styled(Component)>
<Detail__DetailValue <Styled(Component)
component="dd" component="dd"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
@@ -496,20 +456,25 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "Detail__DetailValue-sc-16ypsyv-1", "componentId": "sc-bxivhb",
"isStatic": false, "isStatic": false,
"lastClassName": "kCDjmZ", "lastClassName": "gxmPlV",
"rules": Array [ "rules": Array [
"word-break:break-all;", "
word-break: break-all;
",
[Function], [Function],
" ", "
",
[Function], [Function],
"
",
], ],
}, },
"displayName": "Detail__DetailValue", "displayName": "Styled(Component)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "Detail__DetailValue-sc-16ypsyv-1", "styledComponentId": "sc-bxivhb",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -520,18 +485,18 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
fullWidth={false} fullWidth={false}
> >
<Component <Component
className="Detail__DetailValue-sc-16ypsyv-1 kCDjmZ" className="sc-bxivhb gxmPlV"
component="dd" component="dd"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
> >
<TextListItem <TextListItem
className="Detail__DetailValue-sc-16ypsyv-1 kCDjmZ" className="sc-bxivhb gxmPlV"
component="dd" component="dd"
data-cy={null} data-cy={null}
> >
<dd <dd
className="Detail__DetailValue-sc-16ypsyv-1 kCDjmZ" className="sc-bxivhb gxmPlV"
data-cy={null} data-cy={null}
data-pf-content={true} data-pf-content={true}
> >
@@ -540,13 +505,13 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</TextListItem> </TextListItem>
</Component> </Component>
</StyledComponent> </StyledComponent>
</Detail__DetailValue> </Styled(Component)>
</Detail> </Detail>
</dl> </dl>
</TextList> </TextList>
</DetailList> </DetailList>
</StyledComponent> </StyledComponent>
</DetailList> </Styled(DetailList)>
</div> </div>
</PFDataListCell> </PFDataListCell>
</StyledComponent> </StyledComponent>
@@ -560,17 +525,19 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "DataListCell-sc-18ntxrx-0", "componentId": "sc-bdVaJa",
"isStatic": true, "isStatic": false,
"lastClassName": "flJMIO", "lastClassName": "kruorc",
"rules": Array [ "rules": Array [
"word-break:break-word;", "
word-break: break-word;
",
], ],
}, },
"displayName": "DataListCell", "displayName": "DataListCell",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "DataListCell-sc-18ntxrx-0", "styledComponentId": "sc-bdVaJa",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -580,12 +547,12 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
forwardedRef={null} forwardedRef={null}
> >
<PFDataListCell <PFDataListCell
className="DataListCell-sc-18ntxrx-0 flJMIO" className="sc-bdVaJa kruorc"
> >
<div <div
className="pf-c-data-list__cell DataListCell-sc-18ntxrx-0 flJMIO" className="pf-c-data-list__cell sc-bdVaJa kruorc"
> >
<DetailList <Styled(DetailList)
stacked={true} stacked={true}
> >
<StyledComponent <StyledComponent
@@ -594,18 +561,24 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "DetailList-sc-12g7m4-0", "componentId": "sc-bwzfXH",
"isStatic": false, "isStatic": false,
"lastClassName": "iAtits", "lastClassName": "kVCDmm",
"rules": Array [ "rules": Array [
"display:grid;grid-gap:20px;align-items:center;", "
display: grid;
grid-gap: 20px;
align-items: center;
",
[Function], [Function],
"
",
], ],
}, },
"displayName": "DetailList", "displayName": "Styled(DetailList)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "DetailList-sc-12g7m4-0", "styledComponentId": "sc-bwzfXH",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -616,15 +589,15 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
stacked={true} stacked={true}
> >
<DetailList <DetailList
className="DetailList-sc-12g7m4-0 iAtits" className="sc-bwzfXH kVCDmm"
stacked={true} stacked={true}
> >
<TextList <TextList
className="DetailList-sc-12g7m4-0 iAtits" className="sc-bwzfXH kVCDmm"
component="dl" component="dl"
> >
<dl <dl
className="DetailList-sc-12g7m4-0 iAtits" className="sc-bwzfXH kVCDmm"
data-pf-content={true} data-pf-content={true}
> >
<Detail <Detail
@@ -645,7 +618,7 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</WithI18n> </WithI18n>
} }
> >
<Detail__DetailName <Styled(Component)
component="dt" component="dt"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
@@ -658,18 +631,22 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "Detail__DetailName-sc-16ypsyv-0", "componentId": "sc-htpNat",
"isStatic": false, "isStatic": false,
"lastClassName": "erdIBg", "lastClassName": "iYJcPm",
"rules": Array [ "rules": Array [
"font-weight:var(--pf-global--FontWeight--bold);", "
font-weight: var(--pf-global--FontWeight--bold);
",
[Function], [Function],
"
",
], ],
}, },
"displayName": "Detail__DetailName", "displayName": "Styled(Component)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "Detail__DetailName-sc-16ypsyv-0", "styledComponentId": "sc-htpNat",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -680,18 +657,18 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
fullWidth={false} fullWidth={false}
> >
<Component <Component
className="Detail__DetailName-sc-16ypsyv-0 erdIBg" className="sc-htpNat iYJcPm"
component="dt" component="dt"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
> >
<TextListItem <TextListItem
className="Detail__DetailName-sc-16ypsyv-0 erdIBg" className="sc-htpNat iYJcPm"
component="dt" component="dt"
data-cy={null} data-cy={null}
> >
<dt <dt
className="Detail__DetailName-sc-16ypsyv-0 erdIBg" className="sc-htpNat iYJcPm"
data-cy={null} data-cy={null}
data-pf-content={true} data-pf-content={true}
> >
@@ -700,8 +677,8 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</TextListItem> </TextListItem>
</Component> </Component>
</StyledComponent> </StyledComponent>
</Detail__DetailName> </Styled(Component)>
<Detail__DetailValue <Styled(Component)
component="dd" component="dd"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
@@ -714,20 +691,25 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
"$$typeof": Symbol(react.forward_ref), "$$typeof": Symbol(react.forward_ref),
"attrs": Array [], "attrs": Array [],
"componentStyle": ComponentStyle { "componentStyle": ComponentStyle {
"componentId": "Detail__DetailValue-sc-16ypsyv-1", "componentId": "sc-bxivhb",
"isStatic": false, "isStatic": false,
"lastClassName": "kCDjmZ", "lastClassName": "gxmPlV",
"rules": Array [ "rules": Array [
"word-break:break-all;", "
word-break: break-all;
",
[Function], [Function],
" ", "
",
[Function], [Function],
"
",
], ],
}, },
"displayName": "Detail__DetailValue", "displayName": "Styled(Component)",
"foldedComponentIds": Array [], "foldedComponentIds": Array [],
"render": [Function], "render": [Function],
"styledComponentId": "Detail__DetailValue-sc-16ypsyv-1", "styledComponentId": "sc-bxivhb",
"target": [Function], "target": [Function],
"toString": [Function], "toString": [Function],
"warnTooManyClasses": [Function], "warnTooManyClasses": [Function],
@@ -738,18 +720,18 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
fullWidth={false} fullWidth={false}
> >
<Component <Component
className="Detail__DetailValue-sc-16ypsyv-1 kCDjmZ" className="sc-bxivhb gxmPlV"
component="dd" component="dd"
data-cy={null} data-cy={null}
fullWidth={false} fullWidth={false}
> >
<TextListItem <TextListItem
className="Detail__DetailValue-sc-16ypsyv-1 kCDjmZ" className="sc-bxivhb gxmPlV"
component="dd" component="dd"
data-cy={null} data-cy={null}
> >
<dd <dd
className="Detail__DetailValue-sc-16ypsyv-1 kCDjmZ" className="sc-bxivhb gxmPlV"
data-cy={null} data-cy={null}
data-pf-content={true} data-pf-content={true}
> >
@@ -944,13 +926,13 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</TextListItem> </TextListItem>
</Component> </Component>
</StyledComponent> </StyledComponent>
</Detail__DetailValue> </Styled(Component)>
</Detail> </Detail>
</dl> </dl>
</TextList> </TextList>
</DetailList> </DetailList>
</StyledComponent> </StyledComponent>
</DetailList> </Styled(DetailList)>
</div> </div>
</PFDataListCell> </PFDataListCell>
</StyledComponent> </StyledComponent>
@@ -958,7 +940,7 @@ exports[`<ResourceAccessListItem /> initially renders succesfully 1`] = `
</div> </div>
</DataListItemCells> </DataListItemCells>
</StyledComponent> </StyledComponent>
</ResourceAccessListItem__DataListItemCells> </Styled(DataListItemCells)>
</div> </div>
</DataListItemRow> </DataListItemRow>
</li> </li>

View File

@@ -1,5 +1,3 @@
export { default as ResourceAccessList } from './ResourceAccessList'; export { default as ResourceAccessList } from './ResourceAccessList';
export { default as ResourceAccessListItem } from './ResourceAccessListItem'; export { default as ResourceAccessListItem } from './ResourceAccessListItem';
export { export { default as DeleteRoleConfirmationModal } from './DeleteRoleConfirmationModal';
default as DeleteRoleConfirmationModal,
} from './DeleteRoleConfirmationModal';

View File

@@ -17,7 +17,8 @@ import RoutedTabs from '../RoutedTabs';
import ContentError from '../ContentError'; import ContentError from '../ContentError';
import ContentLoading from '../ContentLoading'; import ContentLoading from '../ContentLoading';
import { TabbedCardHeader } from '../Card'; import { TabbedCardHeader } from '../Card';
import { ScheduleDetail, ScheduleEdit } from '.'; import ScheduleDetail from './ScheduleDetail';
import ScheduleEdit from './ScheduleEdit';
import { SchedulesAPI } from '../../api'; import { SchedulesAPI } from '../../api';
function Schedule({ i18n, setBreadcrumb, unifiedJobTemplate }) { function Schedule({ i18n, setBreadcrumb, unifiedJobTemplate }) {

View File

@@ -4,21 +4,21 @@ import { RRule, rrulestr } from 'rrule';
import styled from 'styled-components'; import styled from 'styled-components';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { Schedule } from '../../../types';
import { Chip, Title, Button } from '@patternfly/react-core'; import { Chip, Title, Button } from '@patternfly/react-core';
import AlertModal from '../../../components/AlertModal'; import { Schedule } from '../../../types';
import { CardBody, CardActionsRow } from '../../../components/Card'; import AlertModal from '../../AlertModal';
import ContentError from '../../../components/ContentError'; import { CardBody, CardActionsRow } from '../../Card';
import ContentLoading from '../../../components/ContentLoading'; import ContentError from '../../ContentError';
import CredentialChip from '../../../components/CredentialChip'; import ContentLoading from '../../ContentLoading';
import { DetailList, Detail, UserDateDetail } from '../../../components/DetailList'; import CredentialChip from '../../CredentialChip';
import { ScheduleOccurrences, ScheduleToggle } from '../../../components/Schedule'; import { DetailList, Detail, UserDateDetail } from '../../DetailList';
import { ScheduleOccurrences, ScheduleToggle } from '..';
import { formatDateString } from '../../../util/dates'; import { formatDateString } from '../../../util/dates';
import useRequest from '../../../util/useRequest'; import useRequest from '../../../util/useRequest';
import { SchedulesAPI } from '../../../api'; import { SchedulesAPI } from '../../../api';
import DeleteButton from '../../../components/DeleteButton'; import DeleteButton from '../../DeleteButton';
import ErrorDetail from '../../../components/ErrorDetail'; import ErrorDetail from '../../ErrorDetail';
import ChipGroup from '../../../components/ChipGroup'; import ChipGroup from '../../ChipGroup';
const PromptTitle = styled(Title)` const PromptTitle = styled(Title)`
--pf-c-title--m-md--FontWeight: 700; --pf-c-title--m-md--FontWeight: 700;

View File

@@ -44,7 +44,10 @@ function ScheduleOccurrences({ preview = { local: [], utc: [] }, i18n }) {
</SplitItem> </SplitItem>
<SplitItem> <SplitItem>
<MultiButtonToggle <MultiButtonToggle
buttons={[['local', 'Local'], ['utc', 'UTC']]} buttons={[
['local', 'Local'],
['utc', 'UTC'],
]}
value={mode} value={mode}
onChange={newMode => setMode(newMode)} onChange={newMode => setMode(newMode)}
/> />

View File

@@ -1,7 +1,9 @@
import React from 'react'; import React from 'react';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { Switch, Route, useRouteMatch } from 'react-router-dom'; import { Switch, Route, useRouteMatch } from 'react-router-dom';
import { Schedule, ScheduleAdd, ScheduleList } from '.'; import Schedule from './Schedule';
import ScheduleAdd from './ScheduleAdd';
import ScheduleList from './ScheduleList';
function Schedules({ function Schedules({
createSchedule, createSchedule,

View File

@@ -2,8 +2,8 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Chip, Split as PFSplit, SplitItem } from '@patternfly/react-core'; import { Chip, Split as PFSplit, SplitItem } from '@patternfly/react-core';
import ChipGroup from '../../components/ChipGroup';
import styled from 'styled-components'; import styled from 'styled-components';
import ChipGroup from '../ChipGroup';
const Split = styled(PFSplit)` const Split = styled(PFSplit)`
margin: 20px 0px; margin: 20px 0px;

View File

@@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers'; import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import ChipGroup from '../../components/ChipGroup'; import ChipGroup from '../ChipGroup';
import SelectedList from './SelectedList'; import SelectedList from './SelectedList';

View File

@@ -77,6 +77,20 @@ const SkippedBottom = styled.div`
background-color: #2dbaba; background-color: #2dbaba;
`; `;
RunningJob.displayName = 'RunningJob';
WaitingJob.displayName = 'WaitingJob';
FinishedJob.displayName = 'FinishedJob';
SuccessfulTop.displayName = 'SuccessfulTop';
SuccessfulBottom.displayName = 'SuccessfulBottom';
FailedTop.displayName = 'FailedTop';
FailedBottom.displayName = 'FailedBottom';
UnreachableTop.displayName = 'UnreachableTop';
UnreachableBottom.displayName = 'UnreachableBottom';
ChangedTop.displayName = 'ChangedTop';
ChangedBottom.displayName = 'ChangedBottom';
SkippedTop.displayName = 'SkippedTop';
SkippedBottom.displayName = 'SkippedBottom';
const StatusIcon = ({ status, ...props }) => { const StatusIcon = ({ status, ...props }) => {
return ( return (
<div {...props}> <div {...props}>

View File

@@ -6,53 +6,53 @@ describe('StatusIcon', () => {
test('renders the successful status', () => { test('renders the successful status', () => {
const wrapper = mount(<StatusIcon status="successful" />); const wrapper = mount(<StatusIcon status="successful" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__SuccessfulTop')).toHaveLength(1); expect(wrapper.find('StatusIcon SuccessfulTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__SuccessfulBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon SuccessfulBottom')).toHaveLength(1);
}); });
test('renders running status', () => { test('renders running status', () => {
const wrapper = mount(<StatusIcon status="running" />); const wrapper = mount(<StatusIcon status="running" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__RunningJob')).toHaveLength(1); expect(wrapper.find('StatusIcon RunningJob')).toHaveLength(1);
}); });
test('renders waiting status', () => { test('renders waiting status', () => {
const wrapper = mount(<StatusIcon status="waiting" />); const wrapper = mount(<StatusIcon status="waiting" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__WaitingJob')).toHaveLength(1); expect(wrapper.find('StatusIcon WaitingJob')).toHaveLength(1);
}); });
test('renders failed status', () => { test('renders failed status', () => {
const wrapper = mount(<StatusIcon status="failed" />); const wrapper = mount(<StatusIcon status="failed" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__FailedTop')).toHaveLength(1); expect(wrapper.find('StatusIcon FailedTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__FailedBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon FailedBottom')).toHaveLength(1);
}); });
test('renders a successful status when host status is "ok"', () => { test('renders a successful status when host status is "ok"', () => {
const wrapper = mount(<StatusIcon status="ok" />); const wrapper = mount(<StatusIcon status="ok" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__SuccessfulTop')).toHaveLength(1); expect(wrapper.find('StatusIcon SuccessfulTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__SuccessfulBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon SuccessfulBottom')).toHaveLength(1);
}); });
test('renders "failed" host status', () => { test('renders "failed" host status', () => {
const wrapper = mount(<StatusIcon status="failed" />); const wrapper = mount(<StatusIcon status="failed" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__FailedTop')).toHaveLength(1); expect(wrapper.find('StatusIcon FailedTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__FailedBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon FailedBottom')).toHaveLength(1);
}); });
test('renders "changed" host status', () => { test('renders "changed" host status', () => {
const wrapper = mount(<StatusIcon status="changed" />); const wrapper = mount(<StatusIcon status="changed" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__ChangedTop')).toHaveLength(1); expect(wrapper.find('StatusIcon ChangedTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__ChangedBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon ChangedBottom')).toHaveLength(1);
}); });
test('renders "skipped" host status', () => { test('renders "skipped" host status', () => {
const wrapper = mount(<StatusIcon status="skipped" />); const wrapper = mount(<StatusIcon status="skipped" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__SkippedTop')).toHaveLength(1); expect(wrapper.find('StatusIcon SkippedTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__SkippedBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon SkippedBottom')).toHaveLength(1);
}); });
test('renders "unreachable" host status', () => { test('renders "unreachable" host status', () => {
const wrapper = mount(<StatusIcon status="unreachable" />); const wrapper = mount(<StatusIcon status="unreachable" />);
expect(wrapper).toHaveLength(1); expect(wrapper).toHaveLength(1);
expect(wrapper.find('StatusIcon__UnreachableTop')).toHaveLength(1); expect(wrapper.find('StatusIcon UnreachableTop')).toHaveLength(1);
expect(wrapper.find('StatusIcon__UnreachableBottom')).toHaveLength(1); expect(wrapper.find('StatusIcon UnreachableBottom')).toHaveLength(1);
}); });
}); });

View File

@@ -9,7 +9,8 @@ import {
WorkflowStateContext, WorkflowStateContext,
} from '../../contexts/Workflow'; } from '../../contexts/Workflow';
import { constants as wfConstants } from './WorkflowUtils'; import { constants as wfConstants } from './WorkflowUtils';
import { WorkflowActionTooltip, WorkflowActionTooltipItem } from '.'; import WorkflowActionTooltip from './WorkflowActionTooltip';
import WorkflowActionTooltipItem from './WorkflowActionTooltipItem';
const StartG = styled.g` const StartG = styled.g`
pointer-events: ${props => (props.ignorePointerEvents ? 'none' : 'auto')}; pointer-events: ${props => (props.ignorePointerEvents ? 'none' : 'auto')};

View File

@@ -1,7 +1,5 @@
export { default as WorkflowActionTooltip } from './WorkflowActionTooltip'; export { default as WorkflowActionTooltip } from './WorkflowActionTooltip';
export { export { default as WorkflowActionTooltipItem } from './WorkflowActionTooltipItem';
default as WorkflowActionTooltipItem,
} from './WorkflowActionTooltipItem';
export { default as WorkflowHelp } from './WorkflowHelp'; export { default as WorkflowHelp } from './WorkflowHelp';
export { default as WorkflowLegend } from './WorkflowLegend'; export { default as WorkflowLegend } from './WorkflowLegend';
export { default as WorkflowLinkHelp } from './WorkflowLinkHelp'; export { default as WorkflowLinkHelp } from './WorkflowLinkHelp';

View File

@@ -13,7 +13,7 @@ import PaginatedDataList, {
} from '../../../components/PaginatedDataList'; } from '../../../components/PaginatedDataList';
import useRequest, { useDeleteItems } from '../../../util/useRequest'; import useRequest, { useDeleteItems } from '../../../util/useRequest';
import { getQSConfig, parseQueryString } from '../../../util/qs'; import { getQSConfig, parseQueryString } from '../../../util/qs';
import { CredentialListItem } from '.'; import CredentialListItem from './CredentialListItem';
const QS_CONFIG = getQSConfig('credential', { const QS_CONFIG = getQSConfig('credential', {
page: 1, page: 1,

View File

@@ -45,7 +45,10 @@ describe('<InventoryAdd />', () => {
expect(wrapper.length).toBe(1); expect(wrapper.length).toBe(1);
}); });
test('handleSubmit should call the api and redirect to details page', async () => { test('handleSubmit should call the api and redirect to details page', async () => {
const instanceGroups = [{ name: 'Bizz', id: 1 }, { name: 'Buzz', id: 2 }]; const instanceGroups = [
{ name: 'Bizz', id: 1 },
{ name: 'Buzz', id: 2 },
];
await waitForElement(wrapper, 'isLoading', el => el.length === 0); await waitForElement(wrapper, 'isLoading', el => el.length === 0);
wrapper.find('InventoryForm').prop('onSubmit')({ wrapper.find('InventoryForm').prop('onSubmit')({

View File

@@ -4,7 +4,11 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { Button, Chip } from '@patternfly/react-core'; import { Button, Chip } from '@patternfly/react-core';
import { CardBody, CardActionsRow } from '../../../components/Card'; import { CardBody, CardActionsRow } from '../../../components/Card';
import { DetailList, Detail, UserDateDetail } from '../../../components/DetailList'; import {
DetailList,
Detail,
UserDateDetail,
} from '../../../components/DetailList';
import { VariablesDetail } from '../../../components/CodeMirrorInput'; import { VariablesDetail } from '../../../components/CodeMirrorInput';
import DeleteButton from '../../../components/DeleteButton'; import DeleteButton from '../../../components/DeleteButton';
import ContentError from '../../../components/ContentError'; import ContentError from '../../../components/ContentError';

View File

@@ -90,11 +90,11 @@ describe('<InventoryDetail />', () => {
expectDetailToMatch(wrapper, 'Type', 'Inventory'); expectDetailToMatch(wrapper, 'Type', 'Inventory');
const org = wrapper.find('Detail[label="Organization"]'); const org = wrapper.find('Detail[label="Organization"]');
expect(org.prop('value')).toMatchInlineSnapshot(` expect(org.prop('value')).toMatchInlineSnapshot(`
<Link <ForwardRef
to="/organizations/1/details" to="/organizations/1/details"
> >
The Organization The Organization
</Link> </ForwardRef>
`); `);
const vars = wrapper.find('VariablesDetail'); const vars = wrapper.find('VariablesDetail');
expect(vars).toHaveLength(1); expect(vars).toHaveLength(1);

View File

@@ -110,7 +110,10 @@ describe('<InventoryEdit />', () => {
test('handleSubmit should post to the api', async () => { test('handleSubmit should post to the api', async () => {
await waitForElement(wrapper, 'isLoading', el => el.length === 0); await waitForElement(wrapper, 'isLoading', el => el.length === 0);
const instanceGroups = [{ name: 'Bizz', id: 2 }, { name: 'Buzz', id: 3 }]; const instanceGroups = [
{ name: 'Bizz', id: 2 },
{ name: 'Buzz', id: 3 },
];
wrapper.find('InventoryForm').prop('onSubmit')({ wrapper.find('InventoryForm').prop('onSubmit')({
name: 'Foo', name: 'Foo',
id: 13, id: 13,

View File

@@ -18,7 +18,8 @@ import { PencilAltIcon } from '@patternfly/react-icons';
import { timeOfDay } from '../../../util/dates'; import { timeOfDay } from '../../../util/dates';
import { InventoriesAPI } from '../../../api'; import { InventoriesAPI } from '../../../api';
import { Inventory } from '../../../types'; import { Inventory } from '../../../types';
import CopyButton from '../../../components/CopyButton/CopyButton'; import DataListCell from '../../../components/DataListCell';
import CopyButton from '../../../components/CopyButton';
const DataListAction = styled(_DataListAction)` const DataListAction = styled(_DataListAction)`
align-items: center; align-items: center;

View File

@@ -9,11 +9,11 @@ import {
useRouteMatch, useRouteMatch,
useLocation, useLocation,
} from 'react-router-dom'; } from 'react-router-dom';
import { CaretLeftIcon } from '@patternfly/react-icons';
import { CardActions } from '@patternfly/react-core';
import useRequest from '../../../util/useRequest'; import useRequest from '../../../util/useRequest';
import { InventoriesAPI } from '../../../api'; import { InventoriesAPI } from '../../../api';
import { CaretLeftIcon } from '@patternfly/react-icons';
import { CardActions } from '@patternfly/react-core';
import { TabbedCardHeader } from '../../../components/Card'; import { TabbedCardHeader } from '../../../components/Card';
import CardCloseButton from '../../../components/CardCloseButton'; import CardCloseButton from '../../../components/CardCloseButton';
import ContentError from '../../../components/ContentError'; import ContentError from '../../../components/ContentError';

View File

@@ -2,7 +2,10 @@ import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { createMemoryHistory } from 'history'; import { createMemoryHistory } from 'history';
import { InventoriesAPI } from '../../../api'; import { InventoriesAPI } from '../../../api';
import { mountWithContexts, waitForElement } from '../../../../testUtils/enzymeHelpers'; import {
mountWithContexts,
waitForElement,
} from '../../../../testUtils/enzymeHelpers';
import mockInventorySource from '../shared/data.inventory_source.json'; import mockInventorySource from '../shared/data.inventory_source.json';
import InventorySource from './InventorySource'; import InventorySource from './InventorySource';

View File

@@ -15,7 +15,11 @@ import { CardBody, CardActionsRow } from '../../../components/Card';
import { VariablesDetail } from '../../../components/CodeMirrorInput'; import { VariablesDetail } from '../../../components/CodeMirrorInput';
import CredentialChip from '../../../components/CredentialChip'; import CredentialChip from '../../../components/CredentialChip';
import DeleteButton from '../../../components/DeleteButton'; import DeleteButton from '../../../components/DeleteButton';
import { DetailList, Detail, UserDateDetail } from '../../../components/DetailList'; import {
DetailList,
Detail,
UserDateDetail,
} from '../../../components/DetailList';
import ErrorDetail from '../../../components/ErrorDetail'; import ErrorDetail from '../../../components/ErrorDetail';
import { InventorySourcesAPI } from '../../../api'; import { InventorySourcesAPI } from '../../../api';

View File

@@ -1,7 +1,10 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { createMemoryHistory } from 'history'; import { createMemoryHistory } from 'history';
import { mountWithContexts, waitForElement } from '../../../../testUtils/enzymeHelpers'; import {
mountWithContexts,
waitForElement,
} from '../../../../testUtils/enzymeHelpers';
import InventorySourceDetail from './InventorySourceDetail'; import InventorySourceDetail from './InventorySourceDetail';
import mockInvSource from '../shared/data.inventory_source.json'; import mockInvSource from '../shared/data.inventory_source.json';
import { InventorySourcesAPI } from '../../../api'; import { InventorySourcesAPI } from '../../../api';

View File

@@ -43,7 +43,14 @@ describe('<InventorySourceList />', () => {
InventorySourcesAPI.readOptions.mockResolvedValue({ InventorySourcesAPI.readOptions.mockResolvedValue({
data: { data: {
actions: { actions: {
GET: { source: { choices: [['scm', 'SCM'], ['ec2', 'EC2']] } }, GET: {
source: {
choices: [
['scm', 'SCM'],
['ec2', 'EC2'],
],
},
},
POST: {}, POST: {},
}, },
}, },
@@ -247,7 +254,14 @@ describe('<InventorySourceList /> RBAC testing', () => {
InventorySourcesAPI.readOptions.mockResolvedValue({ InventorySourcesAPI.readOptions.mockResolvedValue({
data: { data: {
actions: { actions: {
GET: { source: { choices: [['scm', 'SCM'], ['ec2', 'EC2']] } }, GET: {
source: {
choices: [
['scm', 'SCM'],
['ec2', 'EC2'],
],
},
},
}, },
}, },
}); });

View File

@@ -100,6 +100,10 @@ function InventorySourceSyncButton({ onSyncLoading, source, i18n }) {
); );
} }
InventorySourceSyncButton.defaultProps = {
source: {},
};
InventorySourceSyncButton.propTypes = { InventorySourceSyncButton.propTypes = {
onSyncLoading: PropTypes.func.isRequired, onSyncLoading: PropTypes.func.isRequired,
source: PropTypes.shape({}), source: PropTypes.shape({}),

View File

@@ -1,6 +1,9 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { mountWithContexts, waitForElement } from '../../../../testUtils/enzymeHelpers'; import {
mountWithContexts,
waitForElement,
} from '../../../../testUtils/enzymeHelpers';
import InventoryForm from './InventoryForm'; import InventoryForm from './InventoryForm';
@@ -47,7 +50,10 @@ const inventory = {
pending_deletion: false, pending_deletion: false,
}; };
const instanceGroups = [{ name: 'Foo', id: 1 }, { name: 'Bar', id: 2 }]; const instanceGroups = [
{ name: 'Foo', id: 1 },
{ name: 'Bar', id: 2 },
];
describe('<InventoryForm />', () => { describe('<InventoryForm />', () => {
let wrapper; let wrapper;
let onCancel; let onCancel;

View File

@@ -59,14 +59,14 @@ describe('<JobDetail />', () => {
test('should display successful job status icon', () => { test('should display successful job status icon', () => {
const statusDetail = wrapper.find('Detail[label="Status"]'); const statusDetail = wrapper.find('Detail[label="Status"]');
expect(statusDetail.find('StatusIcon__SuccessfulTop')).toHaveLength(1); expect(statusDetail.find('StatusIcon SuccessfulTop')).toHaveLength(1);
expect(statusDetail.find('StatusIcon__SuccessfulBottom')).toHaveLength(1); expect(statusDetail.find('StatusIcon SuccessfulBottom')).toHaveLength(1);
}); });
test('should display successful project status icon', () => { test('should display successful project status icon', () => {
const statusDetail = wrapper.find('Detail[label="Project"]'); const statusDetail = wrapper.find('Detail[label="Project"]');
expect(statusDetail.find('StatusIcon__SuccessfulTop')).toHaveLength(1); expect(statusDetail.find('StatusIcon SuccessfulTop')).toHaveLength(1);
expect(statusDetail.find('StatusIcon__SuccessfulBottom')).toHaveLength(1); expect(statusDetail.find('StatusIcon SuccessfulBottom')).toHaveLength(1);
}); });
test('should properly delete job', async () => { test('should properly delete job', async () => {

View File

@@ -4,13 +4,13 @@ import PropTypes from 'prop-types';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import styled from 'styled-components'; import styled from 'styled-components';
import Entities from 'html-entities'; import { AllHtmlEntities } from 'html-entities';
import StatusIcon from '../../../components/StatusIcon'; import StatusIcon from '../../../components/StatusIcon';
import { DetailList, Detail } from '../../../components/DetailList'; import { DetailList, Detail } from '../../../components/DetailList';
import ContentEmpty from '../../../components/ContentEmpty'; import ContentEmpty from '../../../components/ContentEmpty';
import CodeMirrorInput from '../../../components/CodeMirrorInput'; import CodeMirrorInput from '../../../components/CodeMirrorInput';
const entities = new Entities.AllHtmlEntities(); const entities = new AllHtmlEntities();
const Modal = styled(PFModal)` const Modal = styled(PFModal)`
--pf-c-modal-box__footer--MarginTop: 0; --pf-c-modal-box__footer--MarginTop: 0;

View File

@@ -130,8 +130,8 @@ describe('HostEventModal', () => {
); );
const icon = wrapper.find('StatusIcon'); const icon = wrapper.find('StatusIcon');
expect(icon.prop('status')).toBe('ok'); expect(icon.prop('status')).toBe('ok');
expect(icon.find('StatusIcon__SuccessfulTop').length).toBe(1); expect(icon.find('StatusIcon SuccessfulTop').length).toBe(1);
expect(icon.find('StatusIcon__SuccessfulBottom').length).toBe(1); expect(icon.find('StatusIcon SuccessfulBottom').length).toBe(1);
}); });
test('should display skipped host status icon', () => { test('should display skipped host status icon', () => {
@@ -142,8 +142,8 @@ describe('HostEventModal', () => {
const icon = wrapper.find('StatusIcon'); const icon = wrapper.find('StatusIcon');
expect(icon.prop('status')).toBe('skipped'); expect(icon.prop('status')).toBe('skipped');
expect(icon.find('StatusIcon__SkippedTop').length).toBe(1); expect(icon.find('StatusIcon SkippedTop').length).toBe(1);
expect(icon.find('StatusIcon__SkippedBottom').length).toBe(1); expect(icon.find('StatusIcon SkippedBottom').length).toBe(1);
}); });
test('should display unreachable host status icon', () => { test('should display unreachable host status icon', () => {
@@ -162,8 +162,8 @@ describe('HostEventModal', () => {
const icon = wrapper.find('StatusIcon'); const icon = wrapper.find('StatusIcon');
expect(icon.prop('status')).toBe('unreachable'); expect(icon.prop('status')).toBe('unreachable');
expect(icon.find('StatusIcon__UnreachableTop').length).toBe(1); expect(icon.find('StatusIcon UnreachableTop').length).toBe(1);
expect(icon.find('StatusIcon__UnreachableBottom').length).toBe(1); expect(icon.find('StatusIcon UnreachableBottom').length).toBe(1);
}); });
test('should display failed host status icon', () => { test('should display failed host status icon', () => {
@@ -183,8 +183,8 @@ describe('HostEventModal', () => {
const icon = wrapper.find('StatusIcon'); const icon = wrapper.find('StatusIcon');
expect(icon.prop('status')).toBe('failed'); expect(icon.prop('status')).toBe('failed');
expect(icon.find('StatusIcon__FailedTop').length).toBe(1); expect(icon.find('StatusIcon FailedTop').length).toBe(1);
expect(icon.find('StatusIcon__FailedBottom').length).toBe(1); expect(icon.find('StatusIcon FailedBottom').length).toBe(1);
}); });
test('should display JSON tab content on tab click', () => { test('should display JSON tab content on tab click', () => {

View File

@@ -1,6 +1,6 @@
import Ansi from 'ansi-to-html'; import Ansi from 'ansi-to-html';
import hasAnsi from 'has-ansi'; import hasAnsi from 'has-ansi';
import Entities from 'html-entities'; import { AllHtmlEntities } from 'html-entities';
import React from 'react'; import React from 'react';
import { import {
JobEventLine, JobEventLine,
@@ -35,7 +35,7 @@ const ansi = new Ansi({
15: '#FFF', 15: '#FFF',
}, },
}); });
const entities = new Entities.AllHtmlEntities(); const entities = new AllHtmlEntities();
function getTimestamp({ created }) { function getTimestamp({ created }) {
const date = new Date(created); const date = new Date(created);

View File

@@ -12,7 +12,7 @@ jest.mock('../../../api');
async function checkOutput(wrapper, expectedLines) { async function checkOutput(wrapper, expectedLines) {
await waitForElement(wrapper, 'div[type="job_event"]', el => el.length > 1); await waitForElement(wrapper, 'div[type="job_event"]', el => el.length > 1);
const jobEventLines = wrapper.find('div[type="job_event_line_text"]'); const jobEventLines = wrapper.find('JobEventLineText div');
const actualLines = []; const actualLines = [];
jobEventLines.forEach(line => { jobEventLines.forEach(line => {
actualLines.push(line.text()); actualLines.push(line.text());
@@ -67,58 +67,184 @@ describe('<JobOutput />', () => {
wrapper = mountWithContexts(<JobOutput job={mockJob} />); wrapper = mountWithContexts(<JobOutput job={mockJob} />);
await waitForElement(wrapper, 'JobEvent', el => el.length > 0); await waitForElement(wrapper, 'JobEvent', el => el.length > 0);
await checkOutput(wrapper, [ await checkOutput(wrapper, [
'ok: [localhost] => (item=37) => {',
' "msg": "This is a debug message: 37"',
'}',
'ok: [localhost] => (item=38) => {',
' "msg": "This is a debug message: 38"',
'}',
'ok: [localhost] => (item=39) => {',
' "msg": "This is a debug message: 39"',
'}',
'ok: [localhost] => (item=40) => {',
' "msg": "This is a debug message: 40"',
'}',
'ok: [localhost] => (item=41) => {',
' "msg": "This is a debug message: 41"',
'}',
'ok: [localhost] => (item=42) => {',
' "msg": "This is a debug message: 42"',
'}',
'ok: [localhost] => (item=43) => {',
' "msg": "This is a debug message: 43"',
'}',
'ok: [localhost] => (item=44) => {',
' "msg": "This is a debug message: 44"',
'}',
'ok: [localhost] => (item=45) => {',
' "msg": "This is a debug message: 45"',
'}',
'ok: [localhost] => (item=46) => {',
' "msg": "This is a debug message: 46"',
'}',
'ok: [localhost] => (item=47) => {',
' "msg": "This is a debug message: 47"',
'}',
'ok: [localhost] => (item=48) => {',
' "msg": "This is a debug message: 48"',
'}',
'ok: [localhost] => (item=49) => {',
' "msg": "This is a debug message: 49"',
'}',
'ok: [localhost] => (item=50) => {',
' "msg": "This is a debug message: 50"',
'}',
'ok: [localhost] => (item=51) => {',
' "msg": "This is a debug message: 51"',
'}',
'ok: [localhost] => (item=52) => {',
' "msg": "This is a debug message: 52"',
'}',
'ok: [localhost] => (item=53) => {',
' "msg": "This is a debug message: 53"',
'}',
'ok: [localhost] => (item=54) => {',
' "msg": "This is a debug message: 54"',
'}',
'ok: [localhost] => (item=55) => {',
' "msg": "This is a debug message: 55"',
'}',
'ok: [localhost] => (item=56) => {',
' "msg": "This is a debug message: 56"',
'}',
'ok: [localhost] => (item=57) => {',
' "msg": "This is a debug message: 57"',
'}',
'ok: [localhost] => (item=58) => {',
' "msg": "This is a debug message: 58"',
'}',
'ok: [localhost] => (item=59) => {',
' "msg": "This is a debug message: 59"',
'}',
'ok: [localhost] => (item=60) => {',
' "msg": "This is a debug message: 60"',
'}',
'ok: [localhost] => (item=61) => {',
' "msg": "This is a debug message: 61"',
'}',
'ok: [localhost] => (item=62) => {',
' "msg": "This is a debug message: 62"',
'}',
'ok: [localhost] => (item=63) => {',
' "msg": "This is a debug message: 63"',
'}',
'ok: [localhost] => (item=64) => {',
' "msg": "This is a debug message: 64"',
'}',
'ok: [localhost] => (item=65) => {',
' "msg": "This is a debug message: 65"',
'}',
'ok: [localhost] => (item=66) => {',
' "msg": "This is a debug message: 66"',
'}',
'ok: [localhost] => (item=67) => {',
' "msg": "This is a debug message: 67"',
'}',
'ok: [localhost] => (item=68) => {',
' "msg": "This is a debug message: 68"',
'}',
'ok: [localhost] => (item=69) => {',
' "msg": "This is a debug message: 69"',
'}',
'ok: [localhost] => (item=70) => {',
' "msg": "This is a debug message: 70"',
'}',
'ok: [localhost] => (item=71) => {',
' "msg": "This is a debug message: 71"',
'}',
'ok: [localhost] => (item=72) => {',
' "msg": "This is a debug message: 72"',
'}',
'ok: [localhost] => (item=73) => {',
' "msg": "This is a debug message: 73"',
'}',
'ok: [localhost] => (item=74) => {',
' "msg": "This is a debug message: 74"',
'}',
'ok: [localhost] => (item=75) => {',
' "msg": "This is a debug message: 75"',
'}',
'ok: [localhost] => (item=76) => {',
' "msg": "This is a debug message: 76"',
'}',
'ok: [localhost] => (item=77) => {',
' "msg": "This is a debug message: 77"',
'}',
'ok: [localhost] => (item=78) => {',
' "msg": "This is a debug message: 78"',
'}',
'ok: [localhost] => (item=79) => {',
' "msg": "This is a debug message: 79"',
'}',
'ok: [localhost] => (item=80) => {',
' "msg": "This is a debug message: 80"',
'}',
'ok: [localhost] => (item=81) => {',
' "msg": "This is a debug message: 81"',
'}',
'ok: [localhost] => (item=82) => {',
' "msg": "This is a debug message: 82"',
'}',
'ok: [localhost] => (item=83) => {',
' "msg": "This is a debug message: 83"',
'}',
'ok: [localhost] => (item=84) => {',
' "msg": "This is a debug message: 84"',
'}',
'ok: [localhost] => (item=85) => {',
' "msg": "This is a debug message: 85"',
'}',
'ok: [localhost] => (item=86) => {',
' "msg": "This is a debug message: 86"',
'}',
'ok: [localhost] => (item=87) => {',
' "msg": "This is a debug message: 87"',
'}',
'ok: [localhost] => (item=88) => {',
' "msg": "This is a debug message: 88"',
'}',
'ok: [localhost] => (item=89) => {',
' "msg": "This is a debug message: 89"',
'}',
'ok: [localhost] => (item=90) => {',
' "msg": "This is a debug message: 90"',
'}',
'ok: [localhost] => (item=91) => {',
' "msg": "This is a debug message: 91"',
'}',
'ok: [localhost] => (item=92) => {',
' "msg": "This is a debug message: 92"',
'}',
'ok: [localhost] => (item=93) => {',
' "msg": "This is a debug message: 93"',
'}',
'ok: [localhost] => (item=94) => {',
' "msg": "This is a debug message: 94"',
'}',
'', '',
'PLAY [all] *********************************************************************15:37:25', 'PLAY RECAP *********************************************************************15:37:26',
'localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ',
'', '',
'TASK [debug] *******************************************************************15:37:25',
'ok: [localhost] => (item=1) => {',
' "msg": "This is a debug message: 1"',
'}',
'ok: [localhost] => (item=2) => {',
' "msg": "This is a debug message: 2"',
'}',
'ok: [localhost] => (item=3) => {',
' "msg": "This is a debug message: 3"',
'}',
'ok: [localhost] => (item=4) => {',
' "msg": "This is a debug message: 4"',
'}',
'ok: [localhost] => (item=5) => {',
' "msg": "This is a debug message: 5"',
'}',
'ok: [localhost] => (item=6) => {',
' "msg": "This is a debug message: 6"',
'}',
'ok: [localhost] => (item=7) => {',
' "msg": "This is a debug message: 7"',
'}',
'ok: [localhost] => (item=8) => {',
' "msg": "This is a debug message: 8"',
'}',
'ok: [localhost] => (item=9) => {',
' "msg": "This is a debug message: 9"',
'}',
'ok: [localhost] => (item=10) => {',
' "msg": "This is a debug message: 10"',
'}',
'ok: [localhost] => (item=11) => {',
' "msg": "This is a debug message: 11"',
'}',
'ok: [localhost] => (item=12) => {',
' "msg": "This is a debug message: 12"',
'}',
'ok: [localhost] => (item=13) => {',
' "msg": "This is a debug message: 13"',
'}',
'ok: [localhost] => (item=14) => {',
' "msg": "This is a debug message: 14"',
'}',
'ok: [localhost] => (item=15) => {',
' "msg": "This is a debug message: 15"',
'}',
'ok: [localhost] => (item=16) => {',
' "msg": "This is a debug message: 16"',
'}',
]); ]);
expect(wrapper.find('JobOutput').length).toBe(1); expect(wrapper.find('JobOutput').length).toBe(1);

View File

@@ -16,6 +16,7 @@ const BarSegment = styled.div`
background-color: ${props => props.color || 'inherit'}; background-color: ${props => props.color || 'inherit'};
flex-grow: ${props => props.count || 0}; flex-grow: ${props => props.count || 0};
`; `;
BarSegment.displayName = 'BarSegment';
const TooltipContent = styled.div` const TooltipContent = styled.div`
align-items: center; align-items: center;

View File

@@ -22,7 +22,7 @@ describe('<HostStatusBar />', () => {
}); });
test('should render five bar segments', () => { test('should render five bar segments', () => {
expect(wrapper.find('HostStatusBar__BarSegment').length).toBe(5); expect(wrapper.find('BarSegment').length).toBe(5);
}); });
test('tooltips should display host status and count', () => { test('tooltips should display host status and count', () => {
@@ -44,7 +44,7 @@ describe('<HostStatusBar />', () => {
test('empty host counts should display tooltip and one bar segment', () => { test('empty host counts should display tooltip and one bar segment', () => {
wrapper = mountWithContexts(<HostStatusBar />); wrapper = mountWithContexts(<HostStatusBar />);
expect(wrapper.find('HostStatusBar__BarSegment').length).toBe(1); expect(wrapper.find('BarSegment').length).toBe(1);
expect(wrapper.find('TooltipContent').text()).toEqual( expect(wrapper.find('TooltipContent').text()).toEqual(
'Host status information for this job is unavailable.' 'Host status information for this job is unavailable.'
); );

View File

@@ -1,6 +1,6 @@
import styled from 'styled-components'; import styled from 'styled-components';
export default styled.div` const JobEventLineNumber = styled.div`
color: #161b1f; color: #161b1f;
background-color: #ebebeb; background-color: #ebebeb;
flex: 0 0 45px; flex: 0 0 45px;
@@ -10,3 +10,7 @@ export default styled.div`
border-right: 1px solid #d7d7d7; border-right: 1px solid #d7d7d7;
user-select: none; user-select: none;
`; `;
JobEventLineNumber.displayName = 'JobEventLineNumber';
export default JobEventLineNumber;

View File

@@ -1,6 +1,6 @@
import styled from 'styled-components'; import styled from 'styled-components';
export default styled.div` const JobEventLineText = styled.div`
padding: 0 15px; padding: 0 15px;
white-space: pre-wrap; white-space: pre-wrap;
word-break: break-all; word-break: break-all;
@@ -27,3 +27,7 @@ export default styled.div`
border-radius: 5px; border-radius: 5px;
} }
`; `;
JobEventLineText.displayName = 'JobEventLineText';
export default JobEventLineText;

View File

@@ -5,7 +5,8 @@ import {
getScaleAndOffsetToFit, getScaleAndOffsetToFit,
getTranslatePointsForZoom, getTranslatePointsForZoom,
} from '../../../components/Workflow/WorkflowUtils'; } from '../../../components/Workflow/WorkflowUtils';
import { WorkflowOutputLink, WorkflowOutputNode } from '.'; import WorkflowOutputLink from './WorkflowOutputLink';
import WorkflowOutputNode from './WorkflowOutputNode';
import { import {
WorkflowHelp, WorkflowHelp,
WorkflowLegend, WorkflowLegend,

View File

@@ -59,6 +59,8 @@ const NodeDefaultLabel = styled.p`
white-space: nowrap; white-space: nowrap;
`; `;
Elapsed.displayName = 'Elapsed';
function WorkflowOutputNode({ i18n, mouseEnter, mouseLeave, node }) { function WorkflowOutputNode({ i18n, mouseEnter, mouseLeave, node }) {
const history = useHistory(); const history = useHistory();
const { nodePositions } = useContext(WorkflowStateContext); const { nodePositions } = useContext(WorkflowStateContext);

View File

@@ -73,7 +73,7 @@ describe('WorkflowOutputNode', () => {
</svg> </svg>
); );
expect(wrapper.contains(<p>Automation JT</p>)).toEqual(true); expect(wrapper.contains(<p>Automation JT</p>)).toEqual(true);
expect(wrapper.find('WorkflowOutputNode__Elapsed').text()).toBe('00:00:07'); expect(wrapper.find('WorkflowOutputNode Elapsed').text()).toBe('00:00:07');
}); });
test('node contents displayed correctly when Job Template deleted', () => { test('node contents displayed correctly when Job Template deleted', () => {
const wrapper = mountWithContexts( const wrapper = mountWithContexts(
@@ -88,7 +88,7 @@ describe('WorkflowOutputNode', () => {
</svg> </svg>
); );
expect(wrapper.contains(<p>Automation JT 2</p>)).toEqual(true); expect(wrapper.contains(<p>Automation JT 2</p>)).toEqual(true);
expect(wrapper.find('WorkflowOutputNode__Elapsed').text()).toBe('00:00:07'); expect(wrapper.find('WorkflowOutputNode Elapsed').text()).toBe('00:00:07');
}); });
test('node contents displayed correctly when Job deleted', () => { test('node contents displayed correctly when Job deleted', () => {
const wrapper = mountWithContexts( const wrapper = mountWithContexts(

View File

@@ -7,7 +7,7 @@ import { LoginForm, LoginPage as PFLoginPage } from '@patternfly/react-core';
import { RootAPI } from '../../api'; import { RootAPI } from '../../api';
import { BrandName } from '../../variables'; import { BrandName } from '../../variables';
import brandLogo from '../../../images/brand-logo.svg'; import brandLogo from './brand-logo.svg';
const LoginPage = styled(PFLoginPage)` const LoginPage = styled(PFLoginPage)`
& .pf-c-brand { & .pf-c-brand {

View File

@@ -0,0 +1,232 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 500 500" style="enable-background:new 0 0 500 500;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;fill:#ED1C24;}
.st2{fill:#42210B;}
.st3{fill:#FFFFFF;}
.st4{fill:#C69C6D;stroke:#8C6239;stroke-width:5;stroke-miterlimit:10;}
.st5{fill:#FFFFFF;stroke:#42210B;stroke-width:3;stroke-miterlimit:10;}
.st6{fill:#ED1C24;stroke:#8C6239;stroke-width:5;stroke-miterlimit:10;}
.st7{fill:#A67C52;}
.st8{fill:#ED1C24;}
</style>
<g class="st0">
<path class="st1" d="M319.8,169.3c1.5-14.2,13.7-27.2,29.9-31.9c-13.1,1.5-27.3-1.7-36-10c-8.7-8.3-10-21.9-1.4-30.1
c-12,6.7-28.1,8.1-41.4,3.4c-13.3-4.6-23.5-15.1-26.2-26.9c-2-8.8,0-17.9,2-26.7c-6.2,9.4-17.6,17.3-30.5,17.3
c-12.9,0.1-25.7-10.2-22.9-20.7c-5.5,7.8-11.4,15.9-21,20.2c-9.5,4.3-23.7,2.7-28.2-5.5c-1.6,10.8-7.5,22-19.1,27
c-9,3.9-21.5,2.2-28-3.8c5.7,11.4,4.3,25.3-4.1,35.6c-9.9,12.2-29.1,18.6-46.4,15.6c14.7,7.2,28.5,17.7,32.1,31.5
c3.7,13.8-7.1,30.7-24.1,31.7c13.6,3.1,28,7.4,35.6,17.2c7.6,9.8,2.9,26.4-11.1,28c12.8-2.6,27.4,3.9,31.9,14.2
c4.1,9.5-0.9,20.9-10.9,26.5c18.6-8.9,41-17.1,59.6-8.8c13.9,6.2,20.8,21.6,15.1,33.8c10.4-10.6,23-21.3,39.2-23.5
c12.8-1.8,27.5,4.6,31.9,14.1c-0.3-12.7,6.1-25.5,17.5-34c13.8-10.3,34.4-14,52-9.2c-11.1-7.8-14.9-22-8.9-33
c6-11,21.3-18,35.7-16.2C327.5,198.1,318.3,183.5,319.8,169.3z"/>
</g>
<g>
<g>
<g>
<path class="st2" d="M179.7,297.3c-10.1,3.2-20.3,6-30.6,8.4c-10.7,2.5-21.7,5-32.8,5.1C96,311.1,79.9,297.2,60,296.1
c-5.8-0.3-5.8,8.7,0,9c9.9,0.5,18.9,5.1,27.9,8.8c9.8,4,19.6,6.3,30.2,5.9c21.5-0.8,43.5-7.4,64-13.8
C187.6,304.3,185.2,295.6,179.7,297.3L179.7,297.3z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M322.2,194.8c17.9-8,36-18.5,44.3-37.2c4.2-9.3,6-19.2,7.2-29.3c1.5-11.7,2.5-23.4,3.7-35.2
c0.6-5.8-8.4-5.7-9,0c-1.1,10.3-2.1,20.6-3.3,30.9c-1.1,9.7-2.5,19.7-6.4,28.7c-7.5,17.5-24.6,26.8-41.2,34.2
C312.4,189.4,316.9,197.2,322.2,194.8L322.2,194.8z"/>
</g>
</g>
<g>
<ellipse transform="matrix(0.5541 -0.8324 0.8324 0.5541 -219.4917 376.0051)" class="st2" cx="241.2" cy="392.9" rx="65.5" ry="33.7"/>
</g>
<g>
<g>
<path class="st3" d="M224.1,442.5c22-11.5,38.7-31,47.1-54.3c2-5.5-6.7-7.8-8.7-2.4c-7.6,21.1-23.1,38.5-43,48.9
C214.4,437.4,218.9,445.1,224.1,442.5L224.1,442.5z"/>
</g>
</g>
<g>
<ellipse transform="matrix(0.9684 -0.2494 0.2494 0.9684 -66.4734 109.0276)" class="st2" cx="397" cy="316.8" rx="63.9" ry="32.9"/>
</g>
<g>
<g>
<path class="st3" d="M363.8,341.5c28.3,7,58.7-0.8,80.2-20.5c4.3-3.9-2.1-10.3-6.4-6.4c-19.1,17.5-46.4,24.4-71.5,18.2
C360.5,331.5,358.1,340.1,363.8,341.5L363.8,341.5z"/>
</g>
</g>
<path class="st4" d="M156.9,96c-25.4,4.5-32.9,20.2-45,46.9c-20.2,44.4,2,90.3,5.6,97.5c18.4,36.5,42.3,36.8,60,80.6
c8.6,21.2,4.6,25.2,13.1,37.5c20.4,29.2,63.7,36.1,91.9,33.8c40.3-3.3,91.5-28.8,108.8-82.5c17.1-53.2-6-112.1-41.2-131.2
c-25.3-13.7-44.9-0.5-71.2-20.6c-21.6-16.5-18.4-33.1-37.5-48.8C227.9,98.1,203.7,87.7,156.9,96z"/>
<ellipse transform="matrix(0.6622 -0.7494 0.7494 0.6622 65.2068 309.6339)" class="st2" cx="376" cy="82.5" rx="21" ry="15.5"/>
<g>
<g>
<path class="st3" d="M379.8,75.3c0.8,0.2-0.6-0.4-0.1-0.1c0.2,0.1,0.3,0.2,0.5,0.3c0.4,0.2-0.6-0.7-0.1-0.1
c0.1,0.1,0.7,0.8,0.2,0.2c-0.4-0.5,0,0,0.1,0.1c0.4,0.7,0,0.2,0-0.2c0,0.1,0.1,0.4,0.2,0.5c0.3,0.9-0.1-1,0-0.1
c0.1,2.3,2,4.6,4.5,4.5c2.3-0.1,4.6-2,4.5-4.5c-0.3-4.4-3-8.1-7.3-9.4c-2.2-0.7-5,0.8-5.5,3.1C376.1,72.2,377.4,74.5,379.8,75.3
L379.8,75.3z"/>
</g>
</g>
<ellipse transform="matrix(0.9999 -1.433736e-02 1.433736e-02 0.9999 -4.303 0.8051)" class="st2" cx="54" cy="300.5" rx="21" ry="15.5"/>
<g>
<g>
<path class="st3" d="M52.2,297.5c1.1-0.3,1.4-0.4,2.5,0c0.8,0.3,1.3,0.7,2,1.7c1.5,1.9,4.8,1.6,6.4,0c1.9-1.9,1.5-4.4,0-6.4
c-3.1-3.9-8.6-5.4-13.3-4C44.3,290.5,46.7,299.2,52.2,297.5L52.2,297.5z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M149.3,108.8c4.9-10.8-1.3-24.2-12.9-26.9c-1.9-0.4-2.7,2.4-0.8,2.9c9.6,2.3,15.3,13.5,11.2,22.5
C145.9,109,148.5,110.5,149.3,108.8L149.3,108.8z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M141.2,112.3c2.4-9.4-5.4-19.3-15.2-19c-1.9,0.1-1.9,3.1,0,3c7.8-0.2,14.2,7.6,12.3,15.2
C137.8,113.4,140.7,114.2,141.2,112.3L141.2,112.3z"/>
</g>
</g>
<g>
<g>
<path class="st2" d="M132.6,118c-1.1-8.3-10.9-13.4-18.2-9.1c-1.7,1-0.2,3.6,1.5,2.6c5.2-3,12.9,0.4,13.7,6.5
C129.8,119.9,132.8,119.9,132.6,118L132.6,118z"/>
</g>
</g>
<path class="st5" d="M215.5,166.5l34-73c0,0,35,0,46,21c7.5,14.3,8,39,8,39L215.5,166.5z"/>
<path class="st5" d="M208.2,170.5l-79.5-12.7c0,0-19.6,29-8.4,49.9c7.6,14.2,27.8,28.5,27.8,28.5L208.2,170.5z"/>
<path class="st2" d="M210.5,164.5l33-74c0,0-2.5-5.5-8-7s-12,0-12,0L210.5,164.5z"/>
<path class="st2" d="M207.4,165.3l-73.1-35c0,0-5.6,2.4-7.2,7.8c-1.6,5.5-0.3,12-0.3,12L207.4,165.3z"/>
<path d="M215.5,166.5L234,127c0,0,17-6,25.5,7.5c8.6,13.6-3.5,25.5-3.5,25.5L215.5,166.5z"/>
<path d="M206.7,170.9l-29.6,32c0,0-18,0.5-22-14.9c-4-15.6,11.1-23.2,11.1-23.2L206.7,170.9z"/>
<g>
<g>
<path class="st3" d="M243.4,139.1c-0.6,0.2-0.7,0.3-0.4,0.2c0.3-0.1,0.2-0.1-0.5,0.1c0.7,0-0.3,0-0.4-0.1c0.1,0,0.3,0.1,0.4,0.1
c0.3,0.1,0.2,0-0.4-0.2c0,0,0.6,0.3,0.6,0.3c0.5,0.2-0.9-0.6-0.1-0.1c0.6,0.4-0.3-0.5-0.1-0.1c0.3,0.5-0.3-1-0.1-0.2
c0.2,0.8,0-1,0-0.1c0,2.4,2.1,4.6,4.5,4.5c2.5-0.1,4.5-2,4.5-4.5c0-3-1.6-5.7-4.1-7.3c-2.6-1.7-5.6-1.6-8.4-0.4
c-2.2,0.9-2.8,4.3-1.6,6.2C238.7,139.7,241,140.1,243.4,139.1L243.4,139.1z"/>
</g>
</g>
<g>
<g>
<path class="st3" d="M173.5,176.4c-0.5-0.3-0.1,0,0.2,0.1c-0.7-0.6,0.3,0.5,0.1,0c-0.3-0.5,0.4,0.8,0.1,0.2
c-0.4-0.8,0.2,0.2,0,0.1c0,0,0-0.6,0-0.6c-0.1,0.1-0.1,1,0,0.3c-0.1,0.2-0.1,0.3-0.2,0.5c0.2-0.3,0.2-0.4,0-0.1
c-0.2,0.2-0.2,0.3-0.1,0.1c0.2-0.2,0.1-0.2-0.3,0.2c1.9-1.4,3-4,1.6-6.2c-1.2-1.9-4.1-3.1-6.2-1.6c-2.4,1.7-4,4.3-3.9,7.4
c0.1,3,1.6,5.7,4.1,7.3c2,1.2,5,0.5,6.2-1.6C176.3,180.4,175.7,177.7,173.5,176.4L173.5,176.4z"/>
</g>
</g>
<ellipse transform="matrix(0.862 -0.5069 0.5069 0.862 -88.3186 186.5516)" class="st6" cx="298.5" cy="255.5" rx="79.5" ry="68.5"/>
<g>
<g>
<path class="st7" d="M173.6,109.8c-2.1,2-3.9,4.6-3.6,7.6c0.3,3.5,2.8,6.6,6.6,6.7c6,0.2,11.5-7.7,8.2-13c-1-1.7-3.1-3.1-5.2-3
c-1.7,0.1-3.1,0.8-4.4,1.9c-2,1.8-2.8,5.2-1.9,7.7c2.4,6.6,11.8,5.9,13.8-0.7c0.7-2.5-0.9-5.6-3.5-6.2c-2.7-0.6-5.4,0.8-6.2,3.5
c0.6-2.1,3.1-2.6,4.6-1c0.8,0.9,1,1.8,0.8,2.8c0.2-0.5,0.1-0.4-0.1,0.3c-0.4,0.7-1,1.2-1.8,1.4c-0.9,0-1.8,0-2.7,0
c-1.8-0.6-2.5-1.6-2.3-3.1c-0.1-0.4-0.1-0.7,0.1-1c0.2-0.3,0.1-0.3-0.1,0.1c0.1-0.1,0.2-0.2,0.3-0.4c-0.2,0.3-0.5,0.5-0.7,0.8
c-0.1,0.1-0.2,0.2-0.3,0.3c-0.3,0.2-0.2,0.2,0.1-0.1c1.3,0.2,2.6,0.4,3.9,0.6c0.2,0.4,0.5,0.9,0.7,1.3c0.2,0.6-0.2,0.9-0.2,1.4
c0,0.4,0.4-0.5-0.1,0.1c0.3-0.4,0.6-0.7,1-1c1.9-1.8,2-5.3,0-7.1C178.7,107.9,175.6,107.8,173.6,109.8L173.6,109.8z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M151.2,248.6c-5.7,7,1.7,16.9,10,13.3c3.4-1.5,6.3-5,6.3-8.9c0-4.2-2.7-7.6-7-7.8c-3.1-0.1-5.8,3.3-4.8,6.3
c1.2,3.4,3.7,6.1,7.3,7c2.6,0.6,5.4-0.8,6.2-3.5c0.7-2.5-0.9-5.5-3.5-6.2c-1.7-0.4,0,0.1-0.2,0.1c-0.4,0-0.4-0.8-0.1-0.1
c-1.6,2.1-3.2,4.2-4.8,6.3c-2.4-0.1-2.8-1.1-3-2.6c0.1,0.7-0.1,0.2,0.1-0.1c0.7-0.9-0.5,0.5,0,0c-0.5,0.5-0.3,0.1-0.2,0.2
c0.1,0,0.6,0,0.7,0c0.4,0.1,0.5,0.4,0.8,0.6c0.2,0.3,0.2,0.2-0.1-0.2c0.1,0.1,0.1,0.3,0.2,0.4c0,1,0.1,1.1-0.7,2.1
c1.7-2.1,2-5,0-7.1C156.5,246.8,152.9,246.5,151.2,248.6L151.2,248.6z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M204.1,205.7c0.8,4.8,5.3,8.6,10.1,8.6c5.1,0,9.5-3.9,10.3-8.9c0.7-4.4-0.2-12.1-5.3-13.6
c-2.7-0.8-5.2,0.5-7,2.4c-1.1,1.2-1.5,1.7-3.1,1.2c0.7,2.8,1.5,5.6,2.2,8.4c0.2-0.2-0.5,0.2-0.5,0.2c6.3,1.4,8.9-8.2,2.7-9.6
c-3.5-0.8-6.6,0-9.3,2.4c-3,2.6-1.1,7.2,2.2,8.4c2.6,0.9,5.5,0.8,8-0.2c1.3-0.5,2.4-1.2,3.4-2.1c0.4-0.3,0.7-0.6,1-1
c0.2-0.3,0.4-0.5,0.6-0.7c0.4-0.4,0.3-0.4-0.5,0.3c-0.9,0-1.8,0-2.7,0c0.2,0.1,0.3,0.1,0.5,0.2c-0.7-0.4-1.5-0.9-2.2-1.3
c0.1,0.2,0.3,0.3,0.4,0.5c-0.4-0.7-0.9-1.5-1.3-2.2c0.4,1.2,0.8,2.5,1,3.7c0,0.4,0,0.8,0,1.2c0,0.5-0.5,0.9,0,0.4
c-0.8,0.6-0.9,0.2-1.1-0.9c-0.4-2.7-3.8-4.1-6.2-3.5C204.7,200.3,203.7,203,204.1,205.7L204.1,205.7z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M265.9,179.6c0.2,0.4,0.5,0.9,0.7,1.3c0.6,1.1,1.8,2,3,2.3c1.2,0.3,2.8,0.2,3.9-0.5c1.1-0.7,2-1.7,2.3-3
c0.3-1.4,0.1-2.6-0.5-3.9c-0.2-0.4-0.5-0.9-0.7-1.3c-0.6-1.1-1.8-2-3-2.3c-1.2-0.3-2.8-0.2-3.9,0.5c-1.1,0.7-2,1.7-2.3,3
C265.1,177.1,265.3,178.3,265.9,179.6L265.9,179.6z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M200.4,295.8c-6.1,1.6-8.1,8.6-5,13.7c2.8,4.7,9.1,7.2,14.3,5.4c4.9-1.7,7.8-7.1,6.3-12.2
c-0.8-2.7-2.7-4.8-5.3-5.8c-1.4-0.5-2.8-0.7-4.2-0.8c-0.1,0-0.9-0.1-0.9-0.1c0.2-0.4,1.2,2.5,0.9,0.7c0,0.9,0,1.8,0,2.7
c-0.1,0.1-0.1,0.1-0.2,0.2c3.1-5.6-5.5-10.7-8.6-5c-1.7,3-1.1,6.6,1.4,9c1.3,1.2,2.8,2,4.5,2.3c0.8,0.1,1.6,0.2,2.4,0.3
c0.4,0,0.7,0,1.1,0.1c0.2,0.1,0.1,0.1-0.2-0.1c0,0.1-0.6-0.5-0.6-0.5c-0.1-0.1-0.1-0.2,0-0.3c0.1-0.3,0.1-0.1-0.1,0.5
c-0.3-0.1,0.7-0.2-0.3-0.3c-0.9-0.1-1.1-0.6-1.8-0.9c0,0-0.2-0.3-0.3-0.3c0.3,0-0.8,1.2-0.8,1.2
C209.3,303.8,206.6,294.2,200.4,295.8L200.4,295.8z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M244.8,355.3c-4-6.2-11.2-2.3-12,3.9c-0.8,5.9,1.8,12,6.5,15.6c4.5,3.5,11.5,4.9,16.7,2.1
c6.4-3.3,5.4-9.8,4.9-15.9c-0.5-6.3-1.9-12-9.5-12.1c-5.1-0.1-13.1,0.2-14.5,6.4c-1.2,5.4,2.5,12.8,8.2,13.8
c6.2,1.1,11.2-5.5,7.8-11c-2.2-3.5-8.1-3.1-9.1,1.2c-1.1,4.4,0.5,8,4.1,10.6c5.2,3.8,10.2-4.8,5-8.6c0.2,0.2,0.4,0.5,0.5,0.7
c-3,0.4-6.1,0.8-9.1,1.2c-0.4-0.7,3.4-3.1,2.9-4.8c-0.8-2.6-1.7,1.4-1.9,1.1c0,0.1,5.2-0.1,5.6-0.4c0.7,0.1,0.8-0.1,0.2-0.6
c-0.4-0.7-0.5-0.8-0.4-0.3c-0.2,0.3,0.2,1.9,0.2,2.3c0.2,2,0.3,4,0.5,5.9c0.1,1.6,0.4,1.7-1.1,2c-1.3,0.2-2.9-0.3-4-0.9
c-1.4-0.8-2.5-2-3.1-3.5c-0.3-0.7-0.4-1.3-0.5-2c0-0.3-0.1-0.7,0-1c0.2-1.9-1.1-1.5-3.8,1.2c-1-0.8-2-1.5-3-2.3
c0.1,0.2,0.2,0.4,0.4,0.6C239.6,365.7,248.3,360.7,244.8,355.3L244.8,355.3z"/>
</g>
</g>
<g>
<g>
<path class="st7" d="M336.5,337.4c-2.4-1.5-5.1-2.5-7.9-1.8c-2.7,0.7-4.9,3.2-5.3,6c-0.9,6.4,6.3,8.3,11.2,8.4
c4.8,0.1,10.6-2.4,10.9-7.9c0.2-5.6-5.5-9.6-10.6-6.9c-5.7,3-0.7,11.6,5,8.6c-0.1,0.1-0.2,0.1-0.3,0.2c-0.9,0-1.8,0-2.7,0
c-2.1-0.4-1.4-4.8-0.3-4.3c0,0-1.3,0.3-1.3,0.3c-0.6,0-1.2,0-1.8-0.1c-0.5-0.1-1-0.2-1.5-0.4c-1.2-0.5-1-0.2,0.6,0.7
c0.2,0.8,0.5,1.7,0.7,2.5c-3.4,1.1-4.4,1.9-2.8,2.7c0.4,0.2,0.7,0.4,1.1,0.7C336.9,349.6,341.9,340.9,336.5,337.4L336.5,337.4z"
/>
</g>
</g>
<path class="st3" d="M224.3,256.5L252,273v-40l32,20v-38l28,17l4-28l23,12l-3-24c0,0-14-8-35.5-6.4c-11.6,0.9-24.3,6.8-33.5,11.4
c-14,7-23.7,18.9-31.2,29.1C227,238,224.3,256.5,224.3,256.5z"/>
<path class="st3" d="M372.9,248.9l-28.8-14.5l2.9,39.9l-33.3-17.7l2.7,37.9l-29.1-15l-2,28.2l-23.8-10.3l4.7,23.7
c0,0,14.5,7,35.9,3.8c11.5-1.7,23.7-8.5,32.6-13.8c13.5-8,22.3-20.5,29-31.2C371.5,267.5,372.9,248.9,372.9,248.9z"/>
</g>
<g>
<g>
<path class="st8" d="M235.2,121.6c8.5-3.1,23.2-0.1,27.8,8.4c2.3,4.4,4.5,9.9,4.5,14.9c0.1,5.5-2.7,10.5-5.3,15.3
c-1.5,2.8,2.8,5.4,4.3,2.5c3.1-5.8,6.3-11.9,6-18.7c-0.3-6-2.8-12.8-5.9-17.9c-6-9.5-22.6-13.1-32.7-9.4
C230.9,117.8,232.2,122.7,235.2,121.6L235.2,121.6z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M241.1,110.5c11.6-2.3,25.6,2.3,32.2,12.4c6.6,10.2,6.1,22.8,3.1,34.2c-1.3,5,6.4,7.1,7.7,2.1
c3.8-14.3,3.8-30.3-5.5-42.6c-8.9-11.7-25.5-16.6-39.6-13.8C233.9,103.8,236.1,111.5,241.1,110.5L241.1,110.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M245.4,97.5c7.8-1.8,15.5,0,22.9,2.8c7.2,2.7,15,6.1,20.3,11.8c10.7,11.7,9.5,29.3,8.7,44
c-0.3,6.4,9.7,6.4,10,0c1-17.9,1.2-38.5-12.7-52.1c-6.4-6.3-15.3-10.2-23.6-13.3c-9.1-3.4-18.6-4.9-28.2-2.8
C236.5,89.2,239.1,98.9,245.4,97.5L245.4,97.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M155.8,158.5c-13.1,4.8-14.2,21.6-10.1,33.1c4.3,12,15.2,20.6,28.2,20.5c3.2,0,3.2-5,0-5
c-9.9,0.1-18.6-5.9-22.6-14.9c-3.9-8.6-5.2-24.8,5.8-28.9C160.2,162.3,158.9,157.4,155.8,158.5L155.8,158.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M164.1,216.5c-11.4-2.2-18.8-11.4-22.7-21.9c-3.6-9.6-7.7-25.3,1.2-33.1c3.9-3.4-1.8-9-5.7-5.7
c-11.3,9.9-7.9,28.5-3.3,40.9c4.8,13,14.1,24.7,28.3,27.5C167,225.2,169.1,217.5,164.1,216.5L164.1,216.5z"/>
</g>
</g>
<g>
<g>
<path class="st8" d="M152,231.7c-27.3-13.3-38.1-46.5-23.3-73.2c3.1-5.6-5.5-10.7-8.6-5c-17.3,31.2-5.3,71.1,26.9,86.9
C152.7,243.1,157.8,234.5,152,231.7L152,231.7z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -92,7 +92,10 @@ describe('<OrganizationAdd />', () => {
}); });
test('AnsibleSelect component renders if there are virtual environments', async () => { test('AnsibleSelect component renders if there are virtual environments', async () => {
const mockInstanceGroups = [{ name: 'One', id: 1 }, { name: 'Two', id: 2 }]; const mockInstanceGroups = [
{ name: 'One', id: 1 },
{ name: 'Two', id: 2 },
];
OrganizationsAPI.readInstanceGroups.mockReturnValue({ OrganizationsAPI.readInstanceGroups.mockReturnValue({
data: { data: {
results: mockInstanceGroups, results: mockInstanceGroups,
@@ -119,7 +122,10 @@ describe('<OrganizationAdd />', () => {
}); });
test('AnsibleSelect component does not render if there are 0 virtual environments', async () => { test('AnsibleSelect component does not render if there are 0 virtual environments', async () => {
const mockInstanceGroups = [{ name: 'One', id: 1 }, { name: 'Two', id: 2 }]; const mockInstanceGroups = [
{ name: 'One', id: 1 },
{ name: 'Two', id: 2 },
];
OrganizationsAPI.readInstanceGroups.mockReturnValue({ OrganizationsAPI.readInstanceGroups.mockReturnValue({
data: { data: {
results: mockInstanceGroups, results: mockInstanceGroups,

View File

@@ -4,7 +4,11 @@ import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { Button, Chip } from '@patternfly/react-core'; import { Button, Chip } from '@patternfly/react-core';
import { OrganizationsAPI } from '../../../api'; import { OrganizationsAPI } from '../../../api';
import { DetailList, Detail, UserDateDetail } from '../../../components/DetailList'; import {
DetailList,
Detail,
UserDateDetail,
} from '../../../components/DetailList';
import { CardBody, CardActionsRow } from '../../../components/Card'; import { CardBody, CardActionsRow } from '../../../components/Card';
import AlertModal from '../../../components/AlertModal'; import AlertModal from '../../../components/AlertModal';
import ChipGroup from '../../../components/ChipGroup'; import ChipGroup from '../../../components/ChipGroup';

View File

@@ -28,7 +28,10 @@ describe('<OrganizationDetail />', () => {
}; };
const mockInstanceGroups = { const mockInstanceGroups = {
data: { data: {
results: [{ name: 'One', id: 1 }, { name: 'Two', id: 2 }], results: [
{ name: 'One', id: 1 },
{ name: 'Two', id: 2 },
],
}, },
}; };

View File

@@ -64,7 +64,10 @@ describe('<OrganizationEdit />', () => {
}); });
test('should navigate to organization detail when cancel is clicked', async () => { test('should navigate to organization detail when cancel is clicked', async () => {
const mockInstanceGroups = [{ name: 'One', id: 1 }, { name: 'Two', id: 2 }]; const mockInstanceGroups = [
{ name: 'One', id: 1 },
{ name: 'Two', id: 2 },
];
OrganizationsAPI.readInstanceGroups.mockReturnValue({ OrganizationsAPI.readInstanceGroups.mockReturnValue({
data: { data: {
results: mockInstanceGroups, results: mockInstanceGroups,

View File

@@ -27,7 +27,10 @@ describe('<OrganizationForm />', () => {
instance_groups: '/api/v2/organizations/1/instance_groups', instance_groups: '/api/v2/organizations/1/instance_groups',
}, },
}; };
const mockInstanceGroups = [{ name: 'One', id: 1 }, { name: 'Two', id: 2 }]; const mockInstanceGroups = [
{ name: 'One', id: 1 },
{ name: 'Two', id: 2 },
];
afterEach(() => { afterEach(() => {
jest.clearAllMocks(); jest.clearAllMocks();
@@ -232,7 +235,10 @@ describe('<OrganizationForm />', () => {
await waitForElement(wrapper, 'ContentLoading', el => el.length === 0); await waitForElement(wrapper, 'ContentLoading', el => el.length === 0);
await act(async () => { await act(async () => {
wrapper.find('InstanceGroupsLookup').prop('onChange')( wrapper.find('InstanceGroupsLookup').prop('onChange')(
[{ name: 'One', id: 1 }, { name: 'Three', id: 3 }], [
{ name: 'One', id: 1 },
{ name: 'Three', id: 3 },
],
'instanceGroups' 'instanceGroups'
); );
}); });

View File

@@ -19,6 +19,7 @@ import { timeOfDay } from '../../../util/dates';
import { ProjectsAPI } from '../../../api'; import { ProjectsAPI } from '../../../api';
import ClipboardCopyButton from '../../../components/ClipboardCopyButton'; import ClipboardCopyButton from '../../../components/ClipboardCopyButton';
import StatusIcon from '../../../components/StatusIcon'; import StatusIcon from '../../../components/StatusIcon';
import DataListCell from '../../../components/DataListCell';
import { toTitleCase } from '../../../util/strings'; import { toTitleCase } from '../../../util/strings';
import CopyButton from '../../../components/CopyButton'; import CopyButton from '../../../components/CopyButton';
import ProjectSyncButton from '../shared/ProjectSyncButton'; import ProjectSyncButton from '../shared/ProjectSyncButton';

View File

@@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import ProjectsListItem from './ProjectListItem'; import ProjectsListItem from './ProjectListItem';
import { ProjectsAPI } from '../../../api'; import { ProjectsAPI } from '../../../api';

View File

@@ -4,8 +4,8 @@ import { useLocation, useRouteMatch, useParams } from 'react-router-dom';
import { withI18n } from '@lingui/react'; import { withI18n } from '@lingui/react';
import { t } from '@lingui/macro'; import { t } from '@lingui/macro';
import { TeamsAPI } from '../../../api';
import { Card } from '@patternfly/react-core'; import { Card } from '@patternfly/react-core';
import { TeamsAPI } from '../../../api';
import useRequest from '../../../util/useRequest'; import useRequest from '../../../util/useRequest';
import DataListToolbar from '../../../components/DataListToolbar'; import DataListToolbar from '../../../components/DataListToolbar';

View File

@@ -1,9 +1,12 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { createMemoryHistory } from 'history'; import { createMemoryHistory } from 'history';
import { TeamsAPI } from '../../../api';
import { Route } from 'react-router-dom'; import { Route } from 'react-router-dom';
import { mountWithContexts, waitForElement } from '../../../../testUtils/enzymeHelpers'; import { TeamsAPI } from '../../../api';
import {
mountWithContexts,
waitForElement,
} from '../../../../testUtils/enzymeHelpers';
import TeamAccessList from './TeamAccessList'; import TeamAccessList from './TeamAccessList';
jest.mock('../../../api/models/Teams'); jest.mock('../../../api/models/Teams');

View File

@@ -6,9 +6,8 @@ import {
DataListItemCells, DataListItemCells,
DataListItemRow, DataListItemRow,
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import DataListCell from '../../../components/DataListCell';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import DataListCell from '../../../components/DataListCell';
function TeamAccessListItem({ role, i18n, detailUrl }) { function TeamAccessListItem({ role, i18n, detailUrl }) {
const labelId = `teamRole-${role.id}`; const labelId = `teamRole-${role.id}`;

View File

@@ -13,7 +13,10 @@ jest.mock('../../../api');
const mockInstanceGroups = { const mockInstanceGroups = {
count: 5, count: 5,
data: { data: {
results: [{ id: 1, name: 'IG1' }, { id: 2, name: 'IG2' }], results: [
{ id: 1, name: 'IG1' },
{ id: 2, name: 'IG2' },
],
}, },
}; };

View File

@@ -46,7 +46,10 @@ const mockJobTemplate = {
edit: true, edit: true,
}, },
labels: { labels: {
results: [{ name: 'Sushi', id: 1 }, { name: 'Major', id: 2 }], results: [
{ name: 'Sushi', id: 1 },
{ name: 'Major', id: 2 },
],
}, },
inventory: { inventory: {
id: 2, id: 2,
@@ -309,7 +312,10 @@ describe('<JobTemplateEdit />', () => {
edit: true, edit: true,
}, },
labels: { labels: {
results: [{ name: 'Sushi', id: 1 }, { name: 'Major', id: 2 }], results: [
{ name: 'Sushi', id: 1 },
{ name: 'Major', id: 2 },
],
}, },
inventory: { inventory: {
id: 2, id: 2,

View File

@@ -13,11 +13,10 @@ import {
Stack, Stack,
StackItem, StackItem,
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import DataListCell from '../../../components/DataListCell';
import ChipGroup from '../../../components/ChipGroup';
import { CaretDownIcon, CaretUpIcon } from '@patternfly/react-icons'; import { CaretDownIcon, CaretUpIcon } from '@patternfly/react-icons';
import styled from 'styled-components'; import styled from 'styled-components';
import DataListCell from '../../../components/DataListCell'; import DataListCell from '../../../components/DataListCell';
import ChipGroup from '../../../components/ChipGroup';
const DataListAction = styled(_DataListAction)` const DataListAction = styled(_DataListAction)`
margin-left: 0; margin-left: 0;

View File

@@ -19,7 +19,11 @@ import ChipGroup from '../../../components/ChipGroup';
import { VariablesDetail } from '../../../components/CodeMirrorInput'; import { VariablesDetail } from '../../../components/CodeMirrorInput';
import ContentLoading from '../../../components/ContentLoading'; import ContentLoading from '../../../components/ContentLoading';
import DeleteButton from '../../../components/DeleteButton'; import DeleteButton from '../../../components/DeleteButton';
import { DetailList, Detail, UserDateDetail } from '../../../components/DetailList'; import {
DetailList,
Detail,
UserDateDetail,
} from '../../../components/DetailList';
import ErrorDetail from '../../../components/ErrorDetail'; import ErrorDetail from '../../../components/ErrorDetail';
import LaunchButton from '../../../components/LaunchButton'; import LaunchButton from '../../../components/LaunchButton';
import Sparkline from '../../../components/Sparkline'; import Sparkline from '../../../components/Sparkline';

View File

@@ -100,7 +100,7 @@ describe('<WorkflowJobTemplateDetail/>', () => {
{ {
element: 'Detail[label="Webhook URL"]', element: 'Detail[label="Webhook URL"]',
prop: 'value', prop: 'value',
value: 'http://127.0.0.1:3001/api/v2/workflow_job_templates/45/github/', value: 'http://localhost/api/v2/workflow_job_templates/45/github/',
}, },
{ {
element: "Detail[label='Webhook Service']", element: "Detail[label='Webhook Service']",
@@ -136,7 +136,7 @@ describe('<WorkflowJobTemplateDetail/>', () => {
const labels = wrapper const labels = wrapper
.find('Detail[label="Labels"]') .find('Detail[label="Labels"]')
.find('Chip[component="li"]'); .find('Chip[component="li"]');
const sparkline = wrapper.find('Sparkline__Link'); const sparkline = wrapper.find('Sparkline Link');
expect(organization.text()).toBe('Org'); expect(organization.text()).toBe('Org');
expect(inventory.text()).toEqual('Bar'); expect(inventory.text()).toEqual('Bar');

View File

@@ -23,7 +23,10 @@ const mockTemplate = {
inventory: { id: 1, name: 'Inventory 1' }, inventory: { id: 1, name: 'Inventory 1' },
organization: { id: 1, name: 'Organization 1' }, organization: { id: 1, name: 'Organization 1' },
labels: { labels: {
results: [{ name: 'Label 1', id: 1 }, { name: 'Label 2', id: 2 }], results: [
{ name: 'Label 1', id: 1 },
{ name: 'Label 2', id: 2 },
],
}, },
}, },
scm_branch: 'devel', scm_branch: 'devel',
@@ -187,7 +190,10 @@ describe('<WorkflowJobTemplateEdit/>', () => {
summary_fields: { summary_fields: {
inventory: { id: 1, name: 'Inventory 1' }, inventory: { id: 1, name: 'Inventory 1' },
labels: { labels: {
results: [{ name: 'Label 1', id: 1 }, { name: 'Label 2', id: 2 }], results: [
{ name: 'Label 1', id: 1 },
{ name: 'Label 2', id: 2 },
],
}, },
}, },
scm_branch: 'devel', scm_branch: 'devel',

View File

@@ -14,7 +14,8 @@ import {
} from '../../../../../contexts/Workflow'; } from '../../../../../contexts/Workflow';
import Wizard from '../../../../../components/Wizard'; import Wizard from '../../../../../components/Wizard';
import { NodeTypeStep } from './NodeTypeStep'; import { NodeTypeStep } from './NodeTypeStep';
import { RunStep, NodeNextButton } from '.'; import RunStep from './RunStep';
import NodeNextButton from './NodeNextButton';
function NodeModal({ askLinkType, i18n, onSave, title }) { function NodeModal({ askLinkType, i18n, onSave, title }) {
const history = useHistory(); const history = useHistory();

View File

@@ -2,6 +2,4 @@ export { default as InventorySourcesList } from './InventorySourcesList';
export { default as JobTemplatesList } from './JobTemplatesList'; export { default as JobTemplatesList } from './JobTemplatesList';
export { default as NodeTypeStep } from './NodeTypeStep'; export { default as NodeTypeStep } from './NodeTypeStep';
export { default as ProjectsList } from './ProjectsList'; export { default as ProjectsList } from './ProjectsList';
export { export { default as WorkflowJobTemplatesList } from './WorkflowJobTemplatesList';
default as WorkflowJobTemplatesList,
} from './WorkflowJobTemplatesList';

View File

@@ -21,7 +21,8 @@ import {
WorkflowStartNode, WorkflowStartNode,
WorkflowTools, WorkflowTools,
} from '../../../components/Workflow'; } from '../../../components/Workflow';
import { VisualizerLink, VisualizerNode } from '.'; import VisualizerLink from './VisualizerLink';
import VisualizerNode from './VisualizerNode';
const PotentialLink = styled.polyline` const PotentialLink = styled.polyline`
pointer-events: none; pointer-events: none;

View File

@@ -38,7 +38,12 @@ describe('<JobTemplateForm />', () => {
id: 3, id: 3,
name: 'qux', name: 'qux',
}, },
labels: { results: [{ name: 'Sushi', id: 1 }, { name: 'Major', id: 2 }] }, labels: {
results: [
{ name: 'Sushi', id: 1 },
{ name: 'Major', id: 2 },
],
},
credentials: [ credentials: [
{ id: 1, kind: 'cloud', name: 'Foo' }, { id: 1, kind: 'cloud', name: 'Foo' },
{ id: 2, kind: 'ssh', name: 'Bar' }, { id: 2, kind: 'ssh', name: 'Bar' },

View File

@@ -6,7 +6,10 @@ import LabelSelect from './LabelSelect';
jest.mock('../../../api'); jest.mock('../../../api');
const options = [{ id: 1, name: 'one' }, { id: 2, name: 'two' }]; const options = [
{ id: 1, name: 'one' },
{ id: 2, name: 'two' },
];
describe('<LabelSelect />', () => { describe('<LabelSelect />', () => {
afterEach(() => { afterEach(() => {
@@ -40,7 +43,10 @@ describe('<LabelSelect />', () => {
}); });
LabelsAPI.read.mockReturnValueOnce({ LabelsAPI.read.mockReturnValueOnce({
data: { data: {
results: [{ id: 3, name: 'three' }, { id: 4, name: 'four' }], results: [
{ id: 3, name: 'three' },
{ id: 4, name: 'four' },
],
}, },
}); });
let wrapper; let wrapper;

View File

@@ -9,10 +9,10 @@ import {
InputGroup, InputGroup,
Button, Button,
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import { useField } from 'formik';
import ContentError from '../../../components/ContentError'; import ContentError from '../../../components/ContentError';
import ContentLoading from '../../../components/ContentLoading'; import ContentLoading from '../../../components/ContentLoading';
import useRequest from '../../../util/useRequest'; import useRequest from '../../../util/useRequest';
import { useField } from 'formik';
import { FormColumnLayout } from '../../../components/FormLayout'; import { FormColumnLayout } from '../../../components/FormLayout';
import { CredentialLookup } from '../../../components/Lookup'; import { CredentialLookup } from '../../../components/Lookup';
import AnsibleSelect from '../../../components/AnsibleSelect'; import AnsibleSelect from '../../../components/AnsibleSelect';

View File

@@ -32,7 +32,10 @@ describe('<WorkflowJobTemplateForm/>', () => {
inventory: { id: 1, name: 'Inventory 1' }, inventory: { id: 1, name: 'Inventory 1' },
organization: { id: 1, name: 'Organization 1' }, organization: { id: 1, name: 'Organization 1' },
labels: { labels: {
results: [{ name: 'Label 1', id: 1 }, { name: 'Label 2', id: 2 }], results: [
{ name: 'Label 1', id: 1 },
{ name: 'Label 2', id: 2 },
],
}, },
}, },
scm_branch: 'devel', scm_branch: 'devel',
@@ -61,7 +64,10 @@ describe('<WorkflowJobTemplateForm/>', () => {
results: [{ id: 1 }, { id: 2 }], results: [{ id: 1 }, { id: 2 }],
}); });
InventoriesAPI.read.mockResolvedValue({ InventoriesAPI.read.mockResolvedValue({
results: [{ id: 1, name: 'Foo' }, { id: 2, name: 'Bar' }], results: [
{ id: 1, name: 'Foo' },
{ id: 2, name: 'Bar' },
],
}); });
history = createMemoryHistory({ history = createMemoryHistory({

View File

@@ -1,9 +1,12 @@
import React from 'react'; import React from 'react';
import { act } from 'react-dom/test-utils'; import { act } from 'react-dom/test-utils';
import { createMemoryHistory } from 'history'; import { createMemoryHistory } from 'history';
import { UsersAPI } from '../../../api';
import { Route } from 'react-router-dom'; import { Route } from 'react-router-dom';
import { mountWithContexts, waitForElement } from '../../../../testUtils/enzymeHelpers'; import { UsersAPI } from '../../../api';
import {
mountWithContexts,
waitForElement,
} from '../../../../testUtils/enzymeHelpers';
import UserAccessList from './UserAccessList'; import UserAccessList from './UserAccessList';
jest.mock('../../../api/models/Users'); jest.mock('../../../api/models/Users');

View File

@@ -6,9 +6,8 @@ import {
DataListItemCells, DataListItemCells,
DataListItemRow, DataListItemRow,
} from '@patternfly/react-core'; } from '@patternfly/react-core';
import DataListCell from '../../../components/DataListCell';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import DataListCell from '../../../components/DataListCell';
function UserAccessListItem({ role, i18n, detailUrl }) { function UserAccessListItem({ role, i18n, detailUrl }) {
const labelId = `userRole-${role.id}`; const labelId = `userRole-${role.id}`;