rails_error_dashboard 0.1.0 → 0.1.3

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +305 -703
  3. data/app/assets/stylesheets/rails_error_dashboard/_catppuccin_mocha.scss +107 -0
  4. data/app/assets/stylesheets/rails_error_dashboard/_components.scss +625 -0
  5. data/app/assets/stylesheets/rails_error_dashboard/_layout.scss +257 -0
  6. data/app/assets/stylesheets/rails_error_dashboard/_theme_variables.scss +203 -0
  7. data/app/assets/stylesheets/rails_error_dashboard/application.css +926 -15
  8. data/app/assets/stylesheets/rails_error_dashboard/application.css.map +7 -0
  9. data/app/assets/stylesheets/rails_error_dashboard/application.scss +61 -0
  10. data/app/controllers/rails_error_dashboard/application_controller.rb +18 -0
  11. data/app/controllers/rails_error_dashboard/errors_controller.rb +140 -4
  12. data/app/helpers/rails_error_dashboard/application_helper.rb +55 -0
  13. data/app/helpers/rails_error_dashboard/backtrace_helper.rb +91 -0
  14. data/app/helpers/rails_error_dashboard/overview_helper.rb +78 -0
  15. data/app/helpers/rails_error_dashboard/user_agent_helper.rb +118 -0
  16. data/app/jobs/rails_error_dashboard/application_job.rb +19 -0
  17. data/app/jobs/rails_error_dashboard/async_error_logging_job.rb +48 -0
  18. data/app/jobs/rails_error_dashboard/baseline_alert_job.rb +263 -0
  19. data/app/jobs/rails_error_dashboard/discord_error_notification_job.rb +4 -8
  20. data/app/jobs/rails_error_dashboard/email_error_notification_job.rb +2 -1
  21. data/app/jobs/rails_error_dashboard/pagerduty_error_notification_job.rb +5 -5
  22. data/app/jobs/rails_error_dashboard/slack_error_notification_job.rb +10 -6
  23. data/app/jobs/rails_error_dashboard/webhook_error_notification_job.rb +5 -6
  24. data/app/mailers/rails_error_dashboard/application_mailer.rb +1 -1
  25. data/app/mailers/rails_error_dashboard/error_notification_mailer.rb +1 -1
  26. data/app/models/rails_error_dashboard/cascade_pattern.rb +74 -0
  27. data/app/models/rails_error_dashboard/error_baseline.rb +100 -0
  28. data/app/models/rails_error_dashboard/error_comment.rb +27 -0
  29. data/app/models/rails_error_dashboard/error_log.rb +471 -3
  30. data/app/models/rails_error_dashboard/error_occurrence.rb +49 -0
  31. data/app/views/layouts/rails_error_dashboard.html.erb +816 -178
  32. data/app/views/layouts/rails_error_dashboard_old_backup.html.erb +383 -0
  33. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.html.erb +3 -10
  34. data/app/views/rails_error_dashboard/error_notification_mailer/error_alert.text.erb +1 -2
  35. data/app/views/rails_error_dashboard/errors/_error_row.html.erb +78 -0
  36. data/app/views/rails_error_dashboard/errors/_pattern_insights.html.erb +209 -0
  37. data/app/views/rails_error_dashboard/errors/_stats.html.erb +34 -0
  38. data/app/views/rails_error_dashboard/errors/_timeline.html.erb +167 -0
  39. data/app/views/rails_error_dashboard/errors/analytics.html.erb +152 -56
  40. data/app/views/rails_error_dashboard/errors/correlation.html.erb +373 -0
  41. data/app/views/rails_error_dashboard/errors/index.html.erb +294 -138
  42. data/app/views/rails_error_dashboard/errors/overview.html.erb +253 -0
  43. data/app/views/rails_error_dashboard/errors/platform_comparison.html.erb +399 -0
  44. data/app/views/rails_error_dashboard/errors/show.html.erb +781 -65
  45. data/config/routes.rb +9 -0
  46. data/db/migrate/20251225071314_add_optimized_indexes_to_error_logs.rb +66 -0
  47. data/db/migrate/20251225074653_remove_environment_from_error_logs.rb +26 -0
  48. data/db/migrate/20251225085859_add_enhanced_metrics_to_error_logs.rb +12 -0
  49. data/db/migrate/20251225093603_add_similarity_tracking_to_error_logs.rb +9 -0
  50. data/db/migrate/20251225100236_create_error_occurrences.rb +31 -0
  51. data/db/migrate/20251225101920_create_cascade_patterns.rb +33 -0
  52. data/db/migrate/20251225102500_create_error_baselines.rb +38 -0
  53. data/db/migrate/20251226020000_add_workflow_fields_to_error_logs.rb +27 -0
  54. data/db/migrate/20251226020100_create_error_comments.rb +18 -0
  55. data/lib/generators/rails_error_dashboard/install/install_generator.rb +276 -1
  56. data/lib/generators/rails_error_dashboard/install/templates/initializer.rb +272 -37
  57. data/lib/generators/rails_error_dashboard/solid_queue/solid_queue_generator.rb +36 -0
  58. data/lib/generators/rails_error_dashboard/solid_queue/templates/queue.yml +55 -0
  59. data/lib/rails_error_dashboard/commands/batch_delete_errors.rb +1 -1
  60. data/lib/rails_error_dashboard/commands/batch_resolve_errors.rb +2 -2
  61. data/lib/rails_error_dashboard/commands/log_error.rb +272 -7
  62. data/lib/rails_error_dashboard/commands/resolve_error.rb +16 -0
  63. data/lib/rails_error_dashboard/configuration.rb +90 -5
  64. data/lib/rails_error_dashboard/error_reporter.rb +15 -7
  65. data/lib/rails_error_dashboard/logger.rb +105 -0
  66. data/lib/rails_error_dashboard/middleware/error_catcher.rb +17 -10
  67. data/lib/rails_error_dashboard/plugin.rb +6 -3
  68. data/lib/rails_error_dashboard/plugin_registry.rb +2 -2
  69. data/lib/rails_error_dashboard/plugins/audit_log_plugin.rb +0 -1
  70. data/lib/rails_error_dashboard/plugins/jira_integration_plugin.rb +3 -4
  71. data/lib/rails_error_dashboard/plugins/metrics_plugin.rb +1 -3
  72. data/lib/rails_error_dashboard/queries/analytics_stats.rb +44 -6
  73. data/lib/rails_error_dashboard/queries/baseline_stats.rb +107 -0
  74. data/lib/rails_error_dashboard/queries/co_occurring_errors.rb +86 -0
  75. data/lib/rails_error_dashboard/queries/dashboard_stats.rb +242 -2
  76. data/lib/rails_error_dashboard/queries/error_cascades.rb +74 -0
  77. data/lib/rails_error_dashboard/queries/error_correlation.rb +375 -0
  78. data/lib/rails_error_dashboard/queries/errors_list.rb +106 -10
  79. data/lib/rails_error_dashboard/queries/filter_options.rb +0 -1
  80. data/lib/rails_error_dashboard/queries/platform_comparison.rb +254 -0
  81. data/lib/rails_error_dashboard/queries/similar_errors.rb +93 -0
  82. data/lib/rails_error_dashboard/services/backtrace_parser.rb +113 -0
  83. data/lib/rails_error_dashboard/services/baseline_alert_throttler.rb +88 -0
  84. data/lib/rails_error_dashboard/services/baseline_calculator.rb +269 -0
  85. data/lib/rails_error_dashboard/services/cascade_detector.rb +95 -0
  86. data/lib/rails_error_dashboard/services/pattern_detector.rb +268 -0
  87. data/lib/rails_error_dashboard/services/similarity_calculator.rb +144 -0
  88. data/lib/rails_error_dashboard/value_objects/error_context.rb +27 -1
  89. data/lib/rails_error_dashboard/version.rb +1 -1
  90. data/lib/rails_error_dashboard.rb +57 -7
  91. metadata +69 -10
  92. data/app/models/rails_error_dashboard/application_record.rb +0 -5
  93. data/lib/rails_error_dashboard/queries/developer_insights.rb +0 -277
  94. data/lib/rails_error_dashboard/queries/errors_list_v2.rb +0 -149
  95. data/lib/tasks/rails_error_dashboard_tasks.rake +0 -4
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "mappings": "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",
4
+ "sources": ["_catppuccin_mocha.scss","_theme_variables.scss","_components.scss","_layout.scss","application.scss"],
5
+ "names": [],
6
+ "file": "application.css"
7
+ }
@@ -0,0 +1,61 @@
1
+ // =============================================================================
2
+ // Rails Error Dashboard - Main Stylesheet
3
+ // =============================================================================
4
+ // Theme: Catppuccin Mocha (Dark) / Traditional Light
5
+ //
6
+ // This is the main manifest file for Rails Error Dashboard styles.
7
+ // All Catppuccin theming and component styles are imported here.
8
+ //
9
+ // Color Palette: https://github.com/catppuccin/catppuccin
10
+ // =============================================================================
11
+
12
+ // Import Catppuccin Mocha color palette
13
+ // Defines all 24 Catppuccin colors as SCSS variables and CSS custom properties
14
+ @import 'catppuccin_mocha';
15
+
16
+ // Import semantic theme variables
17
+ // Maps Catppuccin colors to dashboard purposes (primary, success, danger, etc.)
18
+ @import 'theme_variables';
19
+
20
+ // Import component-specific styles
21
+ // Badges, cards, tables, forms, buttons, etc. with Catppuccin theming
22
+ @import 'components';
23
+
24
+ // Import layout and structural styles
25
+ // Navbar, sidebar, animations, and page structure
26
+ @import 'layout';
27
+
28
+ // =============================================================================
29
+ // Global Styles
30
+ // =============================================================================
31
+
32
+ body {
33
+ background-color: var(--bg-color);
34
+ color: var(--text-color);
35
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
36
+ transition: background-color 300ms ease, color 300ms ease;
37
+ }
38
+
39
+ // Links
40
+ a {
41
+ color: var(--text-link);
42
+ text-decoration: none;
43
+ transition: color 150ms ease;
44
+
45
+ &:hover {
46
+ color: var(--text-link-hover);
47
+ text-decoration: underline;
48
+ }
49
+ }
50
+
51
+ // Smooth transitions for theme switching
52
+ * {
53
+ transition-property: background-color, border-color, color;
54
+ transition-duration: 300ms;
55
+ transition-timing-function: ease;
56
+ }
57
+
58
+ // Disable transitions during initial page load
59
+ .no-transition * {
60
+ transition: none !important;
61
+ }
@@ -8,5 +8,23 @@ module RailsErrorDashboard
8
8
 
