foreman_leapp 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/foreman_leapp/locale/de/foreman_leapp.js +2 -2
  3. data/app/assets/javascripts/foreman_leapp/locale/en/foreman_leapp.js +1 -1
  4. data/app/assets/javascripts/foreman_leapp/locale/fr/foreman_leapp.js +12 -12
  5. data/app/assets/javascripts/foreman_leapp/locale/ja/foreman_leapp.js +12 -12
  6. data/app/assets/javascripts/foreman_leapp/locale/ka/foreman_leapp.js +1 -1
  7. data/app/assets/javascripts/foreman_leapp/locale/ko/foreman_leapp.js +13 -13
  8. data/app/assets/javascripts/foreman_leapp/locale/zh_CN/foreman_leapp.js +12 -12
  9. data/app/controllers/api/v2/preupgrade_report_entries_controller.rb +17 -29
  10. data/app/controllers/concerns/foreman_leapp/preupgrade_report_entry_bulk_remediate.rb +69 -0
  11. data/config/routes.rb +1 -2
  12. data/lib/foreman_leapp/engine.rb +1 -12
  13. data/lib/foreman_leapp/version.rb +1 -1
  14. data/locale/de/LC_MESSAGES/foreman_leapp.mo +0 -0
  15. data/locale/de/foreman_leapp.po +3 -3
  16. data/locale/en/LC_MESSAGES/foreman_leapp.mo +0 -0
  17. data/locale/en/foreman_leapp.po +1 -1
  18. data/locale/foreman_leapp.pot +2 -2
  19. data/locale/fr/LC_MESSAGES/foreman_leapp.mo +0 -0
  20. data/locale/fr/foreman_leapp.po +13 -13
  21. data/locale/ja/LC_MESSAGES/foreman_leapp.mo +0 -0
  22. data/locale/ja/foreman_leapp.po +13 -13
  23. data/locale/ka/LC_MESSAGES/foreman_leapp.mo +0 -0
  24. data/locale/ka/foreman_leapp.po +1 -1
  25. data/locale/ko/LC_MESSAGES/foreman_leapp.mo +0 -0
  26. data/locale/ko/foreman_leapp.po +15 -16
  27. data/locale/zh_CN/LC_MESSAGES/foreman_leapp.mo +0 -0
  28. data/locale/zh_CN/foreman_leapp.po +13 -13
  29. data/package.json +0 -1
  30. data/test/functional/api/v2/preupgrade_report_entries_controller_test.rb +64 -0
  31. data/webpack/components/PreupgradeReportsTable/PreupgradeReportsTableHelpers.js +43 -16
  32. data/webpack/components/PreupgradeReportsTable/__tests__/PreupgradeReportsTable.test.js +41 -8
  33. data/webpack/components/PreupgradeReportsTable/index.js +64 -71
  34. data/webpack/index.js +0 -13
  35. metadata +3 -66
  36. data/app/controllers/preupgrade_reports_controller.rb +0 -17
  37. data/app/views/job_invocations/_leapp_preupgrade_report.html.erb +0 -11
  38. data/app/views/preupgrade_report_entries/base.json.rabl +0 -4
  39. data/app/views/preupgrade_reports/index.json.rabl +0 -3
  40. data/app/views/preupgrade_reports/show.json.rabl +0 -7
  41. data/test/functional/preupgrade_reports_controller_test.rb +0 -39
  42. data/webpack/components/PreupgradeReports/PreupgradeReports.js +0 -154
  43. data/webpack/components/PreupgradeReports/PreupgradeReportsActions.js +0 -31
  44. data/webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js +0 -152
  45. data/webpack/components/PreupgradeReports/PreupgradeReportsReducer.js +0 -37
  46. data/webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js +0 -18
  47. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js +0 -129
  48. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js +0 -159
  49. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js +0 -78
  50. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsReducer.test.js +0 -44
  51. data/webpack/components/PreupgradeReports/__tests__/PreupgradeReportsSelectors.test.js +0 -28
  52. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap +0 -489
  53. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap +0 -102
  54. data/webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap +0 -76
  55. data/webpack/components/PreupgradeReports/components/EntriesFilter.js +0 -121
  56. data/webpack/components/PreupgradeReports/components/EntriesFilter.scss +0 -3
  57. data/webpack/components/PreupgradeReports/components/EntriesFilter.test.js +0 -30
  58. data/webpack/components/PreupgradeReports/components/FixSelectedButton.js +0 -35
  59. data/webpack/components/PreupgradeReports/components/FixSelectedButton.test.js +0 -15
  60. data/webpack/components/PreupgradeReports/components/NoReports.js +0 -35
  61. data/webpack/components/PreupgradeReports/components/NoReports.test.js +0 -29
  62. data/webpack/components/PreupgradeReports/components/UpgradeAllButton.js +0 -28
  63. data/webpack/components/PreupgradeReports/components/UpgradeAllButton.test.js +0 -17
  64. data/webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap +0 -330
  65. data/webpack/components/PreupgradeReports/components/__snapshots__/FixSelectedButton.test.js.snap +0 -40
  66. data/webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap +0 -41
  67. data/webpack/components/PreupgradeReports/index.js +0 -57
  68. data/webpack/components/PreupgradeReportsList/PreupgradeReportList.scss +0 -37
  69. data/webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js +0 -124
  70. data/webpack/components/PreupgradeReportsList/components/EmptyInfoItem.js +0 -16
  71. data/webpack/components/PreupgradeReportsList/components/InfoItem.js +0 -34
  72. data/webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js +0 -33
  73. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js +0 -64
  74. data/webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js +0 -56
  75. data/webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js +0 -50
  76. data/webpack/components/PreupgradeReportsList/components/__tests__/EmptyInfoItem.test.js +0 -13
  77. data/webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js +0 -27
  78. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.fixtures.js +0 -38
  79. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js +0 -14
  80. data/webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js +0 -14
  81. data/webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js +0 -29
  82. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/EmptyInfoItem.test.js.snap +0 -8
  83. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap +0 -32
  84. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap +0 -134
  85. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap +0 -113
  86. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap +0 -36
  87. data/webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap +0 -197
  88. data/webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js +0 -28
  89. data/webpack/components/PreupgradeReportsList/components/foreman_leapp.scss +0 -15
  90. data/webpack/components/PreupgradeReportsList/components/helpers.js +0 -186
  91. data/webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg +0 -61
  92. data/webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg +0 -61
  93. data/webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg +0 -62
  94. data/webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg +0 -62
  95. data/webpack/components/PreupgradeReportsList/index.js +0 -61
  96. data/webpack/consts.js +0 -3
  97. data/webpack/csrf.js +0 -4
  98. data/webpack/reducer.js +0 -5
