sidekiq 7.3.9 → 8.0.0.beta2

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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +28 -0
  3. data/README.md +16 -13
  4. data/bin/sidekiqload +10 -10
  5. data/bin/webload +69 -0
  6. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +5 -5
  7. data/lib/sidekiq/api.rb +120 -36
  8. data/lib/sidekiq/capsule.rb +6 -6
  9. data/lib/sidekiq/cli.rb +15 -19
  10. data/lib/sidekiq/client.rb +13 -16
  11. data/lib/sidekiq/component.rb +40 -2
  12. data/lib/sidekiq/config.rb +18 -15
  13. data/lib/sidekiq/embedded.rb +1 -0
  14. data/lib/sidekiq/iterable_job.rb +1 -0
  15. data/lib/sidekiq/job/iterable.rb +13 -4
  16. data/lib/sidekiq/job_retry.rb +17 -5
  17. data/lib/sidekiq/job_util.rb +5 -1
  18. data/lib/sidekiq/launcher.rb +1 -1
  19. data/lib/sidekiq/logger.rb +6 -10
  20. data/lib/sidekiq/manager.rb +0 -1
  21. data/lib/sidekiq/metrics/query.rb +71 -45
  22. data/lib/sidekiq/metrics/shared.rb +4 -1
  23. data/lib/sidekiq/metrics/tracking.rb +9 -7
  24. data/lib/sidekiq/middleware/current_attributes.rb +5 -17
  25. data/lib/sidekiq/paginator.rb +8 -1
  26. data/lib/sidekiq/processor.rb +21 -14
  27. data/lib/sidekiq/profiler.rb +59 -0
  28. data/lib/sidekiq/redis_client_adapter.rb +0 -1
  29. data/lib/sidekiq/testing.rb +2 -2
  30. data/lib/sidekiq/version.rb +2 -2
  31. data/lib/sidekiq/web/action.rb +104 -84
  32. data/lib/sidekiq/web/application.rb +347 -332
  33. data/lib/sidekiq/web/config.rb +116 -0
  34. data/lib/sidekiq/web/helpers.rb +41 -16
  35. data/lib/sidekiq/web/router.rb +60 -76
  36. data/lib/sidekiq/web.rb +51 -156
  37. data/lib/sidekiq.rb +1 -1
  38. data/sidekiq.gemspec +5 -4
  39. data/web/assets/javascripts/application.js +6 -13
  40. data/web/assets/javascripts/base-charts.js +30 -16
  41. data/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
  42. data/web/assets/javascripts/metrics.js +16 -34
  43. data/web/assets/stylesheets/style.css +750 -0
  44. data/web/locales/ar.yml +1 -0
  45. data/web/locales/cs.yml +1 -0
  46. data/web/locales/da.yml +1 -0
  47. data/web/locales/de.yml +1 -0
  48. data/web/locales/el.yml +1 -0
  49. data/web/locales/en.yml +6 -0
  50. data/web/locales/es.yml +24 -2
  51. data/web/locales/fa.yml +1 -0
  52. data/web/locales/fr.yml +1 -0
  53. data/web/locales/gd.yml +1 -0
  54. data/web/locales/he.yml +1 -0
  55. data/web/locales/hi.yml +1 -0
  56. data/web/locales/it.yml +1 -0
  57. data/web/locales/ja.yml +1 -0
  58. data/web/locales/ko.yml +1 -0
  59. data/web/locales/lt.yml +1 -0
  60. data/web/locales/nb.yml +1 -0
  61. data/web/locales/nl.yml +1 -0
  62. data/web/locales/pl.yml +1 -0
  63. data/web/locales/{pt-br.yml → pt-BR.yml} +2 -1
  64. data/web/locales/pt.yml +1 -0
  65. data/web/locales/ru.yml +1 -0
  66. data/web/locales/sv.yml +1 -0
  67. data/web/locales/ta.yml +1 -0
  68. data/web/locales/tr.yml +1 -0
  69. data/web/locales/uk.yml +1 -0
  70. data/web/locales/ur.yml +1 -0
  71. data/web/locales/vi.yml +1 -0
  72. data/web/locales/{zh-cn.yml → zh-CN.yml} +85 -73
  73. data/web/locales/{zh-tw.yml → zh-TW.yml} +2 -1
  74. data/web/views/_footer.erb +31 -33
  75. data/web/views/_job_info.erb +91 -89
  76. data/web/views/_metrics_period_select.erb +13 -10
  77. data/web/views/_nav.erb +14 -21
  78. data/web/views/_paging.erb +23 -21
  79. data/web/views/_poll_link.erb +2 -2
  80. data/web/views/_summary.erb +16 -16
  81. data/web/views/busy.erb +124 -122
  82. data/web/views/dashboard.erb +62 -66
  83. data/web/views/dead.erb +31 -27
  84. data/web/views/filtering.erb +3 -3
  85. data/web/views/layout.erb +6 -22
  86. data/web/views/metrics.erb +75 -81
  87. data/web/views/metrics_for_job.erb +45 -46
  88. data/web/views/morgue.erb +61 -70
  89. data/web/views/profiles.erb +43 -0
  90. data/web/views/queue.erb +54 -52
  91. data/web/views/queues.erb +43 -41
  92. data/web/views/retries.erb +66 -75
  93. data/web/views/retry.erb +32 -27
  94. data/web/views/scheduled.erb +58 -54
  95. data/web/views/scheduled_job_info.erb +1 -1
  96. metadata +32 -18
  97. data/web/assets/stylesheets/application-dark.css +0 -147
  98. data/web/assets/stylesheets/application-rtl.css +0 -163
  99. data/web/assets/stylesheets/application.css +0 -759
  100. data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
  101. data/web/assets/stylesheets/bootstrap.css +0 -5
  102. data/web/views/_status.erb +0 -4
