foreman-tasks 4.1.1 → 4.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/foreman_tasks/find_tasks_common.rb +14 -0
  3. data/app/controllers/foreman_tasks/api/tasks_controller.rb +4 -3
  4. data/app/controllers/foreman_tasks/tasks_controller.rb +3 -10
  5. data/app/lib/actions/middleware/load_setting_values.rb +35 -0
  6. data/app/lib/actions/middleware/watch_delegated_proxy_sub_tasks.rb +2 -6
  7. data/app/models/foreman_tasks/task/dynflow_task.rb +8 -3
  8. data/lib/foreman_tasks/engine.rb +1 -0
  9. data/lib/foreman_tasks/tasks/export_tasks.rake +90 -46
  10. data/lib/foreman_tasks/version.rb +1 -1
  11. data/locale/action_names.rb +3 -2
  12. data/locale/en/foreman_tasks.po +60 -27
  13. data/locale/foreman_tasks.pot +180 -132
  14. data/locale/fr/foreman_tasks.po +61 -28
  15. data/locale/ja/foreman_tasks.po +61 -28
  16. data/locale/zh_CN/foreman_tasks.po +61 -28
  17. data/test/controllers/api/tasks_controller_test.rb +26 -0
  18. data/webpack/ForemanTasks/Components/TaskActions/TaskActionHelpers.js +11 -4
  19. data/webpack/ForemanTasks/Components/TaskActions/TaskActionHelpers.test.js +27 -5
  20. data/webpack/ForemanTasks/Components/TasksTable/TasksTable.js +8 -0
  21. data/webpack/ForemanTasks/Components/TasksTable/TasksTableActions.js +6 -1
  22. data/webpack/ForemanTasks/Components/TasksTable/TasksTableHelpers.js +2 -1
  23. data/webpack/ForemanTasks/Components/TasksTable/TasksTablePage.js +22 -11
  24. data/webpack/ForemanTasks/Components/TasksTable/TasksTableReducer.js +17 -16
  25. data/webpack/ForemanTasks/Components/TasksTable/TasksTableSelectors.js +3 -0
  26. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableHelpers.test.js +1 -1
  27. data/webpack/ForemanTasks/Components/TasksTable/__tests__/TasksTableReducer.test.js +3 -1
  28. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTablePage.test.js.snap +12 -2
  29. data/webpack/ForemanTasks/Components/TasksTable/__tests__/__snapshots__/TasksTableReducer.test.js.snap +5 -0
  30. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/__snapshots__/selectionHeaderCellFormatter.test.js.snap +1 -0
  31. data/webpack/ForemanTasks/Components/TasksTable/formatters/__test__/selectionHeaderCellFormatter.test.js +1 -1
  32. data/webpack/ForemanTasks/Components/TasksTable/formatters/selectionHeaderCellFormatter.js +1 -0
  33. data/webpack/ForemanTasks/Components/TasksTable/index.js +2 -0
  34. metadata +4 -5
  35. data/app/services/foreman_tasks/dashboard_table_filter.rb +0 -56
  36. data/test/unit/dashboard_table_filter_test.rb +0 -77
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a995bfa758def81b00f25d1407ad36c4834473c8aab03786b71b54092329168a
4
- data.tar.gz: d1da5ab84d17f85fbf8911b9cfd3fa6fc7d90e2958fe08efefbe20fccd5b2d7c
3
+ metadata.gz: 6602d0bac71ecbcf69cecc38a00ab4ef145832318576aadcda9a1eda9fed543b
4
+ data.tar.gz: 4b04eef7b87ba5542fd89576671e2bcf90d81ebad475adcc797dfc916bc30f1a
5
5
  SHA512:
