solid_queue_web 0.5.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -8
  3. data/Rakefile +2 -2
  4. data/app/assets/stylesheets/solid_queue_web/_01_base.css +41 -0
  5. data/app/assets/stylesheets/solid_queue_web/_02_layout.css +105 -0
  6. data/app/assets/stylesheets/solid_queue_web/_03_stats.css +49 -0
  7. data/app/assets/stylesheets/solid_queue_web/_04_table.css +52 -0
  8. data/app/assets/stylesheets/solid_queue_web/_05_badges.css +27 -0
  9. data/app/assets/stylesheets/solid_queue_web/_06_buttons.css +38 -0
  10. data/app/assets/stylesheets/solid_queue_web/_07_forms.css +103 -0
  11. data/app/assets/stylesheets/solid_queue_web/_08_detail.css +84 -0
  12. data/app/assets/stylesheets/solid_queue_web/_09_pagination.css +27 -0
  13. data/app/assets/stylesheets/solid_queue_web/_10_responsive.css +73 -0
  14. data/app/assets/stylesheets/solid_queue_web/_11_throughput.css +68 -0
  15. data/app/assets/stylesheets/solid_queue_web/application.css +1 -548
  16. data/app/controllers/solid_queue_web/application_controller.rb +2 -0
  17. data/app/controllers/solid_queue_web/dashboard_controller.rb +12 -0
  18. data/app/controllers/solid_queue_web/failed_jobs/selections_controller.rb +27 -0
  19. data/app/controllers/solid_queue_web/failed_jobs_controller.rb +5 -3
  20. data/app/controllers/solid_queue_web/history_controller.rb +16 -0
  21. data/app/controllers/solid_queue_web/jobs/selections_controller.rb +21 -0
  22. data/app/controllers/solid_queue_web/jobs_controller.rb +13 -8
  23. data/app/controllers/solid_queue_web/queues/jobs_controller.rb +1 -1
  24. data/app/controllers/solid_queue_web/queues_controller.rb +15 -0
  25. data/app/controllers/solid_queue_web/search_controller.rb +23 -0
  26. data/app/helpers/solid_queue_web/application_helper.rb +15 -1
  27. data/app/javascript/solid_queue_web/application.js +4 -0
  28. data/app/javascript/solid_queue_web/refresh_controller.js +52 -0
  29. data/app/javascript/solid_queue_web/search_controller.js +5 -0
  30. data/app/javascript/solid_queue_web/selection_controller.js +42 -0
  31. data/app/views/layouts/solid_queue_web/application.html.erb +2 -0
  32. data/app/views/solid_queue_web/dashboard/index.html.erb +41 -1
  33. data/app/views/solid_queue_web/failed_jobs/index.html.erb +93 -49
  34. data/app/views/solid_queue_web/history/index.html.erb +67 -0
  35. data/app/views/solid_queue_web/jobs/index.html.erb +115 -49
  36. data/app/views/solid_queue_web/processes/index.html.erb +3 -1
  37. data/app/views/solid_queue_web/queues/index.html.erb +15 -1
  38. data/app/views/solid_queue_web/search/index.html.erb +64 -0
  39. data/config/importmap.rb +2 -0
  40. data/config/routes.rb +16 -6
  41. data/lib/solid_queue_web/version.rb +1 -1
  42. metadata +20 -1
@@ -1,21 +1,21 @@
1
1
  <h1 class="sqd-page-title" style="margin-bottom: 1.5rem;">Jobs</h1>
2
2
 
3
- <%= turbo_frame_tag "jobs-table", data: { turbo_action: "advance" } do %>
3
+ <%= turbo_frame_tag "jobs-table", data: { turbo_action: "advance", controller: "refresh", refresh_interval_value: 10000 } do %>
4
4
  <% discardable = SolidQueueWeb::Job::DISCARDABLE.include?(@status) %>
5
5
 
6
6
  <div class="sqd-page-header">
7
7
  <div class="sqd-filters">
