solid_queue_web 1.4.0 → 1.6.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +220 -4
  3. data/app/assets/stylesheets/solid_queue_web/_04_table.css +28 -0
  4. data/app/controllers/solid_queue_web/application_controller.rb +30 -0
  5. data/app/controllers/solid_queue_web/audit_controller.rb +43 -0
  6. data/app/controllers/solid_queue_web/blocked_jobs_controller.rb +2 -2
  7. data/app/controllers/solid_queue_web/failed_jobs/arguments_controller.rb +3 -3
  8. data/app/controllers/solid_queue_web/failed_jobs/selections_controller.rb +6 -4
  9. data/app/controllers/solid_queue_web/failed_jobs_controller.rb +4 -2
  10. data/app/controllers/solid_queue_web/jobs/selections_controller.rb +4 -3
  11. data/app/controllers/solid_queue_web/jobs_controller.rb +7 -3
  12. data/app/controllers/solid_queue_web/queues/jobs_controller.rb +5 -5
  13. data/app/controllers/solid_queue_web/queues/pauses_controller.rb +6 -4
  14. data/app/controllers/solid_queue_web/recurring_tasks/runs_controller.rb +4 -4
  15. data/app/controllers/solid_queue_web/retry_failed_jobs_controller.rb +6 -5
  16. data/app/controllers/solid_queue_web/scheduled_jobs_controller.rb +5 -5
  17. data/app/models/solid_queue_web/audit_event.rb +17 -0
  18. data/app/views/layouts/solid_queue_web/application.html.erb +20 -16
  19. data/app/views/solid_queue_web/audit/index.html.erb +78 -0
  20. data/app/views/solid_queue_web/dashboard/index.html.erb +67 -46
  21. data/app/views/solid_queue_web/failed_jobs/errors/index.html.erb +7 -7
  22. data/app/views/solid_queue_web/failed_jobs/index.html.erb +31 -31
  23. data/app/views/solid_queue_web/history/index.html.erb +14 -14
  24. data/app/views/solid_queue_web/jobs/index.html.erb +42 -42
  25. data/app/views/solid_queue_web/jobs/show.html.erb +20 -20
  26. data/app/views/solid_queue_web/performance/index.html.erb +16 -14
  27. data/app/views/solid_queue_web/processes/index.html.erb +16 -16
  28. data/app/views/solid_queue_web/queues/index.html.erb +16 -16
  29. data/app/views/solid_queue_web/queues/jobs/index.html.erb +21 -21
  30. data/app/views/solid_queue_web/recurring_tasks/index.html.erb +15 -15
  31. data/app/views/solid_queue_web/search/index.html.erb +13 -13
  32. data/config/locales/en.yml +330 -0
  33. data/config/routes.rb +1 -0
  34. data/db/migrate/01_create_solid_queue_web_audit_events.rb +16 -0
  35. data/lib/generators/solid_queue_web/install/migrations_generator.rb +24 -0
  36. data/lib/generators/solid_queue_web/install/templates/create_solid_queue_web_audit_events.rb.tt +16 -0
  37. data/lib/solid_queue_web/engine.rb +1 -0
  38. data/lib/solid_queue_web/version.rb +1 -1
  39. data/lib/solid_queue_web.rb +18 -1
  40. metadata +8 -1
@@ -1,20 +1,20 @@
1
1
  <%= turbo_frame_tag "processes", target: "_top", data: { controller: "refresh", refresh_interval_value: SolidQueueWeb.default_refresh_interval } do %>
2
- <h1 class="sqd-page-title">Processes</h1>
2
+ <h1 class="sqd-page-title"><%= t("solid_queue_web.processes.title") %></h1>
3
3
 
4
4
  <div class="sqd-card">
5
5
  <% if @processes.empty? %>
6
- <div class="sqd-empty">No processes registered.</div>
6
+ <div class="sqd-empty"><%= t("solid_queue_web.processes.empty") %></div>
7
7
  <% else %>
8
8
  <table>
9
9
  <thead>
10
10
  <tr>
