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
-
#broadcast_onboarding_update(user, action, data = {}) ⇒ Object
Broadcast onboarding updates via Turbo Streams.
-
#disable_turbo ⇒ Object
Disable Turbo for specific links/forms.
-
#enable_turbo_morphing ⇒ Object
Turbo Morphing support (for Turbo 8+).
-
#respond_with_turbo(options = {}, &block) ⇒ Object
Respond with appropriate format for Turbo.
-
#stimulus_action(event, controller, method, params = {}) ⇒ Object
Generate Stimulus action attributes.
-
#stimulus_controller_data(controller_name, values = {}) ⇒ Object
Stimulus controller data attributes.
-
#turbo_confirm(message) ⇒ Object
Handle Turbo Confirm dialogs.
-
#turbo_frame_request? ⇒ Boolean
Turbo Frame helpers.
- #turbo_frame_request_id ⇒ Object
-
#turbo_frame_tag_for_onboarding(id, **options, &block) ⇒ Object
Turbo Frame tag helper.
-
#turbo_method(method) ⇒ Object
Handle Turbo Method overrides.
- #turbo_morph_supported? ⇒ Boolean
- #turbo_native_app? ⇒ Boolean
-
#turbo_navigate_to(path, options = {}) ⇒ Object
Helper to safely navigate with Turbo.
-
#turbo_permanent ⇒ Object
Enable Turbo permanent elements.
-
#turbo_stream_actions(options = {}) ⇒ Object
Generate Turbo Stream actions.
- #turbo_stream_request? ⇒ Boolean
-
#turbo_stream_tag_for_onboarding(action, target, **options, &block) ⇒ Object
Turbo Stream tag helper.
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.[: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_turbo ⇒ Object
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_morphing ⇒ Object
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( = {}, &block) respond_to do |format| format.html do if turbo_frame_request? render .merge(layout: false) else render end end format.turbo_stream do if block_given? yield else render turbo_stream: turbo_stream_actions() 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() { 'data-turbo-confirm': } end |
#turbo_frame_request? ⇒ Boolean
Turbo Frame helpers
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_id ⇒ Object
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, **, &block) if defined?(turbo_frame_tag) turbo_frame_tag(id, **, &block) else content_tag(:turbo-frame, id: id, **, &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
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
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, = {}) if turbo_stream_request? turbo_stream.action(:redirect, path) else redirect_to path, end end |
#turbo_permanent ⇒ Object
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( = {}) actions = [] if [:replace] actions << turbo_stream.replace([:replace], partial: [:partial]) end if [:update] actions << turbo_stream.update([:update], partial: [:partial]) end if [:append] actions << turbo_stream.append([:append], partial: [:partial]) end if [:prepend] actions << turbo_stream.prepend([:prepend], partial: [:partial]) end if [:remove] actions << turbo_stream.remove([:remove]) end actions end |
#turbo_stream_request? ⇒ 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, **, &block) if defined?(turbo_stream) turbo_stream.send(action, target, **, &block) else # Fallback for older versions content_tag("turbo-stream", action: action, target: target, **, &block) end end |