9
9
  # Make Pagy helpers available in views
10
10
  helper Pagy::Frontend
11
+
12
+ # CRITICAL: Ensure dashboard errors never break the app
13
+ # Catch all exceptions and render user-friendly error page
14
+ rescue_from StandardError do |exception|
15
+ # Log the error for debugging
16
+ Rails.logger.error("[RailsErrorDashboard] Dashboard controller error: #{exception.class} - #{exception.message}")
17
+ Rails.logger.error("Request: #{request.path} (#{request.method})")
18
+ Rails.logger.error("Params: #{params.inspect}")
19
+ Rails.logger.error(exception.backtrace&.first(10)&.join("\n")) if exception.backtrace
20
+
21
+ # Render user-friendly error page
22
+ render plain: "The Error Dashboard encountered an issue displaying this page.\n\n" \
23
+ "Your application is unaffected - this is only a dashboard display error.\n\n" \
24
+ "Error: #{exception.message}\n\n" \
25
+ "Check Rails logs for details: [RailsErrorDashboard]",
26
+ status: :internal_server_error,
27
+ layout: false
28
+ end
11
29
  end
12
30
  end
@@ -6,6 +6,30 @@ module RailsErrorDashboard
6
6
 
7
7
  before_action :authenticate_dashboard_user!
