foreman-tasks 1.1.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/js_tests.yml +27 -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/README.md +2 -0
  8. data/app/controllers/foreman_tasks/api/tasks_controller.rb +63 -58
  9. data/app/controllers/foreman_tasks/concerns/parameters/triggering.rb +1 -1
  10. data/app/controllers/foreman_tasks/recurring_logics_controller.rb +7 -0
  11. data/app/controllers/foreman_tasks/tasks_controller.rb +9 -14
  12. data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +3 -3
  13. data/app/lib/actions/proxy_action.rb +1 -1
  14. data/app/models/foreman_tasks/recurring_logic.rb +1 -1
  15. data/app/models/foreman_tasks/task.rb +15 -0
  16. data/app/models/foreman_tasks/task/dynflow_task.rb +29 -33
  17. data/app/models/foreman_tasks/task/status_explicator.rb +1 -1
  18. data/app/models/foreman_tasks/triggering.rb +1 -1
  19. data/app/models/setting/foreman_tasks.rb +2 -2
  20. data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
  21. data/app/views/foreman_tasks/api/tasks/details.json.rabl +0 -1
  22. data/app/views/foreman_tasks/api/tasks/index.json.rabl +2 -0
  23. data/app/views/foreman_tasks/api/tasks/show.json.rabl +2 -0
  24. data/app/views/foreman_tasks/recurring_logics/index.html.erb +3 -1
  25. data/config/routes.rb +3 -1
  26. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
  27. data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
  28. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +1 -1
  29. data/db/seeds.d/30-notification_blueprints.rb +14 -7
  30. data/db/seeds.d/61-foreman_tasks_bookmarks.rb +1 -1
  31. data/lib/foreman_tasks/cleaner.rb +4 -6
  32. data/lib/foreman_tasks/dynflow/configuration.rb +1 -1
  33. data/lib/foreman_tasks/dynflow/persistence.rb +4 -6
  34. data/lib/foreman_tasks/engine.rb +3 -8
  35. data/lib/foreman_tasks/version.rb +1 -1
  36. data/locale/action_names.rb +1 -1
  37. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  38. data/locale/en/foreman_tasks.po +270 -54
  39. data/locale/foreman_tasks.pot +630 -292
  40. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  41. data/locale/fr/foreman_tasks.po +817 -0
  42. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  43. data/locale/ja/foreman_tasks.po +817 -0
  44. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  45. data/locale/zh_CN/foreman_tasks.po +816 -0
  46. data/package.json +1 -1
  47. data/script/npm_link_foreman_js.sh +26 -0
  48. data/test/controllers/api/recurring_logics_controller_test.rb +1 -1
  49. data/test/controllers/api/tasks_controller_test.rb +7 -7
  50. data/test/controllers/tasks_controller_test.rb +6 -6
  51. data/test/core/unit/runner_test.rb +20 -20
  52. data/test/core/unit/task_launcher_test.rb +8 -8
  53. data/test/helpers/foreman_tasks/foreman_tasks_helper_test.rb +7 -7
  54. data/test/helpers/foreman_tasks/tasks_helper_test.rb +3 -3
  55. data/test/lib/actions/middleware/keep_current_request_id_test.rb +3 -3
  56. data/test/support/history_tasks_builder.rb +1 -1
  57. data/test/tasks/generate_task_actions_test.rb +1 -1
  58. data/test/unit/actions/action_with_sub_plans_test.rb +2 -2
  59. data/test/unit/actions/bulk_action_test.rb +6 -6
  60. data/test/unit/actions/proxy_action_test.rb +20 -20
  61. data/test/unit/actions/recurring_action_test.rb +30 -32
  62. data/test/unit/cleaner_test.rb +24 -24
  63. data/test/unit/dashboard_table_filter_test.rb +5 -5
  64. data/test/unit/otp_manager_test.rb +2 -2
  65. data/test/unit/proxy_selector_test.rb +9 -9
  66. data/test/unit/recurring_logic_test.rb +32 -32
  67. data/test/unit/remote_task_test.rb +2 -2
  68. data/test/unit/task_groups_test.rb +4 -4
  69. data/test/unit/task_test.rb +18 -18
  70. data/test/unit/triggering_test.rb +8 -8
  71. data/test/unit/troubleshooting_help_generator_test.rb +6 -6
  72. data/test/unit/ui_notifications_test.rb +11 -11
  73. data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
  74. data/webpack/ForemanTasks/Components/{TasksTable/TasksTableActionHelpers.js → TaskActions/TaskActionHelpers.js} +21 -6
  75. data/webpack/ForemanTasks/Components/{TasksTable/__tests__/TasksTableActionHelpers.test.js → TaskActions/TaskActionHelpers.test.js} +2 -2
  76. data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
  77. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
  78. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
  79. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
  80. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
  81. data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
  82. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
  83. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +38 -205
  84. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskButtons.js +168 -0
  85. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +6 -7
  86. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskSkeleton.js +48 -0
  87. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
  88. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +14 -7
  89. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskButtons.test.js +95 -0
  90. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
  91. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
  92. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +90 -189
  93. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskButtons.test.js.snap +212 -0
  94. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +8 -4
  95. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +100 -53
  96. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.scss +3 -14
  97. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +57 -110
  98. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -17
  99. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +57 -37
  100. data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
  101. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
  102. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +13 -1
  103. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +6 -6
  104. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +86 -19
  105. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +25 -21
  106. data/webpack/ForemanTasks/Components/TaskDetails/index.js +12 -11
  107. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
  108. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
  109. data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
  110. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
  111. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
  112. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
  113. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +46 -0
  114. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
  115. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
  116. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
  117. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +55 -0
  118. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
  119. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
  120. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +32 -0
  121. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
  122. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
  123. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
  124. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +135 -35
  125. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +13 -9
  126. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +26 -66
  127. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +10 -12
  128. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +30 -96
  129. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
  130. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +8 -4
  131. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +50 -2
  132. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -12
  133. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +22 -26
  134. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +2 -1
  135. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +3 -14
  136. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +155 -0
  137. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -14
  138. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +17 -124
  139. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +63 -133
  140. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/actionCellFormatter.test.js.snap +1 -0
  141. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionCellFormatter.test.js.snap +2 -0
  142. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/actionCellFormatter.test.js +1 -1
  143. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionCellFormatter.test.js +1 -1
  144. data/webpack/ForemanTasks/Components/TasksTable/formatters/actionCellFormatter.js +10 -7
  145. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionCellFormatter.js +7 -0
  146. data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -2
  147. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +55 -19
  148. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +75 -19
  149. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +88 -21
  150. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
  151. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
  152. data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
  153. data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
  154. data/webpack/ForemanTasks/Components/common/{ToastTypesConstants.js → ToastsHelpers/ToastTypesConstants.js} +0 -0
  155. data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
  156. data/webpack/ForemanTasks/Components/common/urlHelpers.js +7 -0
  157. data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -2
  158. data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
  159. data/webpack/__mocks__/foremanReact/common/helpers.js +2 -0
  160. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
  161. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
  162. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  163. data/webpack/__mocks__/foremanReact/redux/API/APISelectors.js +10 -0
  164. data/webpack/__mocks__/foremanReact/redux/API/index.js +10 -0
  165. data/webpack/__mocks__/foremanReact/redux/middlewares/IntervalMiddleware.js +5 -0
  166. metadata +51 -28
  167. data/.travis.yml +0 -5
  168. data/script/travis_run_js_tests.sh +0 -7
  169. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -44
  170. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsReducer.test.js +0 -33
  171. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsReducer.test.js.snap +0 -26
  172. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/integration.test.js.snap +0 -122
  173. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +0 -63
  174. data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
  175. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
  176. data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
  177. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
  178. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
  179. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
  180. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
  181. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
  182. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
  183. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
  184. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
  185. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
  186. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
  187. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
  188. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ResumeButton.test.js.snap +0 -15
  189. data/webpack/__mocks__/foremanReact/API.js +0 -7