@@ -122,6 +122,42 @@ describe('PreupgradeReportsTable', () => {
122
122
  const waitForTable = () =>
123
123
  waitFor(() => screen.getByText('Report Entry 1', { selector: 'td' }));
124
124
 
125
+ it('loads entries for the whole job invocation when multiple preupgrade reports exist', async () => {
126
+ const host2Entry = {
127
+ id: 501,
128
+ title: 'Host 2 Issue',
129
+ hostname: 'host2.example.com',
130
+ host_id: 202,
131
+ severity: 'medium',
132
+ detail: {},
133
+ };
134
+
135
+ APIActions.get.mockImplementation(({ key, handleSuccess, params }) => {
136
+ return () => {
137
+ if (key.includes('GET_LEAPP_REPORT_LIST')) {
138
+ handleSuccess({ results: [{ id: 1 }, { id: 2 }] });
139
+ }
140
+ if (key.includes('GET_LEAPP_REPORT_ENTRIES')) {
141
+ expect(params.job_invocation_id).toBe(mockJobId);
142
+ expect(params.search).toBeUndefined();
143
+ handleSuccess({
144
+ results: [host2Entry, ...mockEntries],
145
+ subtotal: mockEntries.length + 1,
146
+ });
147
+ }
148
+ return { type: 'MOCK_API_SUCCESS' };
149
+ };
150
+ });
151
+
152
+ renderComponent();
153
+ expandSection();
154
+ await waitFor(() =>
155
+ expect(
156
+ screen.getByText('Host 2 Issue', { selector: 'td' })
157
+ ).toBeInTheDocument()
158
+ );
159
+ });
160
+
125
161
  it('renders data', async () => {
126
162
  renderComponent();
127
163
  expandSection();
@@ -402,7 +438,7 @@ describe('PreupgradeReportsTable', () => {
402
438
  );
403
439
  });
404
440
 
405
- it('Fix Selected dispatches APIActions.post with correct feature, host_ids and remediation_ids', async () => {
441
+ it('Fix Selected dispatches bulk_remediate with fixable entry ids', async () => {
406
442
  renderComponent();
407
443
  expandSection();
408
444
  await waitForTable();
@@ -419,13 +455,10 @@ describe('PreupgradeReportsTable', () => {
419
455
 
420
456
  expect(APIActions.post).toHaveBeenCalledWith(
421
457
  expect.objectContaining({
422
- url: expect.stringContaining('/api/job_invocations'),
458
+ url: expect.stringContaining('/bulk_remediate'),
423
459
  params: {
424
- job_invocation: {
425
- feature: 'leapp_remediation_plan',
426
- host_ids: [100],
427
- inputs: { remediation_ids: '1' },
428
- },
460
+ job_invocation_id: mockJobId,
461
+ ids: [1],
429
462
  },
430
463
  })
431
464
  );
@@ -582,7 +615,7 @@ describe('PreupgradeReportsTable', () => {
582
615
  expect.objectContaining({
583
616
  url: expect.stringContaining('/bulk_remediate'),
584
617
  params: {
585
- search: '',
618
+ job_invocation_id: mockJobId,
586
619
  excluded_ids: [],
587
620
  },
588
621
  })
@@ -29,10 +29,16 @@ import { getControllerSearchProps, STATUS } from 'foremanReact/constants';
29
29
  import SearchBar from 'foremanReact/components/SearchBar';
30
30
  import { APIActions } from 'foremanReact/redux/API';
31
31
  import { usePreupgradeTableState } from './PreupgradeReportsTableHelpers';
32
- import { entryFixable } from '../PreupgradeReports/PreupgradeReportsHelpers';
33
32
  import ReportDetails, { renderSeverityLabel } from './ReportDetails';
34
33
  import './PreupgradeReportsTable.scss';
35
34
 
35
+ const entryWithFixKind = kind => entry =>
36
+ entry.detail &&
37
+ entry.detail.remediations &&
38
+ entry.detail.remediations.some(remediation => remediation.type === kind);
39
+
40
+ const entryFixable = entryWithFixKind('command');
41
+
36
42
  const isRowFixable = entryFixable;
37
43
 
38
44
  const submitJobInvocation = (
@@ -89,7 +95,8 @@ const PreupgradeReportsTable = ({ data = {} }) => {
89
95
  isLeappJob,
90
96
  status,
91
97
  error,
92
- reportId,
98
+ hasReports,
99
+ jobInvocationId,
93
100
  rows,
94
101
  totalCount,
95
102
  pagination,
@@ -113,21 +120,25 @@ const PreupgradeReportsTable = ({ data = {} }) => {
113
120
 
114
121
  useEffect(() => {
115
122
  setFixableCount(null);
116
- }, [searchValue, reportId]);
123
+ }, [searchValue, jobInvocationId]);
117
124
 
118
125
  const searchProps = useMemo(() => {
119
- if (!reportId) return null;
126
+ if (!hasReports || !jobInvocationId) {
127
+ return null;
128
+ }
129
+
120
130
  const baseProps = getControllerSearchProps('preupgrade_report_entries');
131
+
121
132
  return {
122
133
  ...baseProps,
123
134
  autocomplete: {
124
135
  ...baseProps.autocomplete,
125
136
  url: foremanUrl(
126
- `/api/v2/preupgrade_reports/${reportId}/preupgrade_report_entries/auto_complete_search`
137
+ `/api/v2/preupgrade_report_entries/auto_complete_search?job_invocation_id=${jobInvocationId}`
127
138
  ),
128
139
  },
129
140
  };
130
- }, [reportId]);
141
+ }, [hasReports, jobInvocationId]);
131
142
 
132
143
  const columns = useMemo(
133
144
  () => ({
@@ -203,9 +214,10 @@ const PreupgradeReportsTable = ({ data = {} }) => {
203
214
  if (fixableCount === null) {
204
215
  dispatch(
205
216
  APIActions.get({
206
- key: `GET_FIXABLE_COUNT_${reportId}`,
207
- url: `/api/v2/preupgrade_reports/${reportId}/preupgrade_report_entries`,
217
+ key: `GET_FIXABLE_COUNT_${jobInvocationId}`,
218
+ url: '/api/v2/preupgrade_report_entries',
208
219
  params: {
220
+ job_invocation_id: jobInvocationId,
209
221
  search: [searchValue, 'fix_type = command']
210
222
  .filter(Boolean)
211
223
  .join(' AND '),
@@ -226,7 +238,7 @@ const PreupgradeReportsTable = ({ data = {} }) => {
226
238
  originalSelectAll(...args);
227
239
  }
228
240
  },
229
- [dispatch, reportId, searchValue, fixableCount, originalSelectAll]
241
+ [dispatch, jobInvocationId, searchValue, fixableCount, originalSelectAll]
230
242
  );
231
243
 
232
244
  const selectedIds = Array.from(inclusionSet);
@@ -244,19 +256,6 @@ const PreupgradeReportsTable = ({ data = {} }) => {
244
256
  [globalHostId]
245
257
  );
246
258
 
247
- const hostIdsForSelected = useMemo(
248
- () =>
249
- Array.from(
250
- new Set(
251
- rows
252
- .filter(e => selectedIds.includes(e.id))
253
- .map(getHostId)
254
- .filter(Boolean)
255
- )
256
- ),
257
- [rows, selectedIds, getHostId]
258
- );
259
-
260
259
  const allHostIds = useMemo(
261
260
  () => Array.from(new Set(rows.map(getHostId).filter(Boolean))),
262
261
  [rows, getHostId]
@@ -271,11 +270,14 @@ const PreupgradeReportsTable = ({ data = {} }) => {
271
270
  const newDirection = (parts[1] || 'ASC').toLowerCase();
272
271
  sortChanged =
273
272
  newIndex !== sortBy.index || newDirection !== sortBy.direction;
274
- if (sortChanged)
273
+
274
+ if (sortChanged) {
275
275
  setSortBy({ index: newIndex, direction: newDirection });
276
+ }
276
277
  }
277
278
 
278
279
  let newPage = pagination.page;
280
+
279
281
  if (sortChanged) {
280
282
  newPage = 1;
281
283
  } else if (newParams.page !== undefined) {
@@ -300,53 +302,42 @@ const PreupgradeReportsTable = ({ data = {} }) => {
300
302
  };
301
303
 
302
304
  const handleFixSelected = () => {
303
- if (areAllRowsSelected() || exclusionSet.size > 0) {
304
- setSubmitError(null);
305
- setIsSubmitting(true);
306
-
307
- dispatch(
308
- APIActions.post({
309
- key: `BULK_REMEDIATE_${reportId}`,
310
- url: foremanUrl(
311
- `/api/v2/preupgrade_reports/${reportId}/preupgrade_report_entries/bulk_remediate`
312
- ),
313
- params: {
314
- search: searchValue,
315
- excluded_ids: Array.from(exclusionSet),
316
- },
317
- handleSuccess: response => {
318
- const result = response.data || response;
319
- if (result?.id) {
320
- window.location.assign(
321
- foremanUrl(`/job_invocations/${result.id}`)
322
- );
323
- } else {
324
- setIsSubmitting(false);
325
- }
326
- },
327
- handleError: err => {
328
- setSubmitError(err);
329
- setIsSubmitting(false);
330
- },
331
- })
332
- );
333
- } else {
334
- if (selectedIds.length === 0) return;
335
-
336
- const hostIds =
337
- hostIdsForSelected.length > 0
338
- ? hostIdsForSelected
339
- : [globalHostId].filter(Boolean);
340
-
341
- submitJobInvocation(
342
- dispatch,
343
- setSubmitError,
344
- 'leapp_remediation_plan',
345
- hostIds,
346
- selectedIds.join(','),
347
- setIsSubmitting
348
- );
305
+ const isBulkSelection = areAllRowsSelected() || exclusionSet.size > 0;
306
+
307
+ if (!isBulkSelection && selectedIds.length === 0) {
308
+ return;
349
309
  }
310
+
311
+ setSubmitError(null);
312
+ setIsSubmitting(true);
313
+
314
+ dispatch(
315
+ APIActions.post({
316
+ key: `BULK_REMEDIATE_${jobInvocationId}`,
317
+ url: foremanUrl('/api/v2/preupgrade_report_entries/bulk_remediate'),
318
+ params: {
319
+ job_invocation_id: jobInvocationId,
320
+ ...(isBulkSelection
321
+ ? {
322
+ ...(searchValue && { search: searchValue }),
323
+ excluded_ids: Array.from(exclusionSet),
324
+ }
325
+ : { ids: selectedIds }),
326
+ },
327
+ handleSuccess: response => {
328
+ const result = response.data || response;
329
+ if (result?.id) {
330
+ window.location.assign(foremanUrl(`/job_invocations/${result.id}`));
331
+ } else {
332
+ setIsSubmitting(false);
333
+ }
334
+ },
335
+ handleError: err => {
336
+ setSubmitError(err);
337
+ setIsSubmitting(false);
338
+ },
339
+ })
340
+ );
350
341
  };
351
342
 
352
343
  const handleRunUpgrade = () => {
@@ -366,7 +357,9 @@ const PreupgradeReportsTable = ({ data = {} }) => {
366
357
  [columns]
367
358
  );
368
359
 
369
- if (!isLeappJob) return null;
360
+ if (!isLeappJob) {
361
+ return null;
362
+ }
370
363
 
371
364
  const hasAnySelection =
372
365
  areAllRowsSelected() || exclusionSet.size > 0 || selectedIds.length > 0;
@@ -416,7 +409,7 @@ const PreupgradeReportsTable = ({ data = {} }) => {
416
409
  </ToolbarItem>
417
410
  )}
418
411
 
419
- {reportId && searchProps && (
412
+ {hasReports && searchProps && (
420
413
  <ToolbarItem className="leapp-searchbar-item">
421
414
  <SearchBar
422
415
  data={searchProps}
data/webpack/index.js CHANGED
@@ -1,13 +0,0 @@
1
- import componentRegistry from 'foremanReact/components/componentRegistry';
2
-
3
- import injectReducer from 'foremanReact/redux/reducers/registerReducer';
4
-
5
- import PreupgradeReports from './components/PreupgradeReports';
6
- import reducer from './reducer';
7
-
8
- componentRegistry.register({
9
- name: 'PreupgradeReports',
10
- type: PreupgradeReports,
11
- });
12
-
13
- injectReducer('foremanLeapp', reducer);
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_leapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.2.0
4
+ version: 4.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foreman Leapp team
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-10-05 00:00:00.000000000 Z
10
+ date: 2026-10-09 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: foreman_remote_execution
@@ -57,7 +57,7 @@ files:
57
57
  - app/controllers/api/v2/preupgrade_report_entries_controller.rb
58
58
  - app/controllers/api/v2/preupgrade_reports_controller.rb
59
59
  - app/controllers/concerns/api/v2/api_authorizer.rb
60
- - app/controllers/preupgrade_reports_controller.rb
60
+ - app/controllers/concerns/foreman_leapp/preupgrade_report_entry_bulk_remediate.rb
61
61
  - app/helpers/foreman_leapp/hosts_helper.rb
62
62
  - app/helpers/foreman_leapp/template_helper.rb
63
63
  - app/lib/actions/foreman_leapp/preupgrade_job.rb
@@ -77,10 +77,6 @@ files:
77
77
  - app/views/foreman_leapp/job_templates/leapp_preupgrade.erb
78
78
  - app/views/foreman_leapp/job_templates/leapp_remediation.erb
79
79
  - app/views/foreman_leapp/job_templates/leapp_upgrade.erb
80
- - app/views/job_invocations/_leapp_preupgrade_report.html.erb
81
- - app/views/preupgrade_report_entries/base.json.rabl
82
- - app/views/preupgrade_reports/index.json.rabl
83
- - app/views/preupgrade_reports/show.json.rabl
84
80
  - config/routes.rb
85
81
  - db/migrate/20200320104040_preupgrade_report_entries.rb
86
82
  - db/migrate/20200326142259_add_job_id_to_report.rb
@@ -113,7 +109,6 @@ files:
113
109
  - test/functional/api/v2/job_invocations_controller_test.rb
114
110
  - test/functional/api/v2/preupgrade_report_entries_controller_test.rb
115
111
  - test/functional/api/v2/preupgrade_reports_controller_test.rb
116
- - test/functional/preupgrade_reports_controller_test.rb
117
112
  - test/helpers/template_helper_test.rb
118
113
  - test/models/preupgrade_report_entry_test.rb
119
114
  - test/models/preupgrade_report_test.rb
@@ -121,70 +116,13 @@ files:
121
116
  - test/unit/actions/preupgrade_job_test.rb
122
117
  - test/unit/helpers/job_helper_test.rb
123
118
  - webpack/__mocks__/foremanReact/Root/Context/ForemanContext.js
124
- - webpack/components/PreupgradeReports/PreupgradeReports.js
125
- - webpack/components/PreupgradeReports/PreupgradeReportsActions.js
126
- - webpack/components/PreupgradeReports/PreupgradeReportsHelpers.js
127
- - webpack/components/PreupgradeReports/PreupgradeReportsReducer.js
128
- - webpack/components/PreupgradeReports/PreupgradeReportsSelectors.js
129
- - webpack/components/PreupgradeReports/__tests__/PreupgradeReports.fixtures.js
130
- - webpack/components/PreupgradeReports/__tests__/PreupgradeReports.test.js
131
- - webpack/components/PreupgradeReports/__tests__/PreupgradeReportsHelpers.test.js
132
- - webpack/components/PreupgradeReports/__tests__/PreupgradeReportsReducer.test.js
133
- - webpack/components/PreupgradeReports/__tests__/PreupgradeReportsSelectors.test.js
134
- - webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsHelpers.test.js.snap
135
- - webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsReducer.test.js.snap
136
- - webpack/components/PreupgradeReports/__tests__/__snapshots__/PreupgradeReportsSelectors.test.js.snap
137
- - webpack/components/PreupgradeReports/components/EntriesFilter.js
138
- - webpack/components/PreupgradeReports/components/EntriesFilter.scss
139
- - webpack/components/PreupgradeReports/components/EntriesFilter.test.js
140
- - webpack/components/PreupgradeReports/components/FixSelectedButton.js
141
- - webpack/components/PreupgradeReports/components/FixSelectedButton.test.js
142
- - webpack/components/PreupgradeReports/components/NoReports.js
143
- - webpack/components/PreupgradeReports/components/NoReports.test.js
144
- - webpack/components/PreupgradeReports/components/UpgradeAllButton.js
145
- - webpack/components/PreupgradeReports/components/UpgradeAllButton.test.js
146
- - webpack/components/PreupgradeReports/components/__snapshots__/EntriesFilter.test.js.snap
147
- - webpack/components/PreupgradeReports/components/__snapshots__/FixSelectedButton.test.js.snap
148
- - webpack/components/PreupgradeReports/components/__snapshots__/UpgradeAllButton.test.js.snap
149
- - webpack/components/PreupgradeReports/index.js
150
- - webpack/components/PreupgradeReportsList/PreupgradeReportList.scss
151
- - webpack/components/PreupgradeReportsList/__tests__/PreupgradeReportsList.test.js
152
- - webpack/components/PreupgradeReportsList/components/EmptyInfoItem.js
153
- - webpack/components/PreupgradeReportsList/components/InfoItem.js
154
- - webpack/components/PreupgradeReportsList/components/InhibitorInfoItem.js
155
- - webpack/components/PreupgradeReportsList/components/PreupgradeReportEntry.js
156
- - webpack/components/PreupgradeReportsList/components/PreupgradeReportsListHeader.js
157
- - webpack/components/PreupgradeReportsList/components/SortableHeaderItem.js
158
- - webpack/components/PreupgradeReportsList/components/__tests__/EmptyInfoItem.test.js
159
- - webpack/components/PreupgradeReportsList/components/__tests__/InhibitorInfoItem.test.js
160
- - webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.fixtures.js
161
- - webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportEntry.test.js
162
- - webpack/components/PreupgradeReportsList/components/__tests__/PreupgradeReportsListHeader.test.js
163
- - webpack/components/PreupgradeReportsList/components/__tests__/SortableHeaderItem.test.js
164
- - webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/EmptyInfoItem.test.js.snap
165
- - webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/InhibitorInfoItem.test.js.snap
166
- - webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportEntry.test.js.snap
167
- - webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/PreupgradeReportsListHeader.test.js.snap
168
- - webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/SortableHeaderItem.test.js.snap
169
- - webpack/components/PreupgradeReportsList/components/__tests__/__snapshots__/helpers.test.js.snap
170
- - webpack/components/PreupgradeReportsList/components/__tests__/helpers.test.js
171
- - webpack/components/PreupgradeReportsList/components/foreman_leapp.scss
172
- - webpack/components/PreupgradeReportsList/components/helpers.js
173
- - webpack/components/PreupgradeReportsList/components/images/i_severity-critical.svg
174
- - webpack/components/PreupgradeReportsList/components/images/i_severity-high.svg
175
- - webpack/components/PreupgradeReportsList/components/images/i_severity-low.svg
176
- - webpack/components/PreupgradeReportsList/components/images/i_severity-med.svg
177
- - webpack/components/PreupgradeReportsList/index.js
178
119
  - webpack/components/PreupgradeReportsTable/PreupgradeReportsTable.scss
179
120
  - webpack/components/PreupgradeReportsTable/PreupgradeReportsTableHelpers.js
180
121
  - webpack/components/PreupgradeReportsTable/ReportDetails.js
181
122
  - webpack/components/PreupgradeReportsTable/__tests__/PreupgradeReportsTable.test.js
182
123
  - webpack/components/PreupgradeReportsTable/index.js
183
- - webpack/consts.js
184
- - webpack/csrf.js
185
124
  - webpack/global_index.js
186
125
  - webpack/index.js
187
- - webpack/reducer.js
188
126
  - webpack/testSetup.js
189
127
  - webpack/test_setup.js
190
128
  homepage: https://github.com/theforeman/foreman_leapp
@@ -213,7 +151,6 @@ test_files:
213
151
  - test/functional/api/v2/job_invocations_controller_test.rb
214
152
  - test/functional/api/v2/preupgrade_report_entries_controller_test.rb
215
153
  - test/functional/api/v2/preupgrade_reports_controller_test.rb
216
- - test/functional/preupgrade_reports_controller_test.rb
217
154
  - test/helpers/template_helper_test.rb
218
155
  - test/models/preupgrade_report_entry_test.rb
219
156
  - test/models/preupgrade_report_test.rb
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class PreupgradeReportsController < ::Api::V2::BaseController
4
- include Api::V2::ApiAuthorizer
5
-
6
- def index
7
- @preupgrade_reports = resource_scope.includes(:preupgrade_report_entries).search_for(*search_options)
8
- end
9
-
10
- private
11
-
12
- # By overriding :path_to_authenticate we can require REX's :view_job_invocations permission
13
- def path_to_authenticate
14
- Foreman::AccessControl.normalize_path_hash params.slice(:action, :id, :user_id)
15
- .merge({ controller: 'job_invocations' })
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- <% content_for(:javascripts) do %>
2
- <%= webpacked_plugins_js_for :foreman_leapp %>
3
- <% end %>
4
- <% content_for(:stylesheets) do %>
5
- <%= webpacked_plugins_css_for :foreman_leapp %>
6
- <% end %>
7
-
8
- <%= react_component('PreupgradeReports', {
9
- :url => preupgrade_reports_path(:search => "job_invocation_id = #{@job_invocation.id}"),
10
- :newJobInvocationUrl => new_job_invocation_path
11
- }) %>
@@ -1,4 +0,0 @@
1
- object @preupgrade_report_entry
2
-
3
- extends "api/v2/preupgrade_report_entries/base"
4
- attribute :detail
@@ -1,3 +0,0 @@
1
- collection @preupgrade_reports
2
-
3
- extends 'preupgrade_reports/show'
@@ -1,7 +0,0 @@
1
- object @preupgrade_report
2
-
3
- extends "api/v2/preupgrade_reports/base"
4
-
5
- child :preupgrade_report_entries => :entries do
6
- extends "preupgrade_report_entries/base"
7
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_plugin_helper'
4
-
5
- class PreupgradeReportsControllerTest < ActionController::TestCase
6
- setup do
7
- @user = FactoryBot.create(:user, admin: false)
8
- @host = FactoryBot.create :host
9
- FactoryBot.create :preupgrade_report, host: @host
10
- end
11
-
12
- test 'should get :index' do
13
- get :index
14
- assert_response :success
15
- assert_not_empty JSON.parse(@response.body)['results']
16
- end
17
-
18
- test 'should get :index with :view_job_invocations & :view_hosts' do
19
- setup_user 'view', 'job_invocations', nil, @user
20
- setup_user 'view', 'hosts', nil, @user
21
- get :index, session: set_session_user(@user)
22
- assert_response :success
23
- assert_not_empty JSON.parse(@response.body)['results']
24
- end
25
-
26
- test 'should not get :index without :view_job_invocations' do
27
- setup_user 'view', 'hosts', nil, @user
28
- get :index, session: set_session_user(@user)
29
- assert_response :forbidden
30
- assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_job_invocations'
31
- end
32
-
33
- test 'should not get :index without :view_hosts' do
34
- setup_user 'view', 'job_invocations', nil, @user
35
- get :index, session: set_session_user(@user)
36
- assert_response :forbidden
37
- assert_includes JSON.parse(@response.body)['error']['missing_permissions'], 'view_hosts'
38
- end
39
- end
@@ -1,154 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { Icon } from '@patternfly/react-core';
3
- import { ExclamationCircleIcon } from '@patternfly/react-icons';
4
- import EmptyState from 'foremanReact/components/common/EmptyState';
5
- import { LoadingState, Row } from 'patternfly-react';
6
- import PropTypes from 'prop-types';
7
- import { sprintf, translate as __ } from 'foremanReact/common/I18n';
8
-
9
- import PreupgradeReportsList from '../PreupgradeReportsList';
10
- import UpgradeAllButton from './components/UpgradeAllButton';
11
- import EntriesFilter from './components/EntriesFilter';
12
- import FixSelectedButton from './components/FixSelectedButton';
13
-
14
- import {
15
- flattenEntries,
16
- isEmpty,
17
- anyEntriesFixable,
18
- filterEntries,
19
- idsForInvocationFromEntries,
20
- sortEntries,
21
- fixableEntries,
22
- } from './PreupgradeReportsHelpers';
23
-
24
- import NoReports from './components/NoReports';
25
-
26
- const PreupgradeReports = ({
27
- preupgradeReports,
28
- csrfToken,
29
- newJobInvocationUrl,
30
- }) => {
31
- const [filterType, setFilterType] = useState('title');
32
- const [filterValue, setFilterValue] = useState('');
33
- const [checked, setChecked] = useState([]);
34
- const [sort, setSort] = useState({ attribute: '', order: 'desc' });
35
-
36
- const onFilterValueChange = value => {
37
- setFilterValue(value);
38
- };
39
-
40
- const onFilterValueClear = () => setFilterValue('');
41
-
42
- const onFilterTypeChange = value => {
43
- onFilterValueClear();
44
- setFilterType(value);
45
- };
46
-
47
- const isSelected = entry => checked.some(item => item.id === entry.id);
48
-
49
- const anySelected = checked.length > 0;
50
-
51
- const toggleSelected = (entry, isEntrySelected) => {
52
- if (isEntrySelected) {
53
- setChecked(checked.filter(item => item.id !== entry.id));
54
- } else {
55
- setChecked([entry, ...checked]);
56
- }
57
- };
58
-
59
- const toggleSelectAll = () => {
60
- const allFixable = fixableEntries(preupgradeReports);
61
-
62
- if (checked.length === allFixable.length) {
63
- setChecked([]);
64
- } else {
65
- setChecked(allFixable);
66
- }
67
- };
68
-
69
- const changeSort = value => {
70
- setSort({ ...sort, ...value });
71
- };
72
-
73
- return (
74
- <React.Fragment>
75
- <Row>
76
- <div className="col-md-8">
77
- <EntriesFilter
78
- filterType={filterType}
79
- onFilterTypeChange={onFilterTypeChange}
80
- filterValue={filterValue}
81
- onFilterValueChange={onFilterValueChange}
82
- />
83
- </div>
84
- <div className="col-md-4">
85
- <div className="btn-toolbar pull-right">
86
- <FixSelectedButton
87
- postUrl={newJobInvocationUrl}
88
- disabled={!anyEntriesFixable(preupgradeReports) || !anySelected}
89
- csrfToken={csrfToken}
90
- ids={idsForInvocationFromEntries(checked)}
91
- />
92
- <UpgradeAllButton
93
- postUrl={newJobInvocationUrl}
94
- csrfToken={csrfToken}
95
- preupgradeReports={preupgradeReports}
96
- />
97
- </div>
98
- </div>
99
- </Row>
100
- <PreupgradeReportsList
101
- allEntries={filterEntries(
102
- filterType,
103
- filterValue,
104
- sortEntries(flattenEntries(preupgradeReports), sort)
105
- )}
106
- isSelected={isSelected}
107
- toggleSelected={toggleSelected}
108
- sort={sort}
109
- changeSort={changeSort}
110
- toggleSelectAll={toggleSelectAll}
111
- />
112
- </React.Fragment>
113
- );
114
- };
115
-
116
- const withLoadingState = Component => componentProps => {
117
- const { error, loading, preupgradeReports, reportsExpected } = componentProps;
118
-
119
- if (!isEmpty(error)) {
120
- return (
121
- <EmptyState
122
- key="preupgrade-reports-error"
123
- variant="xs"
124
- icon={
125
- <Icon iconSize="lg">
126
- <ExclamationCircleIcon />
127
- </Icon>
128
- }
129
- header={sprintf(__('Could not retrieve data: %(status)s - %(msg)s'), {
130
- status: error.statusText,
131
- msg: error.errorMsg,
132
- })}
133
- />
134
- );
135
- }
136
-
137
- return (
138
- <LoadingState loading={loading}>
139
- {preupgradeReports.length > 0 ? (
140
- <Component {...componentProps} />
141
- ) : (
142
- <NoReports reportsExpected={reportsExpected} />
143
- )}
144
- </LoadingState>
145
- );
146
- };
147
-
148
- PreupgradeReports.propTypes = {
149
- preupgradeReports: PropTypes.array.isRequired,
150
- csrfToken: PropTypes.string.isRequired,
151
- newJobInvocationUrl: PropTypes.string.isRequired,
152
- };
153
-
154
- export default withLoadingState(PreupgradeReports);