view_component 2.36.0 → 2.40.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/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
|