view_component 2.14.1 → 2.15.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of view_component might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +51 -0
- data/app/controllers/view_components_controller.rb +11 -2
- data/lib/view_component.rb +1 -0
- data/lib/view_component/preview.rb +30 -1
- data/lib/view_component/preview_template_error.rb +6 -0
- data/lib/view_component/version.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e01b3b2899158831379c51c72086d84ca838b829a9638eeaec381aa287fa8c8
|
4
|
+
data.tar.gz: fab254768f2f88651ed2c89e9e09ef5fa7e50524dad061435e5abd4e7de1a4ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1ce90df482ab031bf57b808ec1cd0015774d3061733ae4e934d18a8b569e0aa6d22ac71107016ca0ab73f76acb720c7113d21daba2a74a5d313f53ae245e435
|
7
|
+
data.tar.gz: 96e33d8a65235bf8831ce07aec2f13b5bec2617be30c2a11cca2fa969516d167be4eaf2390a6296db2f1e61f1523115e2fd53aa6af1e39a6d661f85a03baf626
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# master
|
2
2
|
|
3
|
+
# 2.15.0
|
4
|
+
|
5
|
+
* Add support for templates as ViewComponent::Preview examples.
|
6
|
+
|
7
|
+
*Juan Manuel Ramallo
|
8
|
+
|
3
9
|
# 2.14.1
|
4
10
|
|
5
11
|
* Allow using `render_inline` in test when the render monkey patch is disabled with `config.view_component.render_monkey_patch_enabled = false` in versions of Rails < 6.1.
|
data/README.md
CHANGED
@@ -680,6 +680,57 @@ config.view_component.preview_route = "/previews"
|
|
680
680
|
|
681
681
|
This example will make the previews available from <http://localhost:3000/previews>.
|
682
682
|
|
683
|
+
#### Preview templates
|
684
|
+
|
685
|
+
Given a preview `test/components/previews/cell_component_preview.rb`, template files can be defined at `test/components/previews/cell_component_preview/`:
|
686
|
+
|
687
|
+
`test/components/previews/cell_component_preview.rb`
|
688
|
+
```ruby
|
689
|
+
class CellComponentPreview < ViewComponent::Preview
|
690
|
+
def default
|
691
|
+
end
|
692
|
+
end
|
693
|
+
```
|
694
|
+
|
695
|
+
`test/components/previews/cell_component_preview/default.html.erb`
|
696
|
+
```erb
|
697
|
+
<table class="table">
|
698
|
+
<tbody>
|
699
|
+
<tr>
|
700
|
+
<%= render CellComponent.new %>
|
701
|
+
</tr>
|
702
|
+
</tbody>
|
703
|
+
</div>
|
704
|
+
```
|
705
|
+
|
706
|
+
To use a different location for preview templates, pass the `template` argument:
|
707
|
+
(the path should be relative to `config.view_component.preview_path`):
|
708
|
+
|
709
|
+
`test/components/previews/cell_component_preview.rb`
|
710
|
+
```ruby
|
711
|
+
class CellComponentPreview < ViewComponent::Preview
|
712
|
+
def default
|
713
|
+
render_with_template(template: 'custom_cell_component_preview/my_preview_template')
|
714
|
+
end
|
715
|
+
end
|
716
|
+
```
|
717
|
+
|
718
|
+
Values from `params` can be accessed through `locals`:
|
719
|
+
|
720
|
+
`test/components/previews/cell_component_preview.rb`
|
721
|
+
```ruby
|
722
|
+
class CellComponentPreview < ViewComponent::Preview
|
723
|
+
def default(title: "Default title", subtitle: "A subtitle")
|
724
|
+
render_with_template(locals: {
|
725
|
+
title: title,
|
726
|
+
subtitle: subtitle
|
727
|
+
})
|
728
|
+
end
|
729
|
+
end
|
730
|
+
```
|
731
|
+
|
732
|
+
Which enables passing in a value with <http://localhost:3000/rails/components/cell_component/default?title=Custom+title&subtitle=Another+subtitle>.
|
733
|
+
|
683
734
|
#### Configuring TestController
|
684
735
|
|
685
736
|
Component tests and previews assume the existence of an `ApplicationController` class, which be can be configured using the `test_controller` option:
|
@@ -24,11 +24,16 @@ class ViewComponentsController < Rails::ApplicationController # :nodoc:
|
|
24
24
|
render "view_components/previews"
|
25
25
|
else
|
26
26
|
prepend_application_view_paths
|
27
|
+
prepend_preview_examples_view_path
|
27
28
|
@example_name = File.basename(params[:path])
|
28
29
|
@render_args = @preview.render_args(@example_name, params: params.permit!)
|
29
30
|
layout = @render_args[:layout]
|
30
|
-
|
31
|
-
|
31
|
+
template = @render_args[:template]
|
32
|
+
locals = @render_args[:locals]
|
33
|
+
opts = {}
|
34
|
+
opts[:layout] = layout if layout.present?
|
35
|
+
opts[:locals] = locals if locals.present?
|
36
|
+
render template, opts # rubocop:disable GitHub/RailsControllerRenderLiteral
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
@@ -59,4 +64,8 @@ class ViewComponentsController < Rails::ApplicationController # :nodoc:
|
|
59
64
|
def prepend_application_view_paths
|
60
65
|
prepend_view_path Rails.root.join("app/views") if defined?(Rails.root)
|
61
66
|
end
|
67
|
+
|
68
|
+
def prepend_preview_examples_view_path
|
69
|
+
prepend_view_path(ViewComponent::Base.preview_paths)
|
70
|
+
end
|
62
71
|
end
|
data/lib/view_component.rb
CHANGED
@@ -8,7 +8,20 @@ module ViewComponent # :nodoc:
|
|
8
8
|
extend ActiveSupport::DescendantsTracker
|
9
9
|
|
10
10
|
def render(component, **args, &block)
|
11
|
-
{
|
11
|
+
{
|
12
|
+
args: args,
|
13
|
+
block: block,
|
14
|
+
component: component,
|
15
|
+
locals: {},
|
16
|
+
template: "view_components/preview",
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def render_with_template(template: nil, locals: {})
|
21
|
+
{
|
22
|
+
template: template,
|
23
|
+
locals: locals
|
24
|
+
}
|
12
25
|
end
|
13
26
|
|
14
27
|
class << self
|
@@ -23,6 +36,8 @@ module ViewComponent # :nodoc:
|
|
23
36
|
example_params_names = instance_method(example).parameters.map(&:last)
|
24
37
|
provided_params = params.slice(*example_params_names).to_h.symbolize_keys
|
25
38
|
result = provided_params.empty? ? new.public_send(example) : new.public_send(example, **provided_params)
|
39
|
+
result ||= {}
|
40
|
+
result[:template] = preview_example_template_path(example) if result[:template].nil?
|
26
41
|
@layout = nil unless defined?(@layout)
|
27
42
|
result.merge(layout: @layout)
|
28
43
|
end
|
@@ -62,6 +77,20 @@ module ViewComponent # :nodoc:
|
|
62
77
|
@layout = layout_name
|
63
78
|
end
|
64
79
|
|
80
|
+
# Returns the relative path (from preview_path) to the preview example template if the template exists
|
81
|
+
def preview_example_template_path(example)
|
82
|
+
preview_path = Array(preview_paths).detect do |preview_path|
|
83
|
+
Dir["#{preview_path}/#{preview_name}_preview/#{example}.html.*"].first
|
84
|
+
end
|
85
|
+
|
86
|
+
if preview_path.nil?
|
87
|
+
raise PreviewTemplateError, "preview template for example #{example} does not exist"
|
88
|
+
end
|
89
|
+
|
90
|
+
path = Dir["#{preview_path}/#{preview_name}_preview/#{example}.html.*"].first
|
91
|
+
Pathname.new(path).relative_path_from(Pathname.new(preview_path)).to_s
|
92
|
+
end
|
93
|
+
|
65
94
|
private
|
66
95
|
|
67
96
|
def load_previews
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: view_component
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub Open Source
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -203,6 +203,7 @@ files:
|
|
203
203
|
- lib/view_component/compile_cache.rb
|
204
204
|
- lib/view_component/engine.rb
|
205
205
|
- lib/view_component/preview.rb
|
206
|
+
- lib/view_component/preview_template_error.rb
|
206
207
|
- lib/view_component/previewable.rb
|
207
208
|
- lib/view_component/render_component_helper.rb
|
208
209
|
- lib/view_component/render_component_to_string_helper.rb
|