8
- <%= link_to "Ready", jobs_path(status: "ready", q: @search), class: @status == "ready" ? "active" : "" %>
9
- <%= link_to "Scheduled", jobs_path(status: "scheduled", q: @search), class: @status == "scheduled" ? "active" : "" %>
10
- <%= link_to "Running", jobs_path(status: "claimed", q: @search), class: @status == "claimed" ? "active" : "" %>
11
- <%= link_to "Blocked", jobs_path(status: "blocked", q: @search), class: @status == "blocked" ? "active" : "" %>
12
- <%= link_to "Failed", jobs_path(status: "failed", q: @search), class: @status == "failed" ? "active" : "" %>
8
+ <%= link_to "Ready", jobs_path(status: "ready", q: @search, period: @period), class: @status == "ready" ? "active" : "" %>
9
+ <%= link_to "Scheduled", jobs_path(status: "scheduled", q: @search, period: @period), class: @status == "scheduled" ? "active" : "" %>
10
+ <%= link_to "Running", jobs_path(status: "claimed", q: @search, period: @period), class: @status == "claimed" ? "active" : "" %>
11
+ <%= link_to "Blocked", jobs_path(status: "blocked", q: @search, period: @period), class: @status == "blocked" ? "active" : "" %>
12
+ <%= link_to "Failed", jobs_path(status: "failed", q: @search, period: @period), class: @status == "failed" ? "active" : "" %>
13
13
  </div>
14
14
  <% if discardable && @jobs.any? %>
15
15
  <div class="sqd-actions">
16
16
  <%= button_to "Discard All", discard_all_jobs_path,
17
17
  method: :post,
18
- params: { status: @status },
18
+ params: { status: @status, period: @period },
19
19
  class: "sqd-btn sqd-btn--danger",
20
20
  data: { confirm: "Discard all #{@jobs.size} #{@status} jobs? This cannot be undone." } %>
21
21
  </div>
@@ -24,62 +24,128 @@
24
24
 
25
25
  <form class="sqd-search" action="<%= jobs_path %>" method="get" data-controller="search">
26
26
  <input type="hidden" name="status" value="<%= @status %>">
27
+ <input type="hidden" name="period" value="<%= @period %>">
27
28
  <input class="sqd-search__input" type="search" name="q" value="<%= @search %>"
28
29
  placeholder="Filter by job class…" autocomplete="off" aria-label="Filter by job class"
29
30
  data-action="input->search#filter">
30
- <button type="submit" class="sqd-btn sqd-btn--muted">Search</button>
31
31
  <% if @search.present? %>
32
- <%= link_to "Clear", jobs_path(status: @status), class: "sqd-btn sqd-btn--muted" %>
32
+ <%= link_to "Clear", jobs_path(status: @status, period: @period), class: "sqd-btn sqd-btn--muted" %>
33
33
  <% end %>
34
+ <div class="sqd-period-filter" role="group" aria-label="Time period">
35
+ <%= link_to "All", jobs_path(status: @status, q: @search), class: @period.nil? ? "active" : "", aria: { current: @period.nil? ? "true" : nil }, aria_label: "All time" %>
36
+ <%= link_to "1h", jobs_path(status: @status, q: @search, period: "1h"), class: @period == "1h" ? "active" : "", aria: { current: @period == "1h" ? "true" : nil }, aria_label: "Last 1 hour" %>
37
+ <%= link_to "24h", jobs_path(status: @status, q: @search, period: "24h"), class: @period == "24h" ? "active" : "", aria: { current: @period == "24h" ? "true" : nil }, aria_label: "Last 24 hours" %>
38
+ <%= link_to "7d", jobs_path(status: @status, q: @search, period: "7d"), class: @period == "7d" ? "active" : "", aria: { current: @period == "7d" ? "true" : nil }, aria_label: "Last 7 days" %>
39
+ </div>
34
40
  </form>
35
41
 