data/web/views/busy.erb CHANGED
@@ -1,148 +1,150 @@
1
- <div class="header-container">
2
- <h1><%= t('Status') %></h1>
3
- </div>
1
+ <section>
2
+ <header>
3
+ <h1><%= t('Status') %></h1>
4
+ </header>
4
5
 
5
- <div class="stats-wrapper">
6
- <div class="stats-container">
7
- <div class="stat">
6
+ <div class="cards-container">
7
+ <article>
8
8
  <h3><%= s = processes.size; number_with_delimiter(s) %></h3>
9
9
  <p><%= t('Processes') %></p>
10
- </div>
11
- <div class="stat">
10
+ </article>
11
+ <article>
12
12
  <h3><%= x = processes.total_concurrency; number_with_delimiter(x) %></h3>
13
13
  <p><%= t('Threads') %></p>
14
- </div>
15
- <div class="stat">
14
+ </article>
15
+ <article>
16
16
  <h3><%= ws = workset.size; number_with_delimiter(ws) %></h3>
17
17
  <p><%= t('Busy') %></p>
18
- </div>
19
- <div class="stat">
18
+ </article>
19
+ <article>
20
20
  <h3><%= x == 0 ? 0 : ((ws / x.to_f) * 100).round(0) %>%</h3>
21
21
  <p><%= t('Utilization') %></p>
22
- </div>
23
- <div class="stat">
22
+ </article>
23
+ <article>
24
24
  <h3><%= format_memory(processes.total_rss) %></h3>
25
25
  <p><%= t('RSS') %></p>
26
- </div>
26
+ </article>
27
27
  </div>
28
- </div>
28
+ </section>
29
29
 
30
- <div class="header-container">
31
- <h1><%= t('Processes') %></h1>
32
- <div>
33
- <form method="POST" class="warning-messages">
30
+ <section>
31
+ <header>
32
+ <h2><%= t('Processes') %></h2>
33
+ <form method="POST" class="filter warning-messages">
34
34
  <%= csrf_tag %>
35
35
  <div class="btn-group pull-right flip">
36
36
  <input class="btn btn-warn" type="submit" name="quiet" value="<%= t('QuietAll') %>" data-confirm="<%= t('AreYouSure') %>"/>
37
37
  <input class="btn btn-danger" type="submit" name="stop" value="<%= t('StopAll') %>" data-confirm="<%= t('AreYouSure') %>"/>
38
38
  </div>
39
39
  </form>
40
- </div>
41
- </div>
40
+ </header>
42
41
 
