foreman-tasks 2.0.3 → 3.0.4

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 (121) 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 +50 -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/models/foreman_tasks/recurring_logic.rb +1 -1
  12. data/app/models/foreman_tasks/task.rb +11 -0
  13. data/app/models/foreman_tasks/task/dynflow_task.rb +27 -33
  14. data/app/models/foreman_tasks/task/search.rb +1 -1
  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/layouts/react.html.erb +1 -2
  21. data/app/views/foreman_tasks/recurring_logics/index.html.erb +3 -1
  22. data/app/views/foreman_tasks/tasks/dashboard/_latest_tasks_in_error_warning.html.erb +1 -1
  23. data/app/views/foreman_tasks/tasks/dashboard/_tasks_status.html.erb +1 -1
  24. data/app/views/foreman_tasks/tasks/show.html.erb +1 -6
  25. data/config/routes.rb +2 -1
  26. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +2 -2
  27. data/db/seeds.d/30-notification_blueprints.rb +7 -7
  28. data/db/seeds.d/61-foreman_tasks_bookmarks.rb +1 -1
  29. data/foreman-tasks.gemspec +1 -0
  30. data/lib/foreman_tasks/cleaner.rb +4 -6
  31. data/lib/foreman_tasks/dynflow/configuration.rb +1 -1
  32. data/lib/foreman_tasks/dynflow/persistence.rb +4 -6
  33. data/lib/foreman_tasks/engine.rb +2 -2
  34. data/lib/foreman_tasks/version.rb +1 -1
  35. data/package.json +0 -1
  36. data/test/controllers/api/recurring_logics_controller_test.rb +1 -1
  37. data/test/controllers/api/tasks_controller_test.rb +17 -7
  38. data/test/controllers/tasks_controller_test.rb +6 -6
  39. data/test/core/unit/runner_test.rb +20 -20
  40. data/test/core/unit/task_launcher_test.rb +8 -8
  41. data/test/helpers/foreman_tasks/foreman_tasks_helper_test.rb +7 -7
  42. data/test/helpers/foreman_tasks/tasks_helper_test.rb +3 -3
  43. data/test/lib/actions/middleware/keep_current_request_id_test.rb +3 -3
  44. data/test/support/history_tasks_builder.rb +1 -1
  45. data/test/tasks/generate_task_actions_test.rb +1 -1
  46. data/test/unit/actions/action_with_sub_plans_test.rb +2 -2
  47. data/test/unit/actions/bulk_action_test.rb +6 -6
  48. data/test/unit/actions/proxy_action_test.rb +20 -20
  49. data/test/unit/actions/recurring_action_test.rb +30 -32
  50. data/test/unit/cleaner_test.rb +24 -24
  51. data/test/unit/dashboard_table_filter_test.rb +5 -5
  52. data/test/unit/otp_manager_test.rb +2 -2
  53. data/test/unit/proxy_selector_test.rb +9 -9
  54. data/test/unit/recurring_logic_test.rb +32 -32
  55. data/test/unit/remote_task_test.rb +2 -2
  56. data/test/unit/task_groups_test.rb +4 -4
  57. data/test/unit/task_test.rb +26 -18
  58. data/test/unit/triggering_test.rb +8 -8
  59. data/test/unit/troubleshooting_help_generator_test.rb +6 -6
  60. data/test/unit/ui_notifications_test.rb +11 -11
  61. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +3 -3
  62. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +8 -157
  63. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskButtons.js +168 -0
  64. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +6 -7
  65. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskSkeleton.js +48 -0
  66. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +1 -1
  67. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +12 -70
  68. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskButtons.test.js +95 -0
  69. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +78 -225
  70. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskButtons.test.js.snap +212 -0
  71. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +8 -4
  72. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +87 -70
  73. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +10 -0
  74. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +48 -125
  75. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -16
  76. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +55 -29
  77. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +2 -2
  78. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +6 -0
  79. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +2 -18
  80. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +77 -27
  81. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +14 -101
  82. data/webpack/ForemanTasks/Components/TaskDetails/index.js +6 -3
  83. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/ScheduledTasksCard/ScheduledTasksCard.scss +4 -0
  84. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/OtherInfo.js +53 -0
  85. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/OtherInfo.test.js +14 -0
  86. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCard.js +27 -19
  87. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCard.scss +14 -0
  88. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCard.test.js +1 -34
  89. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/{StoppedTasksCardHelper.js → StoppedTasksCardTable.js} +28 -1
  90. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/StoppedTasksCardTable.test.js +54 -0
  91. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/__snapshots__/OtherInfo.test.js.snap +48 -0
  92. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/__snapshots__/StoppedTasksCard.test.js.snap +60 -1367
  93. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/Components/StoppedTasksCard/__snapshots__/StoppedTasksCardTable.test.js.snap +960 -0
  94. data/webpack/ForemanTasks/Components/TasksDashboard/Components/TasksCardsGrid/__snapshots__/TasksCardsGrid.test.js.snap +14 -11
  95. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardConstants.js +2 -0
  96. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardSelectors.js +17 -11
  97. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardSelectors.test.js +26 -14
  98. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/__snapshots__/TasksDashboard.test.js.snap +14 -11
  99. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/__snapshots__/TasksDashboardSelectors.test.js.snap +38 -22
  100. data/webpack/ForemanTasks/Components/TasksTable/TasksTableHelpers.js +0 -8
  101. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +13 -4
  102. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.scss +0 -10
  103. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +0 -2
  104. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionNameCellFormatter.test.js.snap +3 -1
  105. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionNameCellFormatter.js +6 -1
  106. data/webpack/ForemanTasks/Components/common/urlHelpers.js +7 -0
  107. data/webpack/ForemanTasks/ForemanTasksReducers.js +0 -2
  108. data/webpack/__mocks__/foremanReact/common/helpers.js +2 -0
  109. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +10 -0
  110. data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
  111. data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js +5 -0
  112. metadata +21 -13
  113. data/.travis.yml +0 -7
  114. data/app/assets/stylesheets/foreman_tasks/tasks.scss +0 -9
  115. data/script/travis_run_js_tests.sh +0 -7
  116. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -38
  117. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsReducer.test.js +0 -33
  118. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsReducer.test.js.snap +0 -26
  119. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/integration.test.js.snap +0 -122
  120. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +0 -72
  121. data/webpack/__mocks__/foremanReact/redux/API.js +0 -7
