foreman-tasks 1.0.1 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -12
  3. data/.rubocop_todo.yml +34 -116
  4. data/README.md +2 -0
  5. data/app/controllers/foreman_tasks/api/recurring_logics_controller.rb +20 -1
  6. data/app/controllers/foreman_tasks/api/tasks_controller.rb +65 -10
  7. data/app/controllers/foreman_tasks/concerns/hosts_controller_extension.rb +1 -1
  8. data/app/controllers/foreman_tasks/recurring_logics_controller.rb +19 -0
  9. data/app/controllers/foreman_tasks/tasks_controller.rb +9 -14
  10. data/app/helpers/foreman_tasks/foreman_tasks_helper.rb +1 -3
  11. data/app/lib/actions/helpers/humanizer.rb +1 -3
  12. data/app/lib/actions/proxy_action.rb +33 -12
  13. data/app/lib/foreman_tasks/concerns/polling_action_extensions.rb +12 -0
  14. data/app/models/foreman_tasks/concerns/action_triggering.rb +1 -1
  15. data/app/models/foreman_tasks/recurring_logic.rb +1 -0
  16. data/app/models/foreman_tasks/remote_task.rb +1 -0
  17. data/app/models/foreman_tasks/task.rb +8 -0
  18. data/app/models/foreman_tasks/task/dynflow_task.rb +2 -1
  19. data/app/models/foreman_tasks/task/search.rb +11 -1
  20. data/app/models/setting/foreman_tasks.rb +7 -2
  21. data/app/services/foreman_tasks/troubleshooting_help_generator.rb +0 -4
  22. data/app/services/ui_notifications/tasks/task_bulk_cancel.rb +36 -0
  23. data/app/services/ui_notifications/tasks/task_bulk_resume.rb +38 -0
  24. data/app/services/ui_notifications/tasks/task_bulk_stop.rb +36 -0
  25. data/app/views/foreman_tasks/api/recurring_logics/base.json.rabl +2 -1
  26. data/app/views/foreman_tasks/api/tasks/details.json.rabl +1 -1
  27. data/app/views/foreman_tasks/api/tasks/show.json.rabl +1 -1
  28. data/app/views/foreman_tasks/recurring_logics/index.html.erb +30 -0
  29. data/app/views/foreman_tasks/tasks/show.html.erb +3 -0
  30. data/config/routes.rb +8 -0
  31. data/db/migrate/20200517215015_rename_bookmarks_controller.rb +35 -0
  32. data/db/migrate/20200519093217_drop_dynflow_allow_dangerous_actions_setting.foreman_tasks.rb +5 -0
  33. data/db/migrate/20200611090846_add_task_lock_index_on_resource_type_and_task_id.rb +9 -0
  34. data/db/seeds.d/30-notification_blueprints.rb +21 -0
  35. data/foreman-tasks.gemspec +5 -6
  36. data/gemfile.d/foreman-tasks.rb +1 -0
  37. data/lib/foreman_tasks/dynflow/console_authorizer.rb +2 -2
  38. data/lib/foreman_tasks/engine.rb +17 -19
  39. data/lib/foreman_tasks/tasks/cleanup.rake +1 -1
  40. data/lib/foreman_tasks/tasks/export_tasks.rake +2 -2
  41. data/lib/foreman_tasks/test_extensions.rb +1 -1
  42. data/lib/foreman_tasks/version.rb +1 -1
  43. data/locale/action_names.rb +2 -2
  44. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  45. data/locale/en/foreman_tasks.po +270 -54
  46. data/locale/foreman_tasks.pot +630 -292
  47. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  48. data/locale/fr/foreman_tasks.po +817 -0
  49. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  50. data/locale/ja/foreman_tasks.po +817 -0
  51. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  52. data/locale/zh_CN/foreman_tasks.po +816 -0
  53. data/package.json +1 -2
  54. data/script/rails +2 -2
  55. data/script/travis_run_js_tests.sh +2 -2
  56. data/test/factories/task_factory.rb +34 -2
  57. data/test/foreman_tasks_test_helper.rb +4 -0
  58. data/test/lib/concerns/polling_action_extensions_test.rb +34 -0
  59. data/test/unit/actions/action_with_sub_plans_test.rb +1 -1
  60. data/test/unit/task_test.rb +160 -74
  61. data/webpack/ForemanTasks/Components/TaskActions/TaskAction.test.js +60 -0
  62. data/webpack/ForemanTasks/Components/TaskActions/TaskActionHelpers.js +67 -0
  63. data/webpack/ForemanTasks/Components/TaskActions/TaskActionHelpers.test.js +46 -0
  64. data/webpack/ForemanTasks/Components/TaskActions/TaskActionsConstants.js +16 -0
  65. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.js +60 -0
  66. data/webpack/ForemanTasks/Components/TaskActions/UnlockModals.test.js +14 -0
  67. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/TaskAction.test.js.snap +233 -0
  68. data/webpack/ForemanTasks/Components/TaskActions/__snapshots__/UnlockModals.test.js.snap +25 -0
  69. data/webpack/ForemanTasks/Components/TaskActions/index.js +115 -0
  70. data/webpack/ForemanTasks/Components/TaskDetails/Components/RunningSteps.js +17 -3
  71. data/webpack/ForemanTasks/Components/TaskDetails/Components/Task.js +132 -165
  72. data/webpack/ForemanTasks/Components/TaskDetails/Components/TaskInfo.js +3 -12
  73. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/RunningSteps.test.js +8 -1
  74. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/Task.test.js +68 -3
  75. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/TaskInfo.test.js +0 -1
  76. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/RunningSteps.test.js.snap +1 -1
  77. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/Task.test.js.snap +108 -75
  78. data/webpack/ForemanTasks/Components/TaskDetails/Components/__tests__/__snapshots__/TaskInfo.test.js.snap +3 -9
  79. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetails.js +35 -5
  80. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsActions.js +34 -14
  81. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsConstants.js +3 -4
  82. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsReducer.js +0 -6
  83. data/webpack/ForemanTasks/Components/TaskDetails/TaskDetailsSelectors.js +4 -10
  84. data/webpack/ForemanTasks/Components/TaskDetails/TasksDetailsHelper.js +6 -1
  85. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.fixtures.js +8 -0
  86. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetails.test.js +7 -1
  87. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/TaskDetailsActions.test.js +18 -2
  88. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetails.test.js.snap +30 -13
  89. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/__snapshots__/TaskDetailsActions.test.js.snap +91 -0
  90. data/webpack/ForemanTasks/Components/TaskDetails/__tests__/integration.test.js +13 -4
  91. data/webpack/ForemanTasks/Components/TaskDetails/index.js +6 -8
  92. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardActions.js +1 -1
  93. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardConstants.js +5 -0
  94. data/webpack/ForemanTasks/Components/TasksDashboard/TasksDashboardHelper.js +3 -2
  95. data/webpack/ForemanTasks/Components/TasksDashboard/__tests__/TasksDashboardActions.test.js +2 -2
  96. data/webpack/ForemanTasks/Components/TasksTable/Components/ActionSelectButton.js +14 -1
  97. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModal.js +83 -0
  98. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalActions.js +106 -0
  99. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalReducer.js +38 -0
  100. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/ConfirmModalSelectors.js +45 -0
  101. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModal.test.js +36 -0
  102. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalActions.test.js +205 -0
  103. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalReducer.test.js +27 -0
  104. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/ConfirmModalSelectors.test.js +54 -0
  105. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModal.test.js.snap +41 -0
  106. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalReducer.test.js.snap +19 -0
  107. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/__test__/__snapshots__/ConfirmModalSelectors.test.js.snap +30 -0
  108. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmModal/index.js +29 -0
  109. data/webpack/ForemanTasks/Components/TasksTable/Components/SelectAllAlert.js +43 -0
  110. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ActionSelectButton.test.js +1 -0
  111. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/SelectAllAlert.test.js +29 -0
  112. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ActionSelectButton.test.js.snap +11 -0
  113. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/SelectAllAlert.test.js.snap +75 -0
  114. data/webpack/ForemanTasks/Components/TasksTable/SubTasksPage.js +4 -1
  115. data/webpack/ForemanTasks/Components/TasksTable/TasksBulkActions.js +247 -0
  116. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +37 -19
  117. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +56 -92
  118. data/webpack/ForemanTasks/Components/TasksTable/TasksTableConstants.js +19 -11
  119. data/webpack/ForemanTasks/Components/TasksTable/TasksTableHelpers.js +4 -3
  120. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +64 -73
  121. data/webpack/ForemanTasks/Components/TasksTable/TasksTableReducer.js +21 -2
  122. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSchema.js +2 -2
  123. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +13 -4
  124. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksBulkActions.test.js +147 -0
  125. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTable.fixtures.js +3 -10
  126. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableActions.test.js +46 -74
  127. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableHelpers.test.js +17 -1
  128. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTablePage.test.js +9 -1
  129. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableReducer.test.js +22 -1
  130. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/SubTasksPage.test.js.snap +4 -12
  131. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksBulkActions.test.js.snap +336 -0
  132. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksIndexPage.test.js.snap +3 -12
  133. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableActions.test.js.snap +22 -158
  134. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +56 -132
  135. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableReducer.test.js.snap +34 -0
  136. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionHeaderCellFormatter.test.js +1 -1
  137. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionHeaderCellFormatter.js +2 -2
  138. data/webpack/ForemanTasks/Components/TasksTable/index.js +10 -4
  139. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.js +47 -19
  140. data/webpack/ForemanTasks/Components/common/ActionButtons/ActionButton.test.js +61 -14
  141. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ActionButton.test.js.snap +80 -21
  142. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.scss +9 -0
  143. data/webpack/ForemanTasks/Components/common/ClickConfirmation/ClickConfirmation.test.js +44 -0
  144. data/webpack/ForemanTasks/Components/common/ClickConfirmation/__snapshots__/ClickConfirmation.test.js.snap +52 -0
  145. data/webpack/ForemanTasks/Components/common/ClickConfirmation/index.js +59 -66
  146. data/webpack/ForemanTasks/Components/common/ToastsHelpers/ToastTypesConstants.js +11 -0
  147. data/webpack/ForemanTasks/Components/common/ToastsHelpers/index.js +15 -0
  148. data/webpack/ForemanTasks/ForemanTasksReducers.js +2 -0
  149. data/webpack/ForemanTasks/Routes/ForemanTasksRoutes.test.js +2 -1
  150. data/webpack/__mocks__/foremanReact/components/ForemanModal/ForemanModalHooks.js +2 -2
  151. data/webpack/__mocks__/foremanReact/components/ForemanModal/index.js +17 -3
  152. data/webpack/__mocks__/foremanReact/components/common/ActionButtons/ActionButtons.js +3 -0
  153. data/webpack/__mocks__/foremanReact/{API.js → redux/API.js} +1 -1
  154. metadata +76 -27
  155. data/webpack/ForemanTasks/Components/TasksTable/Components/CancelConfirm.js +0 -53
  156. data/webpack/ForemanTasks/Components/TasksTable/Components/ConfirmationModals.js +0 -56
  157. data/webpack/ForemanTasks/Components/TasksTable/Components/ResumeConfirm.js +0 -52
  158. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/CancelConfirm.test.js +0 -26
  159. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ConfirmationModals.test.js +0 -24
  160. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/ResumeConfirm.test.js +0 -26
  161. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/CancelConfirm.test.js.snap +0 -65
  162. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ConfirmationModals.test.js.snap +0 -30
  163. data/webpack/ForemanTasks/Components/TasksTable/Components/__test__/__snapshots__/ResumeConfirm.test.js.snap +0 -63
  164. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.js +0 -23
  165. data/webpack/ForemanTasks/Components/common/ActionButtons/CancelButton.test.js +0 -26
  166. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.js +0 -23
  167. data/webpack/ForemanTasks/Components/common/ActionButtons/ResumeButton.test.js +0 -27
  168. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/CancelButton.test.js.snap +0 -15
  169. data/webpack/ForemanTasks/Components/common/ActionButtons/__snapshots__/ResumeButton.test.js.snap +0 -15