43
- <div class="table_container">
44
- <table class="processes table table-hover table-bordered table-striped">
45
- <thead>
46
- <th><%= t('Name') %></th>
47
- <th><%= t('Started') %></th>
48
- <th class="col-sm-1"><%= t('RSS') %><a target="blank" href="https://github.com/sidekiq/sidekiq/wiki/Memory#rss"><span class="info-circle" title="Click to learn more about RSS">?</span></a></th>
49
- <th class="col-sm-1"><%= t('Threads') %></th>
50
- <th class="col-sm-1"><%= t('Busy') %></th>
51
- <th>&nbsp;</th>
52
- </thead>
53
- <% lead = processes.leader %>
54
- <% sorted_processes.each do |process| %>
55
- <tr>
56
- <td class="box">
57
- <%= "#{process['hostname']}:#{process['pid']}" %>
58
- <span class="label label-success"><%= process.tag %></span>
59
- <% process.labels.each do |label| %>
60
- <span class="label label-info"><%= label %></span>
61
- <% end %>
62
- <% if process.embedded? %>
63
- <span class="label label-default">embedded</span>
64
- <% end %>
65
- <% if process.stopping? %>
66
- <span class="label label-danger">quiet</span>
67
- <% end %>
68
- <% if process.identity == lead %>
69
- <span class="label label-warning">leader</span>
70
- <% end %>
71
- <br>
72
- <b><%= "#{t('Queues')}: " %></b>
73
- <% if process.weights %>
74
- <%= busy_weights(process.weights) %>
75
- <% else %>
76
- <%= process.queues.sort.join(", ") %>
77
- <% end %>
78
- <% if process.version != Sidekiq::VERSION %>
42
+ <div class="table_container">
43
+ <table>
44
+ <thead>
45
+ <th><%= t('Name') %></th>
46
+ <th><%= t('Started') %></th>
47
+ <th class="col-sm-1"><%= t('RSS') %><a target="blank" href="https://github.com/sidekiq/sidekiq/wiki/Memory#rss"><span class="info-circle" title="Click to learn more about RSS">?</span></a></th>
48
+ <th class="col-sm-1"><%= t('Threads') %></th>
49
+ <th class="col-sm-1"><%= t('Busy') %></th>
50
+ <th>&nbsp;</th>
51
+ </thead>
52
+ <% lead = processes.leader %>
53
+ <% sorted_processes.each do |process| %>
54
+ <tr>
55
+ <td class="box">
56
+ <%= "#{process['hostname']}:#{process['pid']}" %>
57
+ <span class="label label-success"><%= process.tag %></span>
58
+ <% process.labels.each do |label| %>
59
+ <span class="label label-info"><%= label %></span>
60
+ <% end %>
61
+ <% if process.embedded? %>
62
+ <span class="label label-default">embedded</span>
63
+ <% end %>
64
+ <% if process.stopping? %>
65
+ <span class="label label-danger">quiet</span>
66
+ <% end %>
67
+ <% if process.identity == lead %>
68
+ <span class="label label-warning">leader</span>
69
+ <% end %>
79
70
  <br>
80
- <b><%= "#{t('Version')}: " %></b>
81
- <% if process.version %>
82
- <%= process.version %>
71
+ <b><%= "#{t('Queues')}: " %></b>
72
+ <% if process.weights %>
73
+ <%= busy_weights(process.weights) %>
83
74
  <% else %>
84
- <%= t('Unknown') %>
75
+ <%= process.queues.sort.join(", ") %>
85
76
  <% end %>
86
- <% end %>
87
- </td>
88
- <td><%= relative_time(Time.at(process['started_at'])) %></td>
89
- <td class="num"><%= format_memory(process['rss'].to_i) %></td>
90
- <td class="num"><%= number_with_delimiter(process['concurrency']) %></td>
91
- <td class="num"><%= number_with_delimiter(process['busy']) %></td>
92
- <td>
93
- <% unless process.embedded? %>
94
- <form method="POST">
95
- <%= csrf_tag %>
96
- <input type="hidden" name="identity" value="<%= process['identity'] %>"/>
97
-
98
- <div class="btn-group pull-right flip">
99
- <% unless process.stopping? %><button class="btn btn-xs btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button><% end %>
100
- <button class="btn btn-xs btn-danger" type="submit" name="stop" value="1"><%= t('Stop') %></button>
101
- </div>
102
- </form>
103
- <% end %>
104
- </td>
105
- </tr>
106
- <% end %>
107
- </table>
108
- </div>
77
+ <% if process.version != Sidekiq::VERSION %>
78
+ <br>
79
+ <b><%= "#{t('Version')}: " %></b>
80
+ <% if process.version %>
81
+ <%= process.version %>
82
+ <% else %>
83
+ <%= t('Unknown') %>
84
+ <% end %>
85
+ <% end %>
86
+ </td>
87
+ <td><%= relative_time(Time.at(process['started_at'])) %></td>
88
+ <td class="num"><%= format_memory(process['rss'].to_i) %></td>
89
+ <td class="num"><%= number_with_delimiter(process['concurrency']) %></td>
90
+ <td class="num"><%= number_with_delimiter(process['busy']) %></td>
91
+ <td>
92
+ <% unless process.embedded? %>
93
+ <form method="POST">
94
+ <%= csrf_tag %>
95
+ <input type="hidden" name="identity" value="<%= process['identity'] %>"/>
109
96
 