8
8
 
9
+ def overview
10
+ # Get dashboard stats using Query
11
+ @stats = Queries::DashboardStats.call
12
+
13
+ # Get platform health summary (if enabled)
14
+ if RailsErrorDashboard.configuration.enable_platform_comparison
15
+ comparison = Queries::PlatformComparison.new(days: 7)
16
+ @platform_health = comparison.platform_health_summary
17
+ @platform_scores = comparison.platform_stability_scores
18
+ else
19
+ @platform_health = {}
20
+ @platform_scores = {}
21
+ end
22
+
23
+ # Get critical alerts (critical/high severity errors from last hour)
24
+ @critical_alerts = ErrorLog
25
+ .where("occurred_at >= ?", 1.hour.ago)
26
+ .where(resolved_at: nil)
27
+ .select { |error| [ :critical, :high ].include?(error.severity) }
28
+ .sort_by(&:occurred_at)
29
+ .reverse
30
+ .first(10)
31
+ end
32
+
9
33
  def index
10
34
  # Use Query to get filtered errors
11
35
  errors_query = Queries::ErrorsList.call(filter_params)
@@ -18,7 +42,6 @@ module RailsErrorDashboard
18
42
 
19
43
  # Get filter options using Query
20
44
  filter_options = Queries::FilterOptions.call