@@ -4,40 +4,16 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
4
4
  <div
5
5
  className="tasks-table-wrapper"
6
6
  >
7
- <ConfirmationModals
8
- modalProps={
7
+ <Connect(ConfirmModal)
8
+ id="ConfirmModal"
9
+ parentTaskID={null}
10
+ setModalClosed={[MockFunction]}
11
+ uriQuery={
9
12
  Object {
10
- "cancelModal": Object {
11
- "modalOpen": true,
12
- "setModalClosed": [MockFunction],
13
- "setModalOpen": [MockFunction],
14
- },
15
- "cancelSelectedModal": Object {
16
- "modalOpen": true,
17
- "setModalClosed": [MockFunction],
18
- "setModalOpen": [MockFunction],
19
- },
20
- "resumeModal": Object {
21
- "modalOpen": true,
22
- "setModalClosed": [MockFunction],
23
- "setModalOpen": [MockFunction],
24
- },
25
- "resumeSelectedModal": Object {
26
- "modalOpen": true,
27
- "setModalClosed": [MockFunction],
28
- "setModalOpen": [MockFunction],
29
- },
30
- }
31
- }
32
- selectedRowsLen={0}
33
- tasksActions={
34
- Object {
35
- "cancelSelectedTasks": [Function],
36
- "cancelTask": [Function],
37
- "resumeSelectedTasks": [Function],
38
- "resumeTask": [Function],
13
+ "state": "stopped",
39
14
  }
40
15
  }
16
+ url="/foreman_tasks/tasks?action=\\"some-name\\""
41
17
  />
42
18
  <PageLayout
43
19
  beforeToolbarComponent={
@@ -45,7 +21,8 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
45
21
  history={
46
22
  Object {
47
23
  "location": Object {
48
- "search": "",
24
+ "pathname": "/foreman_tasks/tasks",
25
+ "search": "?action=\\"some-name\\"",
49
26
  },
50
27
  }
51
28
  }
@@ -69,6 +46,7 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
69
46
  ],
70
47
  }
