rails_error_dashboard 0.1.3 → 0.1.5

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.
@@ -1,5 +1,7 @@
1
- <!-- Subscribe to Turbo Stream updates -->
2
- <%= turbo_stream_from "error_list" %>
1
+ <!-- Subscribe to Turbo Stream updates (only if ActionCable is available) -->
2
+ <% if defined?(ActionCable) %>
3
+ <%= turbo_stream_from "error_list" %>
4
+ <% end %>
3
5
 
4
6
  <div class="py-4">
5
7
  <div class="d-flex justify-content-between align-items-center mb-4">
@@ -124,6 +126,16 @@
124
126
  <h5 class="mb-0">Filters & Search</h5>
125
127
  </div>
126
128
  <div class="card-body">
129
+ <!-- Quick Filter Buttons -->
130
+ <div class="d-flex gap-2 mb-3">
131
+ <%= link_to "All Errors", errors_path,
132
+ class: "btn btn-sm #{params[:assigned_to].blank? ? 'btn-primary' : 'btn-outline-primary'}" %>
133
+ <%= link_to "Unassigned", errors_path(assigned_to: '__unassigned__'),
134
+ class: "btn btn-sm #{params[:assigned_to] == '__unassigned__' ? 'btn-primary' : 'btn-outline-primary'}" %>
135
+ <%= link_to "My Errors", errors_path(assigned_to: current_user_name),
136
+ class: "btn btn-sm #{params[:assigned_to] == current_user_name ? 'btn-primary' : 'btn-outline-primary'}" %>
137
+ </div>
138
+
127
139
  <%= form_with url: errors_path, method: :get, class: "row g-3", data: { turbo: false } do %>
128
140
  <div class="col-md-4">
129
141
  <%= text_field_tag :search, params[:search], placeholder: "Search errors...", class: "form-control" %>
@@ -149,6 +161,31 @@
149
161
  ], params[:severity]), class: "form-select" %>
150
162
  </div>
151
163
 
164
+ <!-- Time Range Filter -->
165
+ <div class="col-md-2">
166
+ <%= select_tag :timeframe, options_for_select([
167
+ ['All Time', ''],
168
+ ['Last Hour', 'last_hour'],
169
+ ['Today', 'today'],
170
+ ['Yesterday', 'yesterday'],
171
+ ['Last 7 Days', 'last_7_days'],
172
+ ['Last 30 Days', 'last_30_days'],
173
+ ['Last 90 Days', 'last_90_days']
174
+ ], params[:timeframe]), class: "form-select" %>
175
+ </div>
176
+
177
+ <!-- Frequency Filter -->
178
+ <div class="col-md-2">
179
+ <%= select_tag :frequency, options_for_select([
180
+ ['All Frequencies', ''],
181
+ ['Once', 'once'],
182
+ ['2-9 Times', 'few'],
183
+ ['10-99 Times', 'frequent'],
184
+ ['100+ Times', 'very_frequent'],
185
+ ['Recurring (Active)', 'recurring']
186
+ ], params[:frequency]), class: "form-select" %>
187
+ </div>
188
+
152
189
  <!-- Phase 3: Workflow Filters -->
153
190
  <div class="col-md-2">