6
- metadata.gz: 5c977430ad99bf4e9cd92cb7371005d9b79be87d48a689bda6dae3f24a134e334b01583cc11a93186651c8271bd46946c86472ef408606b6e4758add63df20c7
7
- data.tar.gz: '018184c654bee02017f2bd9da163eef278ee4515e39adcef3dc1338cffb381f5c60f986177450537c80ddedae8f61162e4bf55d0bfa6838b3eb554aba5f52522'
6
+ metadata.gz: 96c669db27581e60652ece6e49fe9bfa1db1d1313b0c89a9a8c9124c897d2c73b9bb7ab5db47045a26651cabdb745779cfcdad45375ea606190774b00544bd8e
7
+ data.tar.gz: cb9100d6621dbda92e4c25c5e87df96ee2fefd6de1dc556ce44031ee45732cd545671624a51864e38d8c5a177b302d843f897d98de7f4f7b68d5484c84bdf7f4
@@ -0,0 +1,14 @@
1
+ module ForemanTasks
2
+ module FindTasksCommon
3
+ def search_query
4
+ [current_taxonomy_search, params[:search]].select(&:present?).join(' AND ')
5
+ end
6
+
7
+ def current_taxonomy_search
8
+ conditions = []
9
+ conditions << "organization_id = #{Organization.current.id}" if Organization.current
10
+ conditions << "location_id = #{Location.current.id}" if Location.current
11
+ conditions.empty? ? '' : "(#{conditions.join(' AND ')})"
12
+ end
13
+ end
14
+ end
@@ -1,6 +1,7 @@
1
1
  module ForemanTasks
2
2
  module Api
3
3
  class TasksController < ::Api::V2::BaseController
4
+ include ForemanTasks::FindTasksCommon
4
5
  include ::Foreman::Controller::SmartProxyAuth
5
6
  add_smart_proxy_filters :callback, :features => 'Dynflow'
6
7
 
@@ -191,11 +192,11 @@ module ForemanTasks
191
192
  params[:order] = "#{ordering_params[:sort_by]} #{ordering_params[:sort_order]}"
192
193
  end
193
194
  params[:order] ||= 'started_at DESC'
194
- @tasks = DashboardTableFilter.new(resource_scope_for_index, params).scope.order(params[:order].to_s)
195
+ @tasks = resource_scope_for_index.order(params[:order].to_s)
195
196
  end
196
197
 
197
198
  def search_options
198
- [params[:search], {}]
199
+ [search_query, {}]
199
200
  end
200
201
 
201
202
  def_param_group :callback_target do
@@ -259,7 +260,7 @@ module ForemanTasks
259
260
  raise BadRequest,
260
261
  _('Resource search_params requires resource_type and resource_id to be specified')
261
262
  end
