rush_job 0.3.1 → 0.4.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: 62c92632ff547f79e44137da7c5d1fa32abebf73e193e415704b04bd981d6256
4
- data.tar.gz: 2bb2cbb6fbd881c7c9419ffdb0b9bbe3ace33d3077f44ef3ee5ff1b4c08df6c3
3
+ metadata.gz: 9f24031055b7af192d199277995a02156d089d208ef07037c75d5ebcafabaaf1
4
+ data.tar.gz: 697f98385692da3bcbe8ff8b5971b222fcf93a1c3df34ef9e4544e86dc51fd6f
5
5
  SHA512:
6
- metadata.gz: 5ab20e3517d870afec5c08873854ed7191daae8efb8b462537d1f04545f2ce7b49ec57a0d3996ac2efa7246a5073e856b19d7420006708bd4d6dd2f369f4a9dd
7
- data.tar.gz: 40421bf79367edd3e4ee1b4211adae3e9e918c69a76203cc2468c5779a6d19169b832d56cb9ce672cd8694b09f3f23df83e82aac6c5e5dd4c71bf59eac586925
6
+ metadata.gz: b9a83f701a00989f02da32d816bae209b90576eff5ab2ca3e2c0930f0a876294faf29dc88267847a65f82d6aa159e1ddce3e56839d5cf1f2df1c532d05e39fd8
7
+ data.tar.gz: '0810045ea1fee244ad1a5ec8bb2d71728546d4d760e0e344bca5d93292c7c1d775fdbff34f1094cc202290b50ef15655c8ce5ce5189782868367fe0bba2ce079'
data/README.md CHANGED
@@ -14,7 +14,7 @@ Navigate to the `/rush_job` route in your application to see the Delayed Jobs. L
14
14
  Add this line to your Ruby on Rails application's Gemfile:
15
15
 
16
16
  ```ruby
17
- gem 'rush_job', '~> 0.3.1'
17
+ gem 'rush_job', '~> 0.4.0'
18
18
  ```
19
19
 
20
20
  And then execute:
@@ -1 +1,12 @@
1
- import "bootstrap"
1
+ import 'bootstrap'
2
+ import Rails from '@rails/ujs'
3
+ Rails.start();
4
+
5
+ import { Application } from '@hotwired/stimulus'
6
+
7
+ import RushJobPollingController from './controllers/rush_job_polling_controller'
8
+ import RushJobReloadJobsTableController from './controllers/rush_job_reload_jobs_table_controller'
9
+
10
+ window.Stimulus = Application.start()
11
+ Stimulus.register('rush-job-polling', RushJobPollingController)
12
+ Stimulus.register('rush-job-reload-jobs-table', RushJobReloadJobsTableController)
@@ -0,0 +1,49 @@
1
+ import { RushJobTableUpdateController } from './rush_job_table_update_controller.js'
2
+
3
+ let intervalID
4
+
5
+ export default class extends RushJobTableUpdateController {
6
+ static targets = [ 'pollingTime', 'pollingTimeLabel', 'pollingSlide' ]
7
+
8
+ connect() {
9
+ this.pollingChange()
10
+ this.stopPolling()
11
+ }
12
+
13
+ pollingChange() {
14
+ const pollingLabelRegex = /\d+/;
15
+ let pollingLabelUpdate = this.pollingTimeLabelTarget.innerHTML.replace(pollingLabelRegex, this.pollingTime())
16
+ this.pollingTimeLabelTarget.innerHTML = pollingLabelUpdate
17
+ }
18
+
19
+ pollingToggle() {
20
+ let pollingSlide = this.pollingSlideTarget
21
+
22
+ if (pollingSlide.checked === true) {
23
+ this.startPolling()
24
+ } else {
25
+ this.stopPolling()
26
+ }
27
+ }
28
+
29
+ startPolling() {
30
+ this.updateJobs()
31
+
32
+ intervalID = setTimeout(() => {
33
+ this.startPolling()
34
+ }, this.pollingTime() * 1000)
35
+ }
36
+
37
+ stopPolling() {
38
+ if (intervalID) {
39
+ clearInterval(intervalID)
40
+ }
41
+ }
42
+
43
+ pollingTime() {
44
+ const pollingTimes = [3, 5, 8, 13, 21, 34, 55]
45
+ let pollingTime = this.pollingTimeTarget.value || 3
46
+
47
+ return pollingTimes[pollingTime]
48
+ }
49
+ }
@@ -0,0 +1,7 @@
1
+ import { RushJobTableUpdateController } from './rush_job_table_update_controller.js'
2
+
3
+ export default class extends RushJobTableUpdateController {
4
+ reloadJobs() {
5
+ this.updateJobs()
6
+ }
7
+ }
@@ -0,0 +1,19 @@
1
+ import { Controller } from '@hotwired/stimulus'
2
+ import Rails from '@rails/ujs'
3
+
4
+ export class RushJobTableUpdateController extends Controller {
5
+ updateJobs() {
6
+ this.blurTable()
7
+
8
+ Rails.ajax({
9
+ url: document.location.href,
10
+ type: 'GET',
11
+ dataType: 'script'
12
+ })
13
+ }
14
+
15
+ blurTable() {
16
+ let jobs_container = document.getElementById('rush-job-jobs-container')
17
+ jobs_container.classList.add('table-refresh')
18
+ }
19
+ }
@@ -11,6 +11,29 @@
11
11
  margin-top: 0.5rem;