71
48
  }
49
+ header="Tasks"
72
50
  onSearch={[Function]}
73
51
  searchProps={
74
52
  Object {
@@ -83,7 +61,7 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
83
61
  "documentationUrl": "4.1.5Searching",
84
62
  "url": "/api/bookmarks",
85
63
  },
86
- "controller": "tasks",
64
+ "controller": "foreman_tasks_tasks",
87
65
  }
88
66
  }
89
67
  searchQuery="a=b"
@@ -91,57 +69,42 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
91
69
  toastNotifications="foreman-tasks-cancel"
92
70
  toolbarButtons={
93
71
  <React.Fragment>
72
+ <Spinner
73
+ className=""
74
+ inline={false}
75
+ inverse={false}
76
+ loading={true}
77
+ size="lg"
78
+ />
94
79
  <ExportButton
95
80
  title="Export All"
96
- url="/foreman_tasks/tasks.csv?include_permissions=true"
81
+ url="/foreman_tasks/tasks.csv?action=%22some-name%22&state=stopped"
97
82
  />
98
83
  <ActionSelectButton
99
84
  disabled={true}
100
- onCancel={[MockFunction]}
101
- onResume={[MockFunction]}
85
+ onCancel={[Function]}
86
+ onForceCancel={[Function]}
87
+ onResume={[Function]}
102
88
  />
103
89
  </React.Fragment>
104
90
  }