262
- scope.joins(:locks).where(foreman_tasks_locks:
263
+ scope.joins(:links).where(foreman_tasks_links:
263
264
  { resource_type: search_params[:resource_type],
264
265
  resource_id: search_params[:resource_id] })
265
266
  when 'task'
@@ -2,6 +2,7 @@ module ForemanTasks
2
2
  class TasksController < ::ApplicationController
3
3
  include Foreman::Controller::AutoCompleteSearch
4
4
  include Foreman::Controller::CsvResponder
5
+ include ForemanTasks::FindTasksCommon
5
6
 
6
7
  def show
7
8
  @task = resource_base.find(params[:id])
@@ -128,17 +129,9 @@ module ForemanTasks
128
129
  def filter(scope, paginate: true)
129
130
  search = current_taxonomy_search
130
131
  search = [search, params[:search]].select(&:present?).join(' AND ')
131
- scope = DashboardTableFilter.new(scope, params).scope
132
- scope = scope.search_for(search, :order => params[:order])
133
- scope = scope.paginate(:page => params[:page], :per_page => params[:per_page]) if paginate
132
+ scope = scope.search_for(search, order: params[:order])
133
+ scope = scope.paginate(page: params[:page], per_page: params[:per_page]) if paginate
134
134
  scope.distinct
135
135
  end
136
-
137
- def current_taxonomy_search
138
- conditions = []
139
- conditions << "organization_id = #{Organization.current.id}" if Organization.current
140
- conditions << "location_id = #{Location.current.id}" if Location.current
141
- conditions.empty? ? '' : "(#{conditions.join(' AND ')})"
142
- end
143
136
  end
144
137
  end
@@ -0,0 +1,35 @@
1
+ module Actions
2
+ module Middleware
3
+ class LoadSettingValues < ::Dynflow::Middleware
4
+ # ::Actions::Middleware::LoadSettingValues
5
+ #
6
+ # A middleware to ensure we load current setting values
7
+
8
+ def delay(*args)
9
+ reload_setting_values
10
+ pass(*args)
11
+ end
12
+
13
+ def plan(*args)
14
+ reload_setting_values
15
+ pass(*args)
16
+ end
17
+
18
+ def run(*args)
19
+ reload_setting_values
20
+ pass(*args)
21
+ end
22
+
23
+ def finalize(*args)
24
+ reload_setting_values
25
+ pass(*args)
26
+ end
27
+
28
+ private
29
+
30
+ def reload_setting_values
31
+ ::Foreman.settings.load_values
32
+ end
33
+ end
34
+ end
35
+ end
@@ -20,9 +20,7 @@ module Actions
20
20
  private
21
21
 
22
22
  def set_clock
23
- action.world.clock.ping action.send(:suspended_action),
24
- POLL_INTERVAL,
25
- CheckOnProxyActions
23
+ action.plan_event(CheckOnProxyActions, POLL_INTERVAL, optional: true)
26
24
  end
27
25
 
28
26
  def check_triggered
@@ -44,9 +42,7 @@ module Actions
44
42
 
45
43
  def notify(event, tasks)
46
44
  tasks.each do |task|
47
- action.world.event task.execution_plan_id,
48
- task.step_id,
49
- event
45
+ action.plan_event(event, execution_plan_id: task.execution_plan_id, step_id: task.step_id)
50
46
  end
51
47
  end
52
48
 
@@ -140,12 +140,17 @@ module ForemanTasks
140
140
 
141
141
  def main_action
142
142
  return @main_action if defined?(@main_action)
143
+
144
+ @main_action = execution_plan && execution_plan.root_plan_step.try(:action, execution_plan)
143
145
  if active_job?
144
146
  job_data = active_job_data
145
- @main_action = active_job_action(job_data['job_class'], job_data['arguments'])
146
- else
147
- @main_action = execution_plan && execution_plan.root_plan_step.try(:action, execution_plan)
147
+ begin
148
+ @main_action = active_job_action(job_data['job_class'], job_data['arguments'])
149
+ rescue => e
150
+ Foreman::Logging.exception("Failed to load ActiveJob for task #{id}", e, :logger => 'foreman-tasks')
151
+ end
148
152
  end
153
+ @main_action
149
154
  end
150
155
 
151
156
  # The class for ActiveJob jobs in Dynflow, JobWrapper is not expected to
@@ -114,6 +114,7 @@ module ForemanTasks
114
114
  world.middleware.use Actions::Middleware::KeepCurrentUser, :before => ::Dynflow::Middleware::Common::Transaction
115
115
  world.middleware.use Actions::Middleware::KeepCurrentTimezone
116
116
  world.middleware.use Actions::Middleware::KeepCurrentRequestID
117
+ world.middleware.use ::Actions::Middleware::LoadSettingValues if Gem::Version.new(::SETTINGS[:version]) >= Gem::Version.new('2.5')
117
118
  end
118
119
 
119
120
  ::ForemanTasks.dynflow.config.on_init do |world|
@@ -12,7 +12,7 @@ namespace :foreman_tasks do
12
12
 
13
13
  * TASK_SEARCH : scoped search filter (example: 'label = "Actions::Foreman::Host::ImportFacts"')
14
14
  * TASK_FILE : file to export to
15
- * TASK_FORMAT : format to use for the export (either html or csv)
15
+ * TASK_FORMAT : format to use for the export (either html, html-dir or csv)
16
16
  * TASK_DAYS : number of days to go back
17
17
 
18
18
  If TASK_SEARCH is not defined, it defaults to all tasks in the past 7 days and
@@ -185,23 +185,27 @@ namespace :foreman_tasks do
185
185
  end
186
186
 
187
187
  class PageHelper
188
- def self.pagify(template)
189
- pre = <<-HTML
190
- <html>
191
- <head>
192
- <title>Dynflow Console</title>
193
- <script src="jquery.js"></script>
194
- <link rel="stylesheet" type="text/css" href="bootstrap.css">
195
- <link rel="stylesheet" type="text/css" href="application.css">
196
- <script src="bootstrap.js"></script>
197
- <script src="run_prettify.js"></script>
198
- <script src="application.js"></script>
199
- </head>
200
- <body>
201
- #{template}
202
- <body>
203
- </html>
188
+ def self.pagify(io, template = nil)
189
+ io.write <<~HTML
190
+ <html>
191
+ <head>
192
+ <title>Dynflow Console</title>
193
+ <script src="jquery.js"></script>
194
+ <link rel="stylesheet" type="text/css" href="bootstrap.css">
195
+ <link rel="stylesheet" type="text/css" href="application.css">
196
+ <script src="bootstrap.js"></script>
197
+ <script src="run_prettify.js"></script>
198
+ <script src="application.js"></script>
199
+ </head>
200
+ <body>
204
201
  HTML
202
+ if block_given?
203
+ yield io
204
+ else
205
+ io.write template
206
+ end
207
+ ensure
208
+ io.write '</body></html>'
205
209
  end
206
210
 
207
211
  def self.copy_assets(tmp_dir)
@@ -216,13 +220,64 @@ namespace :foreman_tasks do
216
220
  end
217
221
  end
218
222
 
219
- def self.generate_index(tasks)
220
- html = '<div><table class="table">'
221
- tasks.order('started_at desc').all.each do |task|
222
- html << "<tr><td><a href=\"#{task.id}.html\">#{task.label}</a></td><td>#{task.started_at}</td>\
223
- <td>#{task.state}</td><td>#{task.result}</td></tr>"
223
+ def self.generate_with_index(io)
224
+ io.write '<div><table class="table">'
225
+ yield io
226
+ ensure
227
+ io.write '</table></div>'
228
+ end
229
+
230
+ def self.generate_index_entry(io, task)
231
+ io << <<~HTML
232
+ <tr>
233
+ <td><a href=\"#{task.id}.html\">#{task.label}</a></td>
234
+ <td>#{task.started_at}</td>
235
+ <td>#{task.state}</td>
236
+ <td>#{task.result}</td>
237
+ </tr>
238
+ HTML
239
+ end
240
+ end
241
+
242
+ def csv_export(export_filename, tasks)
243
+ CSV.open(export_filename, 'wb') do |csv|
244
+ csv << %w[id state type label result parent_task_id started_at ended_at]
245
+ tasks.find_each do |task|
246
+ csv << [task.id, task.state, task.type, task.label, task.result,
247
+ task.parent_task_id, task.started_at, task.ended_at]
224
248
  end
225
- html << '</table></div>'
249
+ end
250
+ end
251
+
252
+ def html_export(workdir, tasks)
253
+ PageHelper.copy_assets(workdir)
254
+
255
+ renderer = TaskRender.new
256
+ total = tasks.count
257
+ index = File.open(File.join(workdir, 'index.html'), 'w')
258
+
259
+ File.open(File.join(workdir, 'index.html'), 'w') do |index|
260
+ PageHelper.pagify(index) do |io|
261
+ PageHelper.generate_with_index(io) do |index|
262
+ tasks.find_each.each_with_index do |task, count|
263
+ File.open(File.join(workdir, "#{task.id}.html"), 'w') { |file| PageHelper.pagify(file, renderer.render_task(task)) }
264
+ PageHelper.generate_index_entry(index, task)
265
+ puts "#{count + 1}/#{total}"
266
+ end
267
+ end
268
+ end
269
+ end
270
+ end
271
+
272
+ def generate_filename(format)
273
+ base = "/tmp/task-export-#{Time.now.to_i}"
274
+ case format
275
+ when 'html'
276
+ base + '.tar.gz'
277
+ when 'csv'
278
+ base + '.csv'
279
+ when 'html-dir'
280
+ base
226
281
  end
227
282
  end
228
283
 
@@ -239,36 +294,25 @@ namespace :foreman_tasks do
239
294
  end
240
295
 
241
296
  format = ENV['TASK_FORMAT'] || 'html'
242
- export_filename = ENV['TASK_FILE'] || "/tmp/task-export-#{Time.now.to_i}.#{format == 'csv' ? 'csv' : 'tar.gz'}"
297
+ export_filename = ENV['TASK_FILE'] || generate_filename(format)
243
298
 
244
- tasks = ForemanTasks::Task.search_for(filter)
299
+ tasks = ForemanTasks::Task.search_for(filter).order(:started_at => :desc)
245
300
 
246
301
  puts _("Exporting all tasks matching filter #{filter}")
247
302
  puts _("Gathering #{tasks.count} tasks.")
248
- if format == 'html'
303
+ case format
304
+ when 'html'
249
305
  Dir.mktmpdir('task-export') do |tmp_dir|
250
- PageHelper.copy_assets(tmp_dir)
251
-
252
- renderer = TaskRender.new
253
- total = tasks.count
254
-
255
- tasks.find_each.with_index do |task, count|
256
- File.open(File.join(tmp_dir, "#{task.id}.html"), 'w') { |file| file.write(PageHelper.pagify(renderer.render_task(task))) }
257
- puts "#{count + 1}/#{total}"
258
- end
259
-
260
- File.open(File.join(tmp_dir, 'index.html'), 'w') { |file| file.write(PageHelper.pagify(PageHelper.generate_index(tasks))) }
261
-
306
+ html_export(tmp_dir, tasks)
262
307
  system("tar", "czf", export_filename, tmp_dir)
263
308
  end
264
- elsif format == 'csv'
265
- CSV.open(export_filename, 'wb') do |csv|
266
- csv << %w[id state type label result parent_task_id started_at ended_at]
267
- tasks.find_each do |task|
268
- csv << [task.id, task.state, task.type, task.label, task.result,
269
- task.parent_task_id, task.started_at, task.ended_at]
270
- end
271
- end
309
+ when 'html-dir'
310
+ FileUtils.mkdir_p(export_filename)
311
+ html_export(export_filename, tasks)
312
+ when 'csv'
313
+ csv_export(export_filename, tasks)
314
+ else
315
+ raise "Unkonwn export format '#{format}'"
272
316
  end
273
317
 
274
318
  puts "Created #{export_filename}"
@@ -1,3 +1,3 @@
1
1
  module ForemanTasks
2
- VERSION = '4.1.1'.freeze
2
+ VERSION = '4.1.5'.freeze
3
3
  end
@@ -1,5 +1,6 @@
1
1
  # Autogenerated!
2
+ _("Preupgrade job")
2
3
  _("Remote action:")
3
4
  _("Import Puppet classes")
4
- _("Action with sub plans")
5
- _("Import facts")
5
+ _("Import facts")
6
+ _("Action with sub plans")
@@ -74,6 +74,9 @@ msgstr ""
74
74
  msgid "All proxies with the required feature are unavailable at the moment"
75
75
  msgstr ""
76
76
 
77
+ msgid "Allow proxy batch tasks"
78
+ msgstr ""
79
+
77
80
  msgid "Allow triggering tasks on the smart proxy in batches"
78
81
  msgstr ""
79
82
 
@@ -99,15 +102,15 @@ msgstr ""
99
102
  msgid "Cancel Selected"
100
103
  msgstr ""
101
104
 
102
- msgid "Cancel all cancellable tasks"
103
- msgstr ""
104
-
105
105
  msgid "Cancel enforced: the task might be still running on the proxy"
106
106
  msgstr ""
107
107
 
108
108
  msgid "Cancel recurring logic"
109
109
  msgstr ""
110
110
 
111
+ msgid "Cancel selected cancellable tasks"
112
+ msgstr ""
113
+
111
114
  msgid "Cancel selected tasks"
112
115
  msgstr ""
113
116
 
@@ -156,6 +159,9 @@ msgstr ""
156
159
  msgid "Could not cancel step."
157
160
  msgstr ""
158
161
 
162
+ msgid "Could not receive data: ${APIerror && APIerror.message}"
163
+ msgstr ""
164
+
159
165
  msgid "Could not receive data: ${error && error.message}"
160
166
  msgstr ""
161
167
 
@@ -207,6 +213,9 @@ msgstr ""
207
213
  msgid "Enable"
208
214
  msgstr ""
209
215
 
216
+ msgid "Enable dynflow console"
217
+ msgstr ""
218
+
210
219
  msgid "Enable the dynflow console (/foreman_tasks/dynflow) for debugging"
211
220
  msgstr ""
212
221
 
@@ -246,9 +255,6 @@ msgstr ""
246
255
  msgid "Failed to initialize"
247
256
  msgstr ""
248
257
 
249
- msgid "Field to sort the results on"
250
- msgstr ""
251
-
252
258
  msgid "Finished"
253
259
  msgstr ""
254
260
 
@@ -270,12 +276,6 @@ msgstr ""
270
276
  msgid "Fri"
271
277
  msgstr ""
272
278
 
273
- msgid "Hash version of 'order' param"
274
- msgstr ""
275
-
276
- msgid "How to order the sorted results (e.g. ASC for ascending)"
277
- msgstr ""
278
-
279
279
  msgid "ID"
280
280
  msgstr ""
281
281
 
@@ -381,9 +381,6 @@ msgstr ""
381
381
  msgid "Number of attempts to start a task on the smart proxy before failing"
382
382
  msgstr ""
383
383
 
384
- msgid "Number of results per page to return"
385
- msgstr ""
386
-
387
384
  msgid "Number of seconds to wait for synchronous task to finish."
388
385
  msgstr ""
389
386
 
@@ -397,13 +394,16 @@ msgstr ""
397
394
  msgid "Operation"
398
395
  msgstr ""
399
396
 
400
- msgid "Output"
397
+ msgid "Other includes all stopped tasks that are cancelled or pending"
401
398
  msgstr ""
402
399
 
403
- msgid "Output:"
400
+ msgid "Other:"
401
+ msgstr ""
402
+
403
+ msgid "Output"
404
404
  msgstr ""
405
405
 
406
- msgid "Page number, starting at 1"
406
+ msgid "Output:"
407
407
  msgstr ""
408
408
 
409
409
  msgid "Parent task"
@@ -427,9 +427,21 @@ msgstr ""
427
427
  msgid "Polling multiplier which is used to multiply the default polling intervals. This can be used to prevent polling too frequently for long running tasks."
428
428
  msgstr ""
429
429
 
430
+ msgid "Preupgrade job"
431
+ msgstr ""
432
+
433
+ msgid "Proxy action retry count"
434
+ msgstr ""
435
+
436
+ msgid "Proxy action retry interval"
437
+ msgstr ""
438
+
430
439
  msgid "Proxy task gone missing from the smart proxy"
431
440
  msgstr ""
432
441
 
442
+ msgid "Proxy tasks batch size"
443
+ msgstr ""
444
+
433
445
  msgid "Raw"
434
446
  msgstr ""
435
447
 
@@ -448,6 +460,12 @@ msgstr ""
448
460
  msgid "Recurring logics"
449
461
  msgstr ""
450
462
 
463
+ msgid "Refresh Data"
464
+ msgstr ""
465
+
466
+ msgid "Remote action:"
467
+ msgstr ""
468
+
451
469
  msgid "Repeat N times"
452
470
  msgstr ""
453
471
 
@@ -457,13 +475,13 @@ msgstr ""
457
475
  msgid "Repeats"
458
476
  msgstr ""
459
477
 
460
- msgid "Require user to be authenticated as user with admin rights when accessing dynflow console"
478
+ msgid "Require auth for dynflow console"
461
479
  msgstr ""
462
480
 
463
- msgid "Required lock is already taken by other running tasks."
481
+ msgid "Require user to be authenticated as user with admin rights when accessing dynflow console"
464
482
  msgstr ""
465
483
 
466
- msgid "Required lock: %s"
484
+ msgid "Required lock is already taken by other running tasks."
467
485
  msgstr ""
468
486
 
469
487
  msgid "Resource search_params requires resource_type and resource_id to be specified"
@@ -514,9 +532,6 @@ msgstr ""
514
532
  msgid "Search query"
515
533
  msgstr ""
516
534
 
517
- msgid "Search string"
518
- msgstr ""
519
-
520
535
  msgid "See %{link} for more details on how to resolve the issue"
521
536
  msgstr ""
522
537
 
@@ -535,10 +550,10 @@ msgstr ""
535
550
  msgid "Set up recurring execution"
536
551
  msgstr ""
537
552
 
538
- msgid "Show recurring logic details"
553
+ msgid "Setting is off"
539
554
  msgstr ""
540
555
 
541
- msgid "Sort field and order, e.g. 'name DESC'"
556
+ msgid "Show recurring logic details"
542
557
  msgstr ""
543
558
 
544
559
  msgid "Start at"
@@ -559,7 +574,7 @@ msgstr ""
559
574
  msgid "Step Canceled"
560
575
  msgstr ""
561
576
 
562
- msgid "Stop all stoppable tasks"
577
+ msgid "Stop selected stoppable tasks"
563
578
  msgstr ""
564
579
 
565
580
  msgid "Stop specific tasks by ID"
@@ -580,6 +595,9 @@ msgstr ""
580
595
  msgid "Sun"
581
596
  msgstr ""
582
597
 
598
+ msgid "Sync task timeout"
599
+ msgstr ""
600
+
583
601
  msgid "Task"
584
602
  msgstr ""
585
603
 
@@ -610,12 +628,21 @@ msgstr ""
610
628
  msgid "Tasks"
611
629
  msgstr ""
612
630
 
631
+ msgid "Tasks troubleshooting URL"
632
+ msgstr ""
633
+
613
634
  msgid "The ID of the step inside the execution plan to send the event to"
614
635
  msgstr ""
615
636
 
616
637
  msgid "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."
617
638
  msgstr ""
618
639
 
640
+ msgid "The recurring logic was disabled."
641
+ msgstr ""
642
+
643
+ msgid "The recurring logic was enabled."
644
+ msgstr ""
645
+
619
646
  msgid "The smart proxy task %s failed."
620
647
  msgstr ""
621
648
 
@@ -690,6 +717,9 @@ msgstr ""
690
717
  msgid "Yes"
691
718
  msgstr ""
692
719
 
720
+ msgid "You do not have permission"
721
+ msgstr ""
722
+
693
723
  msgid "activation key"
694
724
  msgstr ""
695
725
 
@@ -743,6 +773,9 @@ msgstr ""
743
773
  msgid "organization"
744
774
  msgstr ""
745
775
 
776
+ msgid "other"
777
+ msgstr ""
778
+
746
779
  msgid "paused"
747
780
  msgstr ""
748
781