36
- <div class="sqd-card" id="jobs-list">
37
- <% if @jobs.empty? %>
38
- <div class="sqd-empty">No <%= @status %> jobs.</div>
39
- <% else %>
40
- <table>
41
- <thead>
42
- <tr>
43
- <th scope="col">Job Class</th>
44
- <th scope="col">Queue</th>
45
- <th scope="col">Priority</th>
46
- <th scope="col">Scheduled At</th>
47
- <th scope="col">Enqueued At</th>
48
- <% if discardable %><th scope="col"><span class="sqd-sr-only">Actions</span></th><% end %>
49
- </tr>
50
- </thead>
51
- <tbody>
52
- <% @jobs.each do |execution| %>
53
- <% job = execution.job %>
54
- <tr id="execution_<%= execution.id %>">
55
- <td>
56
- <span class="sqd-badge sqd-badge--<%= @status %>"><%= @status %></span>
57
- <%= link_to job.class_name, job_path(job), style: "margin-left: 0.5rem;", data: { turbo_frame: "_top" } %>
58
- </td>
59
- <td>
60
- <%= link_to job.queue_name, queue_jobs_path(queue_name: job.queue_name, status: @status),
61
- class: "sqd-mono", style: "color: inherit;" %>
62
- </td>
63
- <td><%= job.priority %></td>
64
- <td class="sqd-mono">
65
- <%= job.scheduled_at ? job.scheduled_at.strftime("%Y-%m-%d %H:%M:%S") : "" %>
66
- </td>
67
- <td class="sqd-mono"><%= job.created_at.strftime("%Y-%m-%d %H:%M:%S") %></td>
68
- <% if discardable %>
42
+ <% if discardable && @jobs.any? %>
43
+ <div data-controller="selection">
44
+ <%= form_tag job_selection_path, method: :delete, id: "job-selection-form",
45
+ data: { turbo_confirm: "Discard selected jobs? This cannot be undone." } do %>
46
+ <%= hidden_field_tag :status, @status %>
47
+ <%= hidden_field_tag :period, @period %>
48
+ <% end %>
49
+
50
+ <div class="sqd-selection-bar" data-selection-target="bar" style="display: none;">
51
+ <span class="sqd-muted-text"><span data-selection-target="count">0</span> selected</span>
52
+ <button type="button" class="sqd-btn sqd-btn--danger sqd-btn--sm"
53
+ data-action="click->selection#submit"
54
+ data-selection-form-id-param="job-selection-form">Discard Selected</button>
55
+ </div>
56
+
57
+ <div class="sqd-card" id="jobs-list">
58
+ <table>
59
+ <thead>
60
+ <tr>
61
+ <th scope="col">
62
+ <input type="checkbox" data-selection-target="selectAll"
63
+ data-action="change->selection#selectAll"
64
+ aria-label="Select all jobs">
65
+ </th>
66
+ <th scope="col">Job Class</th>
67
+ <th scope="col">Queue</th>
68
+ <th scope="col">Priority</th>
69
+ <th scope="col">Scheduled At</th>
70
+ <th scope="col">Enqueued At</th>
71
+ <th scope="col"><span class="sqd-sr-only">Actions</span></th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <% @jobs.each do |execution| %>
76
+ <% job = execution.job %>
77
+ <tr id="execution_<%= execution.id %>">
78
+ <td>
79
+ <input type="checkbox" value="<%= execution.id %>"
80
+ data-selection-target="checkbox"
81
+ data-action="change->selection#toggle"
82
+ aria-label="Select job <%= job.class_name %>">
83
+ </td>
84
+ <td>
85
+ <span class="sqd-badge sqd-badge--<%= @status %>"><%= @status %></span>
86
+ <%= link_to job.class_name, job_path(job), style: "margin-left: 0.5rem;", data: { turbo_frame: "_top" } %>
87
+ </td>
88
+ <td>
89
+ <%= link_to job.queue_name, queue_jobs_path(queue_name: job.queue_name, status: @status),
90
+ class: "sqd-mono", style: "color: inherit;" %>
91
+ </td>
92
+ <td><%= job.priority %></td>
93
+ <td class="sqd-mono">
94
+ <%= job.scheduled_at ? job.scheduled_at.strftime("%Y-%m-%d %H:%M:%S") : "—" %>
95
+ </td>
96
+ <td class="sqd-mono"><%= job.created_at.strftime("%Y-%m-%d %H:%M:%S") %></td>
69
97
  <td class="sqd-row-actions">
70
98
  <%= button_to "Discard", job_path(execution),
71
99
  method: :delete,
72
- params: { status: @status },
100
+ params: { status: @status, period: @period },
73
101
  class: "sqd-btn sqd-btn--danger sqd-btn--sm",
74
102
  data: { confirm: "Discard this job?" } %>
75
103
  </td>
76
- <% end %>
104
+ </tr>
105
+ <% end %>
106
+ </tbody>
107
+ </table>
108
+ </div>
109
+ </div>
110
+ <% else %>
111
+ <div class="sqd-card" id="jobs-list">
112
+ <% if @jobs.empty? %>
113
+ <div class="sqd-empty">No <%= @status %> jobs.</div>
114
+ <% else %>
115
+ <table>
116
+ <thead>
117
+ <tr>
118
+ <th scope="col">Job Class</th>
119
+ <th scope="col">Queue</th>
120
+ <th scope="col">Priority</th>
121
+ <th scope="col">Scheduled At</th>
122
+ <th scope="col">Enqueued At</th>
77
123
  </tr>