110
- <div class="header-container">
111
- <h1><%= t('Jobs') %></h1>
112
- <% if @workset.size > 0 && @total_size > @count %>
113
- <%= erb :_paging, locals: { url: "#{root_path}busy" } %>
114
- <% end %>
115
- </div>
97
+ <div class="btn-group">
98
+ <% unless process.stopping? %><button class="btn btn-warn" type="submit" name="quiet" value="1"><%= t('Quiet') %></button><% end %>
99
+ <button class="btn btn-danger" type="submit" name="stop" value="1"><%= t('Stop') %></button>
100
+ </div>
101
+ </form>
102
+ <% end %>
103
+ </td>
104
+ </tr>
105
+ <% end %>
106
+ </table>
107
+ </div>
108
+ </section>
116
109
 
117
- <div class="table_container">
118
- <table class="workers table table-hover table-bordered table-striped">
119
- <thead>
120
- <th><%= t('Process') %></th>
121
- <th><%= t('TID') %></th>
122
- <th><%= t('JID') %></th>
123
- <th><%= t('Queue') %></th>
124
- <th><%= t('Job') %></th>
125
- <th><%= t('Arguments') %></th>
126
- <th><%= t('Started') %></th>
127
- </thead>
128
- <% @workset.each do |process, thread, work| %>
129
- <% job = work.job %>
130
- <tr>
131
- <td><%= process %></td>
132
- <td><%= thread %></td>
133
- <td><%= job.jid %></td>
134
- <td>
135
- <a href="<%= root_path %>queues/<%= work.queue %>"><%= work.queue %></a>
136
- </td>
137
- <td>
138
- <%= job.display_class %>
139
- <%= display_tags(job, nil) %>
140
- </td>
141
- <td>
142
- <div class="args"><%= display_args(job.display_args) %></div>
143
- </td>
144
- <td><%= relative_time(work.run_at) %></td>
145
- </tr>
110
+ <section>
111
+ <header>
112
+ <h2><%= t('Jobs') %></h2>
113
+ <% if @workset.size > 0 && @total_size > @count %>
114
+ <%= erb :_paging, locals: { url: "#{root_path}busy" } %>
146
115
  <% end %>
147
- </table>
148
- </div>
116
+ </header>
117
+
118
+ <div class="table_container">
119
+ <table>
120
+ <thead>
121
+ <th><%= t('Process') %></th>
122
+ <th><%= t('TID') %></th>
123
+ <th><%= t('JID') %></th>
124
+ <th><%= t('Queue') %></th>
125
+ <th><%= t('Job') %></th>
126
+ <th><%= t('Arguments') %></th>
127
+ <th><%= t('Started') %></th>
128
+ </thead>
129
+ <% @workset.each do |process, thread, work| %>
130
+ <% job = work.job %>
131
+ <tr>
132
+ <td><%= process %></td>
133
+ <td><%= thread %></td>
134
+ <td><%= job.jid %></td>
135
+ <td>
136
+ <a href="<%= root_path %>queues/<%= work.queue %>"><%= work.queue %></a>
137
+ </td>
138
+ <td>
139
+ <%= job.display_class %>
140
+ <%= display_tags(job, nil) %>
141
+ </td>
142
+ <td>
143
+ <code><div class="args"><%= display_args(job.display_args) %></div></code>
144
+ </td>
145
+ <td><%= relative_time(work.run_at) %></td>
146
+ </tr>
147
+ <% end %>
148
+ </table>
149
+ </div>
150
+ </section>
@@ -1,51 +1,51 @@
1
1
  <script type="text/javascript" src="<%= root_path %>javascripts/dashboard.js" nonce="<%= csp_nonce %>"></script>