154
191
  <%= select_tag :status, options_for_select([
@@ -253,13 +290,13 @@
253
290
  <th style="width: 40px;">
254
291
  <input type="checkbox" id="select-all" class="form-check-input">
255
292
  </th>
256
- <th>Severity</th>
257
- <th>Error Type</th>
293
+ <th><%= sortable_header("Severity", "severity") %></th>
294
+ <th><%= sortable_header("Error Type", "error_type") %></th>
258
295
  <th>Message</th>
259
- <th>Occurrences</th>
260
- <th>First / Last Seen</th>
296
+ <th><%= sortable_header("Occurrences", "occurrence_count") %></th>
297
+ <th><%= sortable_header("First / Last Seen", "last_seen_at") %></th>
261
298
  <% if @platforms.size > 1 %>
262
- <th>Platform</th>
299
+ <th><%= sortable_header("Platform", "platform") %></th>
263
300
  <% end %>
264
301
  <th>Status</th>
265
302
  <th></th>
@@ -79,6 +79,9 @@
79
79
  </div>
80
80
  </div>
81
81
  </div>
82
+ <div class="card-footer bg-white border-top">
83
+ <%= link_to "View #{platform} Errors", errors_path(platform: platform), class: "btn btn-sm btn-outline-primary w-100" %>
84
+ </div>
82
85
  </div>
83
86
  </div>
84
87
  <% end %>
@@ -0,0 +1,575 @@
1
+ <div class="container-fluid py-4">
2
+ <!-- Page Header -->
3
+ <div class="d-flex justify-content-between align-items-center mb-4">
4
+ <h1 class="h3 mb-0">
5
+ <i class="bi bi-gear me-2"></i>
6
+ Configuration Settings
7
+ </h1>
8
+ <div>
9
+ <%= link_to root_path, class: "btn btn-outline-secondary btn-sm" do %>
10
+ <i class="bi bi-arrow-left"></i> Back to Dashboard
11
+ <% end %>
12
+ </div>
13
+ </div>
14
+
15
+ <div class="alert alert-info mb-4">
16
+ <i class="bi bi-info-circle me-2"></i>
17
+ <strong>Read-only view</strong> - These settings are configured in your initializer file:
18
+ <code>config/initializers/rails_error_dashboard.rb</code>
19
+ </div>
20
+
21
+ <!-- Core Features -->
22
+ <div class="card mb-4">
23
+ <div class="card-header bg-primary text-white">
24
+ <h5 class="mb-0">
25
+ <i class="bi bi-shield-check"></i> Core Features
26
+ </h5>
27
+ </div>
28
+ <div class="card-body">
29
+ <div class="row">
30
+ <div class="col-md-6 mb-3">
31
+ <div class="d-flex justify-content-between align-items-center">
32
+ <div>
33
+ <strong>Error Middleware</strong>
34
+ <br><small class="text-muted">Catches unhandled exceptions</small>
35
+ </div>
36
+ <% if @config.enable_middleware %>
37
+ <span class="badge bg-success fs-6">
38
+ <i class="bi bi-check-circle"></i> Enabled
39
+ </span>
40
+ <% else %>
41
+ <span class="badge bg-secondary fs-6">
42
+ <i class="bi bi-x-circle"></i> Disabled
43
+ </span>
44
+ <% end %>
45
+ </div>
46
+ </div>
47
+
48
+ <div class="col-md-6 mb-3">
49
+ <div class="d-flex justify-content-between align-items-center">
50
+ <div>
51
+ <strong>Rails.error Subscriber</strong>
52
+ <br><small class="text-muted">Subscribes to Rails error events</small>
53
+ </div>
54
+ <% if @config.enable_error_subscriber %>
55
+ <span class="badge bg-success fs-6">
56
+ <i class="bi bi-check-circle"></i> Enabled
57
+ </span>
58
+ <% else %>
59
+ <span class="badge bg-secondary fs-6">
60
+ <i class="bi bi-x-circle"></i> Disabled
61
+ </span>
62
+ <% end %>
63
+ </div>
64
+ </div>
65
+
66
+ <div class="col-md-6 mb-3">
67
+ <div class="d-flex justify-content-between align-items-center">
68
+ <div>
69
+ <strong>Authentication</strong>
70
+ <br><small class="text-muted">HTTP Basic Auth protection</small>
71
+ </div>
72
+ <% if @config.require_authentication %>
73
+ <span class="badge bg-success fs-6">
74
+ <i class="bi bi-lock"></i> Required
75
+ </span>
76
+ <% else %>
77
+ <span class="badge bg-warning text-dark fs-6">
78
+ <i class="bi bi-unlock"></i> Disabled
79
+ </span>
80
+ <% end %>
81
+ </div>
82
+ </div>
83
+
84
+ <div class="col-md-6 mb-3">
85
+ <div class="d-flex justify-content-between align-items-center">
86
+ <div>
87
+ <strong>Data Retention</strong>
88
+ <br><small class="text-muted">How long errors are kept</small>
89
+ </div>
90
+ <span class="badge bg-info fs-6">
91
+ <%= @config.retention_days %> days
92
+ </span>
93
+ </div>
94
+ </div>
95
+
96
+ <div class="col-md-6 mb-3">
97
+ <div class="d-flex justify-content-between align-items-center">
98
+ <div>
99
+ <strong>Max Backtrace Lines</strong>
100
+ <br><small class="text-muted">Stack trace depth limit</small>
101
+ </div>
102
+ <span class="badge bg-info fs-6">
103
+ <%= @config.max_backtrace_lines %> lines
104
+ </span>
105
+ </div>
106
+ </div>
107
+
108
+ <div class="col-md-6 mb-3">
109
+ <div class="d-flex justify-content-between align-items-center">
110
+ <div>
111
+ <strong>Sampling Rate</strong>
112
+ <br><small class="text-muted">Percentage of errors captured</small>
113
+ </div>
114
+ <span class="badge bg-info fs-6">
115
+ <%= (@config.sampling_rate * 100).to_i %>%
116
+ </span>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+
123
+ <!-- Performance Settings -->
124
+ <div class="card mb-4">
125
+ <div class="card-header bg-warning text-dark">
126
+ <h5 class="mb-0">
127
+ <i class="bi bi-lightning-charge"></i> Performance Settings
128
+ </h5>
129
+ </div>
130
+ <div class="card-body">
131
+ <div class="row">
132
+ <div class="col-md-6 mb-3">
133
+ <div class="d-flex justify-content-between align-items-center">
134
+ <div>
135
+ <strong>Async Logging</strong>
136
+ <br><small class="text-muted">Background job processing</small>
137
+ </div>
138
+ <% if @config.async_logging %>
139
+ <span class="badge bg-success fs-6">
140
+ <i class="bi bi-check-circle"></i> Enabled
141
+ <% if @config.async_adapter %>
142
+ (<%= @config.async_adapter %>)
143
+ <% end %>
144
+ </span>
145
+ <% else %>
146
+ <span class="badge bg-secondary fs-6">
147
+ <i class="bi bi-x-circle"></i> Disabled
148
+ </span>
149
+ <% end %>
150
+ </div>
151
+ </div>
152
+
153
+ <div class="col-md-6 mb-3">
154
+ <div class="d-flex justify-content-between align-items-center">
155
+ <div>
156
+ <strong>Separate Database</strong>
157
+ <br><small class="text-muted">Dedicated DB for error logs</small>
158
+ </div>
159
+ <% if @config.use_separate_database %>
160
+ <span class="badge bg-success fs-6">
161
+ <i class="bi bi-check-circle"></i> Enabled
162
+ </span>
163
+ <% else %>
164
+ <span class="badge bg-secondary fs-6">
165
+ <i class="bi bi-x-circle"></i> Disabled
166
+ </span>
167
+ <% end %>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+
174
+ <!-- Notification Channels -->
175
+ <div class="card mb-4">
176
+ <div class="card-header bg-info text-white">
177
+ <h5 class="mb-0">
178
+ <i class="bi bi-bell"></i> Notification Channels
179
+ </h5>
180
+ </div>
181
+ <div class="card-body">
182
+ <div class="row">
183
+ <div class="col-md-6 mb-3">
184
+ <div class="d-flex justify-content-between align-items-center">
185
+ <div>
186
+ <strong>Slack</strong>
187
+ <br><small class="text-muted">Real-time notifications</small>
188
+ </div>
189
+ <% if @config.enable_slack_notifications %>
190
+ <span class="badge bg-success fs-6">
191
+ <i class="bi bi-check-circle"></i> Enabled
192
+ </span>
193
+ <% else %>
194
+ <span class="badge bg-secondary fs-6">
195
+ <i class="bi bi-x-circle"></i> Disabled
196
+ </span>
197
+ <% end %>
198
+ </div>
199
+ </div>
200
+
201
+ <div class="col-md-6 mb-3">
202
+ <div class="d-flex justify-content-between align-items-center">
203
+ <div>
204
+ <strong>Email</strong>
205
+ <br><small class="text-muted">Email alerts</small>
206
+ </div>
207
+ <% if @config.enable_email_notifications %>
208
+ <span class="badge bg-success fs-6">
209
+ <i class="bi bi-check-circle"></i> Enabled
210
+ <% if @config.notification_email_recipients&.any? %>
211
+ (<%= @config.notification_email_recipients.count %> recipient<%= @config.notification_email_recipients.count != 1 ? 's' : '' %>)
212
+ <% end %>
213
+ </span>
214
+ <% else %>
215
+ <span class="badge bg-secondary fs-6">
216
+ <i class="bi bi-x-circle"></i> Disabled
217
+ </span>
218
+ <% end %>
219
+ </div>
220
+ </div>
221
+
222
+ <div class="col-md-6 mb-3">
223
+ <div class="d-flex justify-content-between align-items-center">
224
+ <div>
225
+ <strong>Discord</strong>
226
+ <br><small class="text-muted">Discord webhook notifications</small>
227
+ </div>
228
+ <% if @config.enable_discord_notifications %>
229
+ <span class="badge bg-success fs-6">
230
+ <i class="bi bi-check-circle"></i> Enabled
231
+ </span>
232
+ <% else %>
233
+ <span class="badge bg-secondary fs-6">
234
+ <i class="bi bi-x-circle"></i> Disabled
235
+ </span>
236
+ <% end %>
237
+ </div>
238
+ </div>
239
+
240
+ <div class="col-md-6 mb-3">
241
+ <div class="d-flex justify-content-between align-items-center">
242
+ <div>
243
+ <strong>PagerDuty</strong>
244
+ <br><small class="text-muted">Critical error escalation</small>
245
+ </div>
246
+ <% if @config.enable_pagerduty_notifications %>
247
+ <span class="badge bg-success fs-6">
248
+ <i class="bi bi-check-circle"></i> Enabled
249
+ </span>
250
+ <% else %>
251
+ <span class="badge bg-secondary fs-6">
252
+ <i class="bi bi-x-circle"></i> Disabled
253
+ </span>
254
+ <% end %>
255
+ </div>
256
+ </div>
257
+
258
+ <div class="col-md-6 mb-3">
259
+ <div class="d-flex justify-content-between align-items-center">
260
+ <div>
261
+ <strong>Custom Webhooks</strong>
262
+ <br><small class="text-muted">Generic webhook endpoints</small>
263
+ </div>
264
+ <% if @config.enable_webhook_notifications %>
265
+ <span class="badge bg-success fs-6">
266
+ <i class="bi bi-check-circle"></i> Enabled
267
+ <% if @config.webhook_urls&.any? %>
268
+ (<%= @config.webhook_urls.count %> URL<%= @config.webhook_urls.count != 1 ? 's' : '' %>)
269
+ <% end %>
270
+ </span>
271
+ <% else %>
272
+ <span class="badge bg-secondary fs-6">
273
+ <i class="bi bi-x-circle"></i> Disabled
274
+ </span>
275
+ <% end %>
276
+ </div>
277
+ </div>
278
+ </div>
279
+ </div>
280
+ </div>
281
+
282
+ <!-- Advanced Analytics Features -->
283
+ <div class="card mb-4">
284
+ <div class="card-header bg-success text-white">
285
+ <h5 class="mb-0">
286
+ <i class="bi bi-graph-up"></i> Advanced Analytics Features
287
+ </h5>
288
+ </div>
289
+ <div class="card-body">
290
+ <div class="row">
291
+ <div class="col-md-6 mb-3">
292
+ <div class="d-flex justify-content-between align-items-center">
293
+ <div>
294
+ <strong>Similar Errors (Fuzzy Matching)</strong>
295
+ <br><small class="text-muted">Find related errors by similarity</small>
296
+ </div>
297
+ <% if @config.enable_similar_errors %>
298
+ <span class="badge bg-success fs-6">
299
+ <i class="bi bi-check-circle"></i> Enabled
300
+ </span>
301
+ <% else %>
302
+ <span class="badge bg-secondary fs-6">
303
+ <i class="bi bi-x-circle"></i> Disabled
304
+ </span>
305
+ <% end %>
306
+ </div>
307
+ </div>
308
+
309
+ <div class="col-md-6 mb-3">
310
+ <div class="d-flex justify-content-between align-items-center">
311
+ <div>
312
+ <strong>Co-occurring Errors</strong>
313
+ <br><small class="text-muted">Errors happening together</small>
314
+ </div>
315
+ <% if @config.enable_co_occurring_errors %>
316
+ <span class="badge bg-success fs-6">
317
+ <i class="bi bi-check-circle"></i> Enabled
318
+ </span>
319
+ <% else %>
320
+ <span class="badge bg-secondary fs-6">
321
+ <i class="bi bi-x-circle"></i> Disabled
322
+ </span>
323
+ <% end %>
324
+ </div>
325
+ </div>
326
+
327
+ <div class="col-md-6 mb-3">
328
+ <div class="d-flex justify-content-between align-items-center">
329
+ <div>
330
+ <strong>Error Cascades</strong>
331
+ <br><small class="text-muted">Parent→child error chains</small>
332
+ </div>
333
+ <% if @config.enable_error_cascades %>
334
+ <span class="badge bg-success fs-6">
335
+ <i class="bi bi-check-circle"></i> Enabled
336
+ </span>
337
+ <% else %>
338
+ <span class="badge bg-secondary fs-6">
339
+ <i class="bi bi-x-circle"></i> Disabled
340
+ </span>
341
+ <% end %>
342
+ </div>
343
+ </div>
344
+
345
+ <div class="col-md-6 mb-3">
346
+ <div class="d-flex justify-content-between align-items-center">
347
+ <div>
348
+ <strong>Error Correlation</strong>
349
+ <br><small class="text-muted">Version/user/time analysis</small>
350
+ </div>
351
+ <% if @config.enable_error_correlation %>
352
+ <span class="badge bg-success fs-6">
353
+ <i class="bi bi-check-circle"></i> Enabled
354
+ </span>
355
+ <% else %>
356
+ <span class="badge bg-secondary fs-6">
357
+ <i class="bi bi-x-circle"></i> Disabled
358
+ </span>
359
+ <% end %>
360
+ </div>
361
+ </div>
362
+
363
+ <div class="col-md-6 mb-3">
364
+ <div class="d-flex justify-content-between align-items-center">
365
+ <div>
366
+ <strong>Platform Comparison</strong>
367
+ <br><small class="text-muted">iOS vs Android analytics</small>
368
+ </div>
369
+ <% if @config.enable_platform_comparison %>
370
+ <span class="badge bg-success fs-6">
371
+ <i class="bi bi-check-circle"></i> Enabled
372
+ </span>
373
+ <% else %>
374
+ <span class="badge bg-secondary fs-6">
375
+ <i class="bi bi-x-circle"></i> Disabled
376
+ </span>
377
+ <% end %>
378
+ </div>
379
+ </div>
380
+
381
+ <div class="col-md-6 mb-3">
382
+ <div class="d-flex justify-content-between align-items-center">
383
+ <div>
384
+ <strong>Occurrence Patterns</strong>
385
+ <br><small class="text-muted">Cyclical/burst detection</small>
386
+ </div>
387
+ <% if @config.enable_occurrence_patterns %>
388
+ <span class="badge bg-success fs-6">
389
+ <i class="bi bi-check-circle"></i> Enabled
390
+ </span>
391
+ <% else %>
392
+ <span class="badge bg-secondary fs-6">
393
+ <i class="bi bi-x-circle"></i> Disabled
394
+ </span>
395
+ <% end %>
396
+ </div>
397
+ </div>
398
+
399
+ <div class="col-md-6 mb-3">
400
+ <div class="d-flex justify-content-between align-items-center">
401
+ <div>
402
+ <strong>Baseline Alerts</strong>
403
+ <br><small class="text-muted">Anomaly detection</small>
404
+ </div>
405
+ <% if @config.enable_baseline_alerts %>
406
+ <span class="badge bg-success fs-6">
407
+ <i class="bi bi-check-circle"></i> Enabled
408
+ (± <%= @config.baseline_alert_threshold_std_devs %>σ)
409
+ </span>
410
+ <% else %>
411
+ <span class="badge bg-secondary fs-6">
412
+ <i class="bi bi-x-circle"></i> Disabled
413
+ </span>
414
+ <% end %>
415
+ </div>
416
+ </div>
417
+ </div>
418
+ </div>
419
+ </div>
420
+
421
+ <!-- Active Plugins -->
422
+ <div class="card mb-4">
423
+ <div class="card-header bg-dark text-white">
424
+ <h5 class="mb-0">
425
+ <i class="bi bi-puzzle"></i> Active Plugins
426
+ </h5>
427
+ </div>
428
+ <div class="card-body">
429
+ <% if RailsErrorDashboard::PluginRegistry.any? %>
430
+ <div class="table-responsive">
431
+ <table class="table table-hover">
432
+ <thead>
433
+ <tr>
434
+ <th>Plugin Name</th>
435
+ <th>Version</th>
436
+ <th>Description</th>
437
+ <th>Status</th>
438
+ </tr>
439
+ </thead>
440
+ <tbody>
441
+ <% RailsErrorDashboard::PluginRegistry.info.each do |plugin| %>
442
+ <tr>
443
+ <td><strong><%= plugin[:name] %></strong></td>
444
+ <td><code><%= plugin[:version] %></code></td>
445
+ <td><%= plugin[:description] %></td>
446
+ <td>
447
+ <% if plugin[:enabled] %>
448
+ <span class="badge bg-success">
449
+ <i class="bi bi-check-circle"></i> Active
450
+ </span>
451
+ <% else %>
452
+ <span class="badge bg-secondary">
453
+ <i class="bi bi-pause-circle"></i> Inactive
454
+ </span>
455
+ <% end %>
456
+ </td>
457
+ </tr>
458
+ <% end %>
459
+ </tbody>
460
+ </table>
461
+ </div>
462
+ <% else %>
463
+ <div class="alert alert-secondary mb-0">
464
+ <i class="bi bi-info-circle me-2"></i>
465
+ No plugins are currently registered. You can create custom plugins to extend functionality.
466
+ </div>
467
+ <% end %>
468
+ </div>
469
+ </div>
470
+
471
+ <!-- Enhanced Metrics -->
472
+ <% if @config.app_version || @config.git_sha || @config.total_users_for_impact %>
473
+ <div class="card mb-4">
474
+ <div class="card-header bg-secondary text-white">
475
+ <h5 class="mb-0">
476
+ <i class="bi bi-speedometer"></i> Enhanced Metrics
477
+ </h5>
478
+ </div>
479
+ <div class="card-body">
480
+ <div class="row">
481
+ <% if @config.app_version %>
482
+ <div class="col-md-4 mb-3">
483
+ <div class="d-flex justify-content-between align-items-center">
484
+ <div>
485
+ <strong>App Version</strong>
486
+ <br><small class="text-muted">Current application version</small>
487
+ </div>
488
+ <code class="fs-6"><%= @config.app_version %></code>
489
+ </div>
490
+ </div>
491
+ <% end %>
492
+
493
+ <% if @config.git_sha %>
494
+ <div class="col-md-4 mb-3">
495
+ <div class="d-flex justify-content-between align-items-center">
496
+ <div>
497
+ <strong>Git SHA</strong>
498
+ <br><small class="text-muted">Deployed commit</small>
499
+ </div>
500
+ <code class="fs-6"><%= @config.git_sha[0..7] %></code>
501
+ </div>
502
+ </div>
503
+ <% end %>
504
+
505
+ <% if @config.total_users_for_impact %>
506
+ <div class="col-md-4 mb-3">
507
+ <div class="d-flex justify-content-between align-items-center">
508
+ <div>
509
+ <strong>Total Users</strong>
510
+ <br><small class="text-muted">For impact % calculation</small>
511
+ </div>
512
+ <span class="badge bg-info fs-6"><%= @config.total_users_for_impact %></span>
513
+ </div>
514
+ </div>
515
+ <% end %>
516
+ </div>
517
+ </div>
518
+ </div>
519
+ <% end %>
520
+
521
+ <!-- Internal Logging -->
522
+ <div class="card mb-4">
523
+ <div class="card-header bg-light">
524
+ <h5 class="mb-0">
525
+ <i class="bi bi-terminal"></i> Internal Logging
526
+ </h5>
527
+ </div>
528
+ <div class="card-body">
529
+ <div class="row">
530
+ <div class="col-md-6 mb-3">
531
+ <div class="d-flex justify-content-between align-items-center">
532
+ <div>
533
+ <strong>Internal Logging</strong>
534
+ <br><small class="text-muted">Gem debugging output</small>
535
+ </div>
536
+ <% if @config.enable_internal_logging %>
537
+ <span class="badge bg-warning text-dark fs-6">
538
+ <i class="bi bi-check-circle"></i> Enabled
539
+ </span>
540
+ <% else %>
541
+ <span class="badge bg-secondary fs-6">
542
+ <i class="bi bi-x-circle"></i> Disabled
543
+ </span>
544
+ <% end %>
545
+ </div>
546
+ </div>
547
+
548
+ <div class="col-md-6 mb-3">
549
+ <div class="d-flex justify-content-between align-items-center">
550
+ <div>
551
+ <strong>Log Level</strong>
552
+ <br><small class="text-muted">Verbosity level</small>
553
+ </div>
554
+ <span class="badge bg-info fs-6">
555
+ <%= @config.log_level.to_s.upcase %>
556
+ </span>
557
+ </div>
558
+ </div>
559
+ </div>
560
+ </div>
561
+ </div>
562
+
563
+ <!-- Help Text -->
564
+ <div class="alert alert-light border">
565
+ <h6 class="alert-heading">
566
+ <i class="bi bi-question-circle me-2"></i>
567
+ Need to change these settings?
568
+ </h6>
569
+ <p class="mb-0">
570
+ Edit your configuration in <code>config/initializers/rails_error_dashboard.rb</code> and restart your application.
571
+ <br>
572
+ See the <a href="https://github.com/AnjanJ/rails_error_dashboard" target="_blank" class="alert-link">documentation</a> for more information.
573
+ </p>
574
+ </div>
575
+ </div>
data/config/routes.rb CHANGED
@@ -1,5 +1,11 @@
1
1
  RailsErrorDashboard::Engine.routes.draw do
2
- root to: "errors#index"
2
+ root to: "errors#overview"
3
+
4
+ # Dashboard overview
5
+ get "overview", to: "errors#overview", as: :overview
6
+
7
+ # Settings page
8
+ get "settings", to: "errors#settings", as: :settings
3
9
 
4
10
  resources :errors, only: [ :index, :show ] do
5
11
  member do