sidekiq-undertaker 1.4.1 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -1
  3. data/.github/workflows/ruby-build.yml +10 -10
  4. data/.rubocop.yml +1 -1
  5. data/.rubocop_codeclimate.yml +1 -1
  6. data/CHANGELOG.md +12 -0
  7. data/lib/sidekiq/undertaker/dead_job.rb +1 -1
  8. data/lib/sidekiq/undertaker/version.rb +1 -1
  9. data/lib/sidekiq/undertaker.rb +16 -0
  10. data/sidekiq-undertaker.gemspec +8 -8
  11. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  12. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +265 -0
  13. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  14. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +250 -0
  15. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  16. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +250 -0
  17. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  18. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +240 -0
  19. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  20. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +240 -0
  21. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  22. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +335 -0
  23. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  24. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +293 -0
  25. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  26. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +1319 -0
  27. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  28. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +293 -0
  29. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1 -1
  30. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv7.approved.txt +1319 -0
  31. data/spec/sidekiq/undertaker_spec.rb +26 -0
  32. metadata +71 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bb9cb0de79a210eecb875abea9d75cf30f228c294ac9af748a0e90bd2634433
4
- data.tar.gz: efeafbf06536b5ce50ea2d0f13286c92829d11c9168dbd608bf60ade9ad80cde
3
+ metadata.gz: f75ca3784fd83c8eecbaa7cd9a8159577b0f1fe8dd6b7a0d05a7873d58650778
4
+ data.tar.gz: 59c031dc4a5d2aceeea04a099fce4935ab7f43989e50f4353c03d0c5a6690c89
5
5
  SHA512:
6
- metadata.gz: f4c2faf722ee34829c0de7d9c403f42cc148784a735a036de962651e5f7eb02b385a6044cf72da3d8b9290c247b8fcca751ef161ab89f1ef658ce9312e7151bf
7
- data.tar.gz: e599c728949f5363b1d19dcbacc590e606adcd6c15ce4ef2866bc73924f906c5a2b51b6f6533df5d147a2f97fea790fec68cb8f63200aefe00bd0cde792c3f02
6
+ metadata.gz: f5a04ed46664c16dcea8107c76b9421bea08516d08a343d82bfeebd2323d97ff4b57ec1f5c1c1c0ad400af09746341db141d2fdcd35533ca5c5d6b2330182efd
7
+ data.tar.gz: 52f8e24affefceed9019eb88c82318ff391096fa00c17ea2200da4d69297edc0f238b072a2446154678a4e5c4de38eed818f1025aac896ab06cd73a7e7c33ff0
data/.codeclimate.yml CHANGED
@@ -8,6 +8,6 @@ plugins:
8
8
  enabled: true
9
9
  rubocop:
10
10
  enabled: true
11
- channel: rubocop-1-8-1
11
+ channel: rubocop-1-31-0
12
12
  config:
13
13
  file: .rubocop_codeclimate.yml
@@ -17,6 +17,7 @@ jobs:
17
17
  test:
18
18
 
19
19
  runs-on: ubuntu-latest
20
+ continue-on-error: ${{ matrix.experimental }} # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idcontinue-on-error
20
21
 
21
22
  services:
22
23
  redis:
@@ -28,15 +29,14 @@ jobs:
28
29
  fail-fast: false
29
30
  matrix:
30
31
  # SEE: https://github.com/ruby/setup-ruby#supported-versions
31
- ruby-version:
32
- - 'ruby'
33
- - '3.1'
34
- - '2.7'
35
- - 'jruby'
36
- - 'jruby-9.3.2.0'
37
- - 'jruby-9.2.20.1'
38
- - 'truffleruby'
39
- - 'truffleruby+graalvm'
32
+ # https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs#expanding-or-adding-matrix-configurations
33
+ ruby-version: ['ruby', '3.1', '2.7.6', 'jruby', 'jruby-9.3.9.0']
34
+ experimental: [false]
35
+ include: # HINT: Do not use arrays for values here
36
+ - ruby-version: 'truffleruby'
37
+ experimental: true
38
+ - ruby-version: 'truffleruby+graalvm'
39
+ experimental: true
40
40
 
