render_turbo_stream 4.3.0 → 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -18
- data/app/models/render_turbo_stream/option.rb +4 -0
- data/app/views/render_turbo_stream.turbo_stream.erb +8 -2
- data/app/views/render_turbo_stream_request_test.html.erb +5 -2
- data/db/migrate/20230616070450_create_render_turbo_stream_options.rb +9 -0
- data/lib/render_turbo_stream/controller_channel_helpers.rb +2 -2
- data/lib/render_turbo_stream/controller_helpers.rb +13 -32
- data/lib/render_turbo_stream/controller_libs.rb +7 -2
- data/lib/render_turbo_stream/libs.rb +15 -5
- data/lib/render_turbo_stream/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 414f885f38878ae67239db4d797a57f1a0826daf8fdea5f94d6ce7a1b2a0a54a
|
4
|
+
data.tar.gz: eb8b5012eec604e899f088337697491c41522337bf4cec7fc66067462089cc2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 454f651f6801fdb48a2bd2a76167a8d8d0fafd2712242aa9ce5db5f4d72d30bc95a7e4406e7d9da0f67b1542262b2d46a0c60b47cf52ce4773544fc94cdb636b
|
7
|
+
data.tar.gz: 386d2f4bf0d2a940969fe14fd280cb9afe9d09fac6568b9fc5ea98ddcd054a48de547d1a677275e6c418389efe309b10f621258e617c515329105db72b5960eb
|
data/README.md
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# RenderTurboStream
|
2
2
|
|
3
|
-
2021 DHH annouced a great milestone in web development with [Rails 7, "Fulfilling a Vision"](https://rubyonrails.org/2021/12/15/Rails-7-fulfilling-a-vision).
|
4
|
-
|
5
3
|
This gem has a second [README Turbo::StreamsChannel](https://gitlab.com/sedl/renderturbostream/-/blob/main/README-channels.md). Starting point is here. And I recommend that you download my [Quick-and-dirty test project](https://gitlab.com/sedl/renderturbostream_railsapp), set it up, see all the tests succeed, and then read through this README.
|
6
4
|
|
7
5
|
As of v4.3, locals inside partials should work as expected. If you are working with turbo but without this gem, please read [readme-locals](https://gitlab.com/sedl/renderturbostream/-/blob/main/readme-locals.md) to avoid tedious details.
|
@@ -105,12 +103,15 @@ def update
|
|
105
103
|
turbo_stream_save(
|
106
104
|
@article.update(article_params),
|
107
105
|
if_success_turbo_redirect_to: articles_path,
|
108
|
-
target_id: 'customer-form'
|
106
|
+
target_id: 'customer-form',
|
107
|
+
partial: 'form'
|
109
108
|
)
|
110
109
|
end
|
111
110
|
```
|
112
111
|
This will set a status, generate a flash message, and run `render_turbo_stream`. If it fails, it would result in something like this:
|
113
112
|
|
113
|
+
If no partial is given, it renders the default template as turbo_stream.
|
114
|
+
|
114
115
|
```ruby
|
115
116
|
render_turbo_stream(
|
116
117
|
[
|
@@ -129,16 +130,6 @@ render_turbo_stream(
|
|
129
130
|
|
130
131
|
If the update succeeds, it will do a `redirect_to` action from turbo_power
|
131
132
|
|
132
|
-
The `stream_partial` method is for rendering a partial alone.
|
133
|
-
|
134
|
-
```ruby
|
135
|
-
stream_partial(
|
136
|
-
'flash-box',
|
137
|
-
partial: nil, #=> default: id.gsub('-','_')
|
138
|
-
locals: { title: 'my title' },
|
139
|
-
action: nil #=> default: :replace
|
140
|
-
)
|
141
|
-
```
|
142
133
|
|
143
134
|
**locals**: The hash for locals goes through a `symbolize_keys`, so you need to use locals in used partials like this: `locals[:message]`.
|
144
135
|
|
@@ -196,7 +187,7 @@ This means that the target id must be defined in several places: inside a partia
|
|
196
187
|
In order to avoid this kind of tedious coding, the gem has a kind of fallback built in: If the argument `partial` is given, but the attribute `target_id` is not, the gem will get the target_id from the partial. The process is:
|
197
188
|
|
198
189
|
1. Render the partial with the provided locals
|
199
|
-
2. Grabs into the partial by Nokogiri and looks for
|
190
|
+
2. Grabs into the partial by Nokogiri and looks for the first `turbo_frame_tag` **OR** a element with the attribute `data_turbo_target`, get the id and uses this as target_id.
|
200
191
|
3. If all that not is found it raises a exception
|
201
192
|
4. wraps the partial within the `turbo_stream.*` and sends this to the front.
|
202
193
|
|
@@ -252,15 +243,17 @@ config.x.render_turbo_stream.first_argument_is_html_id = %[replace append prepen
|
|
252
243
|
|
253
244
|
This setting is relevant for testing helpers.
|
254
245
|
|
255
|
-
#
|
246
|
+
# Personal note
|
256
247
|
|
257
248
|
The World Wide Web, founded around 1990 by [Tim Berners-Lee](https://en.wikipedia.org/wiki/Tim_Berners-Lee), was an html response from the server.
|
258
249
|
|
259
|
-
Frameworks like Angular, Ember, React, Vue brought a much better user experience, so called "single page applications". But they changed
|
250
|
+
Frameworks like Angular, Ember, React, Vue brought a much better user experience, so called "single page applications". But they changed a paradigma: Now Javascript was the processor of HTML, which is far from the [Progressive Enhancement](https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement).
|
251
|
+
|
252
|
+
2021 DHH annouced a great milestone in web development with [Rails 7, "Fulfilling a Vision"](https://rubyonrails.org/2021/12/15/Rails-7-fulfilling-a-vision). The Rails core now has done a big step, for bringing a user experience like a single page app, but by reducing javascript. This is a modern back to the roots. Thank you Rails Team!
|
260
253
|
|
261
|
-
|
254
|
+
But as of 2023, I searched for months and found nothing to solve all these details to make this Vision really work for rails. Now i am really happy and i cannot imagine working without Turbo!
|
262
255
|
|
263
|
-
|
256
|
+
Let us build on this vision and make rails what it has always been: A framework ahead of its time!
|
264
257
|
|
265
258
|
# Contributing
|
266
259
|
|
@@ -16,8 +16,14 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
<% locals = args[:locals]&.symbolize_keys %>
|
19
|
-
|
20
|
-
<%
|
19
|
+
|
20
|
+
<% if args[:partial].present? %>
|
21
|
+
<% rendered_html = render(partial: args[:partial], locals: locals, formats: [:html]) %>
|
22
|
+
<% else %>
|
23
|
+
<% rendered_html = render(template: args[:template], locals: locals, formats: [:html]) %>
|
24
|
+
<% end %>
|
25
|
+
|
26
|
+
|
21
27
|
<% unless args[:target].present? %>
|
22
28
|
<% args[:target] = RenderTurboStream::Libs.fetch_arguments_from_rendered_string(rendered_html)[:target] %>
|
23
29
|
<% unless args[:target].present? %>
|
@@ -12,8 +12,11 @@
|
|
12
12
|
|
13
13
|
|
14
14
|
<% locals = s[:locals]&.symbolize_keys %>
|
15
|
-
<%
|
16
|
-
|
15
|
+
<% if s[:partial].present? %>
|
16
|
+
<% html = (render partial: s[:partial], locals: locals, formats: [:html]) %>
|
17
|
+
<% else %>
|
18
|
+
<% html = (render template: s[:template], locals: locals, formats: [:html]) %>
|
19
|
+
<% end %>
|
17
20
|
|
18
21
|
|
19
22
|
|
@@ -61,9 +61,9 @@ module RenderTurboStream
|
|
61
61
|
|
62
62
|
disable_default = false
|
63
63
|
if partial.present?
|
64
|
-
_partial = RenderTurboStream::Libs.partial_path(
|
64
|
+
_partial = RenderTurboStream::Libs.partial_path(controller_path, partial)
|
65
65
|
elsif template.present?
|
66
|
-
_template = RenderTurboStream::Libs.partial_path(
|
66
|
+
_template = RenderTurboStream::Libs.partial_path(controller_path, template)
|
67
67
|
disable_default = true
|
68
68
|
else
|
69
69
|
_template = [controller_path, action_name].join('/')
|
@@ -12,10 +12,10 @@ module RenderTurboStream
|
|
12
12
|
if_success_redirect_to: nil, # does a regular redirect. Works if you are inside a turbo_frame and just want to redirect inside that frame BUT CANNOT STREAM OTHERS ACTIONS ON THE SAME RESPONSE https://github.com/rails/rails/issues/48056
|
13
13
|
if_success_turbo_redirect_to: nil, # does a full page redirect (break out of all frames by turbo_power redirect)
|
14
14
|
|
15
|
-
target_id: nil, # IF NIL:
|
16
|
-
partial: nil,
|
15
|
+
target_id: nil, # IF NIL: the gem grabs inside the rendered content for turbo_frame_tag or element with attribute data_turbo_target and takes the id from there.
|
16
|
+
partial: nil, # if nil: the gem renders the default template by turbo-stream
|
17
17
|
action: 'replace', # options: append, prepend
|
18
|
-
locals: {},
|
18
|
+
locals: {},
|
19
19
|
|
20
20
|
if_success_add: nil, # hash for a partial to render or array with actions (as array) or hashes for partials within
|
21
21
|
if_error_add: nil, # additional partials that should be rendered if save_action failed
|
@@ -29,12 +29,6 @@ module RenderTurboStream
|
|
29
29
|
flash_controller_action_name: action_name # options: 'update', 'create', otherwise you have to declare a translation in config/locales like "activerecord.success.#{flash_controller_action_name}" and "activerecord.errors.#{flash_controller_action_name}"
|
30
30
|
)
|
31
31
|
|
32
|
-
# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
33
|
-
# EXCEPTIONS
|
34
|
-
# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
35
|
-
|
36
|
-
raise 'render_turbo_stream: arguments target_id and if_success_redirect_to cannot be provided both' if target_id && if_success_redirect_to
|
37
|
-
|
38
32
|
# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
39
33
|
# LOGIC
|
40
34
|
# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
@@ -49,7 +43,7 @@ module RenderTurboStream
|
|
49
43
|
libs = RenderTurboStream::ControllerLibs.new(save_action)
|
50
44
|
model_name = object.model_name.human
|
51
45
|
|
52
|
-
streams =
|
46
|
+
streams = []
|
53
47
|
|
54
48
|
flashes = libs.generate_flash(
|
55
49
|
model_name,
|
@@ -93,8 +87,9 @@ module RenderTurboStream
|
|
93
87
|
if_success_turbo_redirect_to
|
94
88
|
]
|
95
89
|
])
|
90
|
+
|
96
91
|
elsif save_action && if_success_redirect_to.present?
|
97
|
-
response.status =
|
92
|
+
response.status = 303
|
98
93
|
if allow_channel
|
99
94
|
Rails.logger.debug(" • Sent #{streams.length} actions through Turbo::StreamsChannel to enable defined redirection because allowed in configs.")
|
100
95
|
c_libs = RenderTurboStream::ChannelLibs.new(response)
|
@@ -107,13 +102,10 @@ module RenderTurboStream
|
|
107
102
|
end
|
108
103
|
redirect_to if_success_redirect_to
|
109
104
|
|
110
|
-
elsif !target_id.present? && allow_channel
|
111
|
-
Rails.logger.debug(" • Sent #{streams.length} actions through Turbo::StreamsChannel because no target_id defined and allowed in configs.")
|
112
|
-
c_libs = RenderTurboStream::ChannelLibs.new(response)
|
113
|
-
c_libs.send_actions_to_channel("authenticated-user-#{helpers.current_user.id}", streams, @render_turbo_stream_evaluate_instance_variables)
|
114
|
-
|
115
105
|
else
|
106
|
+
streams += libs.generate_action(controller_path, target_id, action, partial, (partial ? nil : action_name), locals)
|
116
107
|
render_turbo_stream(streams)
|
108
|
+
|
117
109
|
end
|
118
110
|
end
|
119
111
|
|
@@ -134,7 +126,11 @@ module RenderTurboStream
|
|
134
126
|
end
|
135
127
|
r.delete(:target_id)
|
136
128
|
r[:action] = (props[:action].present? ? props[:action] : :replace)
|
137
|
-
|
129
|
+
if props[:partial].present?
|
130
|
+
r[:partial] = RenderTurboStream::Libs.partial_path(controller_path, props[:partial])
|
131
|
+
else
|
132
|
+
r[:template] = RenderTurboStream::Libs.partial_path(controller_path, props[:template])
|
133
|
+
end
|
138
134
|
r[:type] = 'stream-partial'
|
139
135
|
|
140
136
|
ary.push(r)
|
@@ -155,20 +151,5 @@ module RenderTurboStream
|
|
155
151
|
|
156
152
|
end
|
157
153
|
|
158
|
-
# renders a partial to turbo_stream
|
159
|
-
|
160
|
-
def stream_partial(target_id = nil, partial: nil, action: :replace, locals: {})
|
161
|
-
render_turbo_stream(
|
162
|
-
[
|
163
|
-
{
|
164
|
-
target: RenderTurboStream::Libs.target_id_to_target(target_id),
|
165
|
-
partial: partial,
|
166
|
-
action: action,
|
167
|
-
locals: locals
|
168
|
-
}
|
169
|
-
]
|
170
|
-
)
|
171
|
-
end
|
172
|
-
|
173
154
|
end
|
174
155
|
end
|
@@ -76,11 +76,16 @@ module RenderTurboStream
|
|
76
76
|
|
77
77
|
end
|
78
78
|
|
79
|
-
def generate_action(controller_path, target_id, action, partial, locals)
|
79
|
+
def generate_action(controller_path, target_id, action, partial, template, locals)
|
80
80
|
libs = RenderTurboStream::Libs
|
81
81
|
target = libs.target_id_to_target(target_id)
|
82
|
-
|
82
|
+
if partial
|
83
|
+
_partial = libs.partial_path(controller_path, partial)
|
83
84
|
[target: target, partial: _partial, locals: locals, action: action]
|
85
|
+
else
|
86
|
+
_template = libs.template_path(controller_path, template)
|
87
|
+
[target: target, template: _template, locals: locals, action: action]
|
88
|
+
end
|
84
89
|
end
|
85
90
|
|
86
91
|
def action_errors(actions)
|
@@ -17,26 +17,36 @@ module RenderTurboStream
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def self.partial_path(
|
20
|
+
def self.partial_path(controller_path, partial)
|
21
21
|
if partial && partial.to_s.include?('/')
|
22
22
|
partial
|
23
23
|
elsif partial.present?
|
24
24
|
[controller_path, partial].join('/')
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.template_path(controller_path, template)
|
29
|
+
if template && template.to_s.include?('/')
|
30
|
+
template
|
31
|
+
elsif template.present?
|
32
|
+
[controller_path, template].join('/')
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
32
36
|
def self.fetch_arguments_from_rendered_string(rendered_string)
|
33
37
|
noko = Nokogiri::HTML(rendered_string)
|
34
38
|
frame = noko.at_css('turbo-frame')
|
39
|
+
ele = noko.at_css('[data_turbo_target]')
|
35
40
|
if frame.present?
|
36
41
|
{
|
37
42
|
target_id: frame[:id],
|
38
43
|
target: target_id_to_target(frame[:id])
|
39
44
|
}
|
45
|
+
elsif ele.present?
|
46
|
+
{
|
47
|
+
target_id: ele[:id],
|
48
|
+
target: target_id_to_target(ele[:id])
|
49
|
+
}
|
40
50
|
else
|
41
51
|
{}
|
42
52
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: render_turbo_stream
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.3.
|
4
|
+
version: 4.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- christian
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -29,8 +29,8 @@ description: 'A set of helpers that allow a UNIFIED WORKFLOW for TurboStream and
|
|
29
29
|
from the controller. There is no need to write *.turbo_stream.* templates anymore.
|
30
30
|
Logic can stay on in the controller. Javascript actions can also be executed directly
|
31
31
|
from the controller. TESTING: To reduce the amount of hard-to-maintain system tests,
|
32
|
-
|
33
|
-
|
32
|
+
request tests are possible. A DEMO PROJECT with all this built in, along with system
|
33
|
+
and request tests, is linked in the README.'
|
34
34
|
email:
|
35
35
|
- christian@sedlmair.ch
|
36
36
|
executables: []
|
@@ -41,11 +41,13 @@ files:
|
|
41
41
|
- Rakefile
|
42
42
|
- app/controllers/render_turbo_stream/application_controller.rb
|
43
43
|
- app/controllers/render_turbo_stream/render_controller.rb
|
44
|
+
- app/models/render_turbo_stream/option.rb
|
44
45
|
- app/views/layouts/_add_turbo_frame_tag.html.erb
|
45
46
|
- app/views/render_turbo_stream.turbo_stream.erb
|
46
47
|
- app/views/render_turbo_stream_command.html.erb
|
47
48
|
- app/views/render_turbo_stream_empty_template.html.erb
|
48
49
|
- app/views/render_turbo_stream_request_test.html.erb
|
50
|
+
- db/migrate/20230616070450_create_render_turbo_stream_options.rb
|
49
51
|
- lib/render_turbo_stream.rb
|
50
52
|
- lib/render_turbo_stream/channel_libs.rb
|
51
53
|
- lib/render_turbo_stream/channel_view_helpers.rb
|