@@ -0,0 +1,212 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Task rendering render with minimal Props 1`] = `
4
+ <Col
5
+ bsClass="col"
6
+ componentClass="div"
7
+ xs={12}
8
+ >
9
+ <Button
10
+ active={false}
11
+ block={false}
12
+ bsClass="btn"
13
+ bsSize="small"
14
+ bsStyle="default"
15
+ className="reload-button"
16
+ disabled={false}
17
+ onClick={[MockFunction]}
18
+ >
19
+ <span
20
+ className="glyphicon glyphicon-refresh "
21
+ />
22
+ Start auto-reloading
23
+ </Button>
24
+ <Button
25
+ active={false}
26
+ block={false}
27
+ bsClass="btn"
28
+ bsSize="small"
29
+ bsStyle="default"
30
+ className="dynflow-button"
31
+ disabled={true}
32
+ href="/foreman_tasks/dynflow/"
33
+ rel="noopener noreferrer"
34
+ target="_blank"
35
+ >
36
+ <span
37
+ data-original-title="dynflow_enable_console Setting is off"
38
+ title="dynflow_enable_console Setting is off"
39
+ >
40
+ Dynflow console
41
+ </span>
42
+ </Button>
43
+ <Button
44
+ active={false}
45
+ block={false}
46
+ bsClass="btn"
47
+ bsSize="small"
48
+ bsStyle="default"
49
+ className="resume-button"
50
+ data-original-title="You do not have permission"
51
+ disabled={true}
52
+ onClick={[Function]}
53
+ title="You do not have permission"
54
+ >
55
+ Resume
56
+ </Button>
57
+ <Button
58
+ active={false}
59
+ block={false}
60
+ bsClass="btn"
61
+ bsSize="small"
62
+ bsStyle="default"
63
+ className="cancel-button"
64
+ data-original-title="You do not have permission"
65
+ disabled={true}
66
+ onClick={[Function]}
67
+ title="You do not have permission"
68
+ >
69
+ Cancel
70
+ </Button>
71
+ <Button
72
+ active={false}
73
+ block={false}
74
+ bsClass="btn"
75
+ bsSize="small"
76
+ bsStyle="default"
77
+ className="unlock-button"
78
+ data-original-title="You do not have permission"
79
+ disabled={true}
80
+ onClick={[MockFunction]}
81
+ title="You do not have permission"
82
+ >
83
+ Unlock
84
+ </Button>
85
+ <Button
86
+ active={false}
87
+ block={false}
88
+ bsClass="btn"
89
+ bsSize="small"
90
+ bsStyle="default"
91
+ className="force-unlock-button"
92
+ data-original-title="You do not have permission"
93
+ disabled={true}
94
+ onClick={[MockFunction]}
95
+ title="You do not have permission"
96
+ >
97
+ Force Unlock
98
+ </Button>
99
+ </Col>
100
+ `;
101
+
102
+ exports[`Task rendering render with some Props 1`] = `
103
+ <Col
104
+ bsClass="col"
105
+ componentClass="div"
106
+ xs={12}
107
+ >
108
+ <Button
109
+ active={false}
110
+ block={false}
111
+ bsClass="btn"
112
+ bsSize="small"
113
+ bsStyle="default"
114
+ className="reload-button"
115
+ disabled={false}
116
+ onClick={[MockFunction]}
117
+ >
118
+ <span
119
+ className="glyphicon glyphicon-refresh spin"
120
+ />
121
+ Stop auto-reloading
122
+ </Button>
123
+ <Button
124
+ active={false}
125
+ block={false}
126
+ bsClass="btn"
127
+ bsSize="small"
128
+ bsStyle="default"
129
+ className="dynflow-button"
130
+ disabled={false}
131
+ href="/foreman_tasks/dynflow/"
132
+ rel="noopener noreferrer"
133
+ target="_blank"
134
+ >
135
+ <span>
136
+ Dynflow console
137
+ </span>
138
+ </Button>
139
+ <Button
140
+ active={false}
141
+ block={false}
142
+ bsClass="btn"
143
+ bsSize="small"
144
+ bsStyle="default"
145
+ className="resume-button"
146
+ disabled={true}
147
+ onClick={[Function]}
148
+ >
149
+ Resume
150
+ </Button>
151
+ <Button
152
+ active={false}
153
+ block={false}
154
+ bsClass="btn"
155
+ bsSize="small"
156
+ bsStyle="default"
157
+ className="cancel-button"
158
+ disabled={true}
159
+ onClick={[Function]}
160
+ >
161
+ Cancel
162
+ </Button>
163
+ <Button
164
+ active={false}
165
+ block={false}
166
+ bsClass="btn"
167
+ bsSize="small"
168
+ bsStyle="default"
169
+ className="parent-button"
170
+ disabled={false}
171
+ href="/foreman_tasks/tasks/parent-id"
172
+ >
173
+ Parent task
174
+ </Button>
175
+ <Button
176
+ active={false}
177
+ block={false}
178
+ bsClass="btn"
179
+ bsSize="small"
180
+ bsStyle="default"
181
+ className="subtask-button"
182
+ disabled={false}
183
+ href="/foreman_tasks/tasks/test/sub_tasks"
184
+ >
185
+ Sub tasks
186
+ </Button>
187
+ <Button
188
+ active={false}
189
+ block={false}
190
+ bsClass="btn"
191
+ bsSize="small"
192
+ bsStyle="default"
193
+ className="unlock-button"
194
+ disabled={false}
195
+ onClick={[MockFunction]}
196
+ >
197
+ Unlock
198
+ </Button>
199
+ <Button
200
+ active={false}
201
+ block={false}
202
+ bsClass="btn"
203
+ bsSize="small"
204
+ bsStyle="default"
205
+ className="force-unlock-button"
206
+ disabled={false}
207
+ onClick={[MockFunction]}
208
+ >
209
+ Force Unlock
210
+ </Button>
211
+ </Col>
212
+ `;
@@ -290,10 +290,14 @@ exports[`TaskInfo rendering render with Props 1`] = `
290
290
  </b>
