rocketjob_mission_control 4.0.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32e9ce8c771b79d9d3f72743515e704b8a176187718b55e3cb09a39dd18a271f
4
- data.tar.gz: 026bf948a56d9f8786fe3399f245029381b1252b089ba2c9570ba5781bae2078
3
+ metadata.gz: e285d14af9fde45c1fec22bc89a89f96b9eb6e59dbb1cbf5baeac2946b9b4a63
4
+ data.tar.gz: fdff6c5fa69deec469be289f340fb4d82f910d8a1a9c819f703edb984e9fb773
5
5
  SHA512:
6
- metadata.gz: f6d1a31e2860ec330ab6d90554c971b45253ab2d12e40bf0af12e2e7ce6d97bc0c5f77db2d756844dc763fd0f1ae750b4e11908f9041864037a60fe4348da37c
7
- data.tar.gz: 9840b6592baa5f9b3be8200e165a72bc804735e7bca3b414f49071212f83276ae2af26d4a4c41f9fee5af44f5e829f28869e48df4138ee69eb857335f52ab300
6
+ metadata.gz: 2b24c8dfebb108b5d91dfe848f80f6b62feda9ff6bfd48d5e6f85a90cffb9d865dd10c071f646e34c25ca1e4962ffc8ea62e05d21c3c1bde441f4bb48fb1b3a2
7
+ data.tar.gz: 06da811e1d6e9da338b948c463754dcced2512aac7177eea184b0a4f328872a9ceec707ccfc37d0f5f83353ab0fab6c469dc950b6ea4469edadaf7dab5098cee
@@ -50,3 +50,23 @@
50
50
  border-radius: 0;
51
51
  }
52
52
  }
53
+
54
+ .input_slices {
55
+ font-size: 14px;
56
+ line-height: 2.0;
57
+ resize: none;
58
+ width: 100%;
59
+ height: 20em;
60
+ padding-top:5px;
61
+ padding-bottom:5px;
62
+ margin-bottom: 4px;
63
+ }
64
+
65
+ .edit_button{
66
+ float: right;
67
+ margin-left: 3px;
68
+ }
69
+
70
+ .edit_input{
71
+ margin-left: 80px;
72
+ }
@@ -14,13 +14,20 @@ module RocketJobMissionControl
14
14
 
15
15
  def current_policy
16
16
  @current_policy ||= begin
17
- args =
17
+ @args =
18
18
  if Config.authorization_callback
19
19
  instance_exec(&Config.authorization_callback)
20
20
  else
21
21
  {roles: %i[admin]}
22
22
  end
23
- AccessPolicy.new(Authorization.new(args))
23
+ AccessPolicy.new(Authorization.new(@args))
24
+ end
25
+ end
26
+
27
+ def login
28
+ @login ||= begin
29
+ args = instance_exec(&Config.authorization_callback)
30
+ args[:login]
24
31
  end
25
32
  end
26
33
 
@@ -133,9 +133,90 @@ module RocketJobMissionControl
133
133
  authorize! :edit, @job
134
134
  end
135
135
 