105
91
  >
106
92
  <TasksTable
107
93
  actionName=""
108
- actionSelected={[MockFunction]}
109
- cancelTask={[MockFunction]}
94
+ allRowsSelected={false}
110
95
  error={null}
111
96
  getTableItems={[MockFunction]}
112
97
  history={
113
98
  Object {
114
99
  "location": Object {
115
- "search": "",
100
+ "pathname": "/foreman_tasks/tasks",
101
+ "search": "?action=\\"some-name\\"",
116
102
  },
117
103
  }
118
104
  }
119
105
  itemCount={2}
120
- modalProps={
121
- Object {
122
- "cancelModal": Object {
123
- "modalOpen": true,
124
- "setModalClosed": [MockFunction],
125
- "setModalOpen": [MockFunction],
126
- },
127
- "cancelSelectedModal": Object {
128
- "modalOpen": true,
129
- "setModalClosed": [MockFunction],
130
- "setModalOpen": [MockFunction],
131
- },
132
- "resumeModal": Object {
133
- "modalOpen": true,
134
- "setModalClosed": [MockFunction],
135
- "setModalOpen": [MockFunction],
136
- },
137
- "resumeSelectedModal": Object {
138
- "modalOpen": true,
139
- "setModalClosed": [MockFunction],
140
- "setModalOpen": [MockFunction],
141
- },
142
- }
143
- }
144
106
  openClickedModal={[MockFunction]}