11
- <th scope="col">Kind</th>
12
- <th scope="col">Name</th>
13
- <th scope="col">PID</th>
14
- <th scope="col">Host</th>
15
- <th scope="col">Details</th>
16
- <th scope="col">Last Heartbeat</th>
17
- <th scope="col">Status</th>
11
+ <th scope="col"><%= t("solid_queue_web.processes.col_kind") %></th>
12
+ <th scope="col"><%= t("solid_queue_web.processes.col_name") %></th>
13
+ <th scope="col"><%= t("solid_queue_web.processes.col_pid") %></th>
14
+ <th scope="col"><%= t("solid_queue_web.processes.col_host") %></th>
15
+ <th scope="col"><%= t("solid_queue_web.processes.col_details") %></th>
16
+ <th scope="col"><%= t("solid_queue_web.processes.col_last_heartbeat") %></th>
17
+ <th scope="col"><%= t("solid_queue_web.processes.col_status") %></th>
18
18
  </tr>
19
19
  </thead>
20
20
  <tbody>
@@ -28,23 +28,23 @@
28
28
  <td class="sqd-process-meta">
29
29
  <% meta = process.metadata || {} %>
30
30
  <% if meta["queues"].present? %>
31
- <span title="Queues"><%= Array(meta["queues"]).join(", ") %></span>
31
+ <span title="<%= t("solid_queue_web.processes.queues_title") %>"><%= Array(meta["queues"]).join(", ") %></span>
32
32
  <% end %>
33
33
  <% if meta["thread_count"].present? %>
34
- <span class="sqd-muted-text"><%= meta["thread_count"] %> threads</span>
34
+ <span class="sqd-muted-text"><%= t("solid_queue_web.processes.threads", count: meta["thread_count"]) %></span>
35
35
  <% end %>
36
36
  <% if meta["polling_interval"].present? %>
37
- <span class="sqd-muted-text">every <%= meta["polling_interval"] %>s</span>
37
+ <span class="sqd-muted-text"><%= t("solid_queue_web.processes.polling_interval", interval: meta["polling_interval"]) %></span>
38
38
  <% end %>
39
39
  </td>
40
40
  <td class="sqd-mono sqd-muted-text" title="<%= process.last_heartbeat_at %>">
41
- <%= time_ago_in_words(process.last_heartbeat_at) %> ago
41
+ <%= t("solid_queue_web.processes.last_heartbeat_ago", time: time_ago_in_words(process.last_heartbeat_at)) %>
42
42
  </td>
43
43
  <td>
44
44
  <% if stale %>
45
- <span class="sqd-badge sqd-badge--failed">Stale</span>
45
+ <span class="sqd-badge sqd-badge--failed"><%= t("solid_queue_web.processes.status_stale") %></span>
46
46
  <% else %>
47
- <span class="sqd-badge sqd-badge--running">Healthy</span>
47
+ <span class="sqd-badge sqd-badge--running"><%= t("solid_queue_web.processes.status_healthy") %></span>
48
48
  <% end %>
49
49
  </td>
50
50
  </tr>
@@ -53,4 +53,4 @@
53
53
  </table>
54
54
  <% end %>
55
55
  </div>
56
- <% end %>
56
+ <% end %>
@@ -1,20 +1,20 @@
1
- <h1 class="sqd-page-title">Queues</h1>
1
+ <h1 class="sqd-page-title"><%= t("solid_queue_web.queues.title") %></h1>
2
2
 
3
3
  <div class="sqd-card">
4
4
  <% if @queues.empty? %>
5
- <div class="sqd-empty">No queues found.</div>
5
+ <div class="sqd-empty"><%= t("solid_queue_web.queues.empty") %></div>
6
6
  <% else %>
7
7
  <table>
8
8
  <thead>
9
9
  <tr>
10
- <th scope="col">Name</th>
11
- <th scope="col">Size</th>
12
- <th scope="col">Latency</th>
13
- <th scope="col">Done (24h)</th>
14
- <th scope="col">Failed (24h)</th>
15
- <th scope="col">Failure Rate (12h)</th>
16
- <th scope="col">Status</th>
17
- <th scope="col"><span class="sqd-sr-only">Actions</span></th>
10
+ <th scope="col"><%= t("solid_queue_web.queues.col_name") %></th>
11
+ <th scope="col"><%= t("solid_queue_web.queues.col_size") %></th>
12
+ <th scope="col"><%= t("solid_queue_web.queues.col_latency") %></th>
13
+ <th scope="col"><%= t("solid_queue_web.queues.col_done_24h") %></th>
14
+ <th scope="col"><%= t("solid_queue_web.queues.col_failed_24h") %></th>
15
+ <th scope="col"><%= t("solid_queue_web.queues.col_failure_rate") %></th>
16
+ <th scope="col"><%= t("solid_queue_web.queues.col_status") %></th>
17
+ <th scope="col"><span class="sqd-sr-only"><%= t("solid_queue_web.queues.actions") %></span></th>
18
18
  </tr>