41
41
  env:
42
42
  JRUBY_OPTS: '--debug'
@@ -71,7 +71,7 @@ jobs:
71
71
  with:
72
72
  name: coverage-report
73
73
  path: ./coverage
74
- - uses: paambaati/codeclimate-action@v3.0.0
74
+ - uses: paambaati/codeclimate-action@v3.2.0
75
75
  env:
76
76
  # Set CC_TEST_REPORTER_ID as secret of your repo
77
77
  CC_TEST_REPORTER_ID: ${{secrets.CC_TEST_REPORTER_ID}}
data/.rubocop.yml CHANGED
@@ -6,7 +6,7 @@ require:
6
6
  inherit_from: .rubocop_todo.yml
7
7
 
8
8
  AllCops:
9
- TargetRubyVersion: 2.5
9
+ TargetRubyVersion: 2.6
10
10
 
11
11
  Layout/LineLength:
12
12
  Exclude:
@@ -7,7 +7,7 @@ inherit_from:
7
7
  - .rubocop_todo.yml
8
8
 
9
9
  AllCops:
10
- TargetRubyVersion: 2.5
10
+ TargetRubyVersion: 2.6
11
11
 
12
12
  Layout/LineLength:
13
13
  Exclude:
data/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## [1.6.0] - 2022-11-02
6
+
7
+ ### Changed
8
+ - Updated rubocop to version 1.37 and set the required_ruby_version to >= 2.6
9
+ - Update sidekiq dependency to allow version 7
10
+
11
+ ## [1.5.0] - 2022-09-06
12
+
13
+ ### Changed
14
+ - Updated max error message length to be configurable
15
+ - Updated rack-test requirement from ~> 1.1 to ~> 2.0
16
+
5
17
  ## [1.4.1] - 2022-06-03
6
18
  ### Fixed
7
19
  - Fix downgrade rubocop to '1.28' to keep support for JRuby '9.2.20.1'
@@ -53,7 +53,7 @@ module Sidekiq
53
53
  attr_writer :job_class, :time_elapsed_since_failure, :error_class, :error_message, :bucket_name, :job
54
54
 
55
55
  def shorten_error_msg(msg)
56
- max_error_msg_length = 30
56
+ max_error_msg_length = Sidekiq::Undertaker.max_error_msg_length
57
57
 
58
58
  msg.length > max_error_msg_length ? "#{msg[0, max_error_msg_length]}..." : msg
59
59
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sidekiq
4
4
  module Undertaker
5
- VERSION = "1.4.1"
5
+ VERSION = "1.6.0"
6
6
  end
7
7
  end
@@ -14,3 +14,19 @@ if defined?(Sidekiq::Web)
14
14
  Sidekiq::Web.tabs["Undertaker"] = "undertaker/filter"
15
15
  Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "../../web/locales")
16
16
  end
17
+
18
+ module Sidekiq
19
+ module Undertaker
20
+ @config = {
21
+ max_error_msg_length: 30
22
+ }
23
+
24
+ def self.max_error_msg_length=(value)
25
+ @config[:max_error_msg_length] = Integer(value)
26
+ end
27
+
28
+ def self.max_error_msg_length
29
+ @config[:max_error_msg_length]
30
+ end
31
+ end
32
+ end
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  "rubygems_mfa_required" => "true"
28
28
  }
29
29
 
30
- spec.required_ruby_version = ">= 2.5.0"
30
+ spec.required_ruby_version = ">= 2.6.0"
31
31
 
32
32
  spec.files = `git ls-files -z`.split("\x0")
33
33
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -39,21 +39,21 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "approvals", "~> 0.0.25"
40
40
  spec.add_development_dependency "mock_redis", "~> 0.19"
41
41
  spec.add_development_dependency "pry", "~> 0.12"
42
- spec.add_development_dependency "rack-test", "~> 1.1"
42
+ spec.add_development_dependency "rack-test", "~> 2.0"
43
43
  spec.add_development_dependency "rb-readline", "~> 0.5"
44
44
  spec.add_development_dependency "rspec", "~> 3.8"