107
+ openModal={[Function]}
145
108
  pagination={
146
109
  Object {
147
110
  "page": 1,
@@ -155,8 +118,7 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
155
118
  "b",
156
119
  ]
157
120
  }
158
- resumeTask={[MockFunction]}
159
- selectAllRows={[MockFunction]}
121
+ selectPage={[MockFunction]}
160
122
  selectRow={[MockFunction]}
161
123
  selectedRows={Array []}
162
124
  sort={
@@ -165,7 +127,7 @@ exports[`TasksTablePage rendering render with Breadcrubs 1`] = `
165
127
  "order": "w",
166
128
  }
167
129
  }
168
- status="RESOLVED"
130
+ status="PENDING"
169
131
  unselectAllRows={[MockFunction]}
170
132
  unselectRow={[MockFunction]}
171
133
  />
@@ -177,40 +139,16 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
177
139
  <div
178
140
  className="tasks-table-wrapper"
179
141
  >
180
- <ConfirmationModals
181
- modalProps={
142
+ <Connect(ConfirmModal)
143
+ id="ConfirmModal"
144
+ parentTaskID={null}
145
+ setModalClosed={[MockFunction]}
146
+ uriQuery={
182
147
  Object {
183
- "cancelModal": Object {
184
- "modalOpen": true,
185
- "setModalClosed": [MockFunction],
186
- "setModalOpen": [MockFunction],
187
- },
188
- "cancelSelectedModal": Object {
189
- "modalOpen": true,
190
- "setModalClosed": [MockFunction],
191
- "setModalOpen": [MockFunction],
192
- },
193
- "resumeModal": Object {
194
- "modalOpen": true,
195
- "setModalClosed": [MockFunction],
196
- "setModalOpen": [MockFunction],
197
- },
198
- "resumeSelectedModal": Object {
199
- "modalOpen": true,
200
- "setModalClosed": [MockFunction],
201
- "setModalOpen": [MockFunction],
202
- },
203
- }
204
- }
205
- selectedRowsLen={0}
206
- tasksActions={
207
- Object {
208
- "cancelSelectedTasks": [Function],
209
- "cancelTask": [Function],
210
- "resumeSelectedTasks": [Function],
211
- "resumeTask": [Function],
148
+ "state": "stopped",
212
149
  }
213
150
  }
151
+ url="/foreman_tasks/tasks?action=\\"some-name\\""
214
152
  />
215
153
  <PageLayout
216
154
  beforeToolbarComponent={
@@ -218,13 +156,15 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
218
156
  history={
219
157
  Object {
220
158
  "location": Object {
221
- "search": "",
159
+ "pathname": "/foreman_tasks/tasks",
160
+ "search": "?action=\\"some-name\\"",
222
161
  },
223
162
  }
224
163
  }
225
164
  parentTaskID={null}
226
165
  />
227
166
  }
167
+ header="Tasks"
228
168
  onSearch={[Function]}
229
169
  searchProps={
230
170
  Object {
@@ -239,7 +179,7 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
239
179
  "documentationUrl": "4.1.5Searching",
240
180
  "url": "/api/bookmarks",
241
181
  },
242
- "controller": "tasks",
182
+ "controller": "foreman_tasks_tasks",
243
183
  }
244
184
  }
245
185
  searchQuery="a=b"
@@ -247,57 +187,42 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
247
187
  toastNotifications="foreman-tasks-cancel"
248
188
  toolbarButtons={
249
189
  <React.Fragment>
190
+ <Spinner
191
+ className=""
192
+ inline={false}
193
+ inverse={false}
194
+ loading={true}
195
+ size="lg"
196
+ />
250
197
  <ExportButton
251
198
  title="Export All"
252
- url="/foreman_tasks/tasks.csv?include_permissions=true"
199
+ url="/foreman_tasks/tasks.csv?action=%22some-name%22&state=stopped"
253
200
  />
254
201
  <ActionSelectButton
255
202
  disabled={true}
256
- onCancel={[MockFunction]}
257
- onResume={[MockFunction]}
203
+ onCancel={[Function]}
204
+ onForceCancel={[Function]}
205
+ onResume={[Function]}
258
206
  />
259
207
  </React.Fragment>
260
208
  }
261
209
  >
262
210
  <TasksTable
263
211
  actionName=""
264
- actionSelected={[MockFunction]}
265
- cancelTask={[MockFunction]}
212
+ allRowsSelected={false}
266
213
  error={null}
267
214
  getTableItems={[MockFunction]}
268
215
  history={
269
216
  Object {
270
217
  "location": Object {
271
- "search": "",
218
+ "pathname": "/foreman_tasks/tasks",
219
+ "search": "?action=\\"some-name\\"",
272
220
  },
273
221
  }
274
222
  }
275
223
  itemCount={2}
276
- modalProps={
277
- Object {
278
- "cancelModal": Object {
279
- "modalOpen": true,
280
- "setModalClosed": [MockFunction],
281
- "setModalOpen": [MockFunction],
282
- },
283
- "cancelSelectedModal": Object {
284
- "modalOpen": true,
285
- "setModalClosed": [MockFunction],
286
- "setModalOpen": [MockFunction],
287
- },
288
- "resumeModal": Object {
289
- "modalOpen": true,
290
- "setModalClosed": [MockFunction],
291
- "setModalOpen": [MockFunction],
292
- },
293
- "resumeSelectedModal": Object {
294
- "modalOpen": true,
295
- "setModalClosed": [MockFunction],
296
- "setModalOpen": [MockFunction],
297
- },
298
- }
299
- }
300
224
  openClickedModal={[MockFunction]}
225
+ openModal={[Function]}
301
226
  pagination={
302
227
  Object {
303
228
  "page": 1,
@@ -311,8 +236,7 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
311
236
  "b",
312
237
  ]
313
238
  }
314
- resumeTask={[MockFunction]}
315
- selectAllRows={[MockFunction]}
239
+ selectPage={[MockFunction]}
316
240
  selectRow={[MockFunction]}
317
241
  selectedRows={Array []}
318
242
  sort={
@@ -321,7 +245,7 @@ exports[`TasksTablePage rendering render with minimal props 1`] = `
321
245
  "order": "w",
322
246
  }