78
- <% end %>
79
- </tbody>
80
- </table>
81
- <% end %>
82
- </div>
124
+ </thead>
125
+ <tbody>
126
+ <% @jobs.each do |execution| %>
127
+ <% job = execution.job %>
128
+ <tr id="execution_<%= execution.id %>">
129
+ <td>
130
+ <span class="sqd-badge sqd-badge--<%= @status %>"><%= @status %></span>
131
+ <%= link_to job.class_name, job_path(job), style: "margin-left: 0.5rem;", data: { turbo_frame: "_top" } %>
132
+ </td>
133
+ <td>
134
+ <%= link_to job.queue_name, queue_jobs_path(queue_name: job.queue_name, status: @status),
135
+ class: "sqd-mono", style: "color: inherit;" %>
136
+ </td>
137
+ <td><%= job.priority %></td>
138
+ <td class="sqd-mono">
139
+ <%= job.scheduled_at ? job.scheduled_at.strftime("%Y-%m-%d %H:%M:%S") : "—" %>
140
+ </td>
141
+ <td class="sqd-mono"><%= job.created_at.strftime("%Y-%m-%d %H:%M:%S") %></td>
142
+ </tr>
143
+ <% end %>
144
+ </tbody>
145
+ </table>
146
+ <% end %>
147
+ </div>
148
+ <% end %>
83
149
 
84
150
  <% if @pagy.last > 1 %>
85
151
  <%= @pagy.series_nav.html_safe %>
@@ -1,3 +1,4 @@
1
+ <%= turbo_frame_tag "processes", target: "_top", data: { controller: "refresh", refresh_interval_value: 10000 } do %>
1
2
  <h1 class="sqd-page-title">Processes</h1>
2
3
 
3
4
  <div class="sqd-card">
@@ -51,4 +52,5 @@
51
52
  </tbody>
52
53
  </table>
53
54
  <% end %>
54
- </div>
55
+ </div>
56
+ <% end %>
@@ -10,6 +10,8 @@
10
10
  <th scope="col">Name</th>
11
11
  <th scope="col">Size</th>
12
12
  <th scope="col">Latency</th>
13
+ <th scope="col">Done (24h)</th>
14
+ <th scope="col">Failed (24h)</th>
13
15
  <th scope="col">Status</th>
14
16
  <th scope="col"><span class="sqd-sr-only">Actions</span></th>
15
17
  </tr>
@@ -19,7 +21,19 @@
19
21
  <tr>
20
22
  <td class="sqd-mono"><%= queue.name %></td>
21
23
  <td><%= queue.size %></td>
22
- <td><%= queue.human_latency %></td>
24
+ <td>
25
+ <% if (oldest = @oldest_ready[queue.name]) %>
26
+ <% age = Time.current - oldest %>
27
+ <% latency_color = age > 86_400 ? "var(--danger)" : age > 3_600 ? "var(--warning)" : "inherit" %>
28
+ <abbr title="<%= oldest.strftime("%Y-%m-%d %H:%M:%S UTC") %>">
29
+ <span style="color: <%= latency_color %>"><%= format_duration(age) %></span>
30
+ </abbr>
31
+ <% else %>
32
+ <span style="color: var(--muted)">—</span>
33
+ <% end %>
34
+ </td>
35
+ <td style="color: var(--success);"><%= @completed_24h[queue.name] || 0 %></td>
36
+ <td style="color: <%= (@failed_24h[queue.name] || 0) > 0 ? "var(--danger)" : "inherit" %>;"><%= @failed_24h[queue.name] || 0 %></td>
23
37
  <td>
24
38
  <% if queue.paused? %>
25
39
  <span class="sqd-badge sqd-badge--paused">Paused</span>