291
291
  </span>
292
292
  </p>
293
- <p>
294
- A paused task represents a process that has not finished properly. Any task in paused state can lead to potential inconsistency and needs to be resolved.
295
- The recommended approach is to investigate the error messages below and in 'errors' tab, address the primary cause of the issue and resume the task.
296
- </p>
293
+ <p
294
+ dangerouslySetInnerHTML={
295
+ Object {
296
+ "__html": "A paused task represents a process that has not finished properly. Any task in paused state can lead to potential inconsistency and needs to be resolved.
297
+ The recommended approach is to investigate the error messages below and in 'errors' tab, address the primary cause of the issue and resume the task.",
298
+ }
299
+ }
300
+ />
297
301
  </Col>
298
302
  </Row>
299
303
  </Grid>
@@ -1,82 +1,129 @@
1
- import React, { Component } from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { Tab, Tabs } from 'patternfly-react';
4
4
  import { translate as __ } from 'foremanReact/common/I18n';
5
+ import { STATUS } from 'foremanReact/constants';
6
+ import MessageBox from 'foremanReact/components/common/MessageBox';
5
7
  import Task from './Components/Task';
6
8
  import RunningSteps from './Components/RunningSteps';
7
9
  import Errors from './Components/Errors';
8
10
  import Locks from './Components/Locks';