12
12
  }
13
13
 
14
+ .polling-container {
15
+ margin-left: 5%;
16
+ margin-right: 5%;
17
+ }
18
+
19
+ .polling-range-form-label-dark {
20
+ color: rgb(0, 0, 0);
21
+ margin-bottom: 0.5rem;
22
+ }
23
+
24
+ .polling-range-form-label-light {
25
+ color: rgb(255, 255, 255);
26
+ margin-bottom: 0.5rem;
27
+ }
28
+
29
+ .form-check-label-dark {
30
+ color: rgb(0, 0, 0);
31
+ }
32
+
33
+ .form-check-label-light {
34
+ color: rgb(255, 255, 255);
35
+ }
36
+
14
37
  .jobs-container {
15
38
  margin-left: 5%;
16
39
  margin-right: 5%;
@@ -32,4 +55,8 @@
32
55
 
33
56
  .page-item:last-child .page-link {
34
57
  color: rgb(68, 110, 155);
35
- }
58
+ }
59
+
60
+ .table-refresh {
61
+ opacity: 0.3;
62
+ }
@@ -3,8 +3,21 @@ module RushJob
3
3
  include SortHelper
4
4
  include Pagy::Backend
5
5
 
6
+ rescue_from Pagy::OverflowError, with: :redirect_to_first_page
7
+
6
8
  def index
7
9
  @pagy, @rush_jobs = pagy(RushJob.order("#{sort_column} #{sort_direction}"))
10
+
11
+ respond_to do |format|
12
+ format.html
13
+ format.js
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def redirect_to_first_page
20
+ redirect_to root_path, notice: t(:invalid_page_notice)
8
21
  end
9
22
  end
10
23
  end
@@ -11,6 +11,11 @@
11
11
  <%= stylesheet_link_tag "rush_job/application", media: "all" %>
12
12
  </head>
13
13
  <body class="background-color-<%= current_theme %>">
14
+ <% flash.each do |type, msg| %>
15
+ <div class="alert alert-<%= invert_theme %>" role="alert">
16
+ <%= msg %>
17
+ </div>
18
+ <% end %>
14
19
 
15
20
  <%= yield %>
16
21
 