2
- <div class= "dashboard clearfix">
3
- <h3 >
4
- <%= t('Dashboard') %>
5
- <span id="beacon" class="beacon">
6
- <span class="ring"></span>
7
- <span class="dot"></span>
8
- </span>
9
- </h3>
10
- <div class="interval-slider ltr">
11
- <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
12
- <span id="sldr-text" class="current-interval">5 s</span>
13
- <br/>
14
- <input id="sldr" aria-label="<%= t("PollingIntervalMilliseconds") %>" type="range" min="2000" max="20000" step="1000" value="5000"/>
15
- </div>
16
- </div>
17
2
 
18
- <div class="row chart">
19
- <span id="sr-last-dashboard-update-template" hidden="hidden"><%= t("LastDashboardUpdateTemplateLiteral") %></span>
20
- <span id="sr-last-dashboard-update" class="sr-only" role="status"></span>
3
+ <section>
4
+ <header>
5
+ <h1>
6
+ <%= t('Dashboard') %>
7
+ <span id="beacon" class="beacon"></span>
8
+ </h1>
9
+ <div class="filter interval-slider">
10
+ <span class="interval-slider-label"><%= t('PollingInterval') %>:</span>
11
+ <span id="sldr-text" class="current-interval">5 s</span>
12
+ <br/>
13
+ <input id="sldr" aria-label="<%= t("PollingIntervalMilliseconds") %>" role="slider" type="range" min="2000" max="20000" step="1000" value="5000"/>
14
+ </div>
15
+ </header>
21
16
 
22
- <canvas id="realtime-chart">
23
- <%= to_json({
24
- processedLabel: t('Processed'),
25
- failedLabel: t('Failed'),
26
- labels: Array.new(50, ""),
27
- processed: Array.new(50),
28
- failed: Array.new(50),
29
- updateUrl: "#{root_path}stats",
30
- }) %>
31
- </canvas>
17
+ <div class="chart">
18
+ <span id="sr-last-dashboard-update-template" hidden="hidden"><%= t("LastDashboardUpdateTemplateLiteral") %></span>
19
+ <span id="sr-last-dashboard-update" class="sr-only" role="status"></span>
32
20
 
33
- <!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
34
- <div id="realtime-legend">&nbsp;</div>
35
- </div>
21
+ <canvas id="realtime-chart">
22
+ <%= to_json({
23
+ processedLabel: t('Processed'),
24
+ failedLabel: t('Failed'),
25
+ labels: Array.new(50, ""),
26
+ processed: Array.new(50),
27
+ failed: Array.new(50),
28
+ updateUrl: "#{root_path}stats",
29
+ }) %>
30
+ </canvas>
36
31
 
37
- <div class="row header">
38
- <div class="col-sm-4 pull-left flip">
39
- <h3><%= t('History') %></h3>
40
- </div>
41
- </div>
42
- <div class="row chart">
43
- <div>
44
- <a href="<%= root_path %>?days=7" class="history-graph <%= "active" if params[:days] == "7" %>"><%= t('OneWeek') %></a>
45
- <a href="<%= root_path %>" class="history-graph <%= "active" if params[:days].nil? || params[:days] == "30" %>"><%= t('OneMonth') %></a>
46
- <a href="<%= root_path %>?days=90" class="history-graph <%= "active" if params[:days] == "90" %>"><%= t('ThreeMonths') %></a>
47
- <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if params[:days] == "180" %>"><%= t('SixMonths') %></a>
32
+ <!-- start with a space in the legend so the height doesn't change when we add content dynamically -->
33
+ <div id="realtime-legend">&nbsp;</div>
48
34
  </div>
35
+ </section>
36
+
37
+ <section>
38
+ <header>
39
+ <h2><%= t('History') %></h2>
40
+
41
+ <div class="filter">
42
+ <% d = url_params("days") %>
43
+ <a href="<%= root_path %>?days=7" class="history-graph <%= "active" if d == "7" %>"><%= t('OneWeek') %></a>
44
+ <a href="<%= root_path %>" class="history-graph <%= "active" if d.nil? || d == "30" %>"><%= t('OneMonth') %></a>
45
+ <a href="<%= root_path %>?days=90" class="history-graph <%= "active" if d == "90" %>"><%= t('ThreeMonths') %></a>
46
+ <a href="<%= root_path %>?days=180" class="history-graph <%= "active" if d == "180" %>"><%= t('SixMonths') %></a>
47
+ </div>
48
+ </header>
49
49
 