21
- @environments = filter_options[:environments]
22
45
  @error_types = filter_options[:error_types]
23
46
  @platforms = filter_options[:platforms]
24
47
  end
@@ -43,6 +66,70 @@ module RailsErrorDashboard
43
66
  redirect_to error_path(@error)
44
67
  end
45
68
 
69
+ # Phase 3: Workflow Integration Actions
70
+
71
+ def assign
72
+ @error = ErrorLog.find(params[:id])
73
+ @error.assign_to!(params[:assigned_to])
74
+ redirect_to error_path(@error)
75
+ rescue => e
76
+ redirect_to error_path(@error)
77
+ end
78
+
79
+ def unassign
80
+ @error = ErrorLog.find(params[:id])
81
+ @error.unassign!
82
+ redirect_to error_path(@error)
83
+ rescue => e
84
+ redirect_to error_path(@error)
85
+ end
86
+
87
+ def update_priority
88
+ @error = ErrorLog.find(params[:id])
89
+ @error.update!(priority_level: params[:priority_level])
90
+ redirect_to error_path(@error)
91
+ rescue => e
92
+ redirect_to error_path(@error)
93
+ end
94
+
95
+ def snooze
96
+ @error = ErrorLog.find(params[:id])
97
+ @error.snooze!(params[:hours].to_i, reason: params[:reason])
98
+ redirect_to error_path(@error)
99
+ rescue => e
100
+ redirect_to error_path(@error)
101
+ end
102
+
103
+ def unsnooze
104
+ @error = ErrorLog.find(params[:id])
105
+ @error.unsnooze!
106
+ redirect_to error_path(@error)
107
+ rescue => e
108
+ redirect_to error_path(@error)
109
+ end
110
+
111
+ def update_status
112
+ @error = ErrorLog.find(params[:id])
113
+ if @error.update_status!(params[:status], comment: params[:comment])
114
+ redirect_to error_path(@error)
115
+ else
116
+ redirect_to error_path(@error)
117
+ end
118
+ rescue => e
119
+ redirect_to error_path(@error)
120
+ end
121
+
122
+ def add_comment
123
+ @error = ErrorLog.find(params[:id])
124
+ @error.comments.create!(
125
+ author_name: params[:author_name],
126
+ body: params[:body]
127
+ )
128
+ redirect_to error_path(@error)
129
+ rescue => e
130
+ redirect_to error_path(@error)
131
+ end
132
+
46
133
  def analytics