@@ -0,0 +1,49 @@
1
+ <div
2
+ id="rush-job-jobs-container"
3
+ class="jobs-container"
4
+ role="main"
5
+ >
6
+ <div class="table-responsive">
7
+ <table class="table
8
+ table-bordered
9
+ table-striped
10
+ table-<%= current_theme %>">
11
+ <thead>
12
+ <tr>
13
+ <th><%= sortable 'id' %><%= sort_arrow 'id' %></th>
14
+ <th><%= sortable 'priority' %><%= sort_arrow 'priority' %></th>
15
+ <th><%= sortable 'attempts' %><%= sort_arrow 'attempts' %></th>
16
+ <th><%= t :job_class %></th>
17
+ <th><%= t :arguments %></th>
18
+ <th><%= sortable 'last_error' %><%= sort_arrow 'last_error' %></th>
19
+ <th><%= sortable 'run_at' %><%= sort_arrow 'run_at' %></th>
20
+ <th><%= sortable 'locked_at' %><%= sort_arrow 'locked_at' %></th>
21
+ <th><%= sortable 'failed_at' %><%= sort_arrow 'failed_at' %></th>
22
+ <th><%= sortable 'locked_by' %><%= sort_arrow'locked_by' %></th>
23
+ <th><%= sortable 'queue' %><%= sort_arrow 'queue' %></th>
24
+ </tr>
25
+ </thead>
26
+ <tbody class="table-group-divider">
27
+ <% @rush_jobs.each do |job| %>
28
+ <tr>
29
+ <td><%= job.id %></td>
30
+ <td><%= job.priority %></td>
31
+ <td><%= job.attempts %></td>
32
+ <td><%= job.job_class %></td>
33
+ <td><%= job.job_arguments %></td>
34
+ <td><%= job.last_error %></td>
35
+ <td><%= job.run_at %></td>
36
+ <td><%= job.locked_at %></td>
37
+ <td><%= job.failed_at %></td>
38
+ <td><%= job.locked_by %></td>
39
+ <td><%= job.queue %></td>
40
+ </tr>
41
+ <% end %>
42
+ </tbody>
43
+ </table>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="footer-container">
48
+ <%== pagy_bootstrap_nav(@pagy) if @pagy.pages > 1 %>
49
+ </div>
@@ -6,13 +6,8 @@
6
6
  <%= t :delayed_title %>
7
7
  </h2>
8
8
  </div>
9
- <div class="col-3">
10
- <button
11
- type="button"
12
- class="btn btn-primary"
13
- onclick="location.reload();">
14
- <%= t :reload %>
15
- </button>
9
+ <div class="col-3" data-controller="rush-job-reload-jobs-table">
10
+ <button class="btn btn-primary" data-action="click->rush-job-reload-jobs-table#reloadJobs"><%= t :reload %></button>
16
11
  </div>
17
12
  <div class="col-3">
18
13
  <%= form_with url: theme_path, method: 'patch' do |form| %>
@@ -23,48 +18,42 @@
23
18
  </div>
24
19
  </div>
25
20
 
26
- <div class="jobs-container" role="main">
27
- <div class="table-responsive">
28
- <table class="table
29
- table-bordered
30
- table-striped
31
- table-<%= current_theme %>">
32
- <thead>
33
- <tr>
34
- <th><%= sortable 'id' %><%= sort_arrow 'id' %></th>
35
- <th><%= sortable 'priority' %><%= sort_arrow 'priority' %></th>
36
- <th><%= sortable 'attempts' %><%= sort_arrow 'attempts' %></th>
37
- <th><%= t :job_class %></th>
38
- <th><%= t :arguments %></th>
39
- <th><%= sortable 'last_error' %><%= sort_arrow 'last_error' %></th>
40
- <th><%= sortable 'run_at' %><%= sort_arrow 'run_at' %></th>
41
- <th><%= sortable 'locked_at' %><%= sort_arrow 'locked_at' %></th>
42
- <th><%= sortable 'failed_at' %><%= sort_arrow 'failed_at' %></th>
43
- <th><%= sortable 'locked_by' %><%= sort_arrow'locked_by' %></th>
44
- <th><%= sortable 'queue' %><%= sort_arrow 'queue' %></th>
45
- </tr>
46
- </thead>
47
- <tbody class="table-group-divider">
48
- <% @rush_jobs.each do |job| %>
49
- <tr>
50
- <td><%= job.id %></td>
51
- <td><%= job.priority %></td>
52
- <td><%= job.attempts %></td>
53
- <td><%= job.job_class %></td>
54
- <td><%= job.job_arguments %></td>
55
- <td><%= job.last_error %></td>
56
- <td><%= job.run_at %></td>
57
- <td><%= job.locked_at %></td>
58
- <td><%= job.failed_at %></td>
59
- <td><%= job.locked_by %></td>
60
- <td><%= job.queue %></td>
61
- </tr>
62
- <% end %>
63
- </tbody>
64
- </table>
21
+ <div class="polling-container" data-controller="rush-job-polling">
22
+ <div class="row align-items-center">
23
+ <div class="col-3">
24
+ <label
25
+ for="rush-job-polling-range"
26
+ class="polling-range-form-label-<%= invert_theme %>"
27
+ data-rush-job-polling-target="pollingTimeLabel"
28
+ >
29
+ <%= t :polling_time %> 13 <%= t :polling_time_unit %>
30
+ </label>
31
+ <input
32
+ id="rush-job-polling-range"
33
+ type="range"
34
+ class="form-range"
35
+ min="0"
36
+ max="6"
37
+ data-rush-job-polling-target="pollingTime"
38
+ data-action="input->rush-job-polling#pollingChange"
39
+ >
40
+ </div>
41
+ <div class="col-3">
42
+ <div class="form-check form-switch">
43
+ <input
44
+ id="rush-job-polling"
45
+ class="form-check-input"
46
+ type="checkbox"
47
+ role="switch"
48
+ data-rush-job-polling-target="pollingSlide"
49
+ data-action="input->rush-job-polling#pollingToggle"
50
+ >
51
+ <label class="form-check-label-<%= invert_theme %>" for="rush-job-polling"><%= t :enable_polling %></label>
52
+ </div>
53
+ </div>
65
54
  </div>
