view_component-contrib 0.1.4 → 0.1.6
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/CHANGELOG.md +47 -0
- data/README.md +25 -0
- data/app/views/view_component_contrib/preview.html.erb +5 -1
- data/lib/view_component_contrib/preview/base.rb +27 -3
- data/lib/view_component_contrib/preview/sidecarable.rb +2 -2
- data/lib/view_component_contrib/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cebcea7442b79ea935dd0039c361e813b597c8f63a15a9cd90407635a6a96856
|
4
|
+
data.tar.gz: 98e1aeecc1354a1e619bf75c765aa64f0051ac5ff4d7d0c81fb42425e7da7ae5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 427691d12a38bfcab3c0861506aade1ada63422badb1b207e5fff49cd72bc66c8a6aadfd220b51385ef5abc2166061cd8333afbf14e915058e98bf2899438ad5
|
7
|
+
data.tar.gz: 5eb44287d55acb724d458d6eca667296787215cafced750c9071834ee2203b89327d93ff983b1b2e9879b961e13eb8b5d4f2af237c690a4c3f6bc6cbdaa6654c
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,53 @@
|
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.1.6 (2023-11-07)
|
6
|
+
|
7
|
+
- Support preview classes named `<component|partial>_preview.rb`. ([@palkan][])
|
8
|
+
|
9
|
+
It's also possible to explicitly specify the component class name for the preview class:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
class MyComponentPreview
|
13
|
+
self.component_class_name = "SomeComponent"
|
14
|
+
|
15
|
+
def default
|
16
|
+
render_component
|
17
|
+
end
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
## 0.1.5 (2023-11-02)
|
22
|
+
|
23
|
+
- Support content blocks in `#render_component` and `#render_with`. ([@palkan][])
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
class MyComponent::Preview
|
27
|
+
def default
|
28
|
+
# Now you can pass a block to render_component to render it inside the component:
|
29
|
+
render_component(kind: "info") do
|
30
|
+
"Welcome!"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
- Support implicit components in `#render_component` helper. ([@palkan][])
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
class MyComponent::Preview
|
40
|
+
def default
|
41
|
+
# Before
|
42
|
+
render_component(MyComponent::Component.new(foo: "bar"))
|
43
|
+
end
|
44
|
+
|
45
|
+
# After
|
46
|
+
def default
|
47
|
+
render_component(foo: "bar")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
5
52
|
## 0.1.4 (2023-04-30)
|
6
53
|
|
7
54
|
- Fix compatibility with new errors classes in view_component.
|
data/README.md
CHANGED
@@ -47,6 +47,9 @@ bundle exec rails g view_component -h
|
|
47
47
|
**Why adding a custom generator to the project instead of bundling it into the gem?** The generator could only be useful if it fits
|
48
48
|
your project needs. The more control you have over the generator the better. Thus, the best way is to make the generator a part of a project.
|
49
49
|
|
50
|
+
> [!IMPORTANT]
|
51
|
+
> If your application has the `lib/` folder in the autoload paths, make sure you ignored the generated `lib/generators` folder. In Rails 7.1+, you can do this via adding `generators` the `config.autoload_lib` call's `ignore` option. Before, you can use `Rails.autoloaders.main.ignore(...)`.
|
52
|
+
|
50
53
|
## Organizing components, or sidecar pattern extended
|
51
54
|
|
52
55
|
ViewComponent provides different ways to organize your components: putting everyhing (Ruby files, templates, etc.) into `app/components` folder or using a _sidecar_ directory for everything but the `.rb` file itself. The first approach could easily result in a directory bloat; the second is better though there is a room for improvement: we can move `.rb` files into sidecar folders as well. Then, we can get rid of the _noisy_ `_component` suffixes. Finally, we can also put previews there (since storing them within the test folder is a little bit confusing):
|
@@ -156,6 +159,14 @@ class Banner::Preview < ApplicationViewComponentPreview
|
|
156
159
|
def default
|
157
160
|
# This will use `absolute w-full` for the container class
|
158
161
|
render_component Banner::Component.new(text: "Welcome!")
|
162
|
+
|
163
|
+
# or even shorter
|
164
|
+
render_component(text: "Welcome!")
|
165
|
+
|
166
|
+
# you can also pass a content block
|
167
|
+
render_component(kind: :notice) do
|
168
|
+
"Some content"
|
169
|
+
end
|
159
170
|
end
|
160
171
|
|
161
172
|
def mobile
|
@@ -434,6 +445,20 @@ class FlashAlert::Component < ApplicationViewComponent
|
|
434
445
|
end
|
435
446
|
```
|
436
447
|
|
448
|
+
## Supporting `.with_collection`
|
449
|
+
|
450
|
+
The `.with_collection` method from ViewComponent expects a component class to have the "Component" suffix to correctly infer the parameter name. Since we're using a different naming convention, we need to specify the collection parameter name explicitly. For example:
|
451
|
+
|
452
|
+
```ruby
|
453
|
+
class PostCard::Component < ApplicationViewComponent
|
454
|
+
with_collection_parameter :post
|
455
|
+
|
456
|
+
option :post
|
457
|
+
end
|
458
|
+
```
|
459
|
+
|
460
|
+
You can add this to following line to your component generator (unless it's already added): `with_collection_parameter :<%= singular_name %>` to always explicitly provide the collection parameter name.
|
461
|
+
|
437
462
|
## Wrapped components
|
438
463
|
|
439
464
|
Sometimes we need to wrap a component into a custom HTML container (for positioning or whatever). By default, such wrapping doesn't play well with the `#render?` method because if we don't need a component, we don't need a wrapper.
|
@@ -1,6 +1,10 @@
|
|
1
1
|
<div class="<%= container_class %>">
|
2
2
|
<%- if component -%>
|
3
|
-
|
3
|
+
<%- if local_assigns[:content_block] -%>
|
4
|
+
<%= render component, &content_block %>
|
5
|
+
<% else %>
|
6
|
+
<%= render component %>
|
7
|
+
<% end %>
|
4
8
|
<%- else -%>
|
5
9
|
Failed to infer a component from the preview: <%= error %>
|
6
10
|
<%- end -%>
|
@@ -43,11 +43,29 @@ module ViewComponentContrib
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
# Infer component class name from preview class name:
|
47
|
+
# - Namespace::ButtonPreview => Namespace::Button::Component | Namespace::ButtonComponent | Namespace::Button
|
48
|
+
# - Button::Preview => Button::Component | ButtonComponent | Button
|
49
|
+
def component_class_name
|
50
|
+
@component_class_name ||= begin
|
51
|
+
component_name = name.sub(/(::Preview|Preview)$/, "")
|
52
|
+
[
|
53
|
+
"#{component_name}::Component",
|
54
|
+
"#{component_name}Component",
|
55
|
+
component_name
|
56
|
+
].find do
|
57
|
+
_1.safe_constantize
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
attr_writer :component_class_name
|
63
|
+
|
46
64
|
private
|
47
65
|
|
48
66
|
def build_component_instance(locals)
|
49
67
|
return locals unless locals[:component].nil?
|
50
|
-
locals[:component] =
|
68
|
+
locals[:component] = component_class_name.safe_constantize&.new
|
51
69
|
rescue => e
|
52
70
|
locals[:component] = nil
|
53
71
|
locals[:error] = e.message
|
@@ -60,8 +78,14 @@ module ViewComponentContrib
|
|
60
78
|
end
|
61
79
|
|
62
80
|
# Shortcut for render_with_template(locals: {component: ...})
|
63
|
-
def render_component(
|
64
|
-
|
81
|
+
def render_component(component_or_props = nil, &block)
|
82
|
+
component = if component_or_props.is_a?(::ViewComponent::Base)
|
83
|
+
component_or_props
|
84
|
+
else
|
85
|
+
self.class.component_class_name.constantize.new(**(component_or_props || {}))
|
86
|
+
end
|
87
|
+
|
88
|
+
render_with(component: component, content_block: block)
|
65
89
|
end
|
66
90
|
end
|
67
91
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module ViewComponentContrib
|
4
4
|
module Preview
|
5
5
|
module Sidecarable
|
6
|
-
PREVIEW_GLOB = "**/preview.rb"
|
6
|
+
PREVIEW_GLOB = "**/{preview.rb,*_preview.rb}"
|
7
7
|
|
8
8
|
def self.extended(base)
|
9
9
|
base.singleton_class.prepend(ClassMethods)
|
@@ -17,7 +17,7 @@ module ViewComponentContrib
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def preview_name
|
20
|
-
name.
|
20
|
+
name.sub(/(::Preview|Preview)$/, "").underscore
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: view_component-contrib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Dementyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: view_component
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: ruby-next
|
28
|
+
name: ruby-next-core
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
184
|
- !ruby/object:Gem::Version
|
185
185
|
version: '0'
|
186
186
|
requirements: []
|
187
|
-
rubygems_version: 3.4.
|
187
|
+
rubygems_version: 3.4.20
|
188
188
|
signing_key:
|
189
189
|
specification_version: 4
|
190
190
|
summary: A collection of extensions and developer tools for ViewComponent
|