47
134
  days = (params[:days] || 30).to_i
48
135
  @days = days
@@ -54,7 +141,6 @@ module RailsErrorDashboard
54
141
  @errors_over_time = analytics[:errors_over_time]
55
142
  @errors_by_type = analytics[:errors_by_type]
56
143
  @errors_by_platform = analytics[:errors_by_platform]
57
- @errors_by_environment = analytics[:errors_by_environment]
58
144
  @errors_by_hour = analytics[:errors_by_hour]
59
145
  @top_users = analytics[:top_users]
60
146
  @resolution_rate = analytics[:resolution_rate]
@@ -62,6 +148,30 @@ module RailsErrorDashboard
62
148
  @api_errors = analytics[:api_errors]
63
149
  end
64
150
 
151
+ def platform_comparison
152
+ # Check if feature is enabled
153
+ unless RailsErrorDashboard.configuration.enable_platform_comparison
154
+ flash[:alert] = "Platform Comparison is not enabled. Enable it in config/initializers/rails_error_dashboard.rb"
155
+ redirect_to errors_path
156
+ return
157
+ end
158
+
159
+ days = (params[:days] || 7).to_i
160
+ @days = days
161
+
162
+ # Use Query to get platform comparison data
163
+ comparison = Queries::PlatformComparison.new(days: days)
164
+
165
+ @error_rate_by_platform = comparison.error_rate_by_platform
166
+ @severity_distribution = comparison.severity_distribution_by_platform
167
+ @resolution_times = comparison.resolution_time_by_platform
168
+ @top_errors_by_platform = comparison.top_errors_by_platform
169
+ @stability_scores = comparison.platform_stability_scores
170
+ @cross_platform_errors = comparison.cross_platform_errors
171
+ @daily_trends = comparison.daily_trend_by_platform
172
+ @platform_health = comparison.platform_health_summary
173
+ end
174
+
65
175
  def batch_action
66
176
  error_ids = params[:error_ids] || []
67
177
  action_type = params[:action_type]
@@ -88,15 +198,41 @@ module RailsErrorDashboard
88
198
  redirect_to errors_path
89
199
  end
90
200
 
201
+ def correlation
202
+ # Check if feature is enabled
203
+ unless RailsErrorDashboard.configuration.enable_error_correlation
204
+ flash[:alert] = "Error Correlation is not enabled. Enable it in config/initializers/rails_error_dashboard.rb"
205
+ redirect_to errors_path
206
+ return
207
+ end
208
+
209
+ days = (params[:days] || 30).to_i
210
+ @days = days
211
+ correlation = Queries::ErrorCorrelation.new(days: days)
212
+
213
+ @errors_by_version = correlation.errors_by_version
214
+ @errors_by_git_sha = correlation.errors_by_git_sha
215
+ @problematic_releases = correlation.problematic_releases
216
+ @multi_error_users = correlation.multi_error_users(min_error_types: 2)
217
+ @time_correlated_errors = correlation.time_correlated_errors
218
+ @period_comparison = correlation.period_comparison
219
+ @platform_specific_errors = correlation.platform_specific_errors
220
+ end
221
+
91
222
  private
92
223
 
93
224
  def filter_params
94
225
  {
95
- environment: params[:environment],
96
226
  error_type: params[:error_type],
97
227
  unresolved: params[:unresolved],
98
228
  platform: params[:platform],
99
- search: params[:search]
229
+ search: params[:search],
230
+ severity: params[:severity],
231
+ # Phase 3: Workflow filter params
232
+ status: params[:status],
233
+ assigned_to: params[:assigned_to],
234
+ priority_level: params[:priority_level],
235
+ hide_snoozed: params[:hide_snoozed]
100
236
  }