@@ -1,8 +1,8 @@
1
1
  export const minProps = {
2
2
  cancelStep: jest.fn(),
3
+ taskReload: false,
3
4
  taskReloadStop: jest.fn(),
4
5
  taskReloadStart: jest.fn(),
5
- refetchTaskDetails: jest.fn(),
6
- fetchTaskDetails: jest.fn(),
7
6
  taskProgressToggle: jest.fn(),
7
+ status: 'RESOLVED',
8
8
  };
@@ -4,6 +4,12 @@ import TaskDetails from '../TaskDetails';
4
4
  import { minProps } from './TaskDetails.fixtures';
5
5
 
6
6
  const fixtures = {
7
+ 'render with loading Props': { ...minProps, isLoading: true },
8
+ 'render with error Props': {
9
+ ...minProps,
10
+ status: 'ERROR',
11
+ APIerror: { message: 'some-error' },
12
+ },
7
13
  'render with min Props': minProps,
8
14
  };
9
15
 
@@ -3,33 +3,17 @@ import { API } from 'foremanReact/redux/API';
3
3
  import {
4
4
  taskReloadStop,
5
5
  taskReloadStart,
6
- fetchTaskDetails,
7
6
  cancelStep,
8
7
  } from '../TaskDetailsActions';
9
8
 
10
9
  jest.mock('foremanReact/redux/API');
11
10
 
12
- API.get.mockImplementation(async () => ({ data: 'some-data' }));
13
11
  API.post.mockImplementation(async () => ({ data: 'some-data' }));
14
12
 
15
13
  const fixtures = {
16
14
  'should start reload': () => taskReloadStart(1),
17
- 'should stop reload': () => taskReloadStop(2),
18
- 'should fetch-task-details and success': () => fetchTaskDetails(),
19
- 'should cancelStep and success': () => cancelStep('task-id', 'step-id'),
20
-
21
- 'should fetch-task-details and fail': () => {
22
- API.get.mockImplementationOnce(() =>
23
- Promise.reject(new Error('Network Error'))
24
- );
25
- return fetchTaskDetails();
26
- },
27
- 'should cancelStep and fail': () => {
28
- API.post.mockImplementationOnce(() =>
29
- Promise.reject(new Error('Network Error'))
30
- );
31
- return cancelStep('task-id', 'step-id');
32
- },
15
+ 'should stop reload': () => taskReloadStop(),
16
+ 'should cancelStep': () => cancelStep('task-id', 'step-id'),
33
17
  };
34
18
 