50
50
  <canvas id="history-chart">
51
51
  <%= to_json({
@@ -55,54 +55,50 @@
55
55
  failed: @failed_history.to_a.reverse,
56
56
  }) %>
57
57
  </canvas>
58
- </div>
58
+ </section>
59
59
 
60
- <br/>
61
- <div class="row header">
62
- <div class="col-sm-4 pull-left flip">
63
- <h3>Redis</h3>
64
- </div>
65
- </div>
66
- <div class="stats-wrapper">
67
- <div class="stats-container">
68
- <% if @redis_info.fetch("redis_version", nil) %>
69
- <div class="stat">
70
- <h3 id="redis_version"><%= @redis_info.fetch("redis_version") %></h3>
71
- <p><%= t('Version') %></p>
72
- </div>
73
- <% end %>
60
+ <section>
61
+ <header>
62
+ <h2><%= store_name %></h2>
63
+ </header>
64
+ <div class="cards-container">
65
+ <article>
66
+ <h3 id="redis_version"><%= store_version %></h3>
67
+ <p><%= t('Version') %></p>
68
+ </article>
74
69
 
75
70
  <% if @redis_info.fetch("uptime_in_days", nil) %>
76
- <div class="stat">
71
+ <article>
77
72
  <h3 id="uptime_in_days"><%= @redis_info.fetch("uptime_in_days") %></h3>
78
73
  <p><%= t('Uptime') %></p>
79
- </div>
74
+ </article>
80
75
  <% end %>
81
76
 
82
77
  <% if @redis_info.fetch("connected_clients", nil) %>
83
- <div class="stat">
78
+ <article>
84
79
  <h3 id="connected_clients"><%= @redis_info.fetch("connected_clients") %></h3>
85
80
  <p><%= t('Connections') %></p>
86
- </div>
81
+ </article>
87
82
  <% end %>
88
83
 
89
84
  <% if @redis_info.fetch("used_memory_human", nil) %>
90
- <div class="stat">
85
+ <article>
91
86
  <h3 id="used_memory_human"><%= @redis_info.fetch("used_memory_human") %></h3>
92
87
  <p><%= t('MemoryUsage') %></p>
93
- </div>
88
+ </article>
94
89
  <% end %>
95
90
 
96
91
  <% if @redis_info.fetch("used_memory_peak_human", nil) %>
97
- <div class="stat">
92
+ <article>
98
93
  <h3 id="used_memory_peak_human"><%= @redis_info.fetch("used_memory_peak_human") %></h3>
99
94
  <p><%= t('PeakMemoryUsage') %></p>
100
- </div>
95
+ </article>
101
96
  <% end %>
102
97
  </div>
103
- </div>
98
+ </section>
104
99
 
105
100
  <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js" nonce="<%= csp_nonce %>"></script>
106
101
  <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js" nonce="<%= csp_nonce %>"></script>
102
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-adapter-date-fns.min.js" nonce="<%= csp_nonce %>"></script>
107
103
  <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js" nonce="<%= csp_nonce %>"></script>
108
104
  <script type="text/javascript" src="<%= root_path %>javascripts/dashboard-charts.js" nonce="<%= csp_nonce %>"></script>
data/web/views/dead.erb CHANGED
@@ -1,34 +1,38 @@
1
1
  <%= erb :_job_info, locals: { job: @dead, type: :dead } %>
2
2
 
3
- <h3><%= t('Error') %></h3>
4
- <div class="table_container">
5
- <table class="error table table-bordered table-striped table-hover">
6
- <tbody>
7
- <tr>
8
- <th><%= t('ErrorClass') %></th>
9
- <td>
10
- <code><%= @dead['error_class'] %></code>
11
- </td>
12
- </tr>
13
- <tr>
14
- <th><%= t('ErrorMessage') %></th>
15
- <td><%= h(@dead['error_message']) %></td>
16
- </tr>
17
- <% if @dead.error_backtrace %>
3
+ <section>
4
+ <header>
5
+ <h1><%= t('Error') %></h1>
6
+ </header>
7
+ <div class="table_container">
8
+ <table>
9
+ <tbody>
18
10
  <tr>
19
- <th><%= t('ErrorBacktrace') %></th>
11
+ <th><%= t('ErrorClass') %></th>
20
12
  <td>
