foreman-tasks 2.0.1 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/js_tests.yml +31 -0
  3. data/.github/workflows/ruby_tests.yml +74 -0
  4. data/.rubocop.yml +12 -4
  5. data/.rubocop_todo.yml +32 -25
  6. data/Gemfile +5 -0
  7. data/app/controllers/foreman_tasks/api/tasks_controller.rb +54 -63
  8. data/app/controllers/foreman_tasks/concerns/parameters/triggering.rb +1 -1
  9. data/app/controllers/foreman_tasks/recurring_logics_controller.rb +7 -0
  10. data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +3 -3
  11. data/app/lib/actions/proxy_action.rb +1 -1
  12. data/app/models/foreman_tasks/recurring_logic.rb +4 -4
  13. data/app/models/foreman_tasks/task.rb +11 -0
  14. data/app/models/foreman_tasks/task/dynflow_task.rb +29 -34
  15. data/app/models/foreman_tasks/task/status_explicator.rb +1 -1
  16. data/app/models/foreman_tasks/triggering.rb +1 -1
  17. data/app/models/setting/foreman_tasks.rb +9 -9
  18. data/app/services/foreman_tasks/dashboard_table_filter.rb +5 -1
  19. data/app/views/foreman_tasks/api/tasks/index.json.rabl +2 -0
  20. data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
  21. data/app/views/foreman_tasks/layouts/react.html.erb +1 -2
  22. data/app/views/foreman_tasks/recurring_logics/index.html.erb +3 -1
  23. data/app/views/foreman_tasks/tasks/dashboard/_latest_tasks_in_error_warning.html.erb +1 -1
  24. data/app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb +1 -1
  25. data/app/views/foreman_tasks/tasks/show.html.erb +1 -6
  26. data/config/routes.rb +2 -1
  27. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +2 -2
  28. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +3 -3
  29. data/db/seeds.d/30-notification_blueprints.rb +7 -7
  30. data/db/seeds.d/61-foreman_tasks_bookmarks.rb +1 -1
  31. data/foreman-tasks.gemspec +1 -0
  32. data/lib/foreman_tasks/cleaner.rb +4 -6
  33. data/lib/foreman_tasks/dynflow/configuration.rb +1 -1
  34. data/lib/foreman_tasks/dynflow/persistence.rb +4 -6
  35. data/lib/foreman_tasks/engine.rb +2 -2
  36. data/lib/foreman_tasks/tasks/cleanup.rake +2 -2
  37. data/lib/foreman_tasks/tasks/dynflow.rake +6 -0
  38. data/lib/foreman_tasks/tasks/export_tasks.rake +1 -1
  39. data/lib/foreman_tasks/version.rb +1 -1
  40. data/package.json +1 -1
  41. data/script/npm_link_foreman_js.sh +26 -0
  42. data/test/controllers/api/recurring_logics_controller_test.rb +1 -1
  43. data/test/controllers/api/tasks_controller_test.rb +17 -7
  44. data/test/controllers/tasks_controller_test.rb +6 -6
  45. data/test/core/unit/runner_test.rb +20 -20
  46. data/test/core/unit/task_launcher_test.rb +8 -8
  47. data/test/helpers/foreman_tasks/foreman_tasks_helper_test.rb +7 -7
  48. data/test/helpers/foreman_tasks/tasks_helper_test.rb +3 -3
  49. data/test/lib/actions/middleware/keep_current_request_id_test.rb +3 -3
  50. data/test/support/history_tasks_builder.rb +1 -1
  51. data/test/tasks/generate_task_actions_test.rb +1 -1
  52. data/test/unit/actions/action_with_sub_plans_test.rb +2 -2
  53. data/test/unit/actions/bulk_action_test.rb +6 -6
  54. data/test/unit/actions/proxy_action_test.rb +20 -20
  55. data/test/unit/actions/recurring_action_test.rb +30 -32
  56. data/test/unit/cleaner_test.rb +24 -24
  57. data/test/unit/dashboard_table_filter_test.rb +5 -5
  58. data/test/unit/otp_manager_test.rb +2 -2
  59. data/test/unit/proxy_selector_test.rb +9 -9
  60. data/test/unit/recurring_logic_test.rb +38 -32
  61. data/test/unit/remote_task_test.rb +2 -2
  62. data/test/unit/task_groups_test.rb +4 -4
  63. data/test/unit/task_test.rb +18 -18
  64. data/test/unit/triggering_test.rb +8 -8
  65. data/test/unit/troubleshooting_help_generator_test.rb +6 -6
  66. data/test/unit/ui_notifications_test.rb +11 -11
  67. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +3 -3
  68. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +8 -138
  69. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskButtons.js +168 -0
  70. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +6 -7
  71. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskSkeleton.js +48 -0
  72. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +1 -1
  73. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +13 -70
  74. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskButtons.test.js +95 -0
  75. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +78 -208
  76. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskButtons.test.js.snap +212 -0
  77. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +8 -4
  78. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +87 -70
  79. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +13 -14
  80. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +48 -121
  81. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -16
  82. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +57 -28
  83. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +2 -2
  84. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +6 -0
  85. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +2 -18
  86. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +78 -27
  87. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +14 -101
  88. data/webpack/ForemanTasks/Components/TaskDetails/index.js +8 -3
  89. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/ScheduledTasksCard/ScheduledTasksCard.scss +4 -0
  90. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/OtherInfo.js +53 -0
  91. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/OtherInfo.test.js +14 -0
  92. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCard.js +27 -19
  93. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCard.scss +14 -0
  94. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCard.test.js +1 -34
  95. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/{StoppedTasksCardHelper.js → StoppedTasksCardTable.js} +28 -1
  96. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCardTable.test.js +54 -0
  97. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/__snapshots__/OtherInfo.test.js.snap +48 -0
  98. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/__snapshots__/StoppedTasksCard.test.js.snap +60 -1367
  99. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/__snapshots__/StoppedTasksCardTable.test.js.snap +960 -0
  100. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/__snapshots__/TasksCardsGrid.test.js.snap +14 -11
  101. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardConstants.js +2 -0
  102. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardSelectors.js +17 -11
  103. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardSelectors.test.js +26 -14
  104. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/__snapshots__/TasksDashboard.test.js.snap +14 -11
  105. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/__snapshots__/TasksDashboardSelectors.test.js.snap +38 -22
  106. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +1 -0
  107. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +1 -0
  108. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +2 -0
  109. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +24 -7
  110. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +3 -3
  111. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +6 -3
  112. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.scss +0 -10
  113. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +1 -0
  114. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +13 -0
  115. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +1 -0
  116. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
  117. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +1 -0
  118. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +48 -0
  119. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +1 -0
  120. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +39 -7
  121. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
  122. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionNameCellFormatter.test.js.snap +3 -1
  123. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
  124. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
  125. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
  126. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
  127. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionNameCellFormatter.js +6 -1
  128. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
  129. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +39 -31
  130. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +17 -8
  131. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +8 -0
  132. data/webpack/ForemanTasks/Components/common/urlHelpers.js +7 -0
  133. data/webpack/ForemanTasks/ForemanTasksReducers.js +0 -2
  134. data/webpack/__mocks__/foremanReact/common/helpers.js +2 -0
  135. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +10 -0
  136. data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
  137. data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js +5 -0
  138. metadata +27 -17
  139. data/.travis.yml +0 -5
  140. data/app/assets/stylesheets/foreman_tasks/tasks.scss +0 -9
  141. data/script/travis_run_js_tests.sh +0 -7
  142. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -38
  143. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsReducer.test.js +0 -33
  144. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsReducer.test.js.snap +0 -26
  145. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/integration.test.js.snap +0 -122
  146. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +0 -72
  147. data/webpack/__mocks__/foremanReact/redux/API.js +0 -7