45
45
  spec.add_development_dependency "rspec-core", "~> 3.8"
46
46
  spec.add_development_dependency "rspec-mocks", "~> 3.8"
47
47
  spec.add_development_dependency "rspec-sidekiq", "~> 3.0"
48
- spec.add_development_dependency "rt_rubocop_defaults", "~> 2.3"
49
- spec.add_development_dependency "rubocop", "~> 1.28"
50
- spec.add_development_dependency "rubocop-rake", "~> 0.5"
51
- spec.add_development_dependency "rubocop-rspec", "~> 2.0"
52
- spec.add_development_dependency "rubocop_runner", "~> 2.1"
48
+ spec.add_development_dependency "rt_rubocop_defaults", "~> 2.4"
49
+ spec.add_development_dependency "rubocop", "~> 1.37"
50
+ spec.add_development_dependency "rubocop-rake", "~> 0.6"
51
+ spec.add_development_dependency "rubocop-rspec", "~> 2.14"
52
+ spec.add_development_dependency "rubocop_runner", "~> 2.2"
53
53
  spec.add_development_dependency "simplecov", "~> 0.21"
54
54
  spec.add_development_dependency "sinatra", "~> 2.0"
55
55
  spec.add_development_dependency "timecop", "~> 0.9"
56
56
 
57
57
  spec.add_runtime_dependency "rubyzip", "~> 2.3"
58
- spec.add_runtime_dependency "sidekiq", ">= 6.4", "< 7"
58
+ spec.add_runtime_dependency "sidekiq", ">= 6.4", "< 8"
59
59
  end
@@ -22,7 +22,7 @@
22
22
  <div class="navbar navbar-default navbar-fixed-top">
23
23
  <div class="container-fluid">
24
24
  <div class="navbar-header" data-navbar="static">
25
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-menu">
25
+ <button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
26
26
  <span class="icon-bar"></span>
27
27
  <span class="icon-bar"></span>
28
28
  <span class="icon-bar"></span>
