rails_onboarding 0.6.1

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 (148) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +1351 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/javascripts/rails_onboarding/admin/chart_controller.js +25 -0
  6. data/app/assets/javascripts/rails_onboarding/admin/filter_controller.js +49 -0
  7. data/app/assets/javascripts/rails_onboarding/admin/flash_controller.js +21 -0
  8. data/app/assets/javascripts/rails_onboarding/admin/flow_editor_controller.js +86 -0
  9. data/app/assets/javascripts/rails_onboarding/application.js +231 -0
  10. data/app/assets/javascripts/rails_onboarding/milestone_celebration_controller.js +177 -0
  11. data/app/assets/javascripts/rails_onboarding/milestone_dashboard_controller.js +132 -0
  12. data/app/assets/javascripts/rails_onboarding/milestone_detail_controller.js +34 -0
  13. data/app/assets/javascripts/rails_onboarding/navigation_controller.js +277 -0
  14. data/app/assets/javascripts/rails_onboarding/onboarding_controller.js +326 -0
  15. data/app/assets/javascripts/rails_onboarding/progress_controller.js +203 -0
  16. data/app/assets/javascripts/rails_onboarding/progressive_disclosure_controller.js +218 -0
  17. data/app/assets/javascripts/rails_onboarding/tooltip_controller.js +1237 -0
  18. data/app/assets/javascripts/rails_onboarding/tooltip_scheduler_controller.js +511 -0
  19. data/app/assets/javascripts/rails_onboarding/tour_controller.js +763 -0
  20. data/app/assets/stylesheets/rails_onboarding/accessibility.css +536 -0
  21. data/app/assets/stylesheets/rails_onboarding/admin.css +816 -0
  22. data/app/assets/stylesheets/rails_onboarding/application.css +1145 -0
  23. data/app/assets/stylesheets/rails_onboarding/flash_messages.css +237 -0
  24. data/app/assets/stylesheets/rails_onboarding/milestones.css +545 -0
  25. data/app/assets/stylesheets/rails_onboarding/mobile.css +856 -0
  26. data/app/assets/stylesheets/rails_onboarding/progressive_disclosure.css +299 -0
  27. data/app/assets/stylesheets/rails_onboarding/tooltips.css +468 -0
  28. data/app/assets/stylesheets/rails_onboarding/tour.css +495 -0
  29. data/app/assets/stylesheets/rails_onboarding/utilities.css +393 -0
  30. data/app/controllers/concerns/rails_onboarding/admin_authorization.rb +98 -0
  31. data/app/controllers/concerns/rails_onboarding/rate_limitable.rb +104 -0
  32. data/app/controllers/rails_onboarding/ab_tests_controller.rb +257 -0
  33. data/app/controllers/rails_onboarding/admin/ab_tests_controller.rb +121 -0
  34. data/app/controllers/rails_onboarding/admin/base_controller.rb +68 -0
  35. data/app/controllers/rails_onboarding/admin/dashboard_controller.rb +189 -0
  36. data/app/controllers/rails_onboarding/admin/flows_controller.rb +175 -0
  37. data/app/controllers/rails_onboarding/admin/users_controller.rb +366 -0
  38. data/app/controllers/rails_onboarding/application_controller.rb +9 -0
  39. data/app/controllers/rails_onboarding/milestones_controller.rb +126 -0
  40. data/app/controllers/rails_onboarding/onboarding_controller.rb +409 -0
  41. data/app/controllers/rails_onboarding/progressive_features_controller.rb +134 -0
  42. data/app/controllers/rails_onboarding/templates_controller.rb +162 -0
  43. data/app/controllers/rails_onboarding/test_sessions_controller.rb +16 -0
  44. data/app/controllers/rails_onboarding/tooltips_controller.rb +92 -0
  45. data/app/helpers/rails_onboarding/application_helper.rb +4 -0
  46. data/app/helpers/rails_onboarding/i18n_helper.rb +137 -0
  47. data/app/helpers/rails_onboarding/personalization_helper.rb +184 -0
  48. data/app/helpers/rails_onboarding/templates_helper.rb +253 -0
  49. data/app/jobs/rails_onboarding/application_job.rb +4 -0
  50. data/app/mailers/rails_onboarding/application_mailer.rb +6 -0
  51. data/app/mailers/rails_onboarding/onboarding_mailer.rb +72 -0
  52. data/app/models/concerns/rails_onboarding/ab_testable.rb +149 -0
  53. data/app/models/concerns/rails_onboarding/onboardable.rb +649 -0
  54. data/app/models/concerns/rails_onboarding/personalizable.rb +211 -0
  55. data/app/models/concerns/rails_onboarding/progressive_disclosure.rb +276 -0
  56. data/app/models/rails_onboarding/analytics.rb +255 -0
  57. data/app/models/rails_onboarding/analytics_event.rb +168 -0
  58. data/app/models/rails_onboarding/application_record.rb +5 -0
  59. data/app/models/rails_onboarding/flow.rb +41 -0
  60. data/app/services/rails_onboarding/milestone_service.rb +105 -0
  61. data/app/views/layouts/rails_onboarding/admin.html.erb +106 -0
  62. data/app/views/layouts/rails_onboarding/application.html.erb +65 -0
  63. data/app/views/rails_onboarding/ab_tests/index.html.erb +209 -0
  64. data/app/views/rails_onboarding/ab_tests/results.html.erb +253 -0
  65. data/app/views/rails_onboarding/admin/ab_tests/_ab_test_card.html.erb +24 -0
  66. data/app/views/rails_onboarding/admin/ab_tests/index.html.erb +57 -0
  67. data/app/views/rails_onboarding/admin/ab_tests/show.html.erb +41 -0
  68. data/app/views/rails_onboarding/admin/dashboard/index.html.erb +224 -0
  69. data/app/views/rails_onboarding/admin/flows/_form.html.erb +147 -0
  70. data/app/views/rails_onboarding/admin/flows/edit.html.erb +7 -0
  71. data/app/views/rails_onboarding/admin/flows/index.html.erb +125 -0
  72. data/app/views/rails_onboarding/admin/flows/new.html.erb +7 -0
  73. data/app/views/rails_onboarding/admin/flows/preview.html.erb +40 -0
  74. data/app/views/rails_onboarding/admin/flows/show.html.erb +114 -0
  75. data/app/views/rails_onboarding/admin/users/index.html.erb +180 -0
  76. data/app/views/rails_onboarding/admin/users/show.html.erb +187 -0
  77. data/app/views/rails_onboarding/milestones/index.html.erb +64 -0
  78. data/app/views/rails_onboarding/milestones/show.html.erb +57 -0
  79. data/app/views/rails_onboarding/onboarding/_custom_footer.html.erb +2 -0
  80. data/app/views/rails_onboarding/onboarding/_progress_indicator.html.erb +56 -0
  81. data/app/views/rails_onboarding/onboarding/_step_navigation.html.erb +44 -0
  82. data/app/views/rails_onboarding/onboarding/step.html.erb +38 -0
  83. data/app/views/rails_onboarding/onboarding/welcome.html.erb +37 -0
  84. data/app/views/rails_onboarding/onboarding_mailer/completion_email.html.erb +109 -0
  85. data/app/views/rails_onboarding/onboarding_mailer/completion_email.text.erb +29 -0
  86. data/app/views/rails_onboarding/onboarding_mailer/reminder_email.html.erb +99 -0
  87. data/app/views/rails_onboarding/onboarding_mailer/reminder_email.text.erb +20 -0
  88. data/app/views/rails_onboarding/onboarding_mailer/step_completed_email.html.erb +105 -0
  89. data/app/views/rails_onboarding/onboarding_mailer/step_completed_email.text.erb +19 -0
  90. data/app/views/rails_onboarding/onboarding_mailer/welcome_email.html.erb +74 -0
  91. data/app/views/rails_onboarding/onboarding_mailer/welcome_email.text.erb +17 -0
  92. data/app/views/rails_onboarding/shared/_flash.html.erb +25 -0
  93. data/app/views/rails_onboarding/shared/_milestone_badge.html.erb +22 -0
  94. data/app/views/rails_onboarding/shared/_milestone_celebration.html.erb +44 -0
  95. data/app/views/rails_onboarding/shared/_onboarding_banner.html.erb +48 -0
  96. data/app/views/rails_onboarding/templates/index.html.erb +255 -0
  97. data/config/importmap.rb +33 -0
  98. data/config/locales/en.yml +62 -0
  99. data/config/locales/es.yml +62 -0
  100. data/config/locales/fr.yml +62 -0
  101. data/config/routes.rb +79 -0
  102. data/lib/generators/rails_onboarding/install_generator.rb +124 -0
  103. data/lib/generators/rails_onboarding/templates/README +120 -0
  104. data/lib/generators/rails_onboarding/templates/add_analytics_to_rails_onboarding.rb +33 -0
  105. data/lib/generators/rails_onboarding/templates/add_milestone_tracking_to_users.rb +38 -0
  106. data/lib/generators/rails_onboarding/templates/add_onboarding_indexes.rb +93 -0
  107. data/lib/generators/rails_onboarding/templates/add_onboarding_to_users.rb +51 -0
  108. data/lib/generators/rails_onboarding/templates/add_robustness_fields_to_users.rb.tt +20 -0
  109. data/lib/generators/rails_onboarding/templates/create_rails_onboarding_flows.rb +18 -0
  110. data/lib/generators/rails_onboarding/templates/onboarding.css +18 -0
  111. data/lib/generators/rails_onboarding/templates/rails_onboarding.rb +75 -0
  112. data/lib/generators/rails_onboarding/update_generator.rb +73 -0
  113. data/lib/rails_onboarding/api_mode.rb +367 -0
  114. data/lib/rails_onboarding/backfill.rb +130 -0
  115. data/lib/rails_onboarding/background_jobs.rb +412 -0
  116. data/lib/rails_onboarding/caching.rb +180 -0
  117. data/lib/rails_onboarding/cdn_support.rb +202 -0
  118. data/lib/rails_onboarding/configuration/ab_testing.rb +24 -0
  119. data/lib/rails_onboarding/configuration/analytics.rb +29 -0
  120. data/lib/rails_onboarding/configuration/integrations.rb +31 -0
  121. data/lib/rails_onboarding/configuration/milestones.rb +92 -0
  122. data/lib/rails_onboarding/configuration/personalization.rb +25 -0
  123. data/lib/rails_onboarding/configuration/progressive_disclosure.rb +41 -0
  124. data/lib/rails_onboarding/configuration/rate_limiting.rb +18 -0
  125. data/lib/rails_onboarding/configuration/steps.rb +121 -0
  126. data/lib/rails_onboarding/configuration/templates.rb +85 -0
  127. data/lib/rails_onboarding/configuration/tooltips.rb +32 -0
  128. data/lib/rails_onboarding/configuration.rb +133 -0
  129. data/lib/rails_onboarding/configuration_errors.rb +19 -0
  130. data/lib/rails_onboarding/configuration_validator.rb +477 -0
  131. data/lib/rails_onboarding/controller_helpers.rb +153 -0
  132. data/lib/rails_onboarding/current.rb +13 -0
  133. data/lib/rails_onboarding/deprecation.rb +64 -0
  134. data/lib/rails_onboarding/devise_integration.rb +122 -0
  135. data/lib/rails_onboarding/engine.rb +245 -0
  136. data/lib/rails_onboarding/error_recovery.rb +173 -0
  137. data/lib/rails_onboarding/lazy_loading.rb +155 -0
  138. data/lib/rails_onboarding/multi_tenant.rb +306 -0
  139. data/lib/rails_onboarding/requirements_validator.rb +315 -0
  140. data/lib/rails_onboarding/responsive_helper.rb +218 -0
  141. data/lib/rails_onboarding/session_manager.rb +187 -0
  142. data/lib/rails_onboarding/skip_logic.rb +159 -0
  143. data/lib/rails_onboarding/turbo_compatibility.rb +229 -0
  144. data/lib/rails_onboarding/version.rb +3 -0
  145. data/lib/rails_onboarding.rb +44 -0
  146. data/lib/tasks/rails_onboarding_analytics.rake +136 -0
  147. data/lib/tasks/rails_onboarding_tasks.rake +162 -0
  148. metadata +303 -0