136
- def exceptions
137
- authorize! :read, @job
138
- @exceptions = @job.input.group_exceptions
136
+ def view_slice
137
+ # Params from RocketJob. Exceptions are grouped by class_name.
138
+ # Scope: [[slice1], [slice2], [slice(n)]
139
+ authorize! :view_slice, @job
140
+ error_type = params[:error_type]
141
+ scope = @job.input.failed.where('exception.class_name' => error_type)
142
+
143
+ # Used by pagination to display the correct slice
144
+ # Offset refers to the slice number from the array "scope".
145
+ @offset = params.fetch(:offset, 0).to_i
146
+ current_failure = scope.order(_id: 1).limit(1).skip(@offset).first
147
+
148
+ # Instance variables to share with the view and pagination.
149
+ @lines = current_failure.records
150
+ @failure_exception = current_failure.try!(:exception)
151
+ @view_slice_pagination = {
152
+ record_number: current_failure['exception']['record_number'],
153
+ offset: @offset,
154
+ total: (scope.count - 1)
155
+ }
156
+ end
157
+
158
+ def edit_slice
159
+ # We need all the instance varaibles from the view_slice (above) to able to
160
+ # Build the form as an array but only display the bad line
161
+ authorize! :edit_slice, @job
162
+ error_type = params[:error_type]
163
+ @line_index = params[:line_index].to_i
164
+ @offset = params.fetch(:offset, 0).to_i
165
+ scope = @job.input.failed.where('exception.class_name' => error_type)
166
+ current_failure = scope.order(_id: 1).limit(1).skip(@offset).first
167
+ @lines = current_failure.records
168
+ @failure_exception = current_failure.try!(:exception)
169
+ end
170
+
171
+ def update_slice
172
+ authorize! :update_slice, @job
173
+
174
+ # Params from the edit_slice form
175
+ error_type = params[:error_type]
176
+ offset = params[:offset]
177
+ updated_records = params['job']['records']
178
+
179
+ # Finds specific slice [Array]
180
+ slice = @job.input.failed.skip(offset).first
181
+
182
+ # Assings modified slice (from the form) back to slice
183
+ slice.records = updated_records
184
+
185
+ if slice.save
186
+ logger.info("Slice Updated By #{login}, job: #{@job.id}, file_name: #{@job.upload_file_name}")
187
+ flash[:success] = 'slice updated'
188
+ redirect_to view_slice_job_path(@job, error_type: error_type)
189
+ else
190
+ flash[:danger] = 'Error updating slice.'
191
+ end
192
+ end
193
+
194
+ def delete_line
195
+ authorize! :edit_slice, @job
196
+
197
+ # Params from the edit_slice form
198
+ error_type = params[:error_type]
199
+ offset = params.fetch(:offset, 0).to_i
200
+ line_index = params[:line_index].to_i
201
+
202
+ # Finds specific slice [Array]
203
+ scope = @job.input.failed.where('exception.class_name' => error_type)
204
+ slice = scope.order(_id: 1).limit(1).skip(offset).first
205
+
206
+ # Finds and deletes line
207
+ value = slice.to_a[line_index]
208
+ slice.to_a.delete(value)
209
+
210
+ # Assings full array back to slice
211
+ slice.records = slice.to_a
212
+
213
+ if slice.save
214
+ logger.info("Line Deleted By #{login}, job: #{@job.id}, file_name: #{@job.upload_file_name}")
215
+ redirect_to view_slice_job_path(@job, error_type: error_type)
216
+ flash[:success] = 'line removed'
217
+ else
218
+ flash[:danger] = 'Error removing line.'
219
+ end
139
220
  end
140
221
 
141
222
  def exception
@@ -199,7 +280,7 @@ module RocketJobMissionControl
199
280
  'Error loading jobs.'
200
281
  end
201
282
 
202
- raise exception if Rails.env.development? || Rails.env.test?
283
+ raise exception if Rails.env.development? || Rails.env.test?
203
284
  redirect_to :back
204
285
  end
205
286
 
@@ -223,10 +304,10 @@ module RocketJobMissionControl
223
304
  def build_table_layout(columns)
224
305
  index = 0
225
306
  columns.collect do |column|
226
- h = { data: index.to_s }
307
+ h = {data: index.to_s}
227
308
  h[:width] = column[:width] if column.key?(:width)
228
309
  h[:orderable] = column[:orderable] if column.key?(:orderable)
229
- index += 1
310
+ index += 1
230
311
  h
231
312
  end
232
313
  end
@@ -43,6 +43,17 @@ module RocketJobMissionControl
43
43
  )
44
44
  end
45
45
 
