view_component 2.36.0 → 2.40.0
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.
Potentially problematic release.
This version of view_component might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/docs/CHANGELOG.md +77 -0
- data/lib/rails/generators/abstract_generator.rb +19 -2
- data/lib/rails/generators/component/component_generator.rb +4 -0
- data/lib/rails/generators/component/templates/component.rb.tt +1 -1
- data/lib/rails/generators/erb/component_generator.rb +9 -0
- data/lib/rails/generators/erb/templates/component.html.erb.tt +1 -1
- data/lib/rails/generators/stimulus/component_generator.rb +26 -0
- data/lib/rails/generators/stimulus/templates/component_controller.js.tt +7 -0
- data/lib/view_component/base.rb +13 -0
- data/lib/view_component/engine.rb +4 -0
- data/lib/view_component/rails/tasks/view_component.rake +11 -0
- data/lib/view_component/slot_v2.rb +1 -1
- data/lib/view_component/test_helpers.rb +42 -0
- data/lib/view_component/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6b59c1dbd53f3cb893d36ca15cb6838e6b127a36c895d2e062f961929f03bb9
|
4
|
+
data.tar.gz: b32e3ecaa9f9734eded75141a75baeaa4396652e475827ff9db29dcf647e36c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1e2312bb9dda96f1f52d6fa513514e461b2c3f9880ffa8321fcba69aabeaf1d87fc5199a7cf190c2596184051c0db30539b4600dbe2a15b5a560f76dc04240f
|
7
|
+
data.tar.gz: fc65722d4b20457c22de5d0603b80b171777c18bbae19c579f841b4aa092e6feb8e821da8832b6c2fb283d6a2fbca8929967f379b96d68d8ad94c8b171fa2293
|
data/docs/CHANGELOG.md
CHANGED
@@ -7,6 +7,83 @@ title: Changelog
|
|
7
7
|
|
8
8
|
## main
|
9
9
|
|
10
|
+
## 2.40.0
|
11
|
+
|
12
|
+
* Replace antipatterns section in the documentation with best practices.
|
13
|
+
|
14
|
+
*Blake Williams*
|
15
|
+
|
16
|
+
* Add components to `rails stats` task.
|
17
|
+
|
18
|
+
*Nicolas Brousse*
|
19
|
+
|
20
|
+
* Fix bug when using Slim and writing a slot whose block evaluates to `nil`.
|
21
|
+
|
22
|
+
*Yousuf Jukaku*
|
23
|
+
|
24
|
+
* Add documentation for test helpers.
|
25
|
+
|
26
|
+
*Joel Hawksley*
|
27
|
+
|
28
|
+
## 2.39.0
|
29
|
+
|
30
|
+
* Clarify documentation of `with_variant` as an override of Action Pack.
|
31
|
+
|
32
|
+
*Blake Williams*, *Cameron Dutro*, *Joel Hawksley*
|
33
|
+
|
34
|
+
* Update docs page to be called Javascript and CSS, rename Building ViewComponents to Guide.
|
35
|
+
|
36
|
+
*Joel Hawksley*
|
37
|
+
|
38
|
+
* Deprecate `Base#with_variant`.
|
39
|
+
|
40
|
+
*Cameron Dutro*
|
41
|
+
|
42
|
+
* Error out in the CI if docs/api.md has to be regenerated.
|
43
|
+
|
44
|
+
*Dany Marcoux*
|
45
|
+
|
46
|
+
## 2.38.0
|
47
|
+
|
48
|
+
* Add `--stimulus` flag to the component generator. Generates a Stimulus controller alongside the component.
|
49
|
+
* Add config option `config.view_component.generate_stimulus_controller` to always generate a Stimulus controller.
|
50
|
+
|
51
|
+
*Sebastien Auriault*
|
52
|
+
|
53
|
+
## 2.37.0
|
54
|
+
|
55
|
+
* Clarify slots example in docs to reduce naming confusion.
|
56
|
+
|
57
|
+
*Joel Hawksley*, *Blake Williams*
|
58
|
+
|
59
|
+
* Fix error in documentation for `render_many` passthrough slots.
|
60
|
+
|
61
|
+
*Ollie Nye*
|
62
|
+
|
63
|
+
* Add test case for conflict with internal `@variant` variable.
|
64
|
+
|
65
|
+
*David Backeus*
|
66
|
+
|
67
|
+
* Document decision to not change naming convention recommendation to remove `-Component` suffix.
|
68
|
+
|
69
|
+
*Joel Hawksley*
|
70
|
+
|
71
|
+
* Fix typo in documentation.
|
72
|
+
|
73
|
+
*Ryo.gift*
|
74
|
+
|
75
|
+
* Add inline template example to benchmark script.
|
76
|
+
|
77
|
+
*Andrew Tait*
|
78
|
+
|
79
|
+
* Fix benchmark scripts.
|
80
|
+
|
81
|
+
*Andrew Tait*
|
82
|
+
|
83
|
+
* Run benchmarks in CI.
|
84
|
+
|
85
|
+
*Joel Hawksley*
|
86
|
+
|
10
87
|
## 2.36.0
|
11
88
|
|
12
89
|
* Add `slot_type` helper method.
|
@@ -11,13 +11,21 @@ module ViewComponent
|
|
11
11
|
private
|
12
12
|
|
13
13
|
def destination
|
14
|
+
File.join(destination_directory, "#{destination_file_name}.html.#{engine_name}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def destination_directory
|
14
18
|
if options["sidecar"]
|
15
|
-
File.join(component_path, class_path,
|
19
|
+
File.join(component_path, class_path, destination_file_name)
|
16
20
|
else
|
17
|
-
File.join(component_path, class_path
|
21
|
+
File.join(component_path, class_path)
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
25
|
+
def destination_file_name
|
26
|
+
"#{file_name}_component"
|
27
|
+
end
|
28
|
+
|
21
29
|
def file_name
|
22
30
|
@_file_name ||= super.sub(/_component\z/i, "")
|
23
31
|
end
|
@@ -25,5 +33,14 @@ module ViewComponent
|
|
25
33
|
def component_path
|
26
34
|
ViewComponent::Base.view_component_path
|
27
35
|
end
|
36
|
+
|
37
|
+
def stimulus_controller
|
38
|
+
if options["stimulus"]
|
39
|
+
File.join(destination_directory, destination_file_name).
|
40
|
+
sub("#{component_path}/", "").
|
41
|
+
gsub("_", "-").
|
42
|
+
gsub("/", "--")
|
43
|
+
end
|
44
|
+
end
|
28
45
|
end
|
29
46
|
end
|
@@ -12,6 +12,8 @@ module Rails
|
|
12
12
|
argument :attributes, type: :array, default: [], banner: "attribute"
|
13
13
|
check_class_collision suffix: "Component"
|
14
14
|
class_option :inline, type: :boolean, default: false
|
15
|
+
class_option :stimulus, type: :boolean, default: ViewComponent::Base.generate_stimulus_controller
|
16
|
+
class_option :sidecar, type: :boolean, default: false
|
15
17
|
|
16
18
|
def create_component_file
|
17
19
|
template "component.rb", File.join(component_path, class_path, "#{file_name}_component.rb")
|
@@ -21,6 +23,8 @@ module Rails
|
|
21
23
|
|
22
24
|
hook_for :preview, type: :boolean
|
23
25
|
|
26
|
+
hook_for :stimulus, type: :boolean
|
27
|
+
|
24
28
|
hook_for :template_engine do |instance, template_engine|
|
25
29
|
instance.invoke template_engine, [instance.name]
|
26
30
|
end
|
@@ -8,7 +8,7 @@ class <%= class_name %>Component < <%= parent_class %>
|
|
8
8
|
<%- end -%>
|
9
9
|
<%- if initialize_call_method_for_inline? -%>
|
10
10
|
def call
|
11
|
-
content_tag :h1, "Hello world!"
|
11
|
+
content_tag :h1, "Hello world!"<%= ", data: { controller: \"#{stimulus_controller}\" }" if options["stimulus"] %>
|
12
12
|
end
|
13
13
|
<%- end -%>
|
14
14
|
|
@@ -11,6 +11,7 @@ module Erb
|
|
11
11
|
source_root File.expand_path("templates", __dir__)
|
12
12
|
class_option :sidecar, type: :boolean, default: false
|
13
13
|
class_option :inline, type: :boolean, default: false
|
14
|
+
class_option :stimulus, type: :boolean, default: false
|
14
15
|
|
15
16
|
def engine_name
|
16
17
|
"erb"
|
@@ -19,6 +20,14 @@ module Erb
|
|
19
20
|
def copy_view_file
|
20
21
|
super
|
21
22
|
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def data_attributes
|
27
|
+
if options["stimulus"]
|
28
|
+
" data-controller=\"#{stimulus_controller}\""
|
29
|
+
end
|
30
|
+
end
|
22
31
|
end
|
23
32
|
end
|
24
33
|
end
|
@@ -1 +1 @@
|
|
1
|
-
<div
|
1
|
+
<div<%= data_attributes %>>Add <%= class_name %> template here</div>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Stimulus
|
4
|
+
module Generators
|
5
|
+
class ComponentGenerator < ::Rails::Generators::NamedBase
|
6
|
+
include ViewComponent::AbstractGenerator
|
7
|
+
|
8
|
+
source_root File.expand_path("templates", __dir__)
|
9
|
+
class_option :sidecar, type: :boolean, default: false
|
10
|
+
|
11
|
+
def create_stimulus_controller
|
12
|
+
template "component_controller.js", destination
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def destination
|
18
|
+
if options["sidecar"]
|
19
|
+
File.join(component_path, class_path, "#{file_name}_component", "#{file_name}_component_controller.js")
|
20
|
+
else
|
21
|
+
File.join(component_path, class_path, "#{file_name}_component_controller.js")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/view_component/base.rb
CHANGED
@@ -218,9 +218,14 @@ module ViewComponent
|
|
218
218
|
|
219
219
|
# Use the provided variant instead of the one determined by the current request.
|
220
220
|
#
|
221
|
+
# @deprecated Will be removed in v3.0.0.
|
221
222
|
# @param variant [Symbol] The variant to be used by the component.
|
222
223
|
# @return [self]
|
223
224
|
def with_variant(variant)
|
225
|
+
ActiveSupport::Deprecation.warn(
|
226
|
+
"`with_variant` is deprecated and will be removed in ViewComponent v3.0.0."
|
227
|
+
)
|
228
|
+
|
224
229
|
@__vc_variant = variant
|
225
230
|
|
226
231
|
self
|
@@ -278,6 +283,14 @@ module ViewComponent
|
|
278
283
|
#
|
279
284
|
mattr_accessor :show_previews_source, instance_writer: false, default: false
|
280
285
|
|
286
|
+
# Always generate a Stimulus controller alongside the component:
|
287
|
+
#
|
288
|
+
# config.view_component.generate_stimulus_controller = true
|
289
|
+
#
|
290
|
+
# Defaults to `false`.
|
291
|
+
#
|
292
|
+
mattr_accessor :generate_stimulus_controller, instance_writer: false, default: false
|
293
|
+
|
281
294
|
# Path for component files
|
282
295
|
#
|
283
296
|
# config.view_component.view_component_path = "app/my_components"
|
@@ -8,6 +8,10 @@ module ViewComponent
|
|
8
8
|
config.view_component = ActiveSupport::OrderedOptions.new
|
9
9
|
config.view_component.preview_paths ||= []
|
10
10
|
|
11
|
+
rake_tasks do
|
12
|
+
load "view_component/rails/tasks/view_component.rake"
|
13
|
+
end
|
14
|
+
|
11
15
|
initializer "view_component.set_configs" do |app|
|
12
16
|
options = app.config.view_component
|
13
17
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
task stats: "view_component:statsetup"
|
4
|
+
|
5
|
+
namespace :view_component do
|
6
|
+
task statsetup: :environment do
|
7
|
+
require "rails/code_statistics"
|
8
|
+
|
9
|
+
::STATS_DIRECTORIES << ["ViewComponents", ViewComponent::Base.view_component_path]
|
10
|
+
end
|
11
|
+
end
|
@@ -27,8 +27,19 @@ module ViewComponent
|
|
27
27
|
# :nocov:
|
28
28
|
end
|
29
29
|
|
30
|
+
# @private
|
30
31
|
attr_reader :rendered_component
|
31
32
|
|
33
|
+
# Render a component inline. Internally sets `page` to be a `Capybara::Node::Simple`,
|
34
|
+
# allowing for Capybara assertions to be used:
|
35
|
+
#
|
36
|
+
# ```ruby
|
37
|
+
# render_inline(MyComponent.new)
|
38
|
+
# assert_text("Hello, World!")
|
39
|
+
# ```
|
40
|
+
#
|
41
|
+
# @param component [ViewComponent::Base] The instance of the component to be rendered.
|
42
|
+
# @return [Nokogiri::HTML]
|
32
43
|
def render_inline(component, **args, &block)
|
33
44
|
@rendered_component =
|
34
45
|
if Rails.version.to_f >= 6.1
|
@@ -40,10 +51,12 @@ module ViewComponent
|
|
40
51
|
Nokogiri::HTML.fragment(@rendered_component)
|
41
52
|
end
|
42
53
|
|
54
|
+
# @private
|
43
55
|
def controller
|
44
56
|
@controller ||= build_controller(Base.test_controller.constantize)
|
45
57
|
end
|
46
58
|
|
59
|
+
# @private
|
47
60
|
def request
|
48
61
|
@request ||=
|
49
62
|
begin
|
@@ -53,6 +66,15 @@ module ViewComponent
|
|
53
66
|
end
|
54
67
|
end
|
55
68
|
|
69
|
+
# Set the Action Pack request variant for the given block:
|
70
|
+
#
|
71
|
+
# ```ruby
|
72
|
+
# with_variant(:phone) do
|
73
|
+
# render_inline(MyComponent.new)
|
74
|
+
# end
|
75
|
+
# ```
|
76
|
+
#
|
77
|
+
# @param variant [Symbol] The variant to be set for the provided block.
|
56
78
|
def with_variant(variant)
|
57
79
|
old_variants = controller.view_context.lookup_context.variants
|
58
80
|
|
@@ -62,6 +84,16 @@ module ViewComponent
|
|
62
84
|
controller.view_context.lookup_context.variants = old_variants
|
63
85
|
end
|
64
86
|
|
87
|
+
# Set the controller to be used while executing the given block,
|
88
|
+
# allowing access to controller-specific methods:
|
89
|
+
#
|
90
|
+
# ```ruby
|
91
|
+
# with_controller_class(UsersController) do
|
92
|
+
# render_inline(MyComponent.new)
|
93
|
+
# end
|
94
|
+
# ```
|
95
|
+
#
|
96
|
+
# @param klass [ActionController::Base] The controller to be used.
|
65
97
|
def with_controller_class(klass)
|
66
98
|
old_controller = defined?(@controller) && @controller
|
67
99
|
|
@@ -71,6 +103,15 @@ module ViewComponent
|
|
71
103
|
@controller = old_controller
|
72
104
|
end
|
73
105
|
|
106
|
+
# Set the URL for the current request (such as when using request-dependent path helpers):
|
107
|
+
#
|
108
|
+
# ```ruby
|
109
|
+
# with_request_url("/users/42") do
|
110
|
+
# render_inline(MyComponent.new)
|
111
|
+
# end
|
112
|
+
# ```
|
113
|
+
#
|
114
|
+
# @param path [String] The path to set for the current request.
|
74
115
|
def with_request_url(path)
|
75
116
|
old_request_path_parameters = request.path_parameters
|
76
117
|
old_controller = defined?(@controller) && @controller
|
@@ -82,6 +123,7 @@ module ViewComponent
|
|
82
123
|
@controller = old_controller
|
83
124
|
end
|
84
125
|
|
126
|
+
# @private
|
85
127
|
def build_controller(klass)
|
86
128
|
klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
|
87
129
|
end
|
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.40.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: 2021-
|
11
|
+
date: 2021-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -287,6 +287,8 @@ files:
|
|
287
287
|
- lib/rails/generators/rspec/templates/component_spec.rb.tt
|
288
288
|
- lib/rails/generators/slim/component_generator.rb
|
289
289
|
- lib/rails/generators/slim/templates/component.html.slim.tt
|
290
|
+
- lib/rails/generators/stimulus/component_generator.rb
|
291
|
+
- lib/rails/generators/stimulus/templates/component_controller.js.tt
|
290
292
|
- lib/rails/generators/test_unit/component_generator.rb
|
291
293
|
- lib/rails/generators/test_unit/templates/component_test.rb.tt
|
292
294
|
- lib/view_component.rb
|
@@ -301,6 +303,7 @@ files:
|
|
301
303
|
- lib/view_component/preview.rb
|
302
304
|
- lib/view_component/preview_template_error.rb
|
303
305
|
- lib/view_component/previewable.rb
|
306
|
+
- lib/view_component/rails/tasks/view_component.rake
|
304
307
|
- lib/view_component/render_component_helper.rb
|
305
308
|
- lib/view_component/render_component_to_string_helper.rb
|
306
309
|
- lib/view_component/render_monkey_patch.rb
|