@@ -0,0 +1,64 @@
1
+ <h1 class="sqd-page-title" style="margin-bottom: 1.5rem;">Search Jobs</h1>
2
+
3
+ <datalist id="job-class-list">
4
+ <% @job_classes.each do |klass| %>
5
+ <option value="<%= klass %>">
6
+ <% end %>
7
+ </datalist>
8
+
9
+ <form class="sqd-search sqd-search--global" action="<%= search_path %>" method="get" data-controller="search">
10
+ <input class="sqd-search__input sqd-search__input--lg" type="search" name="q"
11
+ value="<%= @query %>" placeholder="Search by job class name…"
12
+ list="job-class-list" autocomplete="off"
13
+ aria-label="Search all jobs by class name"
14
+ data-action="change->search#select">
15
+ <% if @query.present? %>
16
+ <%= link_to "Clear", search_path, class: "sqd-btn sqd-btn--muted" %>
17
+ <% end %>
18
+ </form>
19
+
20
+ <% if @query.present? %>
21
+ <% if @results.empty? %>
22
+ <div class="sqd-empty" style="margin-top: 1rem;">No jobs found matching &ldquo;<%= @query %>&rdquo;.</div>
23
+ <% else %>
24
+ <% @results.each do |status, data| %>
25
+ <div class="sqd-search-group">
26
+ <div class="sqd-search-group__header">
27
+ <span class="sqd-badge sqd-badge--<%= status %>"><%= status %></span>
28
+ <span class="sqd-muted-text">
29
+ <%= pluralize(data[:total], "match", "matches") %>
30
+ <% if data[:total] > SolidQueueWeb::SearchController::LIMIT %>
31
+ &mdash; showing first <%= SolidQueueWeb::SearchController::LIMIT %>
32
+ <% end %>
33
+ </span>
34
+ <% if status == "failed" %>
35
+ <%= link_to "View all →", failed_jobs_path(q: @query), class: "sqd-btn sqd-btn--muted sqd-btn--sm" %>
36
+ <% else %>
37
+ <%= link_to "View all →", jobs_path(status: status, q: @query), class: "sqd-btn sqd-btn--muted sqd-btn--sm" %>
38
+ <% end %>
39
+ </div>
40
+ <div class="sqd-card">
41
+ <table>
42
+ <thead>
43
+ <tr>
44
+ <th scope="col">Job Class</th>
45
+ <th scope="col">Queue</th>
46
+ <th scope="col">Enqueued At</th>
47
+ </tr>
48
+ </thead>
49
+ <tbody>
50
+ <% data[:executions].each do |execution| %>
51
+ <% job = execution.job %>
52
+ <tr>
53
+ <td><%= link_to job.class_name, job_path(job) %></td>
54
+ <td class="sqd-mono"><%= job.queue_name %></td>
55
+ <td class="sqd-mono"><%= job.created_at.strftime("%Y-%m-%d %H:%M:%S") %></td>
56
+ </tr>
57
+ <% end %>
58
+ </tbody>
59
+ </table>
60
+ </div>
61
+ </div>
62
+ <% end %>
63
+ <% end %>
64
+ <% end %>
data/config/importmap.rb CHANGED
@@ -1,2 +1,4 @@
1
1
  pin "solid_queue_web", to: "solid_queue_web/application.js"
2
2
  pin "solid_queue_web/search_controller", to: "solid_queue_web/search_controller.js"
3
+ pin "solid_queue_web/refresh_controller", to: "solid_queue_web/refresh_controller.js"
4
+ pin "solid_queue_web/selection_controller", to: "solid_queue_web/selection_controller.js"
data/config/routes.rb CHANGED
@@ -1,25 +1,35 @@
1
1
  SolidQueueWeb::Engine.routes.draw do
2
2
  root to: "dashboard#index"
3
3
 
4
- resources :recurring_tasks, only: [ :index ]
5
- resources :processes, only: [ :index ]
6
- resources :queues, only: [ :index ], param: :name do
4
+ get "search", to: "search#index", as: :search
5
+ get "history", to: "history#index", as: :history
6
+
7
+ resources :recurring_tasks, only: [:index]
8
+ resources :processes, only: [:index]
9
+ resources :queues, only: [:index], param: :name do
7
10
  member do
8
11
  post :pause
9
12
  post :resume
10
13
  end
11
- resources :jobs, path: "list", only: [ :index, :destroy ], controller: "queues/jobs" do
14
+ resources :jobs, path: "list", only: [:index, :destroy], controller: "queues/jobs" do
12
15
  collection do
13
16
  post :discard_all
14
17
  end
15
18
  end
16
19
  end
17
- resources :jobs, path: "list", only: [ :index, :show, :destroy ] do
20
+
21
+ # Singular selection resources must be defined before the member routes of their
22
+ # parent resources, otherwise DELETE /list/selection matches /list/:id first.
23
+ resource :job_selection, path: "list/selection", only: [:destroy], controller: "jobs/selections"
24
+ resources :jobs, path: "list", only: [:index, :show, :destroy] do
18
25
  collection do
