render_turbo_stream 0.1.0 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +95 -4
- data/lib/render_turbo_stream/render_turbo_stream.rb +144 -0
- data/lib/render_turbo_stream/version.rb +1 -1
- data/lib/render_turbo_stream.rb +1 -1
- data/lib/tasks/render_turbo_stream_tasks.rake +6 -3
- metadata +9 -9
- data/lib/render_turbo_stream/core_ext.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f3c8127d89c8a7f1524e097ebf9114f073cf91d59c63d67e8a25826ed64d7e0
|
4
|
+
data.tar.gz: 638b55cee98740414694ebe30f360f9d54b1bb6cf5adfd64e9c6bc449ea50048
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3356f7781e94451527047e3ea8f82423309a68c7133dbaf8965fab805f24c4df2e15e7304b66e254e012b1a05c9d08942e3ece3c7bd76c79c1aeb9da6e14294
|
7
|
+
data.tar.gz: db7b4e1fef6b047887b193943d529e9902e37f853b7224c581b0f7ea5b0fcaf57826916aab9ffac09cb6906fa231da8b05e6a603902b1f9cdc36e24d6ee513c8
|
data/README.md
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# RenderTurboStream
|
2
|
-
Short description and motivation.
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
Working consistently by turbo_stream means: shooting a lot of partials to the html which always needs the same attributes: ID, partial and maybe some locals. This gem is a attempt to serialize that, especially for `update` and `create` action.
|
4
|
+
|
5
|
+
Logic is better placed inside the controller, instead of the view and it's boring to write always the same `ifs` inside the `update.turbo_stream.haml`. So this gem holds a `.turbo_stream.html.erb` view that loops through all the partials that should be rendered.
|
6
|
+
|
7
|
+
In 90% of cases you have just define your partials, like `_form.haml` and steer them from the controller directly, without a `.turbo_stream.haml` view.
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
Add this line to your application's Gemfile:
|
@@ -21,8 +23,97 @@ Or install it yourself as:
|
|
21
23
|
$ gem install render_turbo_stream
|
22
24
|
```
|
23
25
|
|
26
|
+
and follow the instructions of `turbo_power`, not rails side, but npm package and imports on javascript side, for making redirects working.
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
def create
|
32
|
+
@customer = Customer.new(customer_params)
|
33
|
+
|
34
|
+
render_turbo_stream(
|
35
|
+
@customer.save,
|
36
|
+
redirect_on_success_to: edit_customer_path(@customer),
|
37
|
+
frame_id: 'customer-form-wrapper',
|
38
|
+
partial: 'customer_form',
|
39
|
+
)
|
40
|
+
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
and its done!
|
45
|
+
|
46
|
+
in 90% use cases it should be enough and not necessary writing any code inside `update.turbo_stream.haml` or `create.turbo_stream.haml`
|
47
|
+
|
48
|
+
## Testing
|
49
|
+
|
50
|
+
Testing by regular `rspec` request specs the controller is rendering classic html templates, not turbo_stream. For that html templates are rendered, but only with hints so that your test can check which action is done.
|
51
|
+
|
52
|
+
It has 3 cases of output with its resulting status codes which can be checked by rspec:
|
53
|
+
|
54
|
+
Success and redirection: `302`
|
55
|
+
|
56
|
+
Success without redirection: `200`
|
57
|
+
|
58
|
+
Save Action failed: `422` `:unprocessable_entity`
|
59
|
+
|
60
|
+
## Parameters
|
61
|
+
|
62
|
+
`save_action` (first parameter, boolean) true if successful
|
63
|
+
|
64
|
+
`redirect_on_success_to:` path for redirection in case of success, if nil: no redirection.
|
65
|
+
|
66
|
+
`success_message:` custom message if action is successful
|
67
|
+
|
68
|
+
`error_message:` custom message if action has failed
|
69
|
+
|
70
|
+
`object:` default: object (e.g. @customer) is derived from controller name
|
71
|
+
|
72
|
+
`id:` html-ID for the object that is replaced by turbo_stream, if nil: no partial is rendered
|
73
|
+
|
74
|
+
`partial:` default: 'form', assumes `controller_path`/_form
|
75
|
+
|
76
|
+
`locals:` locals for the partial, as hash
|
77
|
+
|
78
|
+
`replace_on_success:` array of hashes: `[{ id: nil, partial: '', locals: {} }]`
|
79
|
+
|
80
|
+
`replace_on_error:` array of hashes: `[{ id: nil, partial: '', locals: {} }]`
|
81
|
+
|
82
|
+
`add_flash_notices:` additional alerts for the case of failure, example: `["custom-success-message"]`
|
83
|
+
|
84
|
+
`add_flash_alerts:` additional alerts for the case of success, example: `["custom-error-message"]`
|
85
|
+
|
86
|
+
## Requirements
|
87
|
+
|
88
|
+
gem `turbo_power` (is included, used for redirection)
|
89
|
+
|
90
|
+
**Translations used**
|
91
|
+
|
92
|
+
`activerecord.success.successfully_created`
|
93
|
+
|
94
|
+
`activerecord.success.successfully_updated`
|
95
|
+
|
96
|
+
`activerecord.errors.messages.could_not_create`
|
97
|
+
|
98
|
+
`activerecord.errors.messages.could_not_update`
|
99
|
+
|
100
|
+
.. and Model Name Translations
|
101
|
+
|
102
|
+
**Flash configuration**
|
103
|
+
|
104
|
+
Flash messages are pushed as arrays into `flash[:alert]`, `flash.now[:alert]`, `flash[:notice]` or `flash.now[:notice]`
|
105
|
+
|
106
|
+
The corresponding partial has to be configured by
|
107
|
+
|
108
|
+
`config.x.render_turbo_stream.flash_partial` #=> example: `layouts/flashes`
|
109
|
+
|
110
|
+
and a corresponding html-ID for pushing the partial to the right destination inside the layout
|
111
|
+
|
112
|
+
`config.x.render_turbo_stream.flash_id` #=> example: `flash-wrapper`
|
113
|
+
|
24
114
|
## Contributing
|
25
|
-
|
115
|
+
|
116
|
+
Contribution welcome.
|
26
117
|
|
27
118
|
## License
|
28
119
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,144 @@
|
|
1
|
+
module RenderTurboStream
|
2
|
+
module RenderTurboStream
|
3
|
+
# extend ActiveSupport::Concern
|
4
|
+
#
|
5
|
+
# class_methods do
|
6
|
+
# def render_turbo_stream(options = {})
|
7
|
+
# "doing"
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
def render_turbo_stream(
|
11
|
+
save_action,
|
12
|
+
redirect_on_success_to: nil,
|
13
|
+
success_message: nil,
|
14
|
+
error_message: nil,
|
15
|
+
object: nil,
|
16
|
+
id: nil, # if no frame-id given: no partial is rendered
|
17
|
+
partial: 'form',
|
18
|
+
locals: {},
|
19
|
+
replace_on_success: [
|
20
|
+
{
|
21
|
+
id: nil,
|
22
|
+
partial: 'form',
|
23
|
+
locals: {}
|
24
|
+
}
|
25
|
+
],
|
26
|
+
replace_on_error: [
|
27
|
+
{
|
28
|
+
id: nil,
|
29
|
+
partial: 'form',
|
30
|
+
locals: {}
|
31
|
+
}
|
32
|
+
],
|
33
|
+
add_flash_alerts: [],
|
34
|
+
add_flash_notices: []
|
35
|
+
)
|
36
|
+
|
37
|
+
#== flash partial
|
38
|
+
|
39
|
+
@render_turbo_flash_partial = Rails.configuration.x.render_turbo_stream.flash_partial
|
40
|
+
@render_turbo_flash_id = Rails.configuration.x.render_turbo_stream.flash_id
|
41
|
+
|
42
|
+
#== object
|
43
|
+
|
44
|
+
unless object
|
45
|
+
object = eval("@#{controller_name.classify.underscore}")
|
46
|
+
end
|
47
|
+
|
48
|
+
#== set status
|
49
|
+
|
50
|
+
if save_action == false
|
51
|
+
response.status = :unprocessable_entity
|
52
|
+
end
|
53
|
+
|
54
|
+
#== generate message
|
55
|
+
|
56
|
+
if save_action
|
57
|
+
_msg = if success_message
|
58
|
+
success_message
|
59
|
+
elsif action_name == 'create'
|
60
|
+
I18n.t('activerecord.success.successfully_created')
|
61
|
+
elsif action_name == 'update'
|
62
|
+
I18n.t('activerecord.success.successfully_updated')
|
63
|
+
end
|
64
|
+
messages = [
|
65
|
+
[
|
66
|
+
object.model_name.human,
|
67
|
+
_msg
|
68
|
+
].join(' ')
|
69
|
+
]
|
70
|
+
else
|
71
|
+
_msg = if error_message
|
72
|
+
error_message
|
73
|
+
elsif action_name == 'create'
|
74
|
+
I18n.t('activerecord.errors.messages.could_not_create')
|
75
|
+
elsif action_name == 'update'
|
76
|
+
I18n.t('activerecord.errors.messages.could_not_update')
|
77
|
+
end
|
78
|
+
messages = [
|
79
|
+
[
|
80
|
+
object.model_name.human,
|
81
|
+
_msg
|
82
|
+
].join(' ')
|
83
|
+
]
|
84
|
+
end
|
85
|
+
|
86
|
+
#== replace frames
|
87
|
+
|
88
|
+
replace_frames = []
|
89
|
+
if id
|
90
|
+
replace_frames.push({
|
91
|
+
id: id,
|
92
|
+
partial: partial,
|
93
|
+
locals: locals
|
94
|
+
})
|
95
|
+
end
|
96
|
+
if save_action
|
97
|
+
replace_on_success.each do |f|
|
98
|
+
next unless f[:id]
|
99
|
+
replace_frames.push(f)
|
100
|
+
end
|
101
|
+
else
|
102
|
+
replace_on_error.each do |f|
|
103
|
+
next unless f[:id]
|
104
|
+
replace_frames.push(f)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
#== render
|
109
|
+
|
110
|
+
views_folder = Pathname.new(Bundler.rubygems.find_name('render_turbo_stream').first.full_gem_path).join('views')
|
111
|
+
suffix = (request.format.to_sym == :html ? '.html.erb' : '.turbo_stream.erb')
|
112
|
+
|
113
|
+
if save_action && redirect_on_success_to
|
114
|
+
flash[:notice] = messages.to_a + add_flash_notices.to_a
|
115
|
+
flash[:alert] = add_flash_alerts
|
116
|
+
render file: views_folder.join("turbo_stream_redirect#{suffix}"),
|
117
|
+
locals: {
|
118
|
+
url: redirect_on_success_to
|
119
|
+
},
|
120
|
+
layout: false,
|
121
|
+
status: 302
|
122
|
+
|
123
|
+
elsif save_action
|
124
|
+
flash.now[:notice] = messages.to_a + add_flash_notices.to_a
|
125
|
+
flash.now[:alert] = add_flash_alerts
|
126
|
+
render file: views_folder.join("turbo_stream_partials#{suffix}"),
|
127
|
+
locals: {
|
128
|
+
replace_frames: replace_frames
|
129
|
+
},
|
130
|
+
layout: false
|
131
|
+
else
|
132
|
+
flash.now[:alert] = messages.to_a + add_flash_alerts.to_a
|
133
|
+
flash.now[:notice] = add_flash_notices
|
134
|
+
render file: views_folder.join("turbo_stream_partials#{suffix}"),
|
135
|
+
locals: {
|
136
|
+
replace_frames: replace_frames
|
137
|
+
},
|
138
|
+
layout: false
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/lib/render_turbo_stream.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
# desc "
|
2
|
-
#
|
3
|
-
#
|
1
|
+
# desc "install the turbo_stream"
|
2
|
+
# namespace :render_turbo_stream do
|
3
|
+
# task install: :environment do
|
4
|
+
# gem_views = Bundler.rubygems.find_name('render_turbo_stream').first.full_gem_path + '/turbo_stream'
|
5
|
+
# FileUtils.copy_entry gem_views, Rails.application.root.join('app', 'turbo_stream', 'test')
|
6
|
+
# end
|
4
7
|
# 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: 0.1.
|
4
|
+
version: 0.1.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-04-
|
11
|
+
date: 2023-04-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 7.0.4.3
|
27
|
-
description:
|
27
|
+
description: Rendering update and create actions by turbo stream
|
28
28
|
email:
|
29
29
|
- christian@sedlmair.ch
|
30
30
|
executables: []
|
@@ -34,17 +34,17 @@ files:
|
|
34
34
|
- README.md
|
35
35
|
- Rakefile
|
36
36
|
- lib/render_turbo_stream.rb
|
37
|
-
- lib/render_turbo_stream/core_ext.rb
|
38
37
|
- lib/render_turbo_stream/railtie.rb
|
38
|
+
- lib/render_turbo_stream/render_turbo_stream.rb
|
39
39
|
- lib/render_turbo_stream/version.rb
|
40
40
|
- lib/tasks/render_turbo_stream_tasks.rake
|
41
|
-
homepage: https://
|
41
|
+
homepage: https://gitlab.com/sedl/render-turbo-stream
|
42
42
|
licenses:
|
43
43
|
- MIT
|
44
44
|
metadata:
|
45
|
-
homepage_uri: https://
|
46
|
-
source_code_uri: https://
|
47
|
-
changelog_uri: https://
|
45
|
+
homepage_uri: https://gitlab.com/sedl/render-turbo-stream
|
46
|
+
source_code_uri: https://gitlab.com/sedl/render-turbo-stream
|
47
|
+
changelog_uri: https://gitlab.com/sedl/render-turbo-stream
|
48
48
|
post_install_message:
|
49
49
|
rdoc_options: []
|
50
50
|
require_paths:
|
@@ -60,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
requirements: []
|
63
|
-
rubygems_version: 3.
|
63
|
+
rubygems_version: 3.4.12
|
64
64
|
signing_key:
|
65
65
|
specification_version: 4
|
66
66
|
summary: NOT USABLE YET
|