19
19
  </thead>
20
20
  <tbody>
@@ -38,7 +38,7 @@
38
38
  <td>
39
39
  <% sparkline = @failure_sparklines[queue.name] %>
40
40
  <% if sparkline.any? %>
41
- <div class="sqd-mini-sparkline" aria-label="Failure rate last 12 hours for <%= queue.name %>">
41
+ <div class="sqd-mini-sparkline" aria-label="<%= t("solid_queue_web.queues.failure_rate_aria", queue: queue.name) %>">
42
42
  <% sparkline.each_with_index do |rate, i| %>
43
43
  <% pct = rate || 0 %>
44
44
  <% hour_label = (12 - i).hours.ago.strftime("%-I%p").downcase %>
@@ -53,19 +53,19 @@
53
53
  </td>
54
54
  <td>
55
55
  <% if @paused_queue_names.include?(queue.name) %>
56
- <span class="sqd-badge sqd-badge--paused">Paused</span>
56
+ <span class="sqd-badge sqd-badge--paused"><%= t("solid_queue_web.queues.status_paused") %></span>
57
57
  <% else %>
58
- <span class="sqd-badge sqd-badge--running">Running</span>
58
+ <span class="sqd-badge sqd-badge--running"><%= t("solid_queue_web.queues.status_running") %></span>
59
59
  <% end %>
60
60
  </td>
61
61
  <td class="sqd-row-actions">
62
62
  <% if @paused_queue_names.include?(queue.name) %>
63
- <%= button_to "Resume", queue_pause_path(queue.name), method: :delete,
63
+ <%= button_to t("solid_queue_web.queues.resume"), queue_pause_path(queue.name), method: :delete,
64
64
  class: "sqd-btn sqd-btn--primary sqd-btn--sm" %>
65
65
  <% else %>
66
- <%= button_to "Pause", queue_pause_path(queue.name), method: :post,
66
+ <%= button_to t("solid_queue_web.queues.pause"), queue_pause_path(queue.name), method: :post,
67
67
  class: "sqd-btn sqd-btn--muted sqd-btn--sm",
68
- data: { confirm: "Pause queue \"#{queue.name}\"?" } %>
68
+ data: { confirm: t("solid_queue_web.queues.confirm_pause", name: queue.name) } %>
69
69
  <% end %>
70
70
  </td>
71
71
  </tr>
@@ -1,9 +1,9 @@
1
1
  <div class="sqd-page-header">
2
2
  <div>
3
3
  <div class="sqd-breadcrumb">
4
- <%= link_to "Queues", queues_path %> &rsaquo; <%= @queue %>
4
+ <%= link_to t("solid_queue_web.queue_jobs.breadcrumb_queues"), queues_path %> &rsaquo; <%= @queue %>
5
5
  </div>
6
- <h1 class="sqd-page-title">Jobs</h1>
6
+ <h1 class="sqd-page-title"><%= t("solid_queue_web.queue_jobs.title") %></h1>
7
7
  </div>
8
8
  </div>
9
9
 
@@ -12,19 +12,19 @@
12
12
 
13
13
  <div class="sqd-page-header">
14
14
  <div class="sqd-filters">