@@ -1,12 +1,7 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`TaskDetails - Actions should cancelStep and fail 1`] = `
3
+ exports[`TaskDetails - Actions should cancelStep 1`] = `
4
4
  Array [
5
- Array [
6
- Object {
7
- "type": "TASK_STEP_CANCEL_REQUEST",
8
- },
9
- ],
10
5
  Array [
11
6
  Object {
12
7
  "payload": Object {
@@ -20,115 +15,33 @@ Array [
20
15
  ],
21
16
  Array [
22
17
  Object {
23
- "payload": [Error: Network Error],
24
- "type": "TASK_STEP_CANCEL_FAILURE",
25
- },
26
- ],
27
- Array [
28
- Object {
29
- "payload": Object {
30
- "message": Object {
31
- "message": "Could not cancel step. Error: step-id undefined",
32
- "type": "error",
33
- },
34
- },
35
- "type": "TOASTS_ADD",
18
+ "handleError": [Function],
19
+ "handleSuccess": [Function],
20
+ "key": "TASK_STEP_CANCEL",
21
+ "type": "post-some-type",
22
+ "url": "foreman/foreman_tasks/tasks/task-id/cancel_step?step_id=step-id",
36
23
  },
37
24
  ],
38
25
  ]
39
26
  `;
40
27
 
41
- exports[`TaskDetails - Actions should cancelStep and success 1`] = `
42
- Array [
43
- Array [
44
- Object {
45
- "type": "TASK_STEP_CANCEL_REQUEST",
46
- },
47
- ],
48
- Array [
49
- Object {
50
- "payload": Object {
51
- "message": Object {
52
- "message": "Trying to cancel step step-id",
53
- "type": "info",
54
- },
55
- },
56
- "type": "TOASTS_ADD",
57
- },
58
- ],
59
- Array [
60
- Object {
61
- "type": "TASK_STEP_CANCEL_SUCCESS",
62
- },
63
- ],
64
- Array [
65
- Object {
66
- "payload": Object {
67
- "message": Object {
68
- "message": "step-id {__('Step Canceled')}",
69
- "type": "success",
70
- },
71
- },
72
- "type": "TOASTS_ADD",
73
- },
74
- ],
75
- ]
76
- `;
77
-
78
- exports[`TaskDetails - Actions should fetch-task-details and fail 1`] = `
79
- Array [
80
- Array [
81
- Object {
82
- "type": "FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST",
83
- },
84
- ],
85
- Array [
86
- Object {
87
- "payload": [Error: Network Error],
88
- "type": "FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE",
89
- },
90
- ],
91
- ]
92
- `;
93
-
94
- exports[`TaskDetails - Actions should fetch-task-details and success 1`] = `
28
+ exports[`TaskDetails - Actions should start reload 1`] = `
95
29
  Array [
96
30
  Array [
97
31
  Object {
98
- "type": "FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST",
99
- },
100
- ],
101
- Array [
102
- Object {
103
- "payload": "some-data",
104
- "type": "FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS",
105
- },
106
- ],
107
- Array [
108
- Object {
109
- "payload": Object {
110
- "timeoutId": 7,
111
- },
112
- "type": "FOREMAN_TASK_DETAILS_START_POLLING",
32
+ "handleError": [Function],
33
+ "handleSuccess": [Function],
34
+ "interval": 5000,
35
+ "key": "FOREMAN_TASK_DETAILS",
36
+ "type": "get-some-type",
37
+ "url": "foreman/foreman_tasks/api/tasks/1/details?include_permissions",
113
38
  },
114
39
  ],
115
40
  ]
116
41
  `;
117
42
 
118
- exports[`TaskDetails - Actions should start reload 1`] = `
119
- Object {
120
- "payload": Object {
121
- "timeoutId": 1,
122
- },
123
- "type": "FOREMAN_TASK_DETAILS_START_POLLING",
124
- }
125
- `;
126
-
127
43
  exports[`TaskDetails - Actions should stop reload 1`] = `
128
44
  Object {
129
- "payload": Object {
130
- "timeoutId": 2,
131
- },
132
- "type": "FOREMAN_TASK_DETAILS_STOP_POLLING",
45
+ "type": "stop",
133
46
  }
134
47
  `;
@@ -3,7 +3,6 @@ import { connect } from 'react-redux';
3
3
  import TaskDetails from './TaskDetails';
4
4
  import * as taskDetailsActions from './TaskDetailsActions';
5
5
  import * as taskActions from '../TaskActions';
6
- import reducer from './TaskDetailsReducer';
7
6
  import {
8
7
  selectEndedAt,
9
8
  selectStartAt,
@@ -32,6 +31,10 @@ import {
32
31
  selectParentTask,
33
32
  selectExternalId,
34
33
  selectDynflowEnableConsole,
34
+ selectCanEdit,
35
+ selectStatus,
36
+ selectAPIError,
37
+ selectIsLoading,
35
38
  } from './TaskDetailsSelectors';
36
39
 
37
40
  const mapStateToProps = state => ({
@@ -62,11 +65,13 @@ const mapStateToProps = state => ({
62
65
  parentTask: selectParentTask(state),
63
66
  externalId: selectExternalId(state),
64
67
  dynflowEnableConsole: selectDynflowEnableConsole(state),
68
+ canEdit: selectCanEdit(state),
69
+ status: selectStatus(state),
70
+ APIerror: selectAPIError(state),
71
+ isLoading: selectIsLoading(state),
65
72
  });
66
73
 
67
74
  const mapDispatchToProps = dispatch =>
68
75
  bindActionCreators({ ...taskActions, ...taskDetailsActions }, dispatch);
69
76
 
70
- export const reducers = { taskDetails: reducer };
71
-
72
77
  export default connect(mapStateToProps, mapDispatchToProps)(TaskDetails);
@@ -1,15 +1,19 @@
1
1
  .scheduled-tasks-card {
2
2
  text-align: center;
3
+
3
4
  .scheduled-data {
5
+ margin-top: 30px;
4
6
  padding-right: 15px;
5
7
  cursor: pointer;
6
8
  font-size: 40px;
7
9
  font-weight: 300;
8
10
  transition: font-weight 50ms ease-in;
11
+
9
12
  p {
10
13
  font-size: 20px;
11
14
  margin: 0;
12
15
  }
16
+
13
17
  * {
14
18
  margin: 10px;
15
19
  }
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import classNames from 'classnames';
4
+
5
+ import { Icon, Button, OverlayTrigger, Tooltip } from 'patternfly-react';
6
+ import { translate as __ } from 'foremanReact/common/I18n';
7
+ import {
8
+ TASKS_DASHBOARD_AVAILABLE_QUERY_STATES,
9
+ TASKS_DASHBOARD_AVAILABLE_QUERY_RESULTS,
10
+ } from '../../../../TasksDashboardConstants';
11
+ import { queryPropType } from '../../../../TasksDashboardPropTypes';
12
+
13
+ const tooltip = (
14
+ <Tooltip id="stopped-tooltip">
15
+ {__('Other includes all stopped tasks that are cancelled or pending')}
16
+ </Tooltip>
17
+ );
18
+
19
+ export const OtherInfo = ({ updateQuery, otherCount, query }) => {
20
+ const { OTHER } = TASKS_DASHBOARD_AVAILABLE_QUERY_RESULTS;
21
+ const { STOPPED } = TASKS_DASHBOARD_AVAILABLE_QUERY_STATES;
22
+ const active = query.state === STOPPED && query.result === OTHER;
23
+ return (
24
+ <span className={classNames(active && 'other-active')}>
25
+ <OverlayTrigger
26
+ overlay={tooltip}
27
+ trigger={['hover', 'focus']}
28
+ placement="bottom"
29
+ >
30
+ <span>
31
+ <Icon type="pf" name="info" />
32
+ <span>{__('Other:')} </span>
33
+ </span>
34
+ </OverlayTrigger>
35
+ <Button
36
+ bsStyle="link"
37
+ onClick={() =>
38
+ updateQuery({
39
+ state: STOPPED,
40
+ result: OTHER,
41
+ })
42
+ }
43
+ >
44
+ {otherCount}
45
+ </Button>
46
+ </span>
47
+ );
48
+ };
49
+ OtherInfo.propTypes = {
50
+ updateQuery: PropTypes.func.isRequired,
51
+ otherCount: PropTypes.number.isRequired,
52
+ query: queryPropType.isRequired,
53
+ };
@@ -0,0 +1,14 @@
1
+ import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
+
3
+ import { OtherInfo } from './OtherInfo';
4
+
5
+ const fixtures = {
6
+ render: {
7
+ updateQuery: jest.fn,
8
+ otherCount: 7,
9
+ query: { state: 'STOPPED', result: 'OTHER' },
10
+ },
11
+ };
12
+
13
+ describe('OtherInfo', () =>
14
+ testComponentSnapshotsWithFixtures(OtherInfo, fixtures));
@@ -4,8 +4,8 @@ import { Card } from 'patternfly-react';
4
4
  import classNames from 'classnames';
5
5
  import { noop } from 'foremanReact/common/helpers';
6
6
  import { translate as __ } from 'foremanReact/common/I18n';
7
-
8
- import { StoppedTable } from './StoppedTasksCardHelper';
7
+ import { OtherInfo } from './OtherInfo';
8
+ import { StoppedTable } from './StoppedTasksCardTable';
9
9
  import {
10
10
  timePropType,
11
11
  queryPropType,
@@ -14,7 +14,6 @@ import {
14
14
  TASKS_DASHBOARD_AVAILABLE_TIMES,
15
15
  TASKS_DASHBOARD_AVAILABLE_QUERY_STATES,
16
16
  } from '../../../../TasksDashboardConstants';
17
- import { getQueryValueText } from '../../../../TasksDashboardHelper';
18
17
  import './StoppedTasksCard.scss';
19
18
 
20
19
  const StoppedTasksCard = ({
@@ -44,16 +43,19 @@ const StoppedTasksCard = ({
44
43
  {__('Stopped')}
45
44
  </Card.Title>
46
45
  <Card.Body>
47
- <table className="table table-bordered table-striped stopped-table">
48
- <thead>
49
- <tr>
50
- <th />
51
- <th>{__('Total')}</th>
52
- <th>{getQueryValueText(time)}</th>
53
- </tr>
54
- </thead>
55
- <tbody>{StoppedTable(data, query, time, updateQuery)}</tbody>
56
- </table>
46
+ <React.Fragment>
47
+ <StoppedTable
48
+ data={data.results}
49
+ query={query}
50
+ time={time}
51
+ updateQuery={updateQuery}
52
+ />
53
+ <OtherInfo
54
+ updateQuery={updateQuery}
55
+ otherCount={data.other}
56
+ query={query}
57
+ />
58
+ </React.Fragment>
57
59
  </Card.Body>
58
60
  </Card>
59
61
  );
@@ -66,9 +68,12 @@ const resultPropType = PropTypes.shape({
66
68
 
67
69
  StoppedTasksCard.propTypes = {
68
70
  data: PropTypes.shape({
69
- error: resultPropType.isRequired,
70
- warning: resultPropType.isRequired,
71
- success: resultPropType.isRequired,
71
+ results: PropTypes.shape({
72
+ error: resultPropType.isRequired,
73
+ warning: resultPropType.isRequired,
74
+ success: resultPropType.isRequired,
75
+ }),
76
+ other: PropTypes.number,
72
77
  }),
73
78
  time: timePropType,
74
79
  query: queryPropType,
@@ -78,9 +83,12 @@ StoppedTasksCard.propTypes = {
78
83
 
79
84
  StoppedTasksCard.defaultProps = {
80
85
  data: {
81
- error: { total: 0, last: 0 },
82
- warning: { total: 0, last: 0 },
83
- success: { total: 0, last: 0 },
86
+ results: {
87
+ error: { total: 0, last: 0 },
88
+ warning: { total: 0, last: 0 },
89
+ success: { total: 0, last: 0 },
90
+ },
91
+ other: 0,
84
92
  },
85
93
  time: TASKS_DASHBOARD_AVAILABLE_TIMES.H24,
86
94
  query: {},
@@ -39,4 +39,18 @@
39
39
  }
40
40
  }
41
41
  }
42
+
43
+ .other-active {
44
+ text-decoration: underline;
45
+ }
46
+
47
+ .pficon {
48
+ margin-right: 5px;
49
+ }
50
+
51
+ .btn-link {
52
+ font-size: 14px;
53
+ padding-top: 0;
54
+ padding-bottom: 0;
55
+ }
42
56
  }
@@ -1,48 +1,15 @@
1
1
  import { testComponentSnapshotsWithFixtures } from '@theforeman/test';
2
- import {
3
- TASKS_DASHBOARD_AVAILABLE_TIMES,
4
- TASKS_DASHBOARD_AVAILABLE_QUERY_STATES,
5
- TASKS_DASHBOARD_AVAILABLE_QUERY_MODES,
6
- TASKS_DASHBOARD_AVAILABLE_QUERY_RESULTS,
7
- } from '../../../../TasksDashboardConstants';
2
+ import { TASKS_DASHBOARD_AVAILABLE_QUERY_STATES } from '../../../../TasksDashboardConstants';
8
3
  import StoppedTasksCard from './StoppedTasksCard';
9
4
 
10
5
  const { STOPPED } = TASKS_DASHBOARD_AVAILABLE_QUERY_STATES;
11
- const { LAST } = TASKS_DASHBOARD_AVAILABLE_QUERY_MODES;
12
- const { WEEK } = TASKS_DASHBOARD_AVAILABLE_TIMES;
13
6
 
14
7
  const fixtures = {
15
8
  'render with minimal props': {},
16
- 'render with props': {
17
- data: {
18
- error: { total: 9, last: 1 },
19
- warning: { total: 8, last: 2 },
20
- success: { total: 7, last: 3 },
21
- },
22
- time: WEEK,
23
- },
24
9
  'render selected': {
25
10
  query: { state: STOPPED },
26
11
  },
27
12
  };
28
13
 
29
- Object.values(TASKS_DASHBOARD_AVAILABLE_QUERY_RESULTS).forEach(result => {
30
- fixtures[`render ${result}-total selected`] = {
31
- query: {
32
- state: STOPPED,
33
- result,
34
- },
35
- };
36
- fixtures[`render ${result}-last selected`] = {
37
- time: WEEK,
38
- query: {
39
- state: STOPPED,
40
- result,
41
- mode: LAST,
42
- time: WEEK,
43
- },
44
- };
45
- });
46
-
47
14
  describe('StoppedTasksCard', () =>
48
15
  testComponentSnapshotsWithFixtures(StoppedTasksCard, fixtures));
@@ -1,11 +1,18 @@
1
1
  import React from 'react';
2
+ import PropTypes from 'prop-types';
2
3
  import { capitalize } from 'lodash';
3
4
  import classNames from 'classnames';
4
5
  import { Icon, Button } from 'patternfly-react';
6
+ import { translate as __ } from 'foremanReact/common/I18n';
5
7
  import {
6
8
  TASKS_DASHBOARD_AVAILABLE_QUERY_STATES,
7
9
  TASKS_DASHBOARD_AVAILABLE_QUERY_MODES,
8
10
  } from '../../../../TasksDashboardConstants';
11
+ import { getQueryValueText } from '../../../../TasksDashboardHelper';
12
+ import {
13
+ timePropType,
14
+ queryPropType,
15
+ } from '../../../../TasksDashboardPropTypes';
9
16
 
10
17
  const resultIcons = {
11
18
  error: <Icon type="pf" name="error-circle-o" />,
@@ -13,7 +20,7 @@ const resultIcons = {
13
20
  success: <Icon type="pf" name="ok" />,
14
21
  };
15
22
 
16
- export const StoppedTable = (data, query, time, updateQuery) =>
23
+ const StoppedTableCells = (data, query, time, updateQuery) =>
17
24
  Object.entries(data).map(([result, { total, last }]) => {
18
25
  const { STOPPED } = TASKS_DASHBOARD_AVAILABLE_QUERY_STATES;
19
26
  const { LAST } = TASKS_DASHBOARD_AVAILABLE_QUERY_MODES;
@@ -61,3 +68,23 @@ export const StoppedTable = (data, query, time, updateQuery) =>
61
68
  </tr>
62
69
  );
63
70
  });
71
+
72
+ export const StoppedTable = ({ data, query, time, updateQuery }) => (
73
+ <table className="table table-bordered table-striped stopped-table">
74
+ <thead>
75
+ <tr>
76
+ <th />
77
+ <th>{__('Total')}</th>
78
+ <th>{getQueryValueText(time)}</th>
79
+ </tr>
80
+ </thead>
81
+ <tbody>{StoppedTableCells(data, query, time, updateQuery)}</tbody>
82
+ </table>
83
+ );
84
+
85
+ StoppedTable.propTypes = {
86
+ data: PropTypes.object.isRequired,
87
+ query: queryPropType.isRequired,
88
+ time: timePropType.isRequired,
89
+ updateQuery: PropTypes.func.isRequired,
90
+ };