323
247
  }
324
- status="RESOLVED"
248
+ status="PENDING"
325
249
  unselectAllRows={[MockFunction]}
326
250
  unselectRow={[MockFunction]}
327
251
  />
@@ -1,5 +1,23 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`TasksTableReducer reducer should handle OPEN_SELECT_ALL 1`] = `
4
+ Object {
5
+ "tasksTableQuery": Object {
6
+ "selectedRows": Array [],
7
+ "showSelectAll": true,
8
+ },
9
+ }
10
+ `;
11
+
12
+ exports[`TasksTableReducer reducer should handle SELECT_ALL_ROWS 1`] = `
13
+ Object {
14
+ "tasksTableQuery": Object {
15
+ "allRowsSelected": true,
16
+ "selectedRows": Array [],
17
+ },
18
+ }
19
+ `;
20
+
3
21
  exports[`TasksTableReducer reducer should handle SELECT_ROWS 1`] = `
4
22
  Object {
5
23
  "tasksTableQuery": Object {
@@ -49,7 +67,9 @@ Object {
49
67
  exports[`TasksTableReducer reducer should handle UNSELECT_ALL_ROWS 1`] = `
50
68
  Object {
51
69
  "tasksTableQuery": Object {
70
+ "allRowsSelected": false,
52
71
  "selectedRows": Array [],
72
+ "showSelectAll": false,
53
73
  },
54
74
  }