66
55
  </div>
67
56
 
68
- <div class="footer-container">
69
- <%== pagy_bootstrap_nav(@pagy) if @pagy.pages > 1 %>
57
+ <div id="rush-job-jobs-table">
58
+ <%= render 'jobs_table' %>
70
59
  </div>
@@ -0,0 +1 @@
1
+ document.getElementById('rush-job-jobs-table').innerHTML = "<%= j (render partial: 'jobs_table') %>"
data/config/importmap.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  pin 'rush_job/application', preload: true
2
2
  pin 'bootstrap', to: 'https://ga.jspm.io/npm:bootstrap@5.3.1/dist/js/bootstrap.esm.js'
3
3
  pin '@popperjs/core', to: 'https://ga.jspm.io/npm:@popperjs/core@2.11.8/lib/index.js'
4
+ pin '@rails/ujs', to: 'https://ga.jspm.io/npm:@rails/ujs@7.0.6/lib/assets/compiled/rails-ujs.js'
5
+ pin '@hotwired/stimulus', to: 'https://ga.jspm.io/npm:@hotwired/stimulus@3.2.2/dist/stimulus.js'
@@ -2,12 +2,16 @@ en:
2
2
  arguments: "Arguments"
3
3
  attempts: "Attempts"
4
4
  delayed_title: "Delayed jobs"
5
+ enable_polling: "Enable polling"
5
6
  failed_at: "Failed at"
6
7
  id: "Id"
8
+ invalid_page_notice: "No jobs on that page, redirected to first page."
7
9
  job_class: "Job class"
8
10
  last_error: "Last error"
9
11
  locked_at: "Locked at"
10
12
  locked_by: "Locked by"
13
+ polling_time: "Polling time:"
14
+ polling_time_unit: "seconds"
11
15
  priority: "Priority"
12
16
  queue: "Queue"
13
17
  reload: "Reload"
@@ -1,3 +1,3 @@
1
1
  module RushJob
2
- VERSION = '0.3.1'.freeze
2
+ VERSION = '0.4.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rush_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - JavaKoala
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-28 00:00:00.000000000 Z
11
+ date: 2023-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionview
@@ -292,6 +292,9 @@ files:
292
292
  - app/assets/images/rush_job/arrow-up-dark.svg
293
293
  - app/assets/images/rush_job/arrow-up-light.svg
294
294
  - app/assets/javascript/rush_job/application.js
295
+ - app/assets/javascript/rush_job/controllers/rush_job_polling_controller.js
296
+ - app/assets/javascript/rush_job/controllers/rush_job_reload_jobs_table_controller.js
297
+ - app/assets/javascript/rush_job/controllers/rush_job_table_update_controller.js
295
298
  - app/assets/stylesheets/rush_job/application.scss
296
299
  - app/assets/stylesheets/rush_job/pages/_index.scss
297
300
  - app/assets/stylesheets/rush_job/themes/_dark.scss
@@ -305,7 +308,9 @@ files:
305
308
  - app/models/rush_job/application_record.rb
306
309
  - app/models/rush_job/rush_job.rb
307
310
  - app/views/layouts/rush_job/application.html.erb
311
+ - app/views/rush_job/rush_jobs/_jobs_table.html.erb
308
312
  - app/views/rush_job/rush_jobs/index.html.erb
313
+ - app/views/rush_job/rush_jobs/index.js.erb
309
314
  - config/importmap.rb
310
315
  - config/locales/en.yml
311
316
  - config/routes.rb