@@ -0,0 +1,136 @@
1
+ namespace :rails_onboarding do
2
+ namespace :analytics do
3
+ desc "Clean up old analytics data based on retention policy"
4
+ task cleanup: :environment do
5
+ unless RailsOnboarding::AnalyticsEvent.table_exists?
6
+ puts "Analytics table not found. Run 'rails generate rails_onboarding:install' first."
7
+ exit 1
8
+ end
9
+
10
+ retention_days = RailsOnboarding.configuration.analytics_data_retention_days
11
+ cutoff_date = retention_days.days.ago
12
+
13
+ deleted_count = RailsOnboarding::AnalyticsEvent
14
+ .where("occurred_at < ?", cutoff_date)
15
+ .delete_all
16
+
17
+ puts "Cleaned up #{deleted_count} analytics events older than #{retention_days} days"
18
+ end
19
+
20
+ desc "Generate analytics report for date range"
21
+ task :report, [ :start_date, :end_date ] => :environment do |t, args|
22
+ unless RailsOnboarding::AnalyticsEvent.table_exists?
23
+ puts "Analytics table not found. Run 'rails generate rails_onboarding:install' first."
24
+ exit 1
25
+ end
26
+
27
+ start_date = args[:start_date] ? Date.parse(args[:start_date]) : 30.days.ago.to_date
28
+ end_date = args[:end_date] ? Date.parse(args[:end_date]) : Date.current
29
+ date_range = start_date.beginning_of_day..end_date.end_of_day
30
+
31
+ puts "=== Onboarding Analytics Report ==="
32
+ puts "Period: #{start_date} to #{end_date}"
33
+ puts "=" * 40
34
+
35
+ completion_rate = RailsOnboarding::Analytics.onboarding_completion_rate(date_range: date_range)
36
+ skip_rate = RailsOnboarding::Analytics.onboarding_skip_rate(date_range: date_range)
37
+ avg_time = RailsOnboarding::Analytics.average_completion_time(date_range: date_range)
38
+
39
+ puts "Overall Metrics:"
40
+ puts " Completion Rate: #{completion_rate}%"
41
+ puts " Skip Rate: #{skip_rate}%"
42
+ puts " Average Completion Time: #{avg_time} seconds"
43
+ puts
44
+
45
+ step_rates = RailsOnboarding::Analytics.step_completion_rates(date_range: date_range)
46
+ skip_rates = RailsOnboarding::Analytics.step_skip_rates(date_range: date_range)
47
+
48
+ puts "Step Performance:"
49
+ RailsOnboarding.configuration.steps.each do |step|
50
+ step_name = step[:name].to_s
51
+ completion = step_rates[step_name] || 0
52
+ skips = skip_rates[step_name] || 0
53
+ puts " #{step[:title]} (#{step_name}): #{completion}% completion, #{skips}% skip"
54
+ end
55
+ puts
56
+
57
+ tooltip_rate = RailsOnboarding::Analytics.tooltip_engagement_rate(date_range: date_range)
58
+ puts "Tooltip Engagement Rate: #{tooltip_rate}%"
59
+
60
+ milestone_rates = RailsOnboarding::Analytics.milestone_achievement_rates(date_range: date_range)
61
+ if milestone_rates.any?
62
+ puts
63
+ puts "Milestone Achievement Rates:"
64
+ milestone_rates.each do |milestone, rate|
65
+ puts " #{milestone}: #{rate}%"
66
+ end
67
+ end
68
+ end
69
+
70
+ desc "Export analytics data to CSV"
71
+ task :export, [ :start_date, :end_date, :output_file ] => :environment do |t, args|
72
+ unless RailsOnboarding::AnalyticsEvent.table_exists?
73
+ puts "Analytics table not found. Run 'rails generate rails_onboarding:install' first."
74
+ exit 1
75
+ end
76
+
77
+ require "csv"
78
+
79
+ start_date = args[:start_date] ? Date.parse(args[:start_date]) : 30.days.ago.to_date
80
+ end_date = args[:end_date] ? Date.parse(args[:end_date]) : Date.current
81
+ output_file = args[:output_file] || "onboarding_analytics_#{start_date}_to_#{end_date}.csv"
82
+
83
+ date_range = start_date.beginning_of_day..end_date.end_of_day
84
+ events = RailsOnboarding::AnalyticsEvent.by_date_range(date_range.begin, date_range.end)
85
+
86
+ CSV.open(output_file, "w") do |csv|
87
+ csv << [ "ID", "User Type", "User ID", "Event Type", "Properties", "Session ID", "Occurred At", "Created At" ]
88
+
89
+ events.find_each do |event|
90
+ csv << [
91
+ event.id,
92
+ event.user_type,
93
+ event.user_id,
94
+ event.event_type,
95
+ event.properties.to_json,
96
+ event.session_id,
97
+ event.occurred_at,
98
+ event.created_at
99
+ ]
100
+ end
101
+ end
102
+
103
+ puts "Exported #{events.count} analytics events to #{output_file}"
104
+ end
105
+
106
+ desc "Show funnel analysis"
107
+ task :funnel, [ :start_date, :end_date ] => :environment do |t, args|
108
+ unless RailsOnboarding::AnalyticsEvent.table_exists?
109
+ puts "Analytics table not found. Run 'rails generate rails_onboarding:install' first."
110
+ exit 1
111
+ end
112
+
113
+ start_date = args[:start_date] ? Date.parse(args[:start_date]) : 30.days.ago.to_date
114
+ end_date = args[:end_date] ? Date.parse(args[:end_date]) : Date.current
115
+ date_range = start_date.beginning_of_day..end_date.end_of_day
116
+
117
+ funnel = RailsOnboarding::Analytics.funnel_analysis(date_range: date_range)
118
+
119
+ puts "=== Onboarding Funnel Analysis ==="
120
+ puts "Period: #{start_date} to #{end_date}"
121
+ puts "=" * 40
122
+
123
+ puts "Total Users Started: #{funnel[:total_started]}"
124
+ puts "Overall Completion Rate: #{funnel[:overall_completion_rate]}%"
125
+ puts
126
+
127
+ puts "Step-by-Step Funnel:"
128
+ funnel[:steps].each do |step|
129
+ puts " #{step[:step_index] + 1}. #{step[:step_title]}"
130
+ puts " Users Reached: #{step[:users_reached]}"
131
+ puts " Retention Rate: #{step[:retention_rate]}%"
132
+ puts
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,162 @@
1
+ namespace :rails_onboarding do
2
+ desc "Validate that host application meets all RailsOnboarding requirements"
3
+ task validate: :environment do
4
+ puts "\n" + "=" * 80
5
+ puts "RailsOnboarding Requirements Validation"
6
+ puts "=" * 80 + "\n"
7
+
8
+ begin
9
+ results = RailsOnboarding::RequirementsValidator.check
10
+
11
+ # Print info
12
+ if results[:info].any?
13
+ puts "\nValidation Results:"
14
+ results[:info].each { |info| puts " #{info}" }
15
+ end
16
+
17
+ # Print warnings
18
+ if results[:warnings].any?
19
+ puts "\n⚠️ WARNINGS (#{results[:warnings].size}):"
20
+ results[:warnings].each { |warning| puts " ⚠ #{warning}" }
21
+ end
22
+
23
+ # Print errors
24
+ if results[:errors].any?
25
+ puts "\n❌ ERRORS (#{results[:errors].size}):"
26
+ results[:errors].each { |error| puts " ✗ #{error}" }
27
+ puts "\n" + "=" * 80
28
+ puts "❌ Validation FAILED - Please fix the errors above"
29
+ puts "=" * 80 + "\n"
30
+ exit 1
31
+ else
32
+ puts "\n" + "=" * 80
33
+ puts "✅ All requirements validated successfully!"
34
+ puts "=" * 80 + "\n"
35
+ end
36
+ rescue => e
37
+ puts "\n❌ Error running validation: #{e.message}"
38
+ puts e.backtrace.first(5).join("\n") if ENV["DEBUG"]
39
+ exit 1
40
+ end
41
+ end
42
+
43
+ desc "Display RailsOnboarding configuration"
44
+ task config: :environment do
45
+ puts "\n" + "=" * 80
46
+ puts "RailsOnboarding Configuration"
47
+ puts "=" * 80 + "\n"
48
+
49
+ config = RailsOnboarding.configuration
50
+
51
+ puts "User Class: #{config.user_class_name}"
52
+ puts "Steps: #{config.steps.size} configured"
53
+ config.steps.each_with_index do |step, index|
54
+ puts " #{index + 1}. #{step[:name]} - #{step[:title]} #{'(skippable)' if step[:skippable]}"
55
+ end
56
+
57
+ puts "\nFeatures:"
58
+ puts " Tooltips: #{config.enable_tooltips ? '✓ enabled' : '✗ disabled'}"
59
+ puts " Milestones: #{config.enable_milestones ? '✓ enabled' : '✗ disabled'}"
60
+ puts " Emails: #{config.enable_emails ? '✓ enabled' : '✗ disabled'}"
61
+
62
+ puts "\nRedirects:"
63
+ puts " After completion: #{config.redirect_after_completion || 'not configured'}"
64
+ puts " After skip: #{config.redirect_after_skip || 'not configured'}"
65
+
66
+ puts "\nOptional Dependencies:"
67
+ puts " ActiveJob: #{RailsOnboarding.active_job_available? ? '✓' : '✗'}"
68
+ puts " ActionMailer: #{RailsOnboarding.action_mailer_available? ? '✓' : '✗'}"
69
+ puts " ActionMailer configured: #{RailsOnboarding.action_mailer_configured? ? '✓' : '✗'}"
70
+ puts " Devise: #{defined?(Devise) ? '✓' : '✗'}"
71
+ puts " Turbo: #{defined?(Turbo) ? '✓' : '✗'}"
72
+ puts " Stimulus: #{defined?(Stimulus) ? '✓' : '✗'}"
73
+
74
+ puts "\n" + "=" * 80 + "\n"
75
+ end
76
+
77
+ desc "Reset onboarding for a user (provide USER_ID=123)"
78
+ task reset_user: :environment do
79
+ user_id = ENV["USER_ID"]
80
+
81
+ unless user_id
82
+ puts "❌ Error: Please provide USER_ID environment variable"
83
+ puts "Usage: rake rails_onboarding:reset_user USER_ID=123"
84
+ exit 1
85
+ end
86
+
87
+ user_class = RailsOnboarding.configuration.user_class_name.constantize
88
+ user = user_class.find_by(id: user_id)
89
+
90
+ unless user
91
+ puts "❌ Error: User with ID #{user_id} not found"
92
+ exit 1
93
+ end
94
+
95
+ user.reset_onboarding!
96
+ puts "✅ Onboarding reset for user ##{user_id}"
97
+ rescue => e
98
+ puts "❌ Error: #{e.message}"
99
+ exit 1
100
+ end
101
+
102
+ desc "Mark pre-existing users as already onboarded (BEFORE=2026-01-01 DRY_RUN=true)"
103
+ task backfill_existing_users: :environment do
104
+ options = {
105
+ created_before: ENV["BEFORE"].presence,
106
+ dry_run: ENV["DRY_RUN"].to_s.downcase.in?(%w[1 true yes]),
107
+ batch_size: (ENV["BATCH_SIZE"].presence || RailsOnboarding::Backfill::DEFAULT_BATCH_SIZE).to_i
108
+ }.compact
109
+
110
+ puts "\n" + "=" * 80
111
+ puts "RailsOnboarding Backfill"
112
+ puts "=" * 80 + "\n"
113
+
114
+ puts "User class: #{RailsOnboarding::Backfill.user_class.name}"
115
+ puts "Cutoff: #{options[:created_before] || 'none (all users who never started onboarding)'}"
116
+ puts "Batch size: #{options[:batch_size]}"
117
+ puts "Mode: #{options[:dry_run] ? 'DRY RUN (no writes)' : 'LIVE'}"
118
+ puts
119
+
120
+ result = RailsOnboarding::Backfill.mark_existing_users_onboarded(**options)
121
+
122
+ if result.dry_run?
123
+ puts "Would mark #{result.matched} user(s) as onboarded."
124
+ puts "Re-run without DRY_RUN=true to apply."
125
+ else
126
+ puts "✅ Marked #{result.updated} of #{result.matched} matched user(s) as onboarded."
127
+ puts " onboarding_completed_at was set from each user's created_at where available."
128
+ end
129
+
130
+ puts "\n" + "=" * 80 + "\n"
131
+ rescue => e
132
+ puts "❌ Error: #{e.message}"
133
+ puts e.backtrace.first(5).join("\n") if ENV["DEBUG"]
134
+ exit 1
135
+ end
136
+
137
+ desc "Show onboarding statistics"
138
+ task stats: :environment do
139
+ user_class = RailsOnboarding.configuration.user_class_name.constantize
140
+
141
+ total_users = user_class.count
142
+ completed_users = user_class.where(onboarding_completed: true).count
143
+ skipped_users = user_class.where(onboarding_skipped: true).count
144
+ in_progress = total_users - completed_users - skipped_users
145
+
146
+ completion_rate = total_users > 0 ? (completed_users.to_f / total_users * 100).round(2) : 0
147
+
148
+ puts "\n" + "=" * 80
149
+ puts "RailsOnboarding Statistics"
150
+ puts "=" * 80 + "\n"
151
+
152
+ puts "Total Users: #{total_users}"
153
+ puts "Completed Onboarding: #{completed_users} (#{completion_rate}%)"
154
+ puts "Skipped Onboarding: #{skipped_users}"
155
+ puts "In Progress: #{in_progress}"
156
+
157
+ puts "\n" + "=" * 80 + "\n"
158
+ rescue => e
159
+ puts "❌ Error: #{e.message}"
160
+ exit 1
161
+ end
162
+ end
metadata ADDED
@@ -0,0 +1,303 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_onboarding
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.1
5
+ platform: ruby
6
+ authors:
7
+ - David Lewis
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 8.0.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 8.0.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: csv
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: pagy
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '43.6'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '43.6'
54
+ - !ruby/object:Gem::Dependency
55
+ name: minitest
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '6.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '6.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: factory_bot_rails
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '6.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '6.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: sqlite3
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: stimulus-rails
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 1.0.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.0.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: turbo-rails
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 1.0.0
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: 1.0.0
124
+ description: A mountable Rails engine that provides a customizable onboarding flow
125
+ with progress tracking, tooltips, and milestones
126
+ email:
127
+ - david@davidsfolly.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - MIT-LICENSE
133
+ - README.md
134
+ - Rakefile
135
+ - app/assets/javascripts/rails_onboarding/admin/chart_controller.js
136
+ - app/assets/javascripts/rails_onboarding/admin/filter_controller.js
137
+ - app/assets/javascripts/rails_onboarding/admin/flash_controller.js
138
+ - app/assets/javascripts/rails_onboarding/admin/flow_editor_controller.js
139
+ - app/assets/javascripts/rails_onboarding/application.js
140
+ - app/assets/javascripts/rails_onboarding/milestone_celebration_controller.js
141
+ - app/assets/javascripts/rails_onboarding/milestone_dashboard_controller.js
142
+ - app/assets/javascripts/rails_onboarding/milestone_detail_controller.js
143
+ - app/assets/javascripts/rails_onboarding/navigation_controller.js
144
+ - app/assets/javascripts/rails_onboarding/onboarding_controller.js
145
+ - app/assets/javascripts/rails_onboarding/progress_controller.js
146
+ - app/assets/javascripts/rails_onboarding/progressive_disclosure_controller.js
147
+ - app/assets/javascripts/rails_onboarding/tooltip_controller.js
148
+ - app/assets/javascripts/rails_onboarding/tooltip_scheduler_controller.js
149
+ - app/assets/javascripts/rails_onboarding/tour_controller.js
150
+ - app/assets/stylesheets/rails_onboarding/accessibility.css
151
+ - app/assets/stylesheets/rails_onboarding/admin.css
152
+ - app/assets/stylesheets/rails_onboarding/application.css
153
+ - app/assets/stylesheets/rails_onboarding/flash_messages.css
154
+ - app/assets/stylesheets/rails_onboarding/milestones.css
155
+ - app/assets/stylesheets/rails_onboarding/mobile.css
156
+ - app/assets/stylesheets/rails_onboarding/progressive_disclosure.css
157
+ - app/assets/stylesheets/rails_onboarding/tooltips.css
158
+ - app/assets/stylesheets/rails_onboarding/tour.css
159
+ - app/assets/stylesheets/rails_onboarding/utilities.css
160
+ - app/controllers/concerns/rails_onboarding/admin_authorization.rb
161
+ - app/controllers/concerns/rails_onboarding/rate_limitable.rb
162
+ - app/controllers/rails_onboarding/ab_tests_controller.rb
163
+ - app/controllers/rails_onboarding/admin/ab_tests_controller.rb
164
+ - app/controllers/rails_onboarding/admin/base_controller.rb
165
+ - app/controllers/rails_onboarding/admin/dashboard_controller.rb
166
+ - app/controllers/rails_onboarding/admin/flows_controller.rb
167
+ - app/controllers/rails_onboarding/admin/users_controller.rb
168
+ - app/controllers/rails_onboarding/application_controller.rb
169
+ - app/controllers/rails_onboarding/milestones_controller.rb
170
+ - app/controllers/rails_onboarding/onboarding_controller.rb
171
+ - app/controllers/rails_onboarding/progressive_features_controller.rb
172
+ - app/controllers/rails_onboarding/templates_controller.rb
173
+ - app/controllers/rails_onboarding/test_sessions_controller.rb
174
+ - app/controllers/rails_onboarding/tooltips_controller.rb
175
+ - app/helpers/rails_onboarding/application_helper.rb
176
+ - app/helpers/rails_onboarding/i18n_helper.rb
177
+ - app/helpers/rails_onboarding/personalization_helper.rb
178
+ - app/helpers/rails_onboarding/templates_helper.rb
179
+ - app/jobs/rails_onboarding/application_job.rb
180
+ - app/mailers/rails_onboarding/application_mailer.rb
181
+ - app/mailers/rails_onboarding/onboarding_mailer.rb
182
+ - app/models/concerns/rails_onboarding/ab_testable.rb
183
+ - app/models/concerns/rails_onboarding/onboardable.rb
184
+ - app/models/concerns/rails_onboarding/personalizable.rb
185
+ - app/models/concerns/rails_onboarding/progressive_disclosure.rb
186
+ - app/models/rails_onboarding/analytics.rb
187
+ - app/models/rails_onboarding/analytics_event.rb
188
+ - app/models/rails_onboarding/application_record.rb
189
+ - app/models/rails_onboarding/flow.rb
190
+ - app/services/rails_onboarding/milestone_service.rb
191
+ - app/views/layouts/rails_onboarding/admin.html.erb
192
+ - app/views/layouts/rails_onboarding/application.html.erb
193
+ - app/views/rails_onboarding/ab_tests/index.html.erb
194
+ - app/views/rails_onboarding/ab_tests/results.html.erb
195
+ - app/views/rails_onboarding/admin/ab_tests/_ab_test_card.html.erb
196
+ - app/views/rails_onboarding/admin/ab_tests/index.html.erb
197
+ - app/views/rails_onboarding/admin/ab_tests/show.html.erb
198
+ - app/views/rails_onboarding/admin/dashboard/index.html.erb
199
+ - app/views/rails_onboarding/admin/flows/_form.html.erb
200
+ - app/views/rails_onboarding/admin/flows/edit.html.erb
201
+ - app/views/rails_onboarding/admin/flows/index.html.erb
202
+ - app/views/rails_onboarding/admin/flows/new.html.erb
203
+ - app/views/rails_onboarding/admin/flows/preview.html.erb
204
+ - app/views/rails_onboarding/admin/flows/show.html.erb
205
+ - app/views/rails_onboarding/admin/users/index.html.erb
206
+ - app/views/rails_onboarding/admin/users/show.html.erb
207
+ - app/views/rails_onboarding/milestones/index.html.erb
208
+ - app/views/rails_onboarding/milestones/show.html.erb
209
+ - app/views/rails_onboarding/onboarding/_custom_footer.html.erb
210
+ - app/views/rails_onboarding/onboarding/_progress_indicator.html.erb
211
+ - app/views/rails_onboarding/onboarding/_step_navigation.html.erb
212
+ - app/views/rails_onboarding/onboarding/step.html.erb
213
+ - app/views/rails_onboarding/onboarding/welcome.html.erb
214
+ - app/views/rails_onboarding/onboarding_mailer/completion_email.html.erb
215
+ - app/views/rails_onboarding/onboarding_mailer/completion_email.text.erb
216
+ - app/views/rails_onboarding/onboarding_mailer/reminder_email.html.erb
217
+ - app/views/rails_onboarding/onboarding_mailer/reminder_email.text.erb
218
+ - app/views/rails_onboarding/onboarding_mailer/step_completed_email.html.erb
219
+ - app/views/rails_onboarding/onboarding_mailer/step_completed_email.text.erb
220
+ - app/views/rails_onboarding/onboarding_mailer/welcome_email.html.erb
221
+ - app/views/rails_onboarding/onboarding_mailer/welcome_email.text.erb
222
+ - app/views/rails_onboarding/shared/_flash.html.erb
223
+ - app/views/rails_onboarding/shared/_milestone_badge.html.erb
224
+ - app/views/rails_onboarding/shared/_milestone_celebration.html.erb
225
+ - app/views/rails_onboarding/shared/_onboarding_banner.html.erb
226
+ - app/views/rails_onboarding/templates/index.html.erb
227
+ - config/importmap.rb
228
+ - config/locales/en.yml
229
+ - config/locales/es.yml
230
+ - config/locales/fr.yml
231
+ - config/routes.rb
232
+ - lib/generators/rails_onboarding/install_generator.rb
233
+ - lib/generators/rails_onboarding/templates/README
234
+ - lib/generators/rails_onboarding/templates/add_analytics_to_rails_onboarding.rb
235
+ - lib/generators/rails_onboarding/templates/add_milestone_tracking_to_users.rb
236
+ - lib/generators/rails_onboarding/templates/add_onboarding_indexes.rb
237
+ - lib/generators/rails_onboarding/templates/add_onboarding_to_users.rb
238
+ - lib/generators/rails_onboarding/templates/add_robustness_fields_to_users.rb.tt
239
+ - lib/generators/rails_onboarding/templates/create_rails_onboarding_flows.rb
240
+ - lib/generators/rails_onboarding/templates/onboarding.css
241
+ - lib/generators/rails_onboarding/templates/rails_onboarding.rb
242
+ - lib/generators/rails_onboarding/update_generator.rb
243
+ - lib/rails_onboarding.rb
244
+ - lib/rails_onboarding/api_mode.rb
245
+ - lib/rails_onboarding/backfill.rb
246
+ - lib/rails_onboarding/background_jobs.rb
247
+ - lib/rails_onboarding/caching.rb
248
+ - lib/rails_onboarding/cdn_support.rb
249
+ - lib/rails_onboarding/configuration.rb
250
+ - lib/rails_onboarding/configuration/ab_testing.rb
251
+ - lib/rails_onboarding/configuration/analytics.rb
252
+ - lib/rails_onboarding/configuration/integrations.rb
253
+ - lib/rails_onboarding/configuration/milestones.rb
254
+ - lib/rails_onboarding/configuration/personalization.rb
255
+ - lib/rails_onboarding/configuration/progressive_disclosure.rb
256
+ - lib/rails_onboarding/configuration/rate_limiting.rb
257
+ - lib/rails_onboarding/configuration/steps.rb
258
+ - lib/rails_onboarding/configuration/templates.rb
259
+ - lib/rails_onboarding/configuration/tooltips.rb
260
+ - lib/rails_onboarding/configuration_errors.rb
261
+ - lib/rails_onboarding/configuration_validator.rb
262
+ - lib/rails_onboarding/controller_helpers.rb
263
+ - lib/rails_onboarding/current.rb
264
+ - lib/rails_onboarding/deprecation.rb
265
+ - lib/rails_onboarding/devise_integration.rb
266
+ - lib/rails_onboarding/engine.rb
267
+ - lib/rails_onboarding/error_recovery.rb
268
+ - lib/rails_onboarding/lazy_loading.rb
269
+ - lib/rails_onboarding/multi_tenant.rb
270
+ - lib/rails_onboarding/requirements_validator.rb
271
+ - lib/rails_onboarding/responsive_helper.rb
272
+ - lib/rails_onboarding/session_manager.rb
273
+ - lib/rails_onboarding/skip_logic.rb
274
+ - lib/rails_onboarding/turbo_compatibility.rb
275
+ - lib/rails_onboarding/version.rb
276
+ - lib/tasks/rails_onboarding_analytics.rake
277
+ - lib/tasks/rails_onboarding_tasks.rake
278
+ homepage: https://github.com/bunnahabhain/rails_onboarding
279
+ licenses:
280
+ - MIT
281
+ metadata:
282
+ allowed_push_host: https://rubygems.org
283
+ homepage_uri: https://github.com/bunnahabhain/rails_onboarding
284
+ source_code_uri: https://github.com/bunnahabhain/rails_onboarding/tree/v0.6.1
285
+ changelog_uri: https://github.com/bunnahabhain/rails_onboarding/blob/master/docs/CHANGELOG.md
286
+ rdoc_options: []
287
+ require_paths:
288
+ - lib
289
+ required_ruby_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: 3.4.9
294
+ required_rubygems_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ requirements: []
300
+ rubygems_version: 4.0.17
301
+ specification_version: 4
302
+ summary: Flexible onboarding engine for Rails applications
303
+ test_files: []