35
19
  describe('TaskDetails - Actions', () =>
@@ -1,5 +1,79 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`TaskDetails rendering render with error Props 1`] = `
4
+ <MessageBox
5
+ icontype="error-circle-o"
6
+ key="task-details-error"
7
+ msg="Could not receive data: some-error"
8
+ />
9
+ `;
10
+
11
+ exports[`TaskDetails rendering render with loading Props 1`] = `
12
+ <div
13
+ className="task-details-react well"
14
+ >
15
+ <ForwardRef
16
+ animation={false}
17
+ defaultActiveKey={1}
18
+ id="task-details-tabs"
19
+ >
20
+ <Tab
21
+ eventKey={1}
22
+ title="Task"
23
+ >
24
+ <TaskSkeleton />
25
+ </Tab>
26
+ <Tab
27
+ disabled={true}
28
+ eventKey={2}
29
+ title="Running Steps"
30
+ >
31
+ <RunningSteps
32
+ cancelStep={[MockFunction]}
33
+ id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
34
+ runningSteps={Array []}
35
+ taskReload={false}
36
+ taskReloadStart={[MockFunction]}
37
+ />
38
+ </Tab>
39
+ <Tab
40
+ disabled={true}
41
+ eventKey={3}
42
+ title="Errors"
43
+ >
44
+ <Errors
45
+ executionPlan={Object {}}
46
+ failedSteps={Array []}
47
+ />
48
+ </Tab>
49
+ <Tab
50
+ disabled={true}
51
+ eventKey={4}
52
+ title="Locks"
53
+ >
54
+ <Locks
55
+ locks={Array []}
56
+ />
57
+ </Tab>
58
+ <Tab
59
+ disabled={true}
60
+ eventKey={5}
61
+ title="Raw"
62
+ >
63
+ <Raw
64
+ endedAt=""
65
+ externalId=""
66
+ id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
67
+ input={Array []}
68
+ label=""
69
+ output={Object {}}
70
+ startedAt=""
71
+ />
72
+ </Tab>
73
+ </ForwardRef>
74
+ </div>
75
+ `;
76
+
3
77
  exports[`TaskDetails rendering render with min Props 1`] = `
4
78
  <div
5
79
  className="task-details-react well"
@@ -16,55 +90,31 @@ exports[`TaskDetails rendering render with min Props 1`] = `
16
90
  <Task
17
91
  action=""
18
92
  canEdit={false}
19
- cancelStep={[MockFunction]}
20
93
  cancelTaskRequest={[Function]}
21
94
  cancellable={false}
22
95
  dynflowEnableConsole={false}
23
96
  endedAt=""
24
- error={Array []}
25
- executionPlan={Object {}}
97
+ errors={Array []}
26
98
  externalId=""
27
- failedSteps={Array []}
28
- fetchTaskDetails={
29
- [MockFunction] {
30
- "calls": Array [
31
- Array [
32
- "a15dd820-32f1-4ced-9ab7-c0fab8234c47",
33
- null,
34
- [MockFunction],
35
- ],
36
- ],
37
- "results": Array [
38
- Object {
39
- "type": "return",
40
- "value": undefined,
41
- },
42
- ],
43
- }
44
- }
45
99
  hasSubTasks={false}
46
100
  help=""
47
101
  id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
48
102
  input={Array []}
49
103
  label=""
50
- locks={Array []}
51
104
  output={Object {}}
52
105
  parentTask=""
53
106
  progress={0}
54
- refetchTaskDetails={[MockFunction]}
55
107
  result="error"
56
108
  resumable={false}
57
109
  resumeTaskRequest={[Function]}
58
- runningSteps={Array []}
59
110
  startAt=""
60
111
  startBefore=""
61
112
  startedAt=""
62
113
  state=""
114
+ status="RESOLVED"
63
115
  taskProgressToggle={[Function]}
64
116
  taskReload={false}
65
117
  taskReloadStart={[MockFunction]}
66
- taskReloadStop={[MockFunction]}
67
- timeoutId={null}
68
118
  username=""
69
119
  usernamePath=""
70
120
  />
@@ -77,8 +127,8 @@ exports[`TaskDetails rendering render with min Props 1`] = `
77
127
  cancelStep={[MockFunction]}
78
128
  id="a15dd820-32f1-4ced-9ab7-c0fab8234c47"
79
129
  runningSteps={Array []}
80
- taskProgressToggle={[Function]}
81
130
  taskReload={false}
131
+ taskReloadStart={[MockFunction]}
82
132
  />
83
133
  </Tab>
84
134
  <Tab
@@ -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,
@@ -33,6 +32,9 @@ import {
33
32
  selectExternalId,
34
33
  selectDynflowEnableConsole,
35
34
  selectCanEdit,
35
+ selectStatus,
36
+ selectAPIError,
37
+ selectIsLoading,
36
38
  } from './TaskDetailsSelectors';
37
39
 
38
40
  const mapStateToProps = state => ({
@@ -64,11 +66,12 @@ const mapStateToProps = state => ({
64
66
  externalId: selectExternalId(state),
65
67
  dynflowEnableConsole: selectDynflowEnableConsole(state),
66
68
  canEdit: selectCanEdit(state),
69
+ status: selectStatus(state),
70
+ APIerror: selectAPIError(state),
71
+ isLoading: selectIsLoading(state),
67
72
  });
68
73
 
69
74
  const mapDispatchToProps = dispatch =>
70
75
  bindActionCreators({ ...taskActions, ...taskDetailsActions }, dispatch);
71
76
 
72
- export const reducers = { taskDetails: reducer };
73
-
74
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
+ };