Module: RailsOnboarding::TurboCompatibility

Extended by:
ActiveSupport::Concern
Defined in:
lib/rails_onboarding/turbo_compatibility.rb

Overview

Comprehensive Turbo and Stimulus compatibility for Rails 7+ Provides seamless integration with Hotwire stack

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#broadcast_onboarding_update(user, action, data = {}) ⇒ Object

Broadcast onboarding updates via Turbo Streams



108
109
110
111
112
113
114
115
116
117
118
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 108

def broadcast_onboarding_update(user, action, data = {})
  return unless self.class.turbo_integration_options[:broadcast_updates]
  return unless defined?(Turbo::StreamsChannel)

  Turbo::StreamsChannel.broadcast_update_to(
    "onboarding_#{user.id}",
    target: "onboarding-container",
    partial: "rails_onboarding/onboarding/#{action}",
    locals: { user: user, data: data }
  )
end

#disable_turboObject

Disable Turbo for specific links/forms



193
194
195
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 193

def disable_turbo
  { 'data-turbo': "false" }
end

#enable_turbo_morphingObject

Turbo Morphing support (for Turbo 8+)



130
131
132
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 130

def enable_turbo_morphing
  response.headers["X-Turbo-Morph"] = "true" if turbo_morph_supported?
end

#respond_with_turbo(options = {}, &block) ⇒ Object

Respond with appropriate format for Turbo



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 60

def respond_with_turbo(options = {}, &block)
  respond_to do |format|
    format.html do
      if turbo_frame_request?
        render options.merge(layout: false)
      else
        render options
      end
    end

    format.turbo_stream do
      if block_given?
        yield
      else
        render turbo_stream: turbo_stream_actions(options)
      end
    end
  end
end

#stimulus_action(event, controller, method, params = {}) ⇒ Object

Generate Stimulus action attributes



152
153
154
155
156
157
158
159
160
161
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 152

def stimulus_action(event, controller, method, params = {})
  action_string = "#{event}->rails-onboarding--#{controller}##{method}"

  unless params.empty?
    param_string = params.map { |k, v| "#{k}:#{v}" }.join(" ")
    action_string += "(#{param_string})"
  end

  { action: action_string }
end

#stimulus_controller_data(controller_name, values = {}) ⇒ Object

Stimulus controller data attributes



141
142
143
144
145
146
147
148
149
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 141

def stimulus_controller_data(controller_name, values = {})
  data = { controller: "rails-onboarding--#{controller_name}" }

  values.each do |key, value|
    data[:"rails-onboarding--#{controller_name}-#{key}-value"] = value
  end

  data
end

#turbo_confirm(message) ⇒ Object

Handle Turbo Confirm dialogs



183
184
185
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 183

def turbo_confirm(message)
  { 'data-turbo-confirm': message }
end

#turbo_frame_request?Boolean

Turbo Frame helpers

Returns:

  • (Boolean)


42
43
44
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 42

def turbo_frame_request?
  request.headers["Turbo-Frame"].present?
end

#turbo_frame_request_idObject



46
47
48
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 46

def turbo_frame_request_id
  request.headers["Turbo-Frame"]
end

#turbo_frame_tag_for_onboarding(id, **options, &block) ⇒ Object

Turbo Frame tag helper



164
165
166
167
168
169
170
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 164

def turbo_frame_tag_for_onboarding(id, **options, &block)
  if defined?(turbo_frame_tag)
    turbo_frame_tag(id, **options, &block)
  else
    (:turbo-frame, id: id, **options, &block)
  end
end

#turbo_method(method) ⇒ Object

Handle Turbo Method overrides



188
189
190
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 188

def turbo_method(method)
  { 'data-turbo-method': method }
end

#turbo_morph_supported?Boolean

Returns:

  • (Boolean)


134
135
136
137
138
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 134

def turbo_morph_supported?
  return false unless defined?(Turbo)
  # Check if Turbo version supports morphing (8.0+)
  Turbo::VERSION.to_f >= 8.0 rescue false
end

#turbo_native_app?Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 55

def turbo_native_app?
  request.user_agent.to_s.match?(/Turbo Native/)
end

#turbo_navigate_to(path, options = {}) ⇒ Object

Helper to safely navigate with Turbo



121
122
123
124
125
126
127
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 121

def turbo_navigate_to(path, options = {})
  if turbo_stream_request?
    turbo_stream.action(:redirect, path)
  else
    redirect_to path, options
  end
end

#turbo_permanentObject

Enable Turbo permanent elements



198
199
200
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 198

def turbo_permanent
  { 'data-turbo-permanent': "true" }
end

#turbo_stream_actions(options = {}) ⇒ Object

Generate Turbo Stream actions



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
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 81

def turbo_stream_actions(options = {})
  actions = []

  if options[:replace]
    actions << turbo_stream.replace(options[:replace], partial: options[:partial])
  end

  if options[:update]
    actions << turbo_stream.update(options[:update], partial: options[:partial])
  end

  if options[:append]
    actions << turbo_stream.append(options[:append], partial: options[:partial])
  end

  if options[:prepend]
    actions << turbo_stream.prepend(options[:prepend], partial: options[:partial])
  end

  if options[:remove]
    actions << turbo_stream.remove(options[:remove])
  end

  actions
end

#turbo_stream_request?Boolean

Returns:

  • (Boolean)


50
51
52
53
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 50

def turbo_stream_request?
  request.format == :turbo_stream ||
  request.headers["Accept"]&.include?("text/vnd.turbo-stream.html")
end

#turbo_stream_tag_for_onboarding(action, target, **options, &block) ⇒ Object

Turbo Stream tag helper



173
174
175
176
177
178
179
180
# File 'lib/rails_onboarding/turbo_compatibility.rb', line 173

def turbo_stream_tag_for_onboarding(action, target, **options, &block)
  if defined?(turbo_stream)
    turbo_stream.send(action, target, **options, &block)
  else
    # Fallback for older versions
    ("turbo-stream", action: action, target: target, **options, &block)
  end
end