101
237
  end
102
238
 
@@ -1,4 +1,59 @@
1
1
  module RailsErrorDashboard
2
2
  module ApplicationHelper
3
+ # Returns Bootstrap color class for error severity
4
+ # Uses Catppuccin Mocha colors in dark theme via CSS variables
5
+ # @param severity [Symbol] The severity level (:critical, :high, :medium, :low, :info)
6
+ # @return [String] Bootstrap color class (danger, warning, info, secondary)
7
+ def severity_color(severity)
8
+ case severity&.to_sym
9
+ when :critical
10
+ "danger" # Maps to --ctp-red in dark mode
11
+ when :high
12
+ "warning" # Maps to --ctp-peach in dark mode
13
+ when :medium
14
+ "info" # Maps to --ctp-blue in dark mode
15
+ when :low
16
+ "secondary" # Maps to --ctp-overlay1 in dark mode
17
+ else
18
+ "secondary"
19
+ end
20
+ end
21
+
22
+ # Returns CSS variable for severity color (for inline styles)
23
+ # Useful when you need to set background-color or color directly
24
+ # @param severity [Symbol] The severity level
25
+ # @return [String] CSS variable reference
26
+ def severity_color_var(severity)
27
+ case severity&.to_sym
28
+ when :critical
29
+ "var(--ctp-red)"
30
+ when :high
31
+ "var(--ctp-peach)"
32
+ when :medium
33
+ "var(--ctp-blue)"
34
+ when :low
35
+ "var(--ctp-overlay1)"
36
+ else
37
+ "var(--ctp-overlay1)"
38
+ end
39
+ end
40
+
41
+ # Returns platform-specific color class
42
+ # @param platform [String] Platform name (ios, android, web, api)
43
+ # @return [String] CSS color variable
44
+ def platform_color_var(platform)
45
+ case platform&.downcase
46
+ when "ios"
47
+ "var(--platform-ios)"
48
+ when "android"
49
+ "var(--platform-android)"
50
+ when "web"
51
+ "var(--platform-web)"
52
+ when "api"
53
+ "var(--platform-api)"
54
+ else
55
+ "var(--text-color)"
56
+ end
57
+ end
3
58
  end
4
59
  end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsErrorDashboard
