Module: TimeRangeConcern
- Extended by:
- ActiveSupport::Concern
- Included in:
- RailsPulse::DashboardController
- Defined in:
- app/controllers/concerns/time_range_concern.rb
Overview
TimeRangeConcern
Handles time range selection and filtering across all controllers. Supports multiple time range sources with priority order:
-
Page-specific preset/custom range (from dropdown/picker)
-
Chart zoom parameters
-
Time range selector (session)
-
Global filters (session)
-
Default time range
Normalizes times to beginning/end of hour or day based on range duration.
Instance Method Summary collapse
Instance Method Details
#default_time_range_key ⇒ Object
26 27 28 |
# File 'app/controllers/concerns/time_range_concern.rb', line 26 def default_time_range_key :last_24_hours end |
#setup_time_range ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'app/controllers/concerns/time_range_concern.rb', line 30 def setup_time_range default_key = default_time_range_key start_time = case default_key when :last_24_hours then 1.day.ago when :last_7_days then 1.week.ago when :last_14_days then 2.weeks.ago when :last_30_days then 1.month.ago else 1.day.ago end end_time = Time.zone.now selected_time_range = default_key ransack_params = params[:q] || {} # Priority 1: Page-specific preset from dropdown (check this first!) if ransack_params[:period_start_range].present? && ransack_params[:period_start_range].to_sym != :custom # Predefined time range from dropdown selected_time_range = ransack_params[:period_start_range] start_time = case selected_time_range.to_sym when :last_24_hours then 1.day.ago when :last_7_days then 1.week.ago when :last_14_days then 2.weeks.ago when :last_30_days then 1.month.ago else 1.day.ago # Default fallback end # Priority 2: Page-specific custom datetime range from picker (only if period_start_range is :custom) elsif ransack_params[:period_start_range].present? && ransack_params[:period_start_range].to_sym == :custom && ransack_params[:custom_date_range].present? && ransack_params[:custom_date_range].include?(" to ") # Custom datetime range from custom range picker dates = ransack_params[:custom_date_range].split(" to ") start_time = parse_time_param(dates[0].strip) end_time = parse_time_param(dates[1].strip) selected_time_range = :custom # Priority 3: Page-specific filters (chart zoom) elsif ransack_params[:occurred_at_gteq].present? && ransack_params[:occurred_at_lt].present? # Custom time range from chart zoom start_time = parse_time_param(ransack_params[:occurred_at_gteq]) end_time = parse_time_param(ransack_params[:occurred_at_lt]) selected_time_range = :custom # Priority 4: Time range selector (from session) elsif session[:time_range_preference].present? preference = session[:time_range_preference] if preference.is_a?(Hash) && preference["type"] == "custom" # Custom range from time range selector start_time = parse_time_param(preference["start_time"]) end_time = parse_time_param(preference["end_time"]) selected_time_range = :custom else # Preset from time range selector selected_time_range = preference.to_sym start_time = case selected_time_range when :last_24_hours then 1.day.ago when :last_7_days then 1.week.ago when :last_14_days then 2.weeks.ago when :last_30_days then 1.month.ago else start_time end end # Priority 5: Global filters (from session) elsif session_global_filters["start_time"].present? || session_global_filters["end_time"].present? start_time = parse_time_param(session_global_filters["start_time"]) if session_global_filters["start_time"].present? end_time = parse_time_param(session_global_filters["end_time"]) if session_global_filters["end_time"].present? selected_time_range = :custom end # Priority 6: Default time range (already set above) time_diff = (end_time.to_i - start_time.to_i) / 3600.0 if time_diff <= 25 start_time = start_time.beginning_of_hour end_time = end_time.end_of_hour else start_time = start_time.beginning_of_day end_time = end_time.end_of_day end # Convert selected_time_range to string for backward compatibility with tests [ start_time.to_i, end_time.to_i, selected_time_range.to_s, time_diff ] end |