view_component 3.4.0 → 3.5.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 +14 -0
- data/lib/view_component/base.rb +36 -5
- data/lib/view_component/compiler.rb +21 -11
- data/lib/view_component/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce590ddce7011ae4362dde0733f78ba65992c31add6bac215555515d02ae1dc6
|
4
|
+
data.tar.gz: df4867599a61d2757e2f226a3c6b187981772e2d225fc442f9184484c0423e64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a39d71f089c0f4285dc1eecd324e44afc73f55565002a45c2d37292cc4fa8b05713f7237f04b530617ddc0bb2ccd08fab0c7d010400790dc00daf2d6c9c0546
|
7
|
+
data.tar.gz: 252a63a4ed7eefd7db529dc93081d3ccfb78555ac1d051540f7a69829a41d4d22fd94557fa2fe9eb88c012bd8dccfd2ceb813aae2582877e387a2df347e2d915
|
data/docs/CHANGELOG.md
CHANGED
@@ -10,6 +10,20 @@ nav_order: 5
|
|
10
10
|
|
11
11
|
## main
|
12
12
|
|
13
|
+
## 3.5.0
|
14
|
+
|
15
|
+
* Add Skroutz to users list.
|
16
|
+
|
17
|
+
*Chris Nitsas*
|
18
|
+
|
19
|
+
* Improve implementation of `#render_parent` so it respects variants and deep inheritance hierarchies.
|
20
|
+
|
21
|
+
*Cameron Dutro*
|
22
|
+
|
23
|
+
* Add CharlieHR to users list.
|
24
|
+
|
25
|
+
*Alex Balhatchet*
|
26
|
+
|
13
27
|
## 3.4.0
|
14
28
|
|
15
29
|
* Avoid including Rails `url_helpers` into `Preview` class when they're not defined.
|
data/lib/view_component/base.rb
CHANGED
@@ -116,20 +116,44 @@ module ViewComponent
|
|
116
116
|
end
|
117
117
|
|
118
118
|
# Subclass components that call `super` inside their template code will cause a
|
119
|
-
# double render if they emit the result
|
119
|
+
# double render if they emit the result.
|
120
120
|
#
|
121
121
|
# ```erb
|
122
122
|
# <%= super %> # double-renders
|
123
|
-
# <% super %> #
|
123
|
+
# <% super %> # doesn't double-render
|
124
124
|
# ```
|
125
125
|
#
|
126
|
-
#
|
126
|
+
# `super` also doesn't consider the current variant. `render_parent` renders the
|
127
|
+
# parent template considering the current variant and emits the result without
|
128
|
+
# double-rendering.
|
127
129
|
def render_parent
|
128
|
-
|
129
|
-
method(mtd).super_method.call
|
130
|
+
render_parent_to_string
|
130
131
|
nil
|
131
132
|
end
|
132
133
|
|
134
|
+
# Renders the parent component to a string and returns it. This method is meant
|
135
|
+
# to be used inside custom #call methods when a string result is desired, eg.
|
136
|
+
#
|
137
|
+
# ```ruby
|
138
|
+
# def call
|
139
|
+
# "<div>#{render_parent_to_string}</div>"
|
140
|
+
# end
|
141
|
+
# ```
|
142
|
+
#
|
143
|
+
# When rendering the parent inside an .erb template, use `#render_parent` instead.
|
144
|
+
def render_parent_to_string
|
145
|
+
@__vc_parent_render_level ||= 0 # ensure a good starting value
|
146
|
+
|
147
|
+
begin
|
148
|
+
target_render = self.class.instance_variable_get(:@__vc_ancestor_calls)[@__vc_parent_render_level]
|
149
|
+
@__vc_parent_render_level += 1
|
150
|
+
|
151
|
+
target_render.bind_call(self, @__vc_variant)
|
152
|
+
ensure
|
153
|
+
@__vc_parent_render_level -= 1
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
133
157
|
# Optional content to be returned after the rendered template.
|
134
158
|
#
|
135
159
|
# @return [String]
|
@@ -459,6 +483,13 @@ module ViewComponent
|
|
459
483
|
# Set collection parameter to the extended component
|
460
484
|
child.with_collection_parameter provided_collection_parameter
|
461
485
|
|
486
|
+
if instance_methods(false).include?(:render_template_for)
|
487
|
+
vc_ancestor_calls = defined?(@__vc_ancestor_calls) ? @__vc_ancestor_calls.dup : []
|
488
|
+
|
489
|
+
vc_ancestor_calls.unshift(instance_method(:render_template_for))
|
490
|
+
child.instance_variable_set(:@__vc_ancestor_calls, vc_ancestor_calls)
|
491
|
+
end
|
492
|
+
|
462
493
|
super
|
463
494
|
end
|
464
495
|
|
@@ -56,17 +56,17 @@ module ViewComponent
|
|
56
56
|
RUBY
|
57
57
|
# rubocop:enable Style/EvalWithLocation
|
58
58
|
|
59
|
+
component_class.define_method("_call_#{safe_class_name}", component_class.instance_method(:call))
|
60
|
+
|
59
61
|
component_class.silence_redefinition_of_method("render_template_for")
|
60
62
|
component_class.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
61
63
|
def render_template_for(variant = nil)
|
62
|
-
|
64
|
+
_call_#{safe_class_name}
|
63
65
|
end
|
64
66
|
RUBY
|
65
67
|
end
|
66
68
|
else
|
67
69
|
templates.each do |template|
|
68
|
-
# Remove existing compiled template methods,
|
69
|
-
# as Ruby warns when redefining a method.
|
70
70
|
method_name = call_method_name(template[:variant])
|
71
71
|
|
72
72
|
redefinition_lock.synchronize do
|
@@ -95,15 +95,20 @@ module ViewComponent
|
|
95
95
|
|
96
96
|
def define_render_template_for
|
97
97
|
variant_elsifs = variants.compact.uniq.map do |variant|
|
98
|
-
|
98
|
+
safe_name = "_call_variant_#{normalized_variant_name(variant)}_#{safe_class_name}"
|
99
|
+
component_class.define_method(safe_name, component_class.instance_method(call_method_name(variant)))
|
100
|
+
|
101
|
+
"elsif variant.to_sym == :'#{variant}'\n #{safe_name}"
|
99
102
|
end.join("\n")
|
100
103
|
|
104
|
+
component_class.define_method("_call_#{safe_class_name}", component_class.instance_method(:call))
|
105
|
+
|
101
106
|
body = <<-RUBY
|
102
107
|
if variant.nil?
|
103
|
-
|
108
|
+
_call_#{safe_class_name}
|
104
109
|
#{variant_elsifs}
|
105
110
|
else
|
106
|
-
|
111
|
+
_call_#{safe_class_name}
|
107
112
|
end
|
108
113
|
RUBY
|
109
114
|
|
@@ -276,12 +281,17 @@ module ViewComponent
|
|
276
281
|
variant.to_s.gsub("-", "__").gsub(".", "___")
|
277
282
|
end
|
278
283
|
|
284
|
+
def safe_class_name
|
285
|
+
@safe_class_name ||= component_class.name.underscore.gsub("/", "__")
|
286
|
+
end
|
287
|
+
|
279
288
|
def should_compile_superclass?
|
280
|
-
development? && templates.empty? && !has_inline_template? &&
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
289
|
+
development? && templates.empty? && !has_inline_template? && !call_defined?
|
290
|
+
end
|
291
|
+
|
292
|
+
def call_defined?
|
293
|
+
component_class.instance_methods(false).include?(:call) ||
|
294
|
+
component_class.private_instance_methods(false).include?(:call)
|
285
295
|
end
|
286
296
|
end
|
287
297
|
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: 3.
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ViewComponent Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-07-
|
11
|
+
date: 2023-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|