21
- <code><%= @dead.error_backtrace.join("<br/>") %></code>
13
+ <code><%= @dead['error_class'] %></code>
22
14
  </td>
23
15
  </tr>
24
- <% end %>
25
- </tbody>
26
- </table>
27
- </div>
16
+ <tr>
17
+ <th><%= t('ErrorMessage') %></th>
18
+ <td><%= h(@dead['error_message']) %></td>
19
+ </tr>
20
+ <% if @dead.error_backtrace %>
21
+ <tr>
22
+ <th><%= t('ErrorBacktrace') %></th>
23
+ <td>
24
+ <code><%= @dead.error_backtrace.join("<br/>") %></code>
25
+ </td>
26
+ </tr>
27
+ <% end %>
28
+ </tbody>
29
+ </table>
30
+ </div>
28
31
 
29
- <form class="form-horizontal" action="<%= root_path %>morgue/<%= job_params(@dead, @dead.score) %>" method="post">
30
- <%= csrf_tag %>
31
- <a class="btn btn-default" href="<%= root_path %>morgue"><%= t('GoBack') %></a>
32
- <input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>" />
33
- <input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>" />
34
- </form>
32
+ <form action="<%= root_path %>morgue/<%= job_params(@dead, @dead.score) %>" method="post">
33
+ <%= csrf_tag %>
34
+ <a class="btn btn-default" href="<%= root_path %>morgue"><%= t('GoBack') %></a>
35
+ <input class="btn btn-primary" type="submit" name="retry" value="<%= t('RetryNow') %>" />
36
+ <input class="btn btn-danger" type="submit" name="delete" value="<%= t('Delete') %>" />
37
+ </form>
38
+ </section>
@@ -1,6 +1,6 @@
1
- <div>
2
- <form method="get" class="form-inline" action='<%= root_path %><%= which %>'>
1
+ <div class="filter">
2
+ <form role="search" method="get" class="form-inline" action='<%= root_path %><%= which %>'>
3
3
  <label for="substr"><%= t('Filter') %></label>
4
- <input class="search form-control" type="search" name="substr" value="<%= h params[:substr] %>" placeholder="<%= t('AnyJobContent') %>"/>
4
+ <input class="form-control" type="search" name="substr" value="<%= h url_params("substr") %>" placeholder="<%= t('AnyJobContent') %>"/>
5
5
  </form>
6
6
  </div>
data/web/views/layout.erb CHANGED
@@ -1,20 +1,11 @@
1
1
  <!doctype html>
2
- <html dir="<%= text_direction %>">
2
+ <html dir="<%= text_direction %>" lang="<%= locale %>">
3
3
  <head>
4
4
  <title><%= environment_title_prefix %><%= Sidekiq::NAME %></title>
5
5
  <meta charset="utf-8" />
6
6
  <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
7
 
8
- <link href="<%= root_path %>stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
9
- <% if rtl? %>
10
- <link href="<%= root_path %>stylesheets/bootstrap-rtl.min.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>"/>
11
- <% end %>
12
-
13
- <link href="<%= root_path %>stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
14
- <link href="<%= root_path %>stylesheets/application-dark.css" media="screen and (prefers-color-scheme: dark)" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
15
- <% if rtl? %>
16
- <link href="<%= root_path %>stylesheets/application-rtl.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
17
- <% end %>
8
+ <link href="<%= root_path %>stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" nonce="<%= csp_nonce %>" />
18
9
 
19
10
  <link rel="apple-touch-icon" href="<%= root_path %>images/apple-touch-icon.png">
20
11
  <link rel="shortcut icon" type="image/ico" href="<%= root_path %>images/favicon.ico" />
@@ -24,19 +15,12 @@
24
15
  </head>
25
16
  <body class="admin" data-locale="<%= locale %>">
26
17
  <%= erb :_nav %>
27
- <div id="page">
18
+ <main id="page">
28
19
  <div class="container">
29
- <div class="row">
30
- <div class="col-sm-12 summary_bar">
31
- <%= erb :_summary %>
32
- </div>
33
-
34
- <div class="col-sm-12">
35
- <%= yield %>
36
- </div>
37
- </div>
20
+ <%= erb :_summary %>
21
+ <%= yield %>
38
22
  </div>
39
- </div>
23
+ </main>
40
24
  <%= erb :_footer %>
41
25
  </body>
42
26
  </html>