view_component 2.55.0 → 2.57.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.
Potentially problematic release.
This version of view_component might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/controllers/concerns/view_component/preview_actions.rb +2 -1
- data/docs/CHANGELOG.md +59 -0
- data/lib/view_component/base.rb +22 -7
- data/lib/view_component/collection.rb +7 -0
- data/lib/view_component/preview.rb +4 -3
- data/lib/view_component/render_preview_helper.rb +40 -0
- data/lib/view_component/test_helpers.rb +18 -7
- 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: 1c0dea17d60642f97d9edad061c538054015eac0f774bc58d37ba30c177a76ac
|
4
|
+
data.tar.gz: bb12f7080b7c90ab0e475550bf44577ef25d2b1e0d0966cc5f07c272d9ea5fec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3eb53d5be8bdb0ab083f0c57938bda3df2094c6368619efb59254bd8ce6a749ffcd4d1dab653b80be48a17f361fa15611c9086c2a526891d81e92527ffd67c9d
|
7
|
+
data.tar.gz: 418af4138439260637f53b025de631a11f222a699030afe36d3b51b7a31c5f451e7d3eb2ec5c6d13fa39b9b44e12e27fae972b631c92133bfbf054079695b80d
|
@@ -8,7 +8,6 @@ module ViewComponent
|
|
8
8
|
prepend_view_path File.expand_path("../../../views", __dir__)
|
9
9
|
|
10
10
|
around_action :set_locale, only: :previews
|
11
|
-
before_action :find_preview, only: :previews
|
12
11
|
before_action :require_local!, unless: :show_previews?
|
13
12
|
|
14
13
|
if respond_to?(:content_security_policy)
|
@@ -23,6 +22,8 @@ module ViewComponent
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def previews
|
25
|
+
find_preview
|
26
|
+
|
26
27
|
if params[:path] == @preview.preview_name
|
27
28
|
@page_title = "Component Previews for #{@preview.preview_name}"
|
28
29
|
render "view_components/previews", **determine_layout
|
data/docs/CHANGELOG.md
CHANGED
@@ -9,6 +9,65 @@ title: Changelog
|
|
9
9
|
|
10
10
|
## main
|
11
11
|
|
12
|
+
## 2.57.1
|
13
|
+
|
14
|
+
* Fix issue causing `NoMethodError`s when calling helper methods from components rendered as part of a collection.
|
15
|
+
* Fix syntax error in the ERB example in the polymorphic slots docs.
|
16
|
+
|
17
|
+
*Cameron Dutro*
|
18
|
+
|
19
|
+
## 2.57.0
|
20
|
+
|
21
|
+
* Add missing `require` for `Translatable` module in `Base`.
|
22
|
+
|
23
|
+
*Hans Lemuet*
|
24
|
+
|
25
|
+
* Allow anything that responds to `#render_in` to be rendered in the parent component's view context.
|
26
|
+
|
27
|
+
*Cameron Dutro*
|
28
|
+
|
29
|
+
* Fix script/release so it honors semver.
|
30
|
+
|
31
|
+
*Cameron Dutro*
|
32
|
+
|
33
|
+
## 2.56.2
|
34
|
+
|
35
|
+
* Restore removed `rendered_component`, marking it for deprecation in v3.0.0.
|
36
|
+
|
37
|
+
*Tyson Gach*, *Richard Macklin*, *Joel Hawksley*
|
38
|
+
|
39
|
+
## 2.56.1
|
40
|
+
|
41
|
+
* Rename private accessor `rendered_component` to `rendered_content`.
|
42
|
+
|
43
|
+
*Yoshiyuki Hirano*, *Simon Dawson*
|
44
|
+
|
45
|
+
## 2.56.0
|
46
|
+
|
47
|
+
* Introduce experimental `render_preview` test helper. Note: `@rendered_component` in `TestHelpers` has been renamed to `@rendered_content`.
|
48
|
+
|
49
|
+
*Joel Hawksley*
|
50
|
+
|
51
|
+
* Move framework tests into sandbox application.
|
52
|
+
|
53
|
+
*Joel Hawksley*
|
54
|
+
|
55
|
+
* Add G2 to list of companies that use ViewComponent.
|
56
|
+
|
57
|
+
*Jack Shuff*
|
58
|
+
|
59
|
+
* Add Within3 to list of companies that use ViewComponent.
|
60
|
+
|
61
|
+
*Drew Bragg*
|
62
|
+
|
63
|
+
* Add Mission Met to list of companies that use ViewComponent.
|
64
|
+
|
65
|
+
*Nick Smith*
|
66
|
+
|
67
|
+
* Fix `#with_request_url` test helper not parsing nested query parameters into nested hashes.
|
68
|
+
|
69
|
+
*Richard Marbach*
|
70
|
+
|
12
71
|
## 2.55.0
|
13
72
|
|
14
73
|
* Add `render_parent` convenience method to avoid confusion between `<%= super %>` and `<% super %>` in template code.
|
data/lib/view_component/base.rb
CHANGED
@@ -9,6 +9,7 @@ require "view_component/polymorphic_slots"
|
|
9
9
|
require "view_component/previewable"
|
10
10
|
require "view_component/slotable"
|
11
11
|
require "view_component/slotable_v2"
|
12
|
+
require "view_component/translatable"
|
12
13
|
require "view_component/with_content_helper"
|
13
14
|
|
14
15
|
module ViewComponent
|
@@ -32,6 +33,19 @@ module ViewComponent
|
|
32
33
|
|
33
34
|
attr_accessor :__vc_original_view_context
|
34
35
|
|
36
|
+
# Components render in their own view context. Helpers and other functionality
|
37
|
+
# require a reference to the original Rails view context, an instance of
|
38
|
+
# `ActionView::Base`. Use this method to set a reference to the original
|
39
|
+
# view context. Objects that implement this method will render in the component's
|
40
|
+
# view context, while objects that don't will render in the original view context
|
41
|
+
# so helpers, etc work as expected.
|
42
|
+
#
|
43
|
+
# @param view_context [ActionView::Base] The original view context.
|
44
|
+
# @return [void]
|
45
|
+
def set_original_view_context(view_context)
|
46
|
+
self.__vc_original_view_context = view_context
|
47
|
+
end
|
48
|
+
|
35
49
|
# EXPERIMENTAL: This API is experimental and may be removed at any time.
|
36
50
|
# Hook for allowing components to do work as part of the compilation process.
|
37
51
|
#
|
@@ -113,24 +127,25 @@ module ViewComponent
|
|
113
127
|
@current_template = old_current_template
|
114
128
|
end
|
115
129
|
|
130
|
+
# @private
|
116
131
|
def perform_render
|
117
132
|
render_template_for(@__vc_variant).to_s + _output_postamble
|
118
133
|
end
|
119
134
|
|
120
135
|
# Subclass components that call `super` inside their template code will cause a
|
121
|
-
# double render if they
|
122
|
-
#
|
123
|
-
# <%= super %> # double-renders
|
136
|
+
# double render if they emit the result:
|
124
137
|
#
|
125
|
-
#
|
138
|
+
# <%= super %> # double-renders
|
139
|
+
# <% super %> # does not double-render
|
126
140
|
#
|
127
|
-
# Calls `super`, returning nil to avoid rendering the result twice.
|
141
|
+
# Calls `super`, returning `nil` to avoid rendering the result twice.
|
128
142
|
def render_parent
|
129
143
|
mtd = @__vc_variant ? "call_#{@__vc_variant}" : "call"
|
130
144
|
method(mtd).super_method.call
|
131
145
|
nil
|
132
146
|
end
|
133
147
|
|
148
|
+
# @private
|
134
149
|
# :nocov:
|
135
150
|
def render_template_for(variant = nil)
|
136
151
|
# Force compilation here so the compiler always redefines render_template_for.
|
@@ -182,8 +197,8 @@ module ViewComponent
|
|
182
197
|
#
|
183
198
|
# @private
|
184
199
|
def render(options = {}, args = {}, &block)
|
185
|
-
if options.
|
186
|
-
options.__vc_original_view_context
|
200
|
+
if options.respond_to?(:set_original_view_context)
|
201
|
+
options.set_original_view_context(self.__vc_original_view_context)
|
187
202
|
super
|
188
203
|
else
|
189
204
|
__vc_original_view_context.render(options, args, &block)
|
@@ -10,8 +10,15 @@ module ViewComponent
|
|
10
10
|
delegate :format, to: :component
|
11
11
|
delegate :size, to: :@collection
|
12
12
|
|
13
|
+
attr_accessor :__vc_original_view_context
|
14
|
+
|
15
|
+
def set_original_view_context(view_context)
|
16
|
+
self.__vc_original_view_context = view_context
|
17
|
+
end
|
18
|
+
|
13
19
|
def render_in(view_context, &block)
|
14
20
|
components.map do |component|
|
21
|
+
component.set_original_view_context(self.__vc_original_view_context)
|
15
22
|
component.render_in(view_context, &block)
|
16
23
|
end.join.html_safe # rubocop:disable Rails/OutputSafety
|
17
24
|
end
|
@@ -30,7 +30,8 @@ module ViewComponent # :nodoc:
|
|
30
30
|
class << self
|
31
31
|
# Returns all component preview classes.
|
32
32
|
def all
|
33
|
-
load_previews
|
33
|
+
load_previews
|
34
|
+
|
34
35
|
descendants
|
35
36
|
end
|
36
37
|
|
@@ -98,14 +99,14 @@ module ViewComponent # :nodoc:
|
|
98
99
|
source[1...(source.size - 1)].join("\n")
|
99
100
|
end
|
100
101
|
|
101
|
-
private
|
102
|
-
|
103
102
|
def load_previews
|
104
103
|
Array(preview_paths).each do |preview_path|
|
105
104
|
Dir["#{preview_path}/**/*_preview.rb"].sort.each { |file| require_dependency file }
|
106
105
|
end
|
107
106
|
end
|
108
107
|
|
108
|
+
private
|
109
|
+
|
109
110
|
def preview_paths
|
110
111
|
Base.preview_paths
|
111
112
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViewComponent
|
4
|
+
module RenderPreviewHelper
|
5
|
+
# Render a preview inline. Internally sets `page` to be a `Capybara::Node::Simple`,
|
6
|
+
# allowing for Capybara assertions to be used:
|
7
|
+
#
|
8
|
+
# ```ruby
|
9
|
+
# render_preview(:default)
|
10
|
+
# assert_text("Hello, World!")
|
11
|
+
# ```
|
12
|
+
#
|
13
|
+
# Note: `#rendered_preview` expects a preview to be defined with the same class
|
14
|
+
# name as the calling test, but with `Test` replaced with `Preview`:
|
15
|
+
#
|
16
|
+
# MyComponentTest -> MyComponentPreview etc.
|
17
|
+
#
|
18
|
+
# @param preview [String] The name of the preview to be rendered.
|
19
|
+
# @return [Nokogiri::HTML]
|
20
|
+
def render_preview(name)
|
21
|
+
begin
|
22
|
+
preview_klass = self.class.name.gsub("Test", "Preview")
|
23
|
+
preview_klass = preview_klass.constantize
|
24
|
+
rescue NameError
|
25
|
+
raise NameError.new(
|
26
|
+
"`render_preview` expected to find #{preview_klass}, but it does not exist."
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
previews_controller = build_controller(ViewComponent::Base.preview_controller.constantize)
|
31
|
+
previews_controller.request.params[:path] = "#{preview_klass.preview_name}/#{name}"
|
32
|
+
previews_controller.response = ActionDispatch::Response.new
|
33
|
+
result = previews_controller.previews
|
34
|
+
|
35
|
+
@rendered_content = result
|
36
|
+
|
37
|
+
Nokogiri::HTML.fragment(@rendered_content)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "view_component/render_preview_helper"
|
4
|
+
|
3
5
|
module ViewComponent
|
4
6
|
module TestHelpers
|
5
7
|
begin
|
@@ -7,7 +9,7 @@ module ViewComponent
|
|
7
9
|
include Capybara::Minitest::Assertions
|
8
10
|
|
9
11
|
def page
|
10
|
-
Capybara::Node::Simple.new(@
|
12
|
+
Capybara::Node::Simple.new(@rendered_content)
|
11
13
|
end
|
12
14
|
|
13
15
|
def refute_component_rendered
|
@@ -28,7 +30,16 @@ module ViewComponent
|
|
28
30
|
end
|
29
31
|
|
30
32
|
# @private
|
31
|
-
attr_reader :
|
33
|
+
attr_reader :rendered_content
|
34
|
+
|
35
|
+
def rendered_component
|
36
|
+
ViewComponent::Deprecation.warn(
|
37
|
+
"`rendered_component` is deprecated and will be removed in v3.0.0. " \
|
38
|
+
"Use `page` instead."
|
39
|
+
)
|
40
|
+
|
41
|
+
rendered_content
|
42
|
+
end
|
32
43
|
|
33
44
|
# Render a component inline. Internally sets `page` to be a `Capybara::Node::Simple`,
|
34
45
|
# allowing for Capybara assertions to be used:
|
@@ -41,14 +52,14 @@ module ViewComponent
|
|
41
52
|
# @param component [ViewComponent::Base, ViewComponent::Collection] The instance of the component to be rendered.
|
42
53
|
# @return [Nokogiri::HTML]
|
43
54
|
def render_inline(component, **args, &block)
|
44
|
-
@
|
55
|
+
@rendered_content =
|
45
56
|
if Rails.version.to_f >= 6.1
|
46
57
|
controller.view_context.render(component, args, &block)
|
47
58
|
else
|
48
59
|
controller.view_context.render_component(component, &block)
|
49
60
|
end
|
50
61
|
|
51
|
-
Nokogiri::HTML.fragment(@
|
62
|
+
Nokogiri::HTML.fragment(@rendered_content)
|
52
63
|
end
|
53
64
|
|
54
65
|
# Execute the given block in the view context. Internally sets `page` to be a
|
@@ -62,8 +73,8 @@ module ViewComponent
|
|
62
73
|
# assert_text("Hello, World!")
|
63
74
|
# ```
|
64
75
|
def render_in_view_context(&block)
|
65
|
-
@
|
66
|
-
Nokogiri::HTML.fragment(@
|
76
|
+
@rendered_content = controller.view_context.instance_exec(&block)
|
77
|
+
Nokogiri::HTML.fragment(@rendered_content)
|
67
78
|
end
|
68
79
|
|
69
80
|
# @private
|
@@ -136,7 +147,7 @@ module ViewComponent
|
|
136
147
|
|
137
148
|
request.path_info = path
|
138
149
|
request.path_parameters = Rails.application.routes.recognize_path(path)
|
139
|
-
request.set_header("action_dispatch.request.query_parameters", Rack::Utils.
|
150
|
+
request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(path.split("?")[1]))
|
140
151
|
request.set_header(Rack::QUERY_STRING, path.split("?")[1])
|
141
152
|
yield
|
142
153
|
ensure
|
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.57.1
|
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: 2022-
|
11
|
+
date: 2022-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -345,6 +345,7 @@ files:
|
|
345
345
|
- lib/view_component/render_component_helper.rb
|
346
346
|
- lib/view_component/render_component_to_string_helper.rb
|
347
347
|
- lib/view_component/render_monkey_patch.rb
|
348
|
+
- lib/view_component/render_preview_helper.rb
|
348
349
|
- lib/view_component/render_to_string_monkey_patch.rb
|
349
350
|
- lib/view_component/rendering_component_helper.rb
|
350
351
|
- lib/view_component/rendering_monkey_patch.rb
|