46
+ def job_action_links_for_show(action, path, http_method=:get)
47
+ link_to(
48
+ action,
49
+ path,
50
+ method: http_method,
51
+ title: "#{action} job",
52
+ class: 'btn btn-primary',
53
+ data: {confirm: t(:confirm, scope: [:job, :action], action: action)}
54
+ )
55
+ end
56
+
46
57
  def job_selected_class(job, selected_job)
47
58
  if selected_job.present? && job.id == selected_job.id
48
59
  'selected'
@@ -12,7 +12,7 @@ module RocketJobMissionControl
12
12
  # View the contents of jobs and edit the data within them.
13
13
  # Including encrypted records.
14
14
  role :editor, {editor: true} do
15
- can %i[read_records update_records], RocketJob::Job
15
+ can %i[view_slice edit_slice update_slice], RocketJob::Job
16
16
  end
17
17
 
18
18
  # Stop, Pause, Resume, Destroy (force stop) Rocket Job Servers
@@ -1,7 +1,7 @@
1
1
  <% if flash.present? %>
2
2
  <div class='flash text-center'>
3
3
  <% flash.each do |key, msg| %>
4
- <div class='alert alert-alert alert-dismissable' role='alert'>
4
+ <div class='alert alert-<%=key%> alert-dismissable' role='alert'>
5
5
  <button class='close' data-dismiss='alert'>
6
6
  <span>&times;</span>
7
7
  </button>
@@ -0,0 +1,35 @@
1
+ <table class='table datatable jobs-datatable' data-source='<%= jobs_url(format: 'json') %>' style='width: 100%'>
2
+ <thead>
3
+ <tr>
4
+ <th>Count</th>
5
+ <th>Exception Class</th>
6
+ <th>Exception Messages</th>
7
+ </tr>
8
+ </thead>
9
+
10
+ <tbody>
11
+ <% @job.input.group_exceptions.each do |exception| %>
12
+ <tr>
13
+ <th><%= exception.count %></th>
14
+ <th><%= link_to(exception.class_name, exception_job_path(@job, error_type: exception.class_name), class: "card callout") %></th>
15
+
16
+ <th>
17
+ <% exception.messages.each do |message| %>
18
+ <div><%= message %></div>
19
+ <% end %>
20
+ </th>
21
+
22
+ <% if can?(:view_slice, @job) %>
23
+ <th>
24
+ <div>
25
+ <%= link_to 'View Slice', view_slice_job_path(@job, error_type: exception.class_name, record_number: @job.input.failed.first["exception"]["record_number"] ), class: 'btn btn-primary' %>
26
+ </div>
27
+ </th>
28
+ <% end %>
29
+
30
+ </tr>
31
+ <% end %>
32
+ </tbody>
33
+ </table>
34
+
35
+
@@ -42,6 +42,14 @@
42
42
 
43
43
  <div class='clearfix'></div>
44
44
 
45
+ <% if job.respond_to?('input') && job.input.failed.count.positive? %>
46
+ <% status.delete('exception') %>
47
+ <div class='status-message'>
48
+ <label><%= 'Exceptions' %>:</label>
49
+ <%= render partial: 'exceptions', locals: {job: @job} %>
50
+ </div>
51
+ <% end %>
52
+
45
53
  <% remaining.each_pair do |key, value| %>
46
54
  <div class='status-message'>
47
55
  <label><%= key.to_s.titleize %>:</label>