9
11
  import Raw from './Components/Raw';
10
12
  import { getTaskID } from './TasksDetailsHelper';
13
+ import { TaskSkeleton } from './Components/TaskSkeleton';
11
14
 
12
15
  import './TaskDetails.scss';
13
16
 
14
- class TaskDetails extends Component {
15
- componentDidMount() {
16
- const { timeoutId, refetchTaskDetails, fetchTaskDetails } = this.props;
17
+ const TaskDetails = ({
18
+ executionPlan,
19
+ failedSteps,
20
+ runningSteps,
21
+ locks,
22
+ cancelStep,
23
+ taskReloadStart,
24
+ taskReloadStop,
25
+ APIerror,
26
+ ...props
27
+ }) => {
28
+ const id = getTaskID();
29
+ const { taskReload, status, isLoading } = props;
17
30
 
18
- fetchTaskDetails(getTaskID(), timeoutId, refetchTaskDetails);
19
- }
20
- componentWillUnmount() {
21
- this.props.taskReloadStop(this.props.timeoutId);
22
- }
23
- render() {
24
- const {
25
- externalId,
26
- startedAt,
27
- endedAt,
28
- label,
29
- input,
30
- output,
31
- executionPlan,
32
- failedSteps,
33
- runningSteps,
34
- locks,
35
- } = this.props;
36
- const id = getTaskID();
37
- const resumable = executionPlan ? executionPlan.state === 'paused' : false;
38
- const cancellable = executionPlan ? executionPlan.cancellable : false;
31
+ useEffect(() => {
32
+ taskReloadStart(id);
33
+ return () => {
34
+ taskReloadStop();
35
+ };
36
+ }, [id, taskReloadStart, taskReloadStop]);
37
+
38
+ const taskProgressToggle = () => {
39
+ if (taskReload) {
40
+ taskReloadStop();
41
+ } else {
42
+ taskReloadStart(id);
43
+ }
44
+ };
45
+
46
+ if (status === STATUS.ERROR) {
39
47
  return (
40
- <div className="task-details-react well">
41
- <Tabs defaultActiveKey={1} animation={false} id="task-details-tabs">
42
- <Tab eventKey={1} title={__('Task')}>
43
- <Task {...{ ...this.props, cancellable, resumable, id }} />
44
- </Tab>
45
- <Tab eventKey={2} title={__('Running Steps')}>
46
- <RunningSteps
47
- executionPlan={executionPlan}
48
- runningSteps={runningSteps}
49
- />
50
- </Tab>
51
- <Tab eventKey={3} title={__('Errors')}>
52
- <Errors executionPlan={executionPlan} failedSteps={failedSteps} />
53
- </Tab>
54
- <Tab eventKey={4} title={__('Locks')}>
55
- <Locks locks={locks} />
56
- </Tab>
57
- <Tab eventKey={5} title={__('Raw')}>
58
- <Raw
59
- {...{ id, label, startedAt, endedAt, input, output, externalId }}
60
- />
61
- </Tab>
62
- </Tabs>
63
- </div>
48
+ <MessageBox
49
+ key="task-details-error"
50
+ icontype="error-circle-o"
51
+ msg={__(`Could not receive data: ${APIerror && APIerror.message}`)}
52
+ />
64
53
  );
65
54
  }
66
- }
55
+ const resumable = executionPlan ? executionPlan.state === 'paused' : false;
56
+ const cancellable = executionPlan ? executionPlan.cancellable : false;
57
+ return (
58
+ <div className="task-details-react well">
59
+ <Tabs defaultActiveKey={1} animation={false} id="task-details-tabs">
60
+ <Tab eventKey={1} title={__('Task')}>
61
+ {isLoading ? (
62
+ <TaskSkeleton />
63
+ ) : (
64
+ <Task
65
+ {...{
66
+ ...props,
67
+ cancellable,
68
+ resumable,
69
+ id,
70
+ status,
71
+ taskProgressToggle,
72
+ taskReloadStart,
73
+ }}
74
+ />
75
+ )}
76
+ </Tab>
77
+ <Tab eventKey={2} disabled={isLoading} title={__('Running Steps')}>
78
+ <RunningSteps
79
+ runningSteps={runningSteps}
80
+ id={id}
81
+ cancelStep={cancelStep}
82
+ taskReload={taskReload}
83
+ taskReloadStart={taskReloadStart}
84
+ />
85
+ </Tab>
86
+ <Tab eventKey={3} disabled={isLoading} title={__('Errors')}>
87
+ <Errors executionPlan={executionPlan} failedSteps={failedSteps} />
88
+ </Tab>
89
+ <Tab eventKey={4} disabled={isLoading} title={__('Locks')}>
90
+ <Locks locks={locks} />
91
+ </Tab>
92
+ <Tab eventKey={5} disabled={isLoading} title={__('Raw')}>
93
+ <Raw
94
+ id={id}
95
+ label={props.label}
96
+ startedAt={props.startedAt}
97
+ endedAt={props.endedAt}
98
+ input={props.input}
99
+ output={props.output}
100
+ externalId={props.externalId}
101
+ />
102
+ </Tab>
103
+ </Tabs>
104
+ </div>
105
+ );
106
+ };
67
107
 
68
108
  TaskDetails.propTypes = {
69
109
  label: PropTypes.string,
70
- fetchTaskDetails: PropTypes.func,
110
+ runningSteps: PropTypes.array,
111
+ cancelStep: PropTypes.func.isRequired,
112
+ taskReload: PropTypes.bool.isRequired,
113
+ status: PropTypes.oneOf(Object.keys(STATUS)),
114
+ APIerror: PropTypes.object,
115
+ taskReloadStop: PropTypes.func.isRequired,
116
+ taskReloadStart: PropTypes.func.isRequired,
71
117
  ...Task.propTypes,
72
- ...RunningSteps.propTypes,
73
118
  ...Errors.propTypes,
74
119
  ...Locks.propTypes,
75
120
  ...Raw.propTypes,
76
121
  };
77
122
  TaskDetails.defaultProps = {
78
123
  label: '',
79
- fetchTaskDetails: () => null,
124
+ runningSteps: [],
125
+ APIerror: null,
126
+ status: STATUS.PENDING,
80
127
  ...Task.defaultProps,
81
128
  ...RunningSteps.defaultProps,
82
129
  ...Errors.defaultProps,
@@ -10,20 +10,6 @@
10
10
  .container {
11
11
  margin: 0;
12
12
  }
13
- /*
14
- * This is a manifest file that'll be compiled into application.css, which will include all the files
15
- * listed below.
16
- *
17
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
18
- * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
19
- *
20
- * You're free to add application-wide styles to this file and they'll appear at the top of the
21
- * compiled file, but it's generally better to create a new file per style scope.
22
- *
23
- *= require_self
24
- *= require_tree .
25
- */
26
-
27
13
  .spin {
28
14
  -webkit-animation: spin 1s infinite linear;
29
15
  -moz-animation: spin 1s infinite linear;
@@ -60,4 +46,7 @@
60
46
  transform: rotate(360deg);
61
47
  }
62
48
  }
49
+ .dynflow-button > span {
50
+ pointer-events: auto;
51
+ }
63
52
  }
