foreman_leapp 0.0.6 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -20
- data/app/controllers/api/v2/concerns/api_authorizer.rb +27 -0
- data/app/controllers/api/v2/preupgrade_reports_controller.rb +21 -2
- data/app/controllers/preupgrade_reports_controller.rb +11 -1
- data/app/lib/actions/preupgrade_job.rb +2 -1
- data/app/models/preupgrade_report.rb +1 -0
- data/app/models/preupgrade_report_entry.rb +1 -0
- data/app/views/api/v2/preupgrade_report_entries/base.json.rabl +1 -1
- data/app/views/api/v2/preupgrade_reports/job_invocation.json.rabl +3 -0
- data/app/views/foreman_leapp/job_templates/check.erb +14 -0
- data/app/views/foreman_leapp/job_templates/preupgrade.erb +3 -1
- data/app/views/foreman_leapp/job_templates/remediation.erb +11 -0
- data/app/views/foreman_leapp/job_templates/upgrade.erb +6 -5
- data/config/routes.rb +2 -1
- data/db/migrate/20200429080939_report_entries_flags.rb +5 -0
- data/lib/foreman_leapp/engine.rb +4 -1
- data/lib/foreman_leapp/version.rb +1 -1
- data/package.json +3 -2
- data/test/functional/api/v2/preupgrade_reports_controller_test.rb +89 -6
- data/test/functional/preupgrade_reports_controller_test.rb +27 -4
- data/webpack/__mocks__/foremanReact/common/I18n.js +1 -1
- data/webpack/__mocks__/foremanReact/components/common/EmptyState.js +1 -0
- data/webpack/components/PreupgradeReports/PreupgradeReports.js +104 -21
- data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +1 -1
- data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +132 -15
- data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +2 -0
- data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +10 -0
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +45 -7
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +17 -1
- data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +43 -3
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReports.test.js.snap +82 -134
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +409 -2
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +21 -1
- data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +17 -1
- data/webpack/components/PreupgradeReports/components/EntriesFilter.js +121 -0
- data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +3 -0
- data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +30 -0
- data/webpack/components/PreupgradeReports/components/{FixAllButton.js → FixSelectedButton.js} +6 -8
- data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +15 -0
- data/webpack/components/PreupgradeReports/components/NoReports.js +35 -0
- data/webpack/components/PreupgradeReports/components/NoReports.test.js +15 -0
- data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +29 -0
- data/webpack/components/PreupgradeReports/components/{FixAllButton.test.js → UpgradeAllButton.test.js} +3 -4
- data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +330 -0
- data/webpack/components/PreupgradeReports/components/__snapshots__/{FixAllButton.test.js.snap → FixSelectedButton.test.js.snap} +9 -3
- data/webpack/components/PreupgradeReports/components/__snapshots__/NoReports.test.js.snap +19 -0
- data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +29 -0
- data/webpack/components/PreupgradeReports/index.js +22 -4
- data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +37 -0
- data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +16 -0
- data/webpack/components/PreupgradeReportsList/__tests__/__snapshots__/PreupgradeReportsList.test.js.snap +38 -0
- data/webpack/components/PreupgradeReportsList/components/InfoItem.js +1 -1
- data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +33 -0
- data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +19 -9
- data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +56 -0
- data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +50 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +27 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +2 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +14 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +29 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +32 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +23 -17
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +113 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +36 -0
- data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +4 -10
- data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +0 -2
- data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +7 -1
- data/webpack/components/PreupgradeReportsList/components/helpers.js +47 -19
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +61 -0
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +61 -0
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +62 -0
- data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +62 -0
- data/webpack/components/PreupgradeReportsList/index.js +28 -3
- metadata +34 -5
data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`UpgradeAllButton should render 1`] = `
|
4
|
+
<form
|
5
|
+
action="/job_invocations/new"
|
6
|
+
method="post"
|
7
|
+
>
|
8
|
+
<Button
|
9
|
+
active={false}
|
10
|
+
block={false}
|
11
|
+
bsClass="btn"
|
12
|
+
bsStyle="default"
|
13
|
+
disabled={false}
|
14
|
+
type="submit"
|
15
|
+
>
|
16
|
+
Run Upgrade
|
17
|
+
</Button>
|
18
|
+
<input
|
19
|
+
name="authenticity_token"
|
20
|
+
type="hidden"
|
21
|
+
value="abcd"
|
22
|
+
/>
|
23
|
+
<input
|
24
|
+
name="feature"
|
25
|
+
type="hidden"
|
26
|
+
value="leapp_upgrade"
|
27
|
+
/>
|
28
|
+
</form>
|
29
|
+
`;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useEffect } from 'react';
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
2
2
|
import { useDispatch, useSelector } from 'react-redux';
|
3
3
|
import PropTypes from 'prop-types';
|
4
4
|
|
@@ -9,10 +9,12 @@ import getCsrfToken from '../../csrf';
|
|
9
9
|
import {
|
10
10
|
selectPreupgradeReports,
|
11
11
|
selectLoadingPreupgradeReports,
|
12
|
+
selectReportsExpected,
|
12
13
|
selectError,
|
14
|
+
selectJobInvocationsPolling,
|
13
15
|
} from './PreupgradeReportsSelectors';
|
14
16
|
|
15
|
-
import {
|
17
|
+
import { getPreupgradeReportsAction } from './PreupgradeReportsActions';
|
16
18
|
|
17
19
|
const WrappedPreupgradeReports = ({ url, newJobInvocationUrl }) => {
|
18
20
|
const loading = useSelector(state => selectLoadingPreupgradeReports(state));
|
@@ -21,11 +23,26 @@ const WrappedPreupgradeReports = ({ url, newJobInvocationUrl }) => {
|
|
21
23
|
);
|
22
24
|
const error = useSelector(state => selectError(state));
|
23
25
|
|
26
|
+
const invocationPending = useSelector(state =>
|
27
|
+
selectJobInvocationsPolling(state)
|
28
|
+
);
|
29
|
+
|
30
|
+
const reportsExpected = useSelector(state => selectReportsExpected(state));
|
31
|
+
|
32
|
+
const previousInvocationRef = useRef();
|
33
|
+
useEffect(() => {
|
34
|
+
previousInvocationRef.current = invocationPending;
|
35
|
+
});
|
36
|
+
|
37
|
+
const previousInvocationPending = previousInvocationRef.current;
|
38
|
+
|
24
39
|
const dispatch = useDispatch();
|
25
40
|
|
26
41
|
useEffect(() => {
|
27
|
-
|
28
|
-
|
42
|
+
if (previousInvocationPending && !invocationPending) {
|
43
|
+
dispatch(getPreupgradeReportsAction(url));
|
44
|
+
}
|
45
|
+
}, [dispatch, url, invocationPending, previousInvocationPending]);
|
29
46
|
|
30
47
|
return (
|
31
48
|
<PreupgradeReports
|
@@ -34,6 +51,7 @@ const WrappedPreupgradeReports = ({ url, newJobInvocationUrl }) => {
|
|
34
51
|
loading={loading}
|
35
52
|
csrfToken={getCsrfToken()}
|
36
53
|
newJobInvocationUrl={newJobInvocationUrl}
|
54
|
+
reportsExpected={reportsExpected}
|
37
55
|
/>
|
38
56
|
);
|
39
57
|
};
|
@@ -0,0 +1,37 @@
|
|
1
|
+
@import '~@theforeman/vendor/scss/variables';
|
2
|
+
|
3
|
+
#preupgrade-report-entries-list-view {
|
4
|
+
.sortable-header {
|
5
|
+
&.active {
|
6
|
+
color: $color-pf-blue-400;
|
7
|
+
}
|
8
|
+
|
9
|
+
&:hover {
|
10
|
+
cursor: pointer;
|
11
|
+
}
|
12
|
+
|
13
|
+
.fa-angle-up, .fa-angle-down {
|
14
|
+
margin-right: 10px;
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
.list-view-pf-additional-info-item {
|
19
|
+
flex: 1;
|
20
|
+
}
|
21
|
+
|
22
|
+
.list-view-header {
|
23
|
+
border-top: 0px;
|
24
|
+
background-color: $color-pf-white;
|
25
|
+
border-left-color: $color-pf-white;
|
26
|
+
border-right-color: $color-pf-white;
|
27
|
+
|
28
|
+
.list-view-pf-description {
|
29
|
+
font-size: 16px;
|
30
|
+
font-weight: 600;
|
31
|
+
}
|
32
|
+
|
33
|
+
.list-view-pf-checkbox {
|
34
|
+
margin-left: 17px;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
@@ -9,14 +9,30 @@ const allEntries = [
|
|
9
9
|
{ title: 'Not enough credits', severity: 'low' },
|
10
10
|
];
|
11
11
|
|
12
|
+
const isSelected = () => false;
|
13
|
+
const toggleSelected = () => {};
|
14
|
+
const sort = { attribute: '', order: 'asc' };
|
15
|
+
const changeSort = () => {};
|
16
|
+
const toggleSelectAll = () => {};
|
17
|
+
|
12
18
|
const fixtures = {
|
13
19
|
'should render': {
|
14
20
|
allEntries,
|
15
21
|
fixAllWorking: false,
|
22
|
+
isSelected,
|
23
|
+
toggleSelected,
|
24
|
+
sort,
|
25
|
+
changeSort,
|
26
|
+
toggleSelectAll,
|
16
27
|
},
|
17
28
|
'should render when working': {
|
18
29
|
allEntries,
|
19
30
|
fixAllWorking: true,
|
31
|
+
isSelected,
|
32
|
+
toggleSelected,
|
33
|
+
sort,
|
34
|
+
changeSort,
|
35
|
+
toggleSelectAll,
|
20
36
|
},
|
21
37
|
};
|
22
38
|
|
@@ -3,7 +3,18 @@
|
|
3
3
|
exports[`PreupgradeReportsList should render 1`] = `
|
4
4
|
<ListView
|
5
5
|
className=""
|
6
|
+
id="preupgrade-report-entries-list-view"
|
6
7
|
>
|
8
|
+
<PreupgradeReportsListHeader
|
9
|
+
changeSort={[Function]}
|
10
|
+
sort={
|
11
|
+
Object {
|
12
|
+
"attribute": "",
|
13
|
+
"order": "asc",
|
14
|
+
}
|
15
|
+
}
|
16
|
+
toggleSelectAll={[Function]}
|
17
|
+
/>
|
7
18
|
<PreupgradeReportEntry
|
8
19
|
entry={
|
9
20
|
Object {
|
@@ -11,7 +22,9 @@ exports[`PreupgradeReportsList should render 1`] = `
|
|
11
22
|
"title": "Fix me!",
|
12
23
|
}
|
13
24
|
}
|
25
|
+
isEntrySelected={false}
|
14
26
|
key="0"
|
27
|
+
toggleSelected={[Function]}
|
15
28
|
/>
|
16
29
|
<PreupgradeReportEntry
|
17
30
|
entry={
|
@@ -20,7 +33,9 @@ exports[`PreupgradeReportsList should render 1`] = `
|
|
20
33
|
"title": "I am broken too",
|
21
34
|
}
|
22
35
|
}
|
36
|
+
isEntrySelected={false}
|
23
37
|
key="1"
|
38
|
+
toggleSelected={[Function]}
|
24
39
|
/>
|
25
40
|
<PreupgradeReportEntry
|
26
41
|
entry={
|
@@ -29,7 +44,9 @@ exports[`PreupgradeReportsList should render 1`] = `
|
|
29
44
|
"title": "Octocat is not happy",
|
30
45
|
}
|
31
46
|
}
|
47
|
+
isEntrySelected={false}
|
32
48
|
key="2"
|
49
|
+
toggleSelected={[Function]}
|
33
50
|
/>
|
34
51
|
<PreupgradeReportEntry
|
35
52
|
entry={
|
@@ -38,7 +55,9 @@ exports[`PreupgradeReportsList should render 1`] = `
|
|
38
55
|
"title": "Not enough credits",
|
39
56
|
}
|
40
57
|
}
|
58
|
+
isEntrySelected={false}
|
41
59
|
key="3"
|
60
|
+
toggleSelected={[Function]}
|
42
61
|
/>
|
43
62
|
<PaginationWrapper
|
44
63
|
dropdownButtonId="preupgrade-report-entries-pagination-dropdown"
|
@@ -65,7 +84,18 @@ exports[`PreupgradeReportsList should render 1`] = `
|
|
65
84
|
exports[`PreupgradeReportsList should render when working 1`] = `
|
66
85
|
<ListView
|
67
86
|
className=""
|
87
|
+
id="preupgrade-report-entries-list-view"
|
68
88
|
>
|
89
|
+
<PreupgradeReportsListHeader
|
90
|
+
changeSort={[Function]}
|
91
|
+
sort={
|
92
|
+
Object {
|
93
|
+
"attribute": "",
|
94
|
+
"order": "asc",
|
95
|
+
}
|
96
|
+
}
|
97
|
+
toggleSelectAll={[Function]}
|
98
|
+
/>
|
69
99
|
<PreupgradeReportEntry
|
70
100
|
entry={
|
71
101
|
Object {
|
@@ -73,7 +103,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
|
|
73
103
|
"title": "Fix me!",
|
74
104
|
}
|
75
105
|
}
|
106
|
+
isEntrySelected={false}
|
76
107
|
key="0"
|
108
|
+
toggleSelected={[Function]}
|
77
109
|
/>
|
78
110
|
<PreupgradeReportEntry
|
79
111
|
entry={
|
@@ -82,7 +114,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
|
|
82
114
|
"title": "I am broken too",
|
83
115
|
}
|
84
116
|
}
|
117
|
+
isEntrySelected={false}
|
85
118
|
key="1"
|
119
|
+
toggleSelected={[Function]}
|
86
120
|
/>
|
87
121
|
<PreupgradeReportEntry
|
88
122
|
entry={
|
@@ -91,7 +125,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
|
|
91
125
|
"title": "Octocat is not happy",
|
92
126
|
}
|
93
127
|
}
|
128
|
+
isEntrySelected={false}
|
94
129
|
key="2"
|
130
|
+
toggleSelected={[Function]}
|
95
131
|
/>
|
96
132
|
<PreupgradeReportEntry
|
97
133
|
entry={
|
@@ -100,7 +136,9 @@ exports[`PreupgradeReportsList should render when working 1`] = `
|
|
100
136
|
"title": "Not enough credits",
|
101
137
|
}
|
102
138
|
}
|
139
|
+
isEntrySelected={false}
|
103
140
|
key="3"
|
141
|
+
toggleSelected={[Function]}
|
104
142
|
/>
|
105
143
|
<PaginationWrapper
|
106
144
|
dropdownButtonId="preupgrade-report-entries-pagination-dropdown"
|
@@ -14,7 +14,7 @@ const InfoItem = ({ itemId, children, tooltipText }) => {
|
|
14
14
|
</OverlayTrigger>
|
15
15
|
);
|
16
16
|
return (
|
17
|
-
<ListView.InfoItem key={itemId}
|
17
|
+
<ListView.InfoItem key={itemId}>
|
18
18
|
{tooltipText ? overlay : children}
|
19
19
|
</ListView.InfoItem>
|
20
20
|
);
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import PropTypes from 'prop-types';
|
3
|
+
import { Icon } from 'patternfly-react';
|
4
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
5
|
+
|
6
|
+
import { isInhibitor } from '../../PreupgradeReports/PreupgradeReportsHelpers';
|
7
|
+
import InfoItem from './InfoItem';
|
8
|
+
import EmptyInfoItem from './EmptyInfoItem';
|
9
|
+
|
10
|
+
const InhibitorInfoItem = ({ entry }) => {
|
11
|
+
const key = `inhibitor-${entry.id}`;
|
12
|
+
|
13
|
+
if (isInhibitor(entry)) {
|
14
|
+
return (
|
15
|
+
<InfoItem
|
16
|
+
itemId={key}
|
17
|
+
tooltipText={__('This issue inhibits the upgrade.')}
|
18
|
+
>
|
19
|
+
<span>
|
20
|
+
<Icon type="pf" name="security" className="severity-high" />
|
21
|
+
{__('Inhibitor')}
|
22
|
+
</span>
|
23
|
+
</InfoItem>
|
24
|
+
);
|
25
|
+
}
|
26
|
+
return <EmptyInfoItem entry={entry} attr="inhibitor" />;
|
27
|
+
};
|
28
|
+
|
29
|
+
InhibitorInfoItem.propTypes = {
|
30
|
+
entry: PropTypes.object.isRequired,
|
31
|
+
};
|
32
|
+
|
33
|
+
export default InhibitorInfoItem;
|
@@ -3,9 +3,10 @@ import { ListView, Grid, Icon } from 'patternfly-react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
4
4
|
import './foreman_leapp.scss';
|
5
5
|
|
6
|
+
import InhibitorInfoItem from './InhibitorInfoItem';
|
7
|
+
|
6
8
|
import {
|
7
9
|
itemIteratorId,
|
8
|
-
presentSeverity,
|
9
10
|
hasRemediations,
|
10
11
|
getExternals,
|
11
12
|
getRemediations,
|
@@ -13,27 +14,34 @@ import {
|
|
13
14
|
getSeverity,
|
14
15
|
getSummary,
|
15
16
|
getTags,
|
17
|
+
getSeverityImg,
|
16
18
|
} from './helpers';
|
17
19
|
|
18
|
-
|
20
|
+
import { entryFixable } from '../../PreupgradeReports/PreupgradeReportsHelpers';
|
21
|
+
|
22
|
+
const PreupgradeReportEntry = ({ entry, isEntrySelected, toggleSelected }) => (
|
19
23
|
<ListView.Item
|
20
24
|
key={entry.id}
|
21
25
|
stacked
|
22
|
-
checkboxInput={
|
26
|
+
checkboxInput={
|
27
|
+
<input
|
28
|
+
type="checkbox"
|
29
|
+
value={isEntrySelected}
|
30
|
+
checked={isEntrySelected}
|
31
|
+
disabled={!entryFixable(entry)}
|
32
|
+
onChange={() => toggleSelected(entry, isEntrySelected)}
|
33
|
+
/>
|
34
|
+
}
|
23
35
|
description={entry.title}
|
24
36
|
additionalInfo={[
|
25
37
|
<ListView.InfoItem key={itemIteratorId(entry, entry.hostname)}>
|
26
38
|
<Icon type="pf" name="cluster" /> {entry.hostname}
|
27
39
|
</ListView.InfoItem>,
|
28
40
|
<ListView.InfoItem key={itemIteratorId(entry, entry.severity)}>
|
29
|
-
|
30
|
-
type="pf"
|
31
|
-
name="resources-full"
|
32
|
-
style={{ color: presentSeverity(entry.severity) }}
|
33
|
-
/>
|
34
|
-
{entry.severity}
|
41
|
+
{getSeverityImg(entry)}
|
35
42
|
</ListView.InfoItem>,
|
36
43
|
hasRemediations(entry),
|
44
|
+
<InhibitorInfoItem key={itemIteratorId(entry, 'flags')} entry={entry} />,
|
37
45
|
]}
|
38
46
|
>
|
39
47
|
<Grid fluid>
|
@@ -49,6 +57,8 @@ const PreupgradeReportEntry = ({ entry }) => (
|
|
49
57
|
|
50
58
|
PreupgradeReportEntry.propTypes = {
|
51
59
|
entry: PropTypes.object.isRequired,
|
60
|
+
isEntrySelected: PropTypes.bool.isRequired,
|
61
|
+
toggleSelected: PropTypes.func.isRequired,
|
52
62
|
};
|
53
63
|
|
54
64
|
export default PreupgradeReportEntry;
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { ListView } from 'patternfly-react';
|
3
|
+
import PropTypes from 'prop-types';
|
4
|
+
|
5
|
+
import { translate as __ } from 'foremanReact/common/I18n';
|
6
|
+
|
7
|
+
import InfoItem from './InfoItem';
|
8
|
+
import SortableHeaderItem from './SortableHeaderItem';
|
9
|
+
|
10
|
+
const PreupgradeReportsListHeader = ({ sort, changeSort, toggleSelectAll }) => {
|
11
|
+
const additionalInfoColumns = [
|
12
|
+
{ label: __('Host'), value: 'hostname' },
|
13
|
+
{ label: __('Severity'), value: 'severity' },
|
14
|
+
{ label: __('Has Remediation?'), value: 'fix' },
|
15
|
+
{ label: __('Inhibitor?'), value: 'inhibitor' },
|
16
|
+
];
|
17
|
+
|
18
|
+
const additionalInfo = additionalInfoColumns.map((col, idx) => (
|
19
|
+
<InfoItem itemId={idx.toString()} key={idx}>
|
20
|
+
<strong>
|
21
|
+
<SortableHeaderItem
|
22
|
+
title={col.label}
|
23
|
+
sort={sort}
|
24
|
+
value={col.value}
|
25
|
+
changeSort={changeSort}
|
26
|
+
/>
|
27
|
+
</strong>
|
28
|
+
</InfoItem>
|
29
|
+
));
|
30
|
+
|
31
|
+
return (
|
32
|
+
<ListView.Item
|
33
|
+
additionalInfo={additionalInfo}
|
34
|
+
className="list-view-header"
|
35
|
+
checkboxInput={<input type="checkbox" onClick={toggleSelectAll} />}
|
36
|
+
description={
|
37
|
+
<SortableHeaderItem
|
38
|
+
title={__('Title')}
|
39
|
+
sort={sort}
|
40
|
+
value="title"
|
41
|
+
changeSort={changeSort}
|
42
|
+
/>
|
43
|
+
}
|
44
|
+
hideCloseIcon
|
45
|
+
stacked
|
46
|
+
/>
|
47
|
+
);
|
48
|
+
};
|
49
|
+
|
50
|
+
PreupgradeReportsListHeader.propTypes = {
|
51
|
+
sort: PropTypes.object.isRequired,
|
52
|
+
changeSort: PropTypes.func.isRequired,
|
53
|
+
toggleSelectAll: PropTypes.func.isRequired,
|
54
|
+
};
|
55
|
+
|
56
|
+
export default PreupgradeReportsListHeader;
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import React from 'react';
|
2
|
+
import { Icon } from 'patternfly-react';
|
3
|
+
import classNames from 'classnames';
|
4
|
+
import PropTypes from 'prop-types';
|
5
|
+
|
6
|
+
const SortableHeaderItem = ({ value, title, sort, changeSort }) => {
|
7
|
+
const chooseChevron = (active, order) => {
|
8
|
+
if (!active) {
|
9
|
+
return null;
|
10
|
+
}
|
11
|
+
|
12
|
+
const direction = order === 'asc' ? 'angle-up' : 'angle-down';
|
13
|
+
|
14
|
+
return <Icon type="fa" name={direction} />;
|
15
|
+
};
|
16
|
+
|
17
|
+
const active = sort.attribute === value;
|
18
|
+
|
19
|
+
const clickHandler = () => {
|
20
|
+
let direction = 'asc';
|
21
|
+
|
22
|
+
if (active) {
|
23
|
+
direction = sort.order === 'asc' ? 'desc' : 'asc';
|
24
|
+
}
|
25
|
+
|
26
|
+
changeSort({
|
27
|
+
attribute: value,
|
28
|
+
order: direction,
|
29
|
+
});
|
30
|
+
};
|
31
|
+
|
32
|
+
return (
|
33
|
+
<span
|
34
|
+
className={`sortable-header ${classNames({ active })}`}
|
35
|
+
onClick={clickHandler}
|
36
|
+
>
|
37
|
+
{chooseChevron(active, sort.order)}
|
38
|
+
{title}
|
39
|
+
</span>
|
40
|
+
);
|
41
|
+
};
|
42
|
+
|
43
|
+
SortableHeaderItem.propTypes = {
|
44
|
+
sort: PropTypes.object.isRequired,
|
45
|
+
changeSort: PropTypes.func.isRequired,
|
46
|
+
value: PropTypes.string.isRequired,
|
47
|
+
title: PropTypes.string.isRequired,
|
48
|
+
};
|
49
|
+
|
50
|
+
export default SortableHeaderItem;
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
2
|
+
|
3
|
+
import InhibitorInfoItem from '../InhibitorInfoItem';
|
4
|
+
|
5
|
+
const fixtures = {
|
6
|
+
'should render when inhibitor': {
|
7
|
+
entry: {
|
8
|
+
title: 'no title',
|
9
|
+
severity: 'low',
|
10
|
+
id: 5,
|
11
|
+
preupgradeReportId: 7,
|
12
|
+
flags: ['inhibitor'],
|
13
|
+
},
|
14
|
+
},
|
15
|
+
'should render when not inhibitor': {
|
16
|
+
entry: {
|
17
|
+
title: 'no title',
|
18
|
+
severity: 'low',
|
19
|
+
id: 5,
|
20
|
+
preupgradeReportId: 7,
|
21
|
+
flags: [],
|
22
|
+
},
|
23
|
+
},
|
24
|
+
};
|
25
|
+
|
26
|
+
describe('InhibitorInfoItem', () =>
|
27
|
+
testComponentSnapshotsWithFixtures(InhibitorInfoItem, fixtures));
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
2
|
+
|
3
|
+
import PreupgradeReportsListHeader from '../PreupgradeReportsListHeader';
|
4
|
+
|
5
|
+
const fixtures = {
|
6
|
+
'should render': {
|
7
|
+
sort: { attribute: '', order: 'asc' },
|
8
|
+
changeSort: () => {},
|
9
|
+
toggleSelectAll: () => {},
|
10
|
+
},
|
11
|
+
};
|
12
|
+
|
13
|
+
describe('PreupgradeReportsListHeader', () =>
|
14
|
+
testComponentSnapshotsWithFixtures(PreupgradeReportsListHeader, fixtures));
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
|
2
|
+
|
3
|
+
import SortableHeaderItem from '../SortableHeaderItem';
|
4
|
+
|
5
|
+
const changeSort = () => {};
|
6
|
+
|
7
|
+
const fixtures = {
|
8
|
+
'should render when not selected': {
|
9
|
+
changeSort,
|
10
|
+
sort: { attribute: '', order: 'asc' },
|
11
|
+
value: 'severity',
|
12
|
+
title: 'severity',
|
13
|
+
},
|
14
|
+
'should render when selected and sorting asc': {
|
15
|
+
changeSort,
|
16
|
+
sort: { attribute: 'severity', order: 'asc' },
|
17
|
+
value: 'severity',
|
18
|
+
title: 'Severity',
|
19
|
+
},
|
20
|
+
'should render when selected and sorting desc': {
|
21
|
+
changeSort,
|
22
|
+
sort: { attribute: 'severity', order: 'desc' },
|
23
|
+
value: 'severity',
|
24
|
+
title: 'Severity',
|
25
|
+
},
|
26
|
+
};
|
27
|
+
|
28
|
+
describe('SortableHeaderItem', () =>
|
29
|
+
testComponentSnapshotsWithFixtures(SortableHeaderItem, fixtures));
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
2
|
+
|
3
|
+
exports[`InhibitorInfoItem should render when inhibitor 1`] = `
|
4
|
+
<InfoItem
|
5
|
+
itemId="inhibitor-5"
|
6
|
+
tooltipText="This issue inhibits the upgrade."
|
7
|
+
>
|
8
|
+
<span>
|
9
|
+
<Icon
|
10
|
+
className="severity-high"
|
11
|
+
name="security"
|
12
|
+
type="pf"
|
13
|
+
/>
|
14
|
+
Inhibitor
|
15
|
+
</span>
|
16
|
+
</InfoItem>
|
17
|
+
`;
|
18
|
+
|
19
|
+
exports[`InhibitorInfoItem should render when not inhibitor 1`] = `
|
20
|
+
<EmptyInfoItem
|
21
|
+
attr="inhibitor"
|
22
|
+
entry={
|
23
|
+
Object {
|
24
|
+
"flags": Array [],
|
25
|
+
"id": 5,
|
26
|
+
"preupgradeReportId": 7,
|
27
|
+
"severity": "low",
|
28
|
+
"title": "no title",
|
29
|
+
}
|
30
|
+
}
|
31
|
+
/>
|
32
|
+
`;
|
@@ -19,16 +19,11 @@ exports[`PreupgradeReportEntry should render 1`] = `
|
|
19
19
|
className=""
|
20
20
|
stacked={false}
|
21
21
|
>
|
22
|
-
<
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
"color": "#39a5dc",
|
27
|
-
}
|
28
|
-
}
|
29
|
-
type="pf"
|
22
|
+
<img
|
23
|
+
alt="Low Severity"
|
24
|
+
className="severity-img"
|
25
|
+
src={[Function]}
|
30
26
|
/>
|
31
|
-
low
|
32
27
|
</ListViewInfoItem>,
|
33
28
|
<EmptyInfoItem
|
34
29
|
attr="remediation"
|
@@ -41,11 +36,25 @@ exports[`PreupgradeReportEntry should render 1`] = `
|
|
41
36
|
}
|
42
37
|
}
|
43
38
|
/>,
|
39
|
+
<InhibitorInfoItem
|
40
|
+
entry={
|
41
|
+
Object {
|
42
|
+
"id": 5,
|
43
|
+
"preupgradeReportId": 7,
|
44
|
+
"severity": "low",
|
45
|
+
"title": "no title",
|
46
|
+
}
|
47
|
+
}
|
48
|
+
/>,
|
44
49
|
]
|
45
50
|
}
|
46
51
|
checkboxInput={
|
47
52
|
<input
|
53
|
+
checked={false}
|
54
|
+
disabled={true}
|
55
|
+
onChange={[Function]}
|
48
56
|
type="checkbox"
|
57
|
+
value={false}
|
49
58
|
/>
|
50
59
|
}
|
51
60
|
compoundExpand={false}
|
@@ -106,14 +115,11 @@ exports[`PreupgradeReportEntry should render 1`] = `
|
|
106
115
|
componentClass="div"
|
107
116
|
md={8}
|
108
117
|
>
|
109
|
-
<
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
}
|
115
|
-
}
|
116
|
-
type="pf"
|
118
|
+
<img
|
119
|
+
alt="Low Severity"
|
120
|
+
className="severity-img"
|
121
|
+
key="5-7-sv5"
|
122
|
+
src={[Function]}
|
117
123
|
/>
|
118
124
|
|
119
125
|
low
|