@@ -0,0 +1,31 @@
1
+ <%
2
+ previous_offset = [0, pagination[:offset].pred].max
3
+ next_offset = [pagination[:total], pagination[:offset].next].min
4
+ record_number = pagination[:record_number]
5
+ %>
6
+
7
+ <ul class='pagination'>
8
+ <li>
9
+ <%= link_to(view_slice_job_path(error_type: error_type, offset: 0, record_number: record_number), class: "btn btn-default #{page_nav_disabled_class(pagination[:offset], 0)}", title: 'First') do %>
10
+ <i class='fas fa-angle-double-left'></i>
11
+ <% end %>
12
+ </li>
13
+
14
+ <li>
15
+ <%= link_to(view_slice_job_path(error_type: error_type, offset: previous_offset, record_number: record_number), class: "btn btn-default #{page_nav_disabled_class(pagination[:offset], 0)}", title: 'Previous') do %>
16
+ <i class='fas fa-angle-left'></i>
17
+ <% end %>
18
+ </li>
19
+
20
+ <li>
21
+ <%= link_to(view_slice_job_path(error_type: error_type, offset: next_offset, record_number: record_number), class: "btn btn-default #{page_nav_disabled_class(pagination[:offset], pagination[:total])}", title: 'Next') do %>
22
+ <i class='fas fa-angle-right'></i>
23
+ <% end %>
24
+ </li>
25
+
26
+ <li>
27
+ <%= link_to(view_slice_job_path(error_type: error_type, offset: pagination[:total], record_number: record_number), class: "btn btn-default #{page_nav_disabled_class(pagination[:offset], pagination[:total])}", title: 'Last') do %>
28
+ <i class='fas fa-angle-double-right'></i>
29
+ <% end %>
30
+ </li>
31
+ </ul>
@@ -0,0 +1,24 @@
1
+ <div class='edit_input'>
2
+ <div class='col-md-10'>
3
+ <% valid_events = @job.aasm.events.collect { |e| e.name } %>
4
+ <br>
5
+ <br>
6
+ <%= form_for(:job, url: update_slice_job_path(@job, offset: @offset, error_type: @failure_exception.class_name), method: :patch) do |f| %>
7
+ <% @lines.each_with_index do |line, index| %>
8
+ <% if @line_index == index %>
9
+ <%= f.text_area :records, :value => line, class: 'input_slices', id: index, multiple: true %>
10
+ <% else %>
11
+ <%= f.hidden_field :records, :value => line, class: 'input_slices', id: index, multiple: true %>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <div id='submit'>
16
+ <%= f.submit 'Save', class: 'btn btn-primary' %>
17
+ <%= link_to 'Delete', delete_line_job_path(@job, offset: @offset, error_type: @failure_exception.class_name, line_index: @line_index), :data => {:confirm => 'Are you sure?'}, method: :patch, class: 'btn btn-danger' %>
18
+ <%= link_to 'Cancel', view_slice_job_path(@job, error_type: @failure_exception.class_name, record_number: @job.input.failed.first["exception"]["record_number"]), class: 'btn btn-default' %>
19
+ <% end %>
20
+
21
+ </div>
22
+ </div>
23
+ </div>
24
+
@@ -16,55 +16,48 @@
16
16
  <% end %>
17
17
 
18
18
  <div class='btn-toolbar job-actions pull-right'>
19
- <% if @job.respond_to?(:input) && @job.input.failed.count > 0 %>
20
- <div class='btn-group'>
21
- <%= link_to('Show Exceptions', exceptions_job_path(@job), class: 'btn btn-default') %>
22
- </div>
23
- <% end %>
24
19
 
25
- <% if @job.scheduled? && can?(:run_now, @job)%>
20
+ <% if @job.scheduled? && can?(:run_now, @job) %>
26
21
  <div class='btn-group'>
27
- <%= job_action_link('Run', rocket_job_mission_control.run_now_job_path(@job), :patch) %>
22
+ <%= job_action_links_for_show('Run', rocket_job_mission_control.run_now_job_path(@job), :patch) %>
28
23
  </div>
29
24
  <% end %>
30
25
 
31
- <div class='btn-group'>
26
+ <div class='left-margin'>
32
27
  <% valid_events = @job.aasm.events.collect { |e| e.name } %>
33
28
 