15
- <%= link_to "Ready", queue_jobs_path(queue_name: @queue, status: "ready", q: @search), class: @status == "ready" ? "active" : "" %>
16
- <%= link_to "Scheduled", queue_jobs_path(queue_name: @queue, status: "scheduled", q: @search), class: @status == "scheduled" ? "active" : "" %>
17
- <%= link_to "Running", queue_jobs_path(queue_name: @queue, status: "claimed", q: @search), class: @status == "claimed" ? "active" : "" %>
18
- <%= link_to "Blocked", queue_jobs_path(queue_name: @queue, status: "blocked", q: @search), class: @status == "blocked" ? "active" : "" %>
19
- <%= link_to "Failed", queue_jobs_path(queue_name: @queue, status: "failed", q: @search), class: @status == "failed" ? "active" : "" %>
15
+ <%= link_to t("solid_queue_web.queue_jobs.tab_ready"), queue_jobs_path(queue_name: @queue, status: "ready", q: @search), class: @status == "ready" ? "active" : "" %>
16
+ <%= link_to t("solid_queue_web.queue_jobs.tab_scheduled"), queue_jobs_path(queue_name: @queue, status: "scheduled", q: @search), class: @status == "scheduled" ? "active" : "" %>
17
+ <%= link_to t("solid_queue_web.queue_jobs.tab_running"), queue_jobs_path(queue_name: @queue, status: "claimed", q: @search), class: @status == "claimed" ? "active" : "" %>
18
+ <%= link_to t("solid_queue_web.queue_jobs.tab_blocked"), queue_jobs_path(queue_name: @queue, status: "blocked", q: @search), class: @status == "blocked" ? "active" : "" %>
19
+ <%= link_to t("solid_queue_web.queue_jobs.tab_failed"), queue_jobs_path(queue_name: @queue, status: "failed", q: @search), class: @status == "failed" ? "active" : "" %>
20
20
  </div>
21
21
  <% if discardable && @jobs.any? %>
22
22
  <div class="sqd-actions">
23
- <%= button_to "Discard All", discard_all_queue_jobs_path(queue_name: @queue),
23
+ <%= button_to t("solid_queue_web.queue_jobs.discard_all"), discard_all_queue_jobs_path(queue_name: @queue),
24
24
  method: :post,
25
25
  params: { status: @status },
26
26
  class: "sqd-btn sqd-btn--danger",
27
- data: { confirm: "Discard all #{@jobs.size} #{@status} jobs in #{@queue}? This cannot be undone." } %>
27
+ data: { confirm: t("solid_queue_web.queue_jobs.confirm_discard_all", count: @jobs.size, status: @status, queue: @queue) } %>
28
28
  </div>
29
29
  <% end %>
30
30
  </div>
@@ -32,26 +32,26 @@
32
32
  <form class="sqd-search" action="<%= queue_jobs_path(queue_name: @queue) %>" method="get" data-controller="search">
33
33
  <input type="hidden" name="status" value="<%= @status %>">
34
34
  <input class="sqd-search__input" type="search" name="q" value="<%= @search %>"
35
- placeholder="Filter by job class…" autocomplete="off" aria-label="Filter by job class"
35
+ placeholder="<%= t("solid_queue_web.queue_jobs.placeholder_job_class") %>" autocomplete="off" aria-label="<%= t("solid_queue_web.queue_jobs.aria_filter_job_class") %>"
36
36
  data-action="input->search#filter">
37
- <button type="submit" class="sqd-btn sqd-btn--muted">Search</button>
37
+ <button type="submit" class="sqd-btn sqd-btn--muted"><%= t("solid_queue_web.queue_jobs.search_button") %></button>
38
38
  <% if @search.present? %>
39
- <%= link_to "Clear", queue_jobs_path(queue_name: @queue, status: @status), class: "sqd-btn sqd-btn--muted" %>
39
+ <%= link_to t("solid_queue_web.shared.clear"), queue_jobs_path(queue_name: @queue, status: @status), class: "sqd-btn sqd-btn--muted" %>
40
40
  <% end %>
41
41
  </form>
42
42
 
43
43
  <div class="sqd-card" id="jobs-list">
44
44
  <% if @jobs.empty? %>
45
- <div class="sqd-empty">No <%= @status %> jobs in <%= @queue %>.</div>
45
+ <div class="sqd-empty"><%= t("solid_queue_web.queue_jobs.no_jobs", status: @status, queue: @queue) %></div>
46
46
  <% else %>
47
47
  <table>
48
48
  <thead>
49
49
  <tr>
50
- <th scope="col">Job Class</th>
51
- <th scope="col">Priority</th>
52
- <th scope="col">Scheduled At</th>
53
- <th scope="col">Enqueued At</th>
54
- <% if discardable %><th scope="col"><span class="sqd-sr-only">Actions</span></th><% end %>
50
+ <th scope="col"><%= t("solid_queue_web.queue_jobs.col_job_class") %></th>
51
+ <th scope="col"><%= t("solid_queue_web.queue_jobs.col_priority") %></th>
52
+ <th scope="col"><%= t("solid_queue_web.queue_jobs.col_scheduled_at") %></th>
53
+ <th scope="col"><%= t("solid_queue_web.queue_jobs.col_enqueued_at") %></th>
54
+ <% if discardable %><th scope="col"><span class="sqd-sr-only"><%= t("solid_queue_web.queue_jobs.actions") %></span></th><% end %>
55
55
  </tr>