19
26
  post :discard_all
20
27
  end
21
28
  end
22
- resources :failed_jobs, only: [ :index, :destroy ] do
29
+
30
+ resource :failed_job_selection, path: "failed_jobs/selection", only: [:create, :destroy],
31
+ controller: "failed_jobs/selections"
32
+ resources :failed_jobs, only: [:index, :destroy] do
23
33
  collection do
24
34
  post :retry_all
25
35
  post :discard_all
@@ -1,3 +1,3 @@
1
1
  module SolidQueueWeb
2
- VERSION = "0.5.5"
2
+ VERSION = "0.7.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solid_queue_web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuck Smith
@@ -91,24 +91,42 @@ files:
91
91
  - MIT-LICENSE
92
92
  - README.md
93
93
  - Rakefile
94
+ - app/assets/stylesheets/solid_queue_web/_01_base.css
95
+ - app/assets/stylesheets/solid_queue_web/_02_layout.css
96
+ - app/assets/stylesheets/solid_queue_web/_03_stats.css
97
+ - app/assets/stylesheets/solid_queue_web/_04_table.css
98
+ - app/assets/stylesheets/solid_queue_web/_05_badges.css
99
+ - app/assets/stylesheets/solid_queue_web/_06_buttons.css
100
+ - app/assets/stylesheets/solid_queue_web/_07_forms.css
101
+ - app/assets/stylesheets/solid_queue_web/_08_detail.css
102
+ - app/assets/stylesheets/solid_queue_web/_09_pagination.css
103
+ - app/assets/stylesheets/solid_queue_web/_10_responsive.css
104
+ - app/assets/stylesheets/solid_queue_web/_11_throughput.css
94
105
  - app/assets/stylesheets/solid_queue_web/application.css
95
106
  - app/controllers/solid_queue_web/application_controller.rb
96
107
  - app/controllers/solid_queue_web/dashboard_controller.rb
108
+ - app/controllers/solid_queue_web/failed_jobs/selections_controller.rb
97
109
  - app/controllers/solid_queue_web/failed_jobs_controller.rb
110
+ - app/controllers/solid_queue_web/history_controller.rb
111
+ - app/controllers/solid_queue_web/jobs/selections_controller.rb
98
112
  - app/controllers/solid_queue_web/jobs_controller.rb
99
113
  - app/controllers/solid_queue_web/processes_controller.rb
100
114
  - app/controllers/solid_queue_web/queues/jobs_controller.rb
101
115
  - app/controllers/solid_queue_web/queues_controller.rb
102
116
  - app/controllers/solid_queue_web/recurring_tasks_controller.rb
117
+ - app/controllers/solid_queue_web/search_controller.rb
103
118
  - app/helpers/solid_queue_web/application_helper.rb
104
119
  - app/javascript/solid_queue_web/application.js
120
+ - app/javascript/solid_queue_web/refresh_controller.js
105
121
  - app/javascript/solid_queue_web/search_controller.js
122
+ - app/javascript/solid_queue_web/selection_controller.js
106
123
  - app/jobs/solid_queue_web/application_job.rb
107
124
  - app/models/solid_queue_web/application_record.rb
108
125
  - app/models/solid_queue_web/job.rb
109
126
  - app/views/layouts/solid_queue_web/application.html.erb
110
127
  - app/views/solid_queue_web/dashboard/index.html.erb
111
128
  - app/views/solid_queue_web/failed_jobs/index.html.erb
129
+ - app/views/solid_queue_web/history/index.html.erb
112
130
  - app/views/solid_queue_web/jobs/destroy.turbo_stream.erb
113
131
  - app/views/solid_queue_web/jobs/index.html.erb
114
132
  - app/views/solid_queue_web/jobs/show.html.erb
@@ -117,6 +135,7 @@ files:
117
135
  - app/views/solid_queue_web/queues/jobs/destroy.turbo_stream.erb
118
136
  - app/views/solid_queue_web/queues/jobs/index.html.erb
119
137
  - app/views/solid_queue_web/recurring_tasks/index.html.erb
138
+ - app/views/solid_queue_web/search/index.html.erb
120
139
  - config/importmap.rb
121
140
  - config/routes.rb
122
141
  - lib/solid_queue_web.rb