34
- <% if valid_events.include?(:pause) && @job.pausable? && can?(:pause, @job)%>
35
- <%= job_action_link('Pause', rocket_job_mission_control.pause_job_path(@job), :patch) %>
29
+ <% if valid_events.include?(:pause) && @job.pausable? && can?(:pause, @job) %>
30
+ <%= job_action_links_for_show('Pause', rocket_job_mission_control.pause_job_path(@job), :patch) %>
36
31
  <% end %>
37
32
 
38
- <% if valid_events.include?(:resume) && can?(:resume, @job)%>
39
- <%= job_action_link('Resume', rocket_job_mission_control.resume_job_path(@job), :patch) %>
33
+ <% if valid_events.include?(:resume) && can?(:resume, @job) %>
34
+ <%= job_action_links_for_show('Resume', rocket_job_mission_control.resume_job_path(@job), :patch) %>
40
35
  <% end %>
41
36
 
42
- <% if valid_events.include?(:retry) && can?(:retry, @job)%>
43
- <%= job_action_link('Retry', rocket_job_mission_control.retry_job_path(@job), :patch) %>
37
+ <% if valid_events.include?(:retry) && can?(:retry, @job) %>
38
+ <%= job_action_links_for_show('Retry', rocket_job_mission_control.retry_job_path(@job), :patch) %>
44
39
  <% end %>
45
- </div>
46
40
 
47
- <div class='btn-group'>
48
- <% if valid_events.include?(:fail) && can?(:fail, @job)%>
49
- <%= job_action_link('Fail', rocket_job_mission_control.fail_job_path(@job), :patch) %>
41
+ <% if valid_events.include?(:fail) && can?(:fail, @job) %>
42
+ <%= job_action_links_for_show('Fail', rocket_job_mission_control.fail_job_path(@job), :patch) %>
50
43
  <% end %>
51
44
 
52
45
  <% if valid_events.include?(:abort) && can?(:abort, @job) %>
53
- <%= job_action_link('Abort', rocket_job_mission_control.abort_job_path(@job), :patch) %>
46
+ <%= job_action_links_for_show('Abort', rocket_job_mission_control.abort_job_path(@job), :patch) %>
54
47
  <% end %>
55
48
 
56
- <% if can?(:destroy, @job)%>
57
- <%= job_action_link('Destroy', rocket_job_mission_control.job_path(@job), :delete) %>
49
+ <% if can?(:destroy, @job) %>
50
+ <%= job_action_links_for_show('Destroy', rocket_job_mission_control.job_path(@job), :delete) %>
58
51
  <% end %>
59
- </div>
60
52
 
61
- <% unless @job.completed? || @job.aborted? %>
62
- <div class='btn-group'>
63
- <% if can?(:edit, @job)%>
64
- <%= link_to 'Edit', edit_job_path(@job), class: 'btn btn-default' %>
65
- <% end %>
66
- </div>
67
- <% end %>
53
+ <% unless @job.completed? || @job.aborted? %>
54
+ <div class='btn-group'>
55
+ <% if can?(:edit, @job) %>
56
+ <%= link_to 'Edit', edit_job_path(@job), class: 'btn btn-primary' %>
57
+ <% end %>
58
+ </div>
59
+ <% end %>
60
+ </div>
68
61
  </div>
69
62
  </div>
70
63
  </div>
@@ -72,6 +65,6 @@
72
65
 
73
66
  <div class='row'>
74
67
  <div class='col-md-12'>
75
- <%= render partial: 'status', locals: { job: @job } %>
68
+ <%= render partial: 'status', locals: {job: @job} %>
76
69
  </div>
77
70
  </div>