56
56
  </thead>
57
57
  <tbody>
@@ -69,11 +69,11 @@
69
69
  <td class="sqd-mono"><%= format_timestamp(job.created_at) %></td>
70
70
  <% if discardable %>
71
71
  <td class="sqd-row-actions">
72
- <%= button_to "Discard", queue_job_path(queue_name: @queue, id: execution),
72
+ <%= button_to t("solid_queue_web.queue_jobs.discard"), queue_job_path(queue_name: @queue, id: execution),
73
73
  method: :delete,
74
74
  params: { status: @status },
75
75
  class: "sqd-btn sqd-btn--danger sqd-btn--sm",
76
- data: { confirm: "Discard this job?" } %>
76
+ data: { confirm: t("solid_queue_web.queue_jobs.confirm_discard") } %>
77
77
  </td>
78
78
  <% end %>
79
79
  </tr>
@@ -86,4 +86,4 @@
86
86
  <% if @pagy.last > 1 %>
87
87
  <%= @pagy.series_nav.html_safe %>
88
88
  <% end %>
89
- <% end %>
89
+ <% end %>
@@ -1,20 +1,20 @@
1
- <h1 class="sqd-page-title">Recurring Tasks</h1>
1
+ <h1 class="sqd-page-title"><%= t("solid_queue_web.recurring_tasks.title") %></h1>
2
2
 
3
3
  <div class="sqd-card" style="margin-top: 1.5rem;">
4
4
  <% if @recurring_tasks.empty? %>
5
- <div class="sqd-empty">No recurring tasks configured.</div>
5
+ <div class="sqd-empty"><%= t("solid_queue_web.recurring_tasks.empty") %></div>
6
6
  <% else %>
7
7
  <table>
8
8
  <thead>
9
9
  <tr>
10
- <th scope="col">Key</th>
11
- <th scope="col">Schedule</th>
12
- <th scope="col">Job / Command</th>
13
- <th scope="col">Queue</th>
14
- <th scope="col">Next Run</th>
15
- <th scope="col">Last Run</th>
16
- <th scope="col">Type</th>
17
- <th scope="col"><span class="sqd-sr-only">Actions</span></th>
10
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_key") %></th>
11
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_schedule") %></th>
12
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_job_command") %></th>
13
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_queue") %></th>
14
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_next_run") %></th>
15
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_last_run") %></th>
16
+ <th scope="col"><%= t("solid_queue_web.recurring_tasks.col_type") %></th>
17
+ <th scope="col"><span class="sqd-sr-only"><%= t("solid_queue_web.shared.actions") %></span></th>
18
18
  </tr>
19
19
  </thead>
20
20
  <tbody>
@@ -56,20 +56,20 @@
56
56
  </td>
57
57
  <td>
58
58
  <% if task.static? %>
59
- <span class="sqd-badge sqd-badge--static">Static</span>
59
+ <span class="sqd-badge sqd-badge--static"><%= t("solid_queue_web.recurring_tasks.type_static") %></span>
60
60
  <% else %>
61
- <span class="sqd-badge sqd-badge--dynamic">Dynamic</span>
61
+ <span class="sqd-badge sqd-badge--dynamic"><%= t("solid_queue_web.recurring_tasks.type_dynamic") %></span>
62
62
  <% end %>
63
63
  </td>
64
64
  <td class="sqd-row-actions">
65
- <%= button_to "Run Now", recurring_task_run_path(task.key),
65
+ <%= button_to t("solid_queue_web.recurring_tasks.run_now"), recurring_task_run_path(task.key),
66
66
  method: :post,
67
67
  class: "sqd-btn sqd-btn--primary sqd-btn--sm",
68
- data: { confirm: "Run \"#{task.key}\" immediately?" } %>
68
+ data: { confirm: t("solid_queue_web.recurring_tasks.confirm_run_now", key: task.key) } %>
69
69
  </td>
70
70
  </tr>