@@ -0,0 +1,265 @@
1
+ <!doctype html>
2
+ <html dir="ltr">
3
+ <head>
4
+ <title>[TEST] Sidekiq</title>
5
+ <meta charset="utf-8" />
6
+ <meta name="viewport" content="width=device-width,initial-scale=1.0" />
7
+
8
+ <link href="/sidekiq/stylesheets/bootstrap.css" media="screen" rel="stylesheet" type="text/css" />
9
+
10
+
11
+ <link href="/sidekiq/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />
12
+ <link href="/sidekiq/stylesheets/application-dark.css" media="screen and (prefers-color-scheme: dark)" rel="stylesheet" type="text/css" />
13
+
14
+
15
+ <link rel="apple-touch-icon" href="/sidekiq/images/apple-touch-icon.png">
16
+ <link rel="shortcut icon" type="image/ico" href="/sidekiq/images/favicon.ico" />
17
+ <script type="text/javascript" src="/sidekiq/javascripts/application.js"></script>
18
+ <meta name="google" content="notranslate" />
19
+
20
+ </head>
21
+ <body class="admin" data-locale="en">
22
+ <div class="navbar navbar-default navbar-fixed-top">
23
+ <div class="container-fluid">
24
+ <div class="navbar-header" data-navbar="static">
25
+ <button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
26
+ <span class="icon-bar"></span>
27
+ <span class="icon-bar"></span>
28
+ <span class="icon-bar"></span>
29
+ </button>
30
+ <div class="navbar-toggle collapsed navbar-livereload">
31
+
32
+ <a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
33
+ <a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
34
+
35
+
36
+
37
+ </div>
38
+ <a class="navbar-brand" href="/sidekiq/">
39
+ Sidekiq
40
+ <span class="status">
41
+ <i class="status-sprite status-idle"></i>
42
+ idle
43
+ </span>
44
+
45
+ </a>
46
+ </div>
47
+
48
+ <div class="collapse navbar-collapse" id="navbar-menu">
49
+ <ul class="nav navbar-nav" data-navbar="static">
50
+
51
+
52
+ <li class="">
53
+ <a href="/sidekiq/">Dashboard</a>
54
+ </li>
55
+
56
+
57
+
58
+ <li class="">
59
+ <a href="/sidekiq/busy">Busy</a>
60
+ </li>
61
+
62
+
63
+
64
+ <li class="">
65
+ <a href="/sidekiq/queues">Queues</a>
66
+ </li>
67
+
68
+
69
+
70
+ <li class="">
71
+ <a href="/sidekiq/retries">Retries</a>
72
+ </li>
73
+
74
+
75
+
76
+ <li class="">
77
+ <a href="/sidekiq/scheduled">Scheduled</a>
78
+ </li>
79
+
80
+
81
+
82
+ <li class="">
83
+ <a href="/sidekiq/morgue">Dead</a>
84
+ </li>
85
+
86
+
87
+
88
+ <li class="">
89
+ <a href="/sidekiq/metrics">Metrics</a>
90
+ </li>
91
+
92
+
93
+
94
+
95
+ <li class="active" data-navbar="custom-tab">
96
+ <a href="/sidekiq/undertaker/filter">Undertaker</a>
97
+ </li>
98
+
99
+
100
+ <li class="navbar-livereload">
101
+ <div class="poll-wrapper">
102
+
103
+ <a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
104
+ <a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
105
+
106
+
107
+
108
+ </div>
109
+ </li>
110
+ </ul>
111
+ </div>
112
+ </div>
113
+ </div>
114
+
115
+ <div id="page">
116
+ <div class="container">
117
+ <div class="row">
118
+ <div class="col-sm-12 summary_bar">
119
+ <ul class="list-unstyled summary row">
120
+ <li class="processed col-sm-1">
121
+ <span id="txtProcessed" class="count">0</span>
122
+ <span class="desc">Processed</span>
123
+ </li>
124
+ <li class="failed col-sm-1">
125
+ <span id="txtFailed" class="count">0</span>
126
+ <span class="desc">Failed</span>
127
+ </li>
128
+ <li class="busy col-sm-1">
129
+ <a href="/sidekiq/busy">
130
+ <span id="txtBusy" class="count">0</span>
131
+ <span class="desc">Busy</span>
132
+ </a>
133
+ </li>
134
+ <li class="enqueued col-sm-1">
135
+ <a href="/sidekiq/queues">
136
+ <span id="txtEnqueued" class="count">0</span>
137
+ <span class="desc">Enqueued</span>
138
+ </a>
139
+ </li>
140
+ <li class="retries col-sm-1">
141
+ <a href="/sidekiq/retries">
142
+ <span id="txtRetries" class="count">0</span>
143
+ <span class="desc">Retries</span>
144
+ </a>
145
+ </li>
146
+ <li class="scheduled col-sm-1">
147
+ <a href="/sidekiq/scheduled">
148
+ <span id="txtScheduled" class="count">0</span>
149
+ <span class="desc">Scheduled</span>
150
+ </a>
151
+ </li>
152
+ <li class="dead col-sm-1">
153
+ <a href="/sidekiq/morgue">
154
+ <span id="txtDead" class="count">4</span>
155
+ <span class="desc">Dead</span>
156
+ </a>
157
+ </li>
158
+ </ul>
159
+
160
+ </div>
161
+
162
+ <div class="col-sm-12">
163
+ <header class="row header">
164
+ <div class="col-sm-12">
165
+ <h3>
166
+ <b>4</b> dead jobs
167
+ </h3>
168
+ </div>
169
+ </header>
170
+
171
+ <table class="table table-striped table-bordered table-white">
172
+ <thead>
173
+ <tr>
174
+ <th style="width: 20%">Jobs</th>
175
+ <th style="width: 10%">All</th>
176
+ <th style="width: 10%">1 hour</th>
177
+ <th style="width: 10%">3 hours</th>
178
+ <th style="width: 10%">1 day</th>
179
+ <th style="width: 10%">3 days</th>
180
+ <th style="width: 10%">1 week</th>
181
+ <th style="width: 10%">Older</th>
182
+ </tr>
183
+ </thead>
184
+
185
+ <tr>
186
+ <td><a href='/sidekiq/undertaker/morgue/all/all/all/total_dead'> all</a></td>
187
+ <td><a href='/sidekiq/undertaker/filter/all/total_dead'>4</a></td>
188
+ <td><a href='/sidekiq/undertaker/filter/all/1_hour'>4</a></td>
189
+ <td><a href='/sidekiq/undertaker/filter/all/3_hours'>0</a></td>
190
+ <td><a href='/sidekiq/undertaker/filter/all/1_day'>0</a></td>
191
+ <td><a href='/sidekiq/undertaker/filter/all/3_days'>0</a></td>
192
+ <td><a href='/sidekiq/undertaker/filter/all/1_week'>0</a></td>
193
+ <td><a href='/sidekiq/undertaker/filter/all/older'>0</a></td>
194
+ </tr>
195
+
196
+ <tr>
197
+ <td><a href='/sidekiq/undertaker/morgue/HardWorker/all/all/total_dead'> HardWorker</a></td>
198
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/total_dead'>3</a></td>
199
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/1_hour'>3</a></td>
200
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/3_hours'>0</a></td>
201
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/1_day'>0</a></td>
202
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/3_days'>0</a></td>
203
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/1_week'>0</a></td>
204
+ <td><a href='/sidekiq/undertaker/filter/HardWorker/older'>0</a></td>
205
+ </tr>
206
+
207
+ <tr>
208
+ <td><a href='/sidekiq/undertaker/morgue/HardWorker1/all/all/total_dead'> HardWorker1</a></td>
209
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/total_dead'>1</a></td>
210
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/1_hour'>1</a></td>
211
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/3_hours'>0</a></td>
212
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/1_day'>0</a></td>
213
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/3_days'>0</a></td>
214
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/1_week'>0</a></td>
215
+ <td><a href='/sidekiq/undertaker/filter/HardWorker1/older'>0</a></td>
216
+ </tr>
217
+
218
+ </table>
219
+
220
+ <header class="row header">
221
+ <div class="col-sm-12">
222
+ <h3>
223
+ Import Jobs
224
+ </h3>
225
+ </div>
226
+ </header>
227
+
228
+ <form enctype="multipart/form-data" method="post" action='/sidekiq/undertaker/import_jobs'>
229
+ <input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
230
+ <input type="file" id=upload_file" name="upload_file" >
231
+ <button class="btn btn-danger" style="margin-top: 10px" type="submit">
232
+ Import
233
+ </button>
234
+ </form>
235
+
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ <div class="navbar navbar-fixed-bottom navbar-inverse ltr">
241
+ <div class="navbar-inner">
242
+ <div class="container text-center">
243
+ <ul class="nav">
244
+ <li>
245
+ <p class="navbar-text product-version">Sidekiq v*EXCLUDED*</p>
246
+ </li>
247
+ <li>
248
+ <p class="navbar-text redis-url" title="redis://localhost:6379/0">redis://localhost:6379/0</p>
249
+ </li>
250
+ <li>
251
+ <p id="serverUtcTime" class="navbar-text server-utc-time">20:57:00 UTC</p>
252
+ </li>
253
+ <li>
254
+ <p class="navbar-text"><a rel=help href="https://github.com/mperham/sidekiq/wiki">docs</a></p>
255
+ </li>
256
+ <li>
257
+ <p class="navbar-text"><a rel=external href="https://github.com/mperham/sidekiq/tree/main/web/locales">en</a></p>
258
+ </li>
259
+ </ul>
260
+ </div>
261
+ </div>
262
+ </div>
263
+
264
+ </body>
265
+ </html>
@@ -22,7 +22,7 @@
22
22
  <div class="navbar navbar-default navbar-fixed-top">
23
23
  <div class="container-fluid">
24
24
  <div class="navbar-header" data-navbar="static">
25
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-menu">
25
+ <button type="button" class="navbar-toggle collapsed" data-toggle="navbar-menu" data-target="#navbar-menu">
26
26
  <span class="icon-bar"></span>
27
27
  <span class="icon-bar"></span>
28
28
  <span class="icon-bar"></span>