@@ -0,0 +1,47 @@
1
+ <div class='edit_input'>
2
+ <div class='col-md-10'>
3
+ <div class='job-status'>
4
+ <div class='failures'>
5
+ <div class='lead'><%= link_to(@job.class, job_path(@job)) %>: <%= @failure_exception.class_name %></div>
6
+
7
+ <div class='pagination-buttons pull-right'>
8
+ <%= render partial: 'view_slice_pagination', locals: {error_type: @failure_exception.class_name, pagination: @view_slice_pagination} %>
9
+ </div>
10
+
11
+ <div class='clearfix'></div>
12
+
13
+ <div class='message'>
14
+ <pre><code><%= @failure_exception.message %></code></pre>
15
+ </div>
16
+
17
+ </div>
18
+ </div>
19
+
20
+ <% @lines.each_with_index do |line, index| %>
21
+ <% if index + 1 == @view_slice_pagination[:record_number] %>
22
+ <% if flash[:success] %>
23
+ <%= render partial: 'layouts/rocket_job_mission_control/partials/flash' %>
24
+ <br>
25
+ <% end %>
26
+ <div class='message' tabindex="<%= index + 1 %>" id="<%= index + 1 %>">
27
+ <pre><span>Line: <%= index + 1 %></span><br><br><code><%= line %></code><br><br>
28
+ <% if can?(:edit_slice, @job) %><div class='edit_button'><%= link_to "Edit", edit_slice_job_path(@job, offset: @offset, error_type: @failure_exception.class_name, line_index: index), class: 'btn btn-primary' %></div><% end %><div class='edit_button'> <%= link_to "Back", job_path(@job), class: 'btn btn-warning' %></div>
29
+ </pre>
30
+ </div>
31
+ <% else %>
32
+ <div class='message' tabindex="<%= index + 1 %>" id="<%= index + 1 %>">
33
+ <pre><span>Line: <%= index + 1 %></span><br><br><code><%= line %></code><br><br>
34
+ <% if can?(:edit_slice, @job) %><div class='edit_button'><%= link_to "Edit", edit_slice_job_path(@job, offset: @offset, error_type: @failure_exception.class_name, line_index: index), class: 'btn btn-primary' %></div><% end %>
35
+ </pre>
36
+ </div>
37
+ <% end %>
38
+ <% end %>
39
+
40
+ </div>
41
+ </div>
42
+
43
+ <script>
44
+ $(document).ready(function () {
45
+ document.getElementById(<%= @view_slice_pagination[:record_number] %>).focus();
46
+ });
47
+ </script>
data/config/routes.rb CHANGED
@@ -19,8 +19,12 @@ RocketJobMissionControl::Engine.routes.draw do
19
19
  patch :resume
20
20
  patch :retry
21
21
  patch :run_now
22
- get :exceptions
23
- get :exception
22
+ patch :delete_line
23
+ patch :update_slice
24
+ get :exceptions
25
+ get :exception
26
+ get :view_slice
27
+ get :edit_slice
24
28
  end
25
29
  end
26
30
 
@@ -1,3 +1,3 @@
1
1
  module RocketJobMissionControl
2
- VERSION = '4.0.0'
2
+ VERSION = '4.1.0'.freeze
3
3
  end
@@ -430,6 +430,33 @@ module RocketJobMissionControl
430
430
  end
431
431
  end
432
432
  end
433
+
434
+ [:view_slice, :edit_slice].each do |method|
435
+ describe "with a failed slice" do
436
+ it "access ##{method}" do
437
+ params = {:error_type => "ArgumentError", "record_number" => "9", "id" => failed_job.id}
438
+ params = {params: params} if Rails.version.to_i >= 5
439
+ get method, params
440
+ assert_response :success
441
+ end
442
+ end
443
+ end
444
+
445
+ describe "#update slice" do
446
+ before do
447
+ params = { "job" => { "records" => [ "1", "2", "3"] }, "error_type" => "CSV::MalformedCSVError", "offset" => "1", "id" => failed_job.id.to_s }
448
+ params = {params: params} if Rails.version.to_i >= 5
449
+ post :update_slice, params
450
+ end
451
+
452
+ it 'redirects' do
453
+ assert_redirected_to view_slice_job_path(failed_job, error_type: "CSV::MalformedCSVError")
454
+ end
455
+
456
+ it 'adds a flash success message' do
457
+ assert_equal 'slice updated', flash[:success]
458
+ end
459
+ end
433
460
  end