71
71
  <% end %>
72
72
  </tbody>
73
73
  </table>
74
74
  <% end %>
75
- </div>
75
+ </div>
@@ -1,4 +1,4 @@
1
- <h1 class="sqd-page-title" style="margin-bottom: 1.5rem;">Search Jobs</h1>
1
+ <h1 class="sqd-page-title" style="margin-bottom: 1.5rem;"><%= t("solid_queue_web.search.title") %></h1>
2
2
 
3
3
  <datalist id="job-class-list">
4
4
  <% @job_classes.each do |klass| %>
@@ -8,42 +8,42 @@
8
8
 
9
9
  <form class="sqd-search sqd-search--global" action="<%= search_path %>" method="get" data-controller="search">
10
10
  <input class="sqd-search__input sqd-search__input--lg" type="search" name="q"
11
- value="<%= @query %>" placeholder="Search by job class name…"
11
+ value="<%= @query %>" placeholder="<%= t("solid_queue_web.search.placeholder") %>"
12
12
  list="job-class-list" autocomplete="off"
13
- aria-label="Search all jobs by class name"
13
+ aria-label="<%= t("solid_queue_web.search.aria_label") %>"
14
14
  data-action="change->search#select">
15
15
  <% if @query.present? %>
16
- <%= link_to "Clear", search_path, class: "sqd-btn sqd-btn--muted" %>
16
+ <%= link_to t("solid_queue_web.search.clear"), search_path, class: "sqd-btn sqd-btn--muted" %>
17
17
  <% end %>
18
18
  </form>
19
19
 
20
20
  <% if @query.present? %>
21
21
  <% if @results.empty? %>
22
- <div class="sqd-empty" style="margin-top: 1rem;">No jobs found matching &ldquo;<%= @query %>&rdquo;.</div>
22
+ <div class="sqd-empty" style="margin-top: 1rem;"><%= t("solid_queue_web.search.no_results", query: @query) %></div>
23
23
  <% else %>
24
24
  <% @results.each do |status, data| %>
25
25
  <div class="sqd-search-group">
26
26
  <div class="sqd-search-group__header">
27
27
  <span class="sqd-badge sqd-badge--<%= status %>"><%= status %></span>
28
28
  <span class="sqd-muted-text">
29
- <%= pluralize(data[:total], "match", "matches") %>
29
+ <%= t("solid_queue_web.search.matches", count: data[:total]) %>
30
30
  <% if data[:total] > SolidQueueWeb.search_results_limit %>
31
- &mdash; showing first <%= SolidQueueWeb.search_results_limit %>
31
+ <%= t("solid_queue_web.search.showing_first", limit: SolidQueueWeb.search_results_limit) %>
32
32
  <% end %>
33
33
  </span>
34
34
  <% if status == "failed" %>
35
- <%= link_to "View all →", failed_jobs_path(q: @query), class: "sqd-btn sqd-btn--muted sqd-btn--sm" %>
35
+ <%= link_to t("solid_queue_web.search.view_all"), failed_jobs_path(q: @query), class: "sqd-btn sqd-btn--muted sqd-btn--sm" %>
36
36
  <% else %>
37
- <%= link_to "View all →", jobs_path(status: status, q: @query), class: "sqd-btn sqd-btn--muted sqd-btn--sm" %>
37
+ <%= link_to t("solid_queue_web.search.view_all"), jobs_path(status: status, q: @query), class: "sqd-btn sqd-btn--muted sqd-btn--sm" %>
38
38
  <% end %>
39
39
  </div>
40
40
  <div class="sqd-card">
41
41
  <table>
42
42
  <thead>
43
43
  <tr>
44
- <th scope="col">Job Class</th>
45
- <th scope="col">Queue</th>
46
- <th scope="col">Enqueued At</th>
44
+ <th scope="col"><%= t("solid_queue_web.search.col_job_class") %></th>
45
+ <th scope="col"><%= t("solid_queue_web.search.col_queue") %></th>
46
+ <th scope="col"><%= t("solid_queue_web.search.col_enqueued_at") %></th>
47
47
  </tr>
48
48
  </thead>
49
49
  <tbody>
@@ -61,4 +61,4 @@
61
61
  </div>
62
62
  <% end %>
63
63
  <% end %>
64
- <% end %>
64
+ <% end %>