@@ -1,115 +1,62 @@
1
- import API from 'foremanReact/API';
1
+ import { post, get } from 'foremanReact/redux/API';
2
+ import { addToast } from 'foremanReact/redux/actions/toasts';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
2
4
  import {
3
- showLoading,
4
- hideLoading,
5
- } from 'foremanReact/components/Layout/LayoutActions';
5
+ withInterval,
6
+ stopInterval,
7
+ } from 'foremanReact/redux/middlewares/IntervalMiddleware';
8
+ import { foremanTasksApiPath, foremanTasksPath } from '../common/urlHelpers';
9
+ import { TASK_STEP_CANCEL, FOREMAN_TASK_DETAILS } from './TaskDetailsConstants';
6
10
  import {
7
- FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST,
8
- FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS,
9
- FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE,
10
- FOREMAN_TASK_DETAILS_STOP_POLLING,
11
- FOREMAN_TASK_DETAILS_START_POLLING,
12
- FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL,
13
- FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL,
14
- } from './TaskDetailsConstants';
15
- import {
16
- cancelTaskRequest,
17
- resumeTaskRequest,
18
- } from '../TasksTable/TasksTableActions';
19
-
20
- export const taskReloadStop = timeoutId => {
21
- if (timeoutId) {
22
- clearTimeout(timeoutId);
23
- }
24
- return {
25
- type: FOREMAN_TASK_DETAILS_STOP_POLLING,
26
- payload: { timeoutId },
27
- };
28
- };
29
-
30
- export const taskReloadStart = (
31
- timeoutId,
32
- refetchTaskDetails,
33
- id,
34
- loading = false
35
- ) => {
36
- if (!timeoutId) {
37
- timeoutId = setInterval(() => refetchTaskDetails(id, loading), 5000);
38
- }
39
- return {
40
- type: FOREMAN_TASK_DETAILS_START_POLLING,
41
- payload: { timeoutId },
42
- };
43
- };
44
-
45
- export const refetchTaskDetails = (id, loading) => dispatch => {
46
- if (!loading) {
47
- showLoading();
48
- dispatch(startRequest());
49
- reloadTasksDetails(id, dispatch);
50
- }
51
- };
52
-
53
- const reloadTasksDetails = async (id, dispatch) => {
54
- try {
55
- const { data } = await API.get(`/foreman_tasks/api/tasks/${id}/details`);
56
- dispatch(requestSuccess(data));
57
- } catch (error) {
58
- dispatch(requestFailure(error));
59
- document.location.reload();
60
- } finally {
61
- hideLoading();
62
- }
11
+ errorToastData,
12
+ infoToastData,
13
+ successToastData,
14
+ } from '../common/ToastsHelpers';
15
+
16
+ export const taskReloadStop = () => stopInterval(FOREMAN_TASK_DETAILS);
17
+
18
+ export const taskReloadStart = id => dispatch => {
19
+ dispatch(
20
+ withInterval(
21
+ get({
22
+ key: FOREMAN_TASK_DETAILS,
23
+ url: foremanTasksApiPath(`${id}/details?include_permissions`),
24
+ handleSuccess: ({ data }) => {
25
+ if (data.state === 'stopped') {
26
+ dispatch(stopInterval(FOREMAN_TASK_DETAILS));
27
+ }
28
+ },
29
+ handleError: () => {
30
+ dispatch(stopInterval(FOREMAN_TASK_DETAILS));
31
+ },
32
+ }),
33
+ 5000
34
+ )
35
+ );
63
36
  };