434
461
 
435
462
  def set_role(r)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocketjob_mission_control
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Cloutier
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2018-11-19 00:00:00.000000000 Z
14
+ date: 2019-02-08 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rails
@@ -33,14 +33,14 @@ dependencies:
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: 4.0.0
36
+ version: '4.0'
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: 4.0.0
43
+ version: '4.0'
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: jquery-rails
46
46
  requirement: !ruby/object:Gem::Requirement
@@ -185,14 +185,17 @@ files:
185
185
  - app/views/rocket_job_mission_control/dirmon_entries/index.html.erb
186
186
  - app/views/rocket_job_mission_control/dirmon_entries/new.html.erb
187
187
  - app/views/rocket_job_mission_control/dirmon_entries/show.html.erb
188
+ - app/views/rocket_job_mission_control/jobs/_exceptions.html.erb
188
189
  - app/views/rocket_job_mission_control/jobs/_pagination.html.erb
189
190
  - app/views/rocket_job_mission_control/jobs/_sidebar.html.erb
190
191
  - app/views/rocket_job_mission_control/jobs/_status.html.erb
192
+ - app/views/rocket_job_mission_control/jobs/_view_slice_pagination.html.erb
191
193
  - app/views/rocket_job_mission_control/jobs/edit.html.erb
194
+ - app/views/rocket_job_mission_control/jobs/edit_slice.html.erb
192
195
  - app/views/rocket_job_mission_control/jobs/exception.html.erb
193
- - app/views/rocket_job_mission_control/jobs/exceptions.html.erb
194
196
  - app/views/rocket_job_mission_control/jobs/index.html.erb
195
197
  - app/views/rocket_job_mission_control/jobs/show.html.erb
198
+ - app/views/rocket_job_mission_control/jobs/view_slice.html.erb
196
199
  - app/views/rocket_job_mission_control/servers/_sidebar.html.erb
197
200
  - app/views/rocket_job_mission_control/servers/index.html.erb
198
201
  - config/initializers/assets.rb
@@ -240,8 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
243
  - !ruby/object:Gem::Version
241
244
  version: '0'
242
245
  requirements: []
243
- rubyforge_project:
244
- rubygems_version: 2.7.7
246
+ rubygems_version: 3.0.2
245
247
  signing_key:
246
248
  specification_version: 4
247
249
  summary: Ruby's missing batch system.
@@ -1,42 +0,0 @@
1
- <div class='job-list'>
2
- <div class='list'>
3
- <div class='row'>
4
- <div class='col-sm-10'>
5
- <h2>Exceptions for <%= @job.class.name %></h2>
6
- <%= link_to(@job.class.name, job_path(@job)) %>
7
- <%= h(@job.description) %>
8
- </div>
9
-
10
- <div class='col-sm-2'>
11
- <div class='btn btn-default pull-right dt-reload' data-behavior='reload'>
12
- <i class='fas fa-sync'></i>
13
- </div>
14
- </div>
15
- </div>
16
-
17
- <table class='table datatable jobs-datatable' data-source='<%= jobs_url(format: 'json') %>' style='width: 100%'>
18
- <thead>
19
- <tr>
20
- <th>Count</th>
21
- <th>Exception Class</th>
22
- <th>Exception Messages</th>
23
- </tr>
24
- </thead>
25
-
26
- <tbody>
27
- <% @exceptions.each do |exception| %>
28
- <tr>
29
- <th><%= exception.count %></th>
30
- <th><%= link_to(exception.class_name, exception_job_path(@job, error_type: exception.class_name), class: "card callout") %></th>
31
-
32
- <th>
33
- <% exception.messages.each do |message| %>
34
- <div><%= message %></div>
35
- <% end %>
36
- </th>
37
- </tr>
38
- <% end %>
39
- </tbody>
40
- </table>
41
- </div>
42
- </div>