4
+ module BacktraceHelper
5
+ # Parse backtrace string into structured frames
6
+ def parse_backtrace(backtrace_string)
7
+ Services::BacktraceParser.parse(backtrace_string)
8
+ end
9
+
10
+ # Filter to show only application code
11
+ def filter_app_code(frames)
12
+ frames.select { |f| f[:category] == :app }
13
+ end
14
+
15
+ # Filter to show framework/gem code
16
+ def filter_framework_code(frames)
17
+ frames.reject { |f| f[:category] == :app }
18
+ end
19
+
20
+ # Get icon for frame category
21
+ def frame_icon(category)
22
+ case category
23
+ when :app
24
+ '<i class="bi bi-code-square text-success"></i>'.html_safe
25
+ when :gem
26
+ '<i class="bi bi-box text-info"></i>'.html_safe
27
+ when :framework
28
+ '<i class="bi bi-gear text-warning"></i>'.html_safe
29
+ when :ruby_core
30
+ '<i class="bi bi-gem text-secondary"></i>'.html_safe
31
+ else
32
+ '<i class="bi bi-question-circle text-muted"></i>'.html_safe
33
+ end
34
+ end
35
+
36
+ # Get color class for frame category
37
+ def frame_color_class(category)
38
+ case category
39
+ when :app
40
+ "text-success fw-bold"
41
+ when :gem
42
+ "text-info"
43
+ when :framework
44
+ "text-warning"
45
+ when :ruby_core
46
+ "text-secondary"
47
+ else
48
+ "text-muted"
49
+ end
50
+ end
51
+
52
+ # Get background color class for frame
53
+ # Uses Catppuccin-themed backtrace frame classes from _components.scss
54
+ def frame_bg_class(category)
55
+ case category
56
+ when :app
57
+ "backtrace-frame frame-app"
58
+ when :gem
59
+ "backtrace-frame frame-gem"
60
+ when :framework
61
+ "backtrace-frame frame-framework"
62
+ when :ruby_core
63
+ "backtrace-frame frame-ruby-core"
64
+ else
65
+ ""
66
+ end
67
+ end
68
+
69
+ # Format category name
70
+ def frame_category_name(category)
71
+ case category
72
+ when :app
73
+ "Your Code"
74
+ when :gem
75
+ "Gem"
76
+ when :framework
77
+ "Rails Framework"
78
+ when :ruby_core
79
+ "Ruby Core"
80
+ else
81
+ "Unknown"
82
+ end
83
+ end
84
+
85
+ # Count frames by category
86
+ def frame_count_by_category(frames)
87
+ frames.group_by { |f| f[:category] }
88
+ .transform_values(&:count)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsErrorDashboard
4
+ module OverviewHelper
5
+ # All helper methods return Bootstrap semantic classes (success, warning, danger)
6
+ # These automatically map to Catppuccin Mocha colors in dark theme via CSS variables:
7
+ # - success → --ctp-green
8
+ # - warning → --ctp-peach
9
+ # - danger → --ctp-red
10
+ def error_rate_border_class(rate)
11
+ return "border-success" if rate < 1.0
12
+ return "border-warning" if rate < 5.0
13
+ "border-danger"
14
+ end
15
+
16
+ def error_rate_text_class(rate)
17
+ return "text-success" if rate < 1.0
18
+ return "text-warning" if rate < 5.0
19
+ "text-danger"
20
+ end
21
+
22
+ def trend_arrow(value)
23
+ return "→" if value.zero?
24
+ value > 0 ? "↑" : "↓"
25
+ end
26
+
27
+ def trend_color_class(value)
28
+ return "text-muted" if value.zero?
29
+ value > 0 ? "text-danger" : "text-success"
30
+ end
31
+
32
+ def trend_text(direction)
33
+ case direction
34
+ when :increasing
35
+ "Increasing"
36
+ when :decreasing
37
+ "Decreasing"
38
+ else
39
+ "Stable"
40
+ end
41
+ end
42
+
43
+ def severity_icon(severity)
44
+ case severity
45
+ when :critical
46
+ "🔴"
47
+ when :high
48
+ "🟠"
49
+ when :medium
50
+ "🟡"
51
+ else
52
+ "⚪"
53
+ end
54
+ end
55
+
56
+ def health_status_color(status)
57
+ case status
58
+ when :healthy
59
+ "success"
60
+ when :warning
61
+ "warning"
62
+ else
63
+ "danger"
64
+ end
65
+ end
66
+
67
+ def health_status_text(status)
68
+ case status
69
+ when :healthy
70
+ "✅ Healthy"
71
+ when :warning
72
+ "⚠️ Warning"
73
+ else
74
+ "🔴 Critical"
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsErrorDashboard
4
+ module UserAgentHelper
5
+ # Parse user agent string into browser, OS, and device info
6
+ def parse_user_agent(user_agent_string)
7
+ return default_user_agent_info if user_agent_string.blank?
8
+
9
+ browser = Browser.new(user_agent_string)
10
+
11
+ {
12
+ browser_name: browser_name(browser),
13
+ browser_version: browser.version,
14
+ os_name: os_name(browser),
15
+ device_type: device_type(browser),
16
+ platform: browser.platform.to_s.titleize,
17
+ is_mobile: browser.device.mobile?,
18
+ is_tablet: browser.device.tablet?,
19
+ is_bot: browser.bot?
20
+ }
21
+ rescue StandardError => e
22
+ Rails.logger.warn "[RailsErrorDashboard] Failed to parse user agent: #{e.message}"
23
+ default_user_agent_info
24
+ end
25
+
26
+ # Get browser icon based on browser name
27
+ def browser_icon(browser_info)
28
+ return '<i class="bi bi-question-circle text-muted"></i>'.html_safe if browser_info.blank?
29
+
30
+ case browser_info[:browser_name]&.downcase
31
+ when "chrome"
32
+ '<i class="bi bi-browser-chrome text-warning"></i>'.html_safe
33
+ when "firefox"
34
+ '<i class="bi bi-browser-firefox text-danger"></i>'.html_safe
35
+ when "safari"
36
+ '<i class="bi bi-browser-safari text-primary"></i>'.html_safe
37
+ when "edge"
38
+ '<i class="bi bi-browser-edge text-info"></i>'.html_safe
39
+ else
40
+ '<i class="bi bi-globe text-secondary"></i>'.html_safe
41
+ end
42
+ end
43
+
44
+ # Get OS icon based on OS name
45
+ def os_icon(browser_info)
46
+ return '<i class="bi bi-question-circle text-muted"></i>'.html_safe if browser_info.blank?
47
+
48
+ case browser_info[:os_name]&.downcase
49
+ when /windows/
50
+ '<i class="bi bi-windows text-primary"></i>'.html_safe
51
+ when /mac|darwin/
52
+ '<i class="bi bi-apple text-secondary"></i>'.html_safe
53
+ when /linux/
54
+ '<i class="bi bi-ubuntu text-danger"></i>'.html_safe
55
+ when /android/
56
+ '<i class="bi bi-android2 text-success"></i>'.html_safe
57
+ when /ios|iphone|ipad/
58
+ '<i class="bi bi-apple text-secondary"></i>'.html_safe
59
+ else
60
+ '<i class="bi bi-cpu text-muted"></i>'.html_safe
61
+ end
62
+ end
63
+
64
+ # Get device icon based on device type
65
+ def device_icon(browser_info)
66
+ return '<i class="bi bi-question-circle text-muted"></i>'.html_safe if browser_info.blank?
67
+
68
+ if browser_info[:is_mobile]
69
+ '<i class="bi bi-phone text-success"></i>'.html_safe
70
+ elsif browser_info[:is_tablet]
71
+ '<i class="bi bi-tablet text-info"></i>'.html_safe
72
+ else
73
+ '<i class="bi bi-laptop text-secondary"></i>'.html_safe
74
+ end
75
+ end
76
+
77
+ private
78
+
79
+ def browser_name(browser)
80
+ return "Chrome" if browser.chrome?
81
+ return "Firefox" if browser.firefox?
82
+ return "Safari" if browser.safari?
83
+ return "Edge" if browser.edge?
84
+ return "Opera" if browser.opera?
85
+ return "Internet Explorer" if browser.ie?
86
+ "Unknown"
87
+ end
88
+
89
+ def os_name(browser)
90
+ return "Windows" if browser.platform.windows?
91
+ return "macOS" if browser.platform.mac?
92
+ return "Linux" if browser.platform.linux?
93
+ return "Android" if browser.platform.android?
94
+ return "iOS" if browser.platform.ios?
95
+ "Unknown"
96
+ end
97
+
98
+ def device_type(browser)
99
+ return "Mobile" if browser.device.mobile?
100
+ return "Tablet" if browser.device.tablet?
101
+ return "Bot" if browser.bot?
102
+ "Desktop"
103
+ end
104
+
105
+ def default_user_agent_info
106
+ {
107
+ browser_name: "Unknown",
108
+ browser_version: nil,
109
+ os_name: "Unknown",
110
+ device_type: "Unknown",
111
+ platform: "Unknown",
112
+ is_mobile: false,
113
+ is_tablet: false,
114
+ is_bot: false
115
+ }
116
+ end
117
+ end
118
+ end