55
75
  `;
@@ -62,6 +82,20 @@ Object {
62
82
  }
63
83
  `;
64
84
 
85
+ exports[`TasksTableReducer reducer should handle UNSELECT_ROWS with all rows selected 1`] = `
86
+ Object {
87
+ "tasksTableQuery": Object {
88
+ "allRowsSelected": false,
89
+ "selectedRows": Array [
90
+ 3,
91
+ 4,
92
+ 5,
93
+ ],
94
+ "showSelectAll": false,
95
+ },
96
+ }
97
+ `;
98
+
65
99
  exports[`TasksTableReducer reducer should handle UPDATE_CLICKED 1`] = `
66
100
  Object {
67
101
  "tasksTableQuery": Object {
@@ -4,7 +4,7 @@ describe('selectionHeaderCellFormatter', () => {
4
4
  it('render', () => {
5
5
  expect(
6
6
  selectionHeaderCellFormatter(
7
- { allRowsSelected: () => true },
7
+ { allPageSelected: () => true },
8
8
  'some-label'
9
9
  )
10
10
  ).toMatchSnapshot();
@@ -4,7 +4,7 @@ import TableSelectionHeaderCell from '../Components/TableSelectionHeaderCell';
4
4
  export default (selectionController, label) => (
5
5
  <TableSelectionHeaderCell
6
6
  label={label}
7
- checked={selectionController.allRowsSelected()}
8
- onChange={() => selectionController.selectAllRows()}
7
+ checked={selectionController.allPageSelected()}
8
+ onChange={selectionController.selectPage}
9
9
  />
10
10
  );
@@ -2,7 +2,8 @@ import { connect } from 'react-redux';
2
2
  import { bindActionCreators } from 'redux';
3
3
  import TasksTablePage from './TasksTablePage';
4
4
  import reducer from './TasksTableReducer';
5
- import * as actions from './TasksTableActions';
5
+ import * as tableActions from './TasksTableActions';
6
+ import * as bulkActions from './TasksBulkActions';
6
7
  import {
7
8
  selectStatus,
8
9
  selectError,
@@ -12,7 +13,9 @@ import {
12
13
  selectSort,
13
14
  selectActionName,
14
15
  selectSelectedRows,
15
- selectClicked,
16
+ selectAllRowsSelected,
17
+ selectShowSelectAll,
18
+ selectModalID,
16
19
  } from './TasksTableSelectors';
17
20
 
18
21
  const mapStateToProps = state => ({
@@ -24,10 +27,13 @@ const mapStateToProps = state => ({
24
27
  itemCount: selectItemCount(state),
25
28
  actionName: selectActionName(state),
26
29
  selectedRows: selectSelectedRows(state),
27
- clicked: selectClicked(state),
30
+ allRowsSelected: selectAllRowsSelected(state),
31
+ showSelectAll: selectShowSelectAll(state),
32
+ modalID: selectModalID(state),
28
33
  });
29
34
 
30
- const mapDispatchToProps = dispatch => bindActionCreators(actions, dispatch);
35
+ const mapDispatchToProps = dispatch =>
36
+ bindActionCreators({ ...tableActions, ...bulkActions }, dispatch);
31
37
 
32
38
  export const reducers = { tasksTable: reducer };
33
39
 
@@ -1,27 +1,53 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { CancelButton } from './CancelButton';
4
- import { ResumeButton } from './ResumeButton';
3
+ import { translate as __ } from 'foremanReact/common/I18n';
4
+ import { ActionButtons } from 'foremanReact/components/common/ActionButtons/ActionButtons';
5
5
 
6
- export const ActionButton = ({ id, name, availableActions, taskActions }) => {
7
- const isResume = availableActions.resumable;
8
- if (isResume) {
9
- return (
10
- <ResumeButton
11
- id={id}
12
- name={name}
13
- onClick={taskActions.resumeTask}
14
- disabled={false}
15
- />
16
- );
6
+ export const ActionButton = ({
7
+ id,
8
+ name,
9
+ availableActions: { resumable, cancellable, stoppable },
10
+ taskActions,
11
+ }) => {
12
+ const buttons = [];
13
+ const isTitle = !(resumable || cancellable || stoppable);
14
+ const title = isTitle ? __('Task cannot be canceled') : undefined;
15
+ if (resumable) {
16
+ buttons.push({
17
+ title: __('Resume'),
18
+ action: {
19
+ disabled: !resumable,
20
+ onClick: () => taskActions.resumeTask(id, name),
21
+ id: `task-resume-button-${id}`,
22
+ },
23
+ });
24
+ }
25
+ if (cancellable || (!stoppable && !resumable)) {
26
+ // Cancel is the default button that should be shown if no task action can be done
27
+ buttons.push({
28
+ title: __('Cancel'),
29
+ action: {
30
+ disabled: !cancellable,
31
+ onClick: () => taskActions.cancelTask(id, name),
32
+ id: `task-cancel-button-${id}`,
33
+ },
34
+ });
35
+ }
36
+
37
+ if (stoppable) {
38
+ buttons.push({
39
+ title: __('Force Cancel'),
40
+ action: {
41
+ disabled: !stoppable,
42
+ onClick: () => taskActions.forceCancelTask(id, name),
43
+ id: `task-force-cancel-button-${id}`,
44
+ },
45
+ });
17
46
  }
18
47
  return (
19
- <CancelButton
20
- id={id}
21
- name={name}
22
- disabled={!availableActions.cancellable}
23
- onClick={taskActions.cancelTask}
24
- />
48
+ <span title={title}>
49
+ <ActionButtons buttons={buttons} />
50
+ </span>
25
51
  );
26
52
  };
27
53
 
@@ -31,9 +57,11 @@ ActionButton.propTypes = {
31
57
  availableActions: PropTypes.shape({
32
58
  cancellable: PropTypes.bool,
33
59
  resumable: PropTypes.bool,
60
+ stoppable: PropTypes.bool,
34
61
  }).isRequired,
35
62
  taskActions: PropTypes.shape({
36
63
  cancelTask: PropTypes.func,
37
64
  resumeTask: PropTypes.func,
65
+ forceCancelTask: PropTypes.func,
38
66
  }).isRequired,
39
67
  };