64
37
 
65
- export const fetchTaskDetails = (
66
- id,
67
- timeoutId,
68
- refetchTaskDetailsAction
69
- ) => async dispatch => {
70
- showLoading();
71
- dispatch(startRequest());
72
- await getTasksDetails(id, dispatch, timeoutId, refetchTaskDetailsAction);
38
+ export const cancelStep = (taskId, stepId) => async dispatch => {
39
+ dispatch(addToast(infoToastData(`${__('Trying to cancel step')} ${stepId}`)));
40
+ dispatch(
41
+ post({
42
+ key: TASK_STEP_CANCEL,
43
+ url: foremanTasksPath(`${taskId}/cancel_step?step_id=${stepId}`),
44
+ handleSuccess: () => {
45
+ dispatch(addToast(successToastData(`${stepId} {__('Step Canceled')}`)));
46
+ },
47
+ handleError: error => {
48
+ dispatch(
49
+ addToast(
50
+ errorToastData(
51
+ `${__('Could not cancel step.')} ${__(
52
+ 'Error:'
53
+ )} ${stepId} ${error.response &&
54
+ error.response.data &&
55
+ error.response.data.error}`
56
+ )
57
+ )
58
+ );
59
+ },
60
+ })
61
+ );
73
62
  };
74
-
75
- const getTasksDetails = async (
76
- id,
77
- dispatch,
78
- timeoutId,
79
- refetchTaskDetailsAction
80
- ) => {
81
- try {
82
- const { data } = await API.get(`/foreman_tasks/api/tasks/${id}/details`);
83
- dispatch(requestSuccess(data));
84
- if (data.state !== 'stopped') {
85
- dispatch(taskReloadStart(timeoutId, refetchTaskDetailsAction, id));
86
- }
87
- } catch (error) {
88
- dispatch(requestFailure(error));
89
- } finally {
90
- hideLoading();
91
- }
92
- };
93
-
94
- const startRequest = () => ({
95
- type: FOREMAN_TASK_DETAILS_FETCH_TASK_REQUEST,
96
- });
97
-
98
- const requestSuccess = data => ({
99
- type: FOREMAN_TASK_DETAILS_FETCH_TASK_SUCCESS,
100
- payload: data,
101
- });
102
-
103
- const requestFailure = error => ({
104
- type: FOREMAN_TASK_DETAILS_FETCH_TASK_FAILURE,
105
- payload: error,
106
- });
107
-
108
- export const toggleUnlockModal = () => ({
109
- type: FOREMAN_TASK_DETAILS_TOGGLE_UNLOCK_MODAL,
110
- });
111
- export const toggleForceUnlockModal = () => ({
112
- type: FOREMAN_TASK_DETAILS_TOGGLE_FORCE_UNLOCK_MODAL,
113
- });
114
-
115
- export { cancelTaskRequest, resumeTaskRequest };