view_component 2.83.0 → 3.0.0.rc1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27bcac094fd171c4eb5c5ef2319372747f0efd62ca643fefdc2b544fd6efbd73
4
- data.tar.gz: 49d93b90f2cf504ded99a6cfe0db780ec178131800a35eff210488da62aae673
3
+ metadata.gz: 18fc4d884af4512c13d7b1f4184c59e57859a8d797451ec0b2063ff425a7d357
4
+ data.tar.gz: 8da2e96b470f354b1d09f1b461506e64cca4345522f2b9ddfa4143ee5bf0627c
5
5
  SHA512:
6
- metadata.gz: 89a7f4702ccfc60f9128a99a3ff0ab5b35237fc0aaba860c01e705754330d557b3c380de369cd63db430f3d42d2cb2370a0677eee07ae73a61118921ec715994
7
- data.tar.gz: 99c1af02c38bba37dc3f44b70818eadae73e307c4d05dd321585fb8cbdfed667367e34255fbbae11b9197fca731704e53a76b38abcfac93e45378c48a798cb43
6
+ metadata.gz: 9750449d8d23a150a099e8c3fa6620eb7ba03adecfeefaa9e4f0c3ce463353d9918f1212971ae214557675eae367232ccd96308e89f11831259efa1000b8fa22
7
+ data.tar.gz: 7b1a6852d060bea82ab51e69f3328d95dd6491d11fb2f88b84fa8b235fb17a83670a05764c8df116127017332fd3a6f9d76d9205fd5bcc31d925ec9e39a573b8
data/docs/CHANGELOG.md CHANGED
@@ -10,11 +10,59 @@ nav_order: 5
10
10
 
11
11
  ## main
12
12
 
13
- ## 2.83.0
13
+ ## 3.0.0.rc1
14
14
 
15
- * Ensure HTML output safety.
15
+ 1,000+ days and 100+ releases later, the 200+ contributors to ViewComponent are proud to ship v3.0.0!
16
16
 
17
- *Cameron Dutro*
17
+ We're so grateful for all of the work of community members to get us to this release. Whether it’s filing bug reports, designing APIs in long-winded discussion threads, or writing code itself, ViewComponent is built by the community, for the community. We couldn’t be more proud of what we’re building together :heart:
18
+
19
+ This release makes the following breaking changes, many of which have long been deprecated:
20
+
21
+ * BREAKING: Remove deprecated slots setter methods. Use `with_SLOT_NAME` instead.
22
+
23
+ *Joel Hawksley*
24
+
25
+ * BREAKING: Remove deprecated SlotsV1 in favor of current SlotsV2.
26
+
27
+ *Joel Hawksley*
28
+
29
+ * BREAKING: Remove deprecated `content_areas` feature. Use Slots instead.
30
+
31
+ *Joel Hawksley*
32
+
33
+ * BREAKING: Remove deprecated support for loading ViewComponent engine manually. Make sure `require "view_component/engine"` is removed from `Gemfile`.
34
+
35
+ *Joel Hawksley*
36
+
37
+ * BREAKING: Remove deprecated `generate_*` methods. Use `generate.*` instead.
38
+
39
+ *Joel Hawksley*
40
+
41
+ * BREAKING: Remove deprecated `with_variant` method.
42
+
43
+ *Joel Hawksley*
44
+
45
+ * BREAKING: Remove deprecated `rendered_component` in favor of `rendered_content`.
46
+
47
+ *Joel Hawksley*
48
+
49
+ * BREAKING: Remove deprecated `config.preview_path` in favor of `config.preview_paths`.
50
+
51
+ *Joel Hawksley*
52
+
53
+ * BREAKING: Support Ruby 2.7+ instead of 2.4+
54
+
55
+ *Joel Hawksley*
56
+
57
+ * BREAKING: Remove deprecated `before_render_check`.
58
+
59
+ *Joel Hawksley*
60
+
61
+ * BREAKING: Change counter variable to start iterating from `0` instead of `1`.
62
+
63
+ *Frank S*
64
+
65
+ Run into an issue with this release? [Let us know](https://github.com/ViewComponent/view_component/issues/1629).
18
66
 
19
67
  ## 2.82.0
20
68
 
@@ -6,10 +6,8 @@ require "view_component/collection"
6
6
  require "view_component/compile_cache"
7
7
  require "view_component/compiler"
8
8
  require "view_component/config"
9
- require "view_component/content_areas"
10
9
  require "view_component/polymorphic_slots"
11
10
  require "view_component/preview"
12
- require "view_component/slotable"
13
11
  require "view_component/slotable_v2"
14
12
  require "view_component/translatable"
15
13
  require "view_component/with_content_helper"
@@ -31,7 +29,6 @@ module ViewComponent
31
29
  attr_writer :config
32
30
  end
33
31
 
34
- include ViewComponent::ContentAreas
35
32
  include ViewComponent::PolymorphicSlots
36
33
  include ViewComponent::SlotableV2
37
34
  include ViewComponent::Translatable
@@ -44,9 +41,6 @@ module ViewComponent
44
41
  # For CSRF authenticity tokens in forms
45
42
  delegate :form_authenticity_token, :protect_against_forgery?, :config, to: :helpers
46
43
 
47
- class_attribute :content_areas
48
- self.content_areas = [] # class_attribute:default doesn't work until Rails 5.2
49
-
50
44
  # Config option that strips trailing whitespace in templates before compiling them.
51
45
  class_attribute :__vc_strip_trailing_whitespace, instance_accessor: false, instance_predicate: false
52
46
  self.__vc_strip_trailing_whitespace = false # class_attribute:default doesn't work until Rails 5.2
@@ -66,23 +60,6 @@ module ViewComponent
66
60
  self.__vc_original_view_context = view_context
67
61
  end
68
62
 
69
- # @!macro [attach] deprecated_generate_mattr_accessor
70
- # @method generate_$1
71
- # @deprecated Use `#generate.$1` instead. Will be removed in v3.0.0.
72
- def self._deprecated_generate_mattr_accessor(name)
73
- define_singleton_method("generate_#{name}".to_sym) do
74
- generate.public_send(name)
75
- end
76
- define_singleton_method("generate_#{name}=".to_sym) do |value|
77
- generate.public_send("#{name}=".to_sym, value)
78
- end
79
- end
80
-
81
- _deprecated_generate_mattr_accessor :distinct_locale_files
82
- _deprecated_generate_mattr_accessor :locale
83
- _deprecated_generate_mattr_accessor :sidecar
84
- _deprecated_generate_mattr_accessor :stimulus_controller
85
-
86
63
  # Entrypoint for rendering components.
87
64
  #
88
65
  # - `view_context`: ActionView context from calling view
@@ -130,12 +107,7 @@ module ViewComponent
130
107
  before_render
131
108
 
132
109
  if render?
133
- # Avoid allocating new string when output_postamble is blank
134
- if output_postamble.blank?
135
- safe_render_template_for(@__vc_variant).to_s
136
- else
137
- safe_render_template_for(@__vc_variant).to_s + safe_output_postamble
138
- end
110
+ render_template_for(@__vc_variant).to_s + output_postamble
139
111
  else
140
112
  ""
141
113
  end
@@ -162,7 +134,7 @@ module ViewComponent
162
134
  #
163
135
  # @return [String]
164
136
  def output_postamble
165
- @@default_output_postamble ||= "".html_safe
137
+ ""
166
138
  end
167
139
 
168
140
  # Called before rendering the component. Override to perform operations that
@@ -170,14 +142,6 @@ module ViewComponent
170
142
  #
171
143
  # @return [void]
172
144
  def before_render
173
- before_render_check
174
- end
175
-
176
- # Called after rendering the component.
177
- #
178
- # @deprecated Use `#before_render` instead. Will be removed in v3.0.0.
179
- # @return [void]
180
- def before_render_check
181
145
  # noop
182
146
  end
183
147
 
@@ -270,22 +234,9 @@ module ViewComponent
270
234
  #
271
235
  # @private
272
236
  def format
273
- # Ruby 2.6 throws a warning without checking `defined?`, 2.7 doesn't
274
237
  @__vc_variant if defined?(@__vc_variant)
275
238
  end
276
239
 
277
- # Use the provided variant instead of the one determined by the current request.
278
- #
279
- # @deprecated Will be removed in v3.0.0.
280
- # @param variant [Symbol] The variant to be used by the component.
281
- # @return [self]
282
- def with_variant(variant)
283
- @__vc_variant = variant
284
-
285
- self
286
- end
287
- deprecate :with_variant, deprecator: ViewComponent::Deprecation
288
-
289
240
  # The current request. Use sparingly as doing so introduces coupling that
290
241
  # inhibits encapsulation & reuse, often making testing difficult.
291
242
  #
@@ -314,38 +265,6 @@ module ViewComponent
314
265
  @__vc_content_evaluated
315
266
  end
316
267
 
317
- def maybe_escape_html(text)
318
- return text if request && !request.format.html?
319
- return text if text.blank?
320
-
321
- if text.html_safe?
322
- text
323
- else
324
- yield
325
- html_escape(text)
326
- end
327
- end
328
-
329
- def safe_render_template_for(variant)
330
- if compiler.renders_template_for_variant?(variant)
331
- render_template_for(variant)
332
- else
333
- maybe_escape_html(render_template_for(variant)) do
334
- Kernel.warn("WARNING: The #{self.class} component rendered HTML-unsafe output. The output will be automatically escaped, but you may want to investigate.")
335
- end
336
- end
337
- end
338
-
339
- def safe_output_postamble
340
- maybe_escape_html(output_postamble) do
341
- Kernel.warn("WARNING: The #{self.class} component was provided an HTML-unsafe postamble. The postamble will be automatically escaped, but you may want to investigate.")
342
- end
343
- end
344
-
345
- def compiler
346
- @compiler ||= self.class.compiler
347
- end
348
-
349
268
  # Set the controller used for testing components:
350
269
  #
351
270
  # ```ruby
@@ -62,7 +62,7 @@ module ViewComponent
62
62
 
63
63
  def component_options(item, iterator)
64
64
  item_options = {component.collection_parameter => item}
65
- item_options[component.collection_counter_parameter] = iterator.index + 1 if component.counter_argument_present?
65
+ item_options[component.collection_counter_parameter] = iterator.index if component.counter_argument_present?
66
66
  item_options[component.collection_iteration_parameter] = iterator.dup if component.iteration_argument_present?
67
67
 
68
68
  @options.merge(item_options)
@@ -16,7 +16,6 @@ module ViewComponent
16
16
  def initialize(component_class)
17
17
  @component_class = component_class
18
18
  @redefinition_lock = Mutex.new
19
- @variants_rendering_templates = Set.new
20
19
  end
21
20
 
22
21
  def compiled?
@@ -47,12 +46,6 @@ module ViewComponent
47
46
  return false
48
47
  end
49
48
 
50
- if subclass_instance_methods.include?(:before_render_check)
51
- ViewComponent::Deprecation.deprecation_warning(
52
- "`before_render_check`", :"`before_render`"
53
- )
54
- end
55
-
56
49
  if raise_errors
57
50
  component_class.validate_initialization_parameters!
58
51
  component_class.validate_collection_parameter!
@@ -62,7 +55,6 @@ module ViewComponent
62
55
  # Remove existing compiled template methods,
63
56
  # as Ruby warns when redefining a method.
64
57
  method_name = call_method_name(template[:variant])
65
- @variants_rendering_templates << template[:variant]
66
58
 
67
59
  redefinition_lock.synchronize do
68
60
  component_class.silence_redefinition_of_method(method_name)
@@ -83,10 +75,6 @@ module ViewComponent
83
75
  CompileCache.register(component_class)
84
76
  end
85
77
 
86
- def renders_template_for_variant?(variant)
87
- @variants_rendering_templates.include?(variant)
88
- end
89
-
90
78
  private
91
79
 
92
80
  attr_reader :component_class, :redefinition_lock
@@ -126,9 +126,6 @@ module ViewComponent
126
126
  # The locations in which component previews will be looked up.
127
127
  # Defaults to `['test/component/previews']` relative to your Rails root.
128
128
 
129
- # @!attribute preview_path
130
- # @deprecated Use #preview_paths instead. Will be removed in v3.0.0.
131
-
132
129
  # @!attribute test_controller
133
130
  # @return [String]
134
131
  # The controller used for testing components.
@@ -158,15 +155,6 @@ module ViewComponent
158
155
  @config = self.class.defaults
159
156
  end
160
157
 
161
- def preview_path
162
- preview_paths
163
- end
164
-
165
- def preview_path=(new_value)
166
- ViewComponent::Deprecation.deprecation_warning("`preview_path`", :"`preview_paths`")
167
- self.preview_paths = Array.wrap(new_value)
168
- end
169
-
170
158
  delegate_missing_to :config
171
159
 
172
160
  private
@@ -3,6 +3,6 @@
3
3
  require "active_support/deprecation"
4
4
 
5
5
  module ViewComponent
6
- DEPRECATION_HORIZON = "3.0.0"
6
+ DEPRECATION_HORIZON = "4.0.0"
7
7
  Deprecation = ActiveSupport::Deprecation.new(DEPRECATION_HORIZON, "ViewComponent")
8
8
  end
@@ -143,20 +143,3 @@ module ViewComponent
143
143
  end
144
144
  end
145
145
  end
146
-
147
- if RUBY_VERSION < "2.7.0"
148
- ViewComponent::Deprecation.deprecation_warning("Support for Ruby versions < 2.7.0")
149
- end
150
-
151
- # :nocov:
152
- unless defined?(ViewComponent::Base)
153
- require "view_component/deprecation"
154
-
155
- ViewComponent::Deprecation.deprecation_warning(
156
- "Manually loading the engine",
157
- "remove `require \"view_component/engine\"`"
158
- )
159
-
160
- require "view_component"
161
- end
162
- # :nocov:
@@ -60,18 +60,6 @@ module ViewComponent
60
60
  "#{slot_name}_#{poly_type}"
61
61
  end
62
62
 
63
- define_method(setter_name) do |*args, &block|
64
- if _warn_on_deprecated_slot_setter
65
- ViewComponent::Deprecation.deprecation_warning(
66
- "Using polymorphic slot setters like `#{setter_name}`",
67
- :"`with_#{setter_name}`"
68
- )
69
- end
70
-
71
- set_polymorphic_slot(slot_name, poly_type, *args, &block)
72
- end
73
- ruby2_keywords(setter_name.to_sym) if respond_to?(:ruby2_keywords, true)
74
-
75
63
  define_method("with_#{setter_name}") do |*args, &block|
76
64
  set_polymorphic_slot(slot_name, poly_type, *args, &block)
77
65
  end
@@ -15,71 +15,6 @@ module ViewComponent
15
15
  end
16
16
 
17
17
  class_methods do
18
- # support initializing slots as:
19
- #
20
- # with_slot(
21
- # :header,
22
- # collection: true|false,
23
- # class_name: "Header" # class name string, used to instantiate Slot
24
- # )
25
- def with_slot(*slot_names, collection: false, class_name: nil)
26
- ViewComponent::Deprecation.deprecation_warning(
27
- "`with_slot`", "use the new slots API (https://viewcomponent.org/guide/slots.html) instead"
28
- )
29
-
30
- slot_names.each do |slot_name|
31
- # Ensure slot_name isn't already declared
32
- if slots.key?(slot_name)
33
- raise ArgumentError.new("#{slot_name} slot declared multiple times")
34
- end
35
-
36
- # Ensure slot name isn't :content
37
- if slot_name == :content
38
- raise ArgumentError.new ":content is a reserved slot name. Please use another name, such as ':body'"
39
- end
40
-
41
- # Set the name of the method used to access the Slot(s)
42
- accessor_name =
43
- if collection
44
- # If Slot is a collection, set the accessor
45
- # name to the pluralized form of the slot name
46
- # For example: :tab => :tabs
47
- ActiveSupport::Inflector.pluralize(slot_name)
48
- else
49
- slot_name
50
- end
51
-
52
- instance_variable_name = "@#{accessor_name}"
53
-
54
- # If the slot is a collection, define an accesor that defaults to an empty array
55
- if collection
56
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
57
- def #{accessor_name}
58
- content unless content_evaluated? # ensure content is loaded so slots will be defined
59
- #{instance_variable_name} ||= []
60
- end
61
- RUBY
62
- else
63
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
64
- def #{accessor_name}
65
- content unless content_evaluated? # ensure content is loaded so slots will be defined
66
- #{instance_variable_name} if defined?(#{instance_variable_name})
67
- end
68
- RUBY
69
- end
70
-
71
- # Default class_name to ViewComponent::Slot
72
- class_name = "ViewComponent::Slot" unless class_name.present?
73
-
74
- # Register the slot on the component
75
- slots[slot_name] = {
76
- class_name: class_name,
77
- instance_variable_name: instance_variable_name,
78
- collection: collection
79
- }
80
- end
81
- end
82
-
83
18
  def inherited(child)
84
19
  # Clone slot configuration into child class
85
20
  # see #test_slots_pollution
@@ -17,19 +17,9 @@ module ViewComponent
17
17
  # Hash of registered Slots
18
18
  class_attribute :registered_slots
19
19
  self.registered_slots = {}
20
-
21
- class_attribute :_warn_on_deprecated_slot_setter
22
- self._warn_on_deprecated_slot_setter = false
23
20
  end
24
21
 
25
22
  class_methods do
26
- ##
27
- # Enables deprecations coming to the Slots API in ViewComponent v3
28
- #
29
- def warn_on_deprecated_slot_setter
30
- self._warn_on_deprecated_slot_setter = true
31
- end
32
-
33
23
  ##
34
24
  # Registers a sub-component
35
25
  #
@@ -88,21 +78,7 @@ module ViewComponent
88
78
  ruby2_keywords(:"with_#{slot_name}") if respond_to?(:ruby2_keywords, true)
89
79
 
90
80
  define_method slot_name do |*args, &block|
91
- if args.empty? && block.nil?
92
- get_slot(slot_name)
93
- else
94
- if _warn_on_deprecated_slot_setter
95
- stack = caller_locations(3)
96
-
97
- ViewComponent::Deprecation.deprecation_warning(
98
- "Setting a slot with `##{slot_name}`",
99
- "use `#with_#{slot_name}` to set the slot instead",
100
- stack
101
- )
102
- end
103
-
104
- set_slot(slot_name, nil, *args, &block)
105
- end
81
+ get_slot(slot_name)
106
82
  end
107
83
  ruby2_keywords(slot_name.to_sym) if respond_to?(:ruby2_keywords, true)
108
84
 
@@ -155,22 +131,6 @@ module ViewComponent
155
131
  validate_plural_slot_name(slot_name)
156
132
  validate_singular_slot_name(ActiveSupport::Inflector.singularize(slot_name).to_sym)
157
133
 
158
- # Define setter for singular names
159
- # for example `renders_many :items` allows fetching all tabs with
160
- # `component.tabs` and setting a tab with `component.tab`
161
-
162
- define_method singular_name do |*args, &block|
163
- if _warn_on_deprecated_slot_setter
164
- ViewComponent::Deprecation.deprecation_warning(
165
- "Setting a slot with `##{singular_name}`",
166
- "use `#with_#{singular_name}` to set the slot instead"
167
- )
168
- end
169
-
170
- set_slot(slot_name, nil, *args, &block)
171
- end
172
- ruby2_keywords(singular_name.to_sym) if respond_to?(:ruby2_keywords, true)
173
-
174
134
  define_method :"with_#{singular_name}" do |*args, &block|
175
135
  set_slot(slot_name, nil, *args, &block)
176
136
  end
@@ -182,23 +142,8 @@ module ViewComponent
182
142
  end
183
143
  end
184
144
 
185
- # Instantiates and and adds multiple slots forwarding the first
186
- # argument to each slot constructor
187
145
  define_method slot_name do |collection_args = nil, &block|
188
- if collection_args.nil? && block.nil?
189
- get_slot(slot_name)
190
- else
191
- if _warn_on_deprecated_slot_setter
192
- ViewComponent::Deprecation.deprecation_warning(
193
- "Setting a slot with `##{slot_name}`",
194
- "use `#with_#{slot_name}` to set the slot instead"
195
- )
196
- end
197
-
198
- collection_args.map do |args|
199
- set_slot(slot_name, nil, **args, &block)
200
- end
201
- end
146
+ get_slot(slot_name)
202
147
  end
203
148
 
204
149
  define_method "#{slot_name}?" do
@@ -31,15 +31,6 @@ module ViewComponent
31
31
  # @private
32
32
  attr_reader :rendered_content
33
33
 
34
- # Returns the result of a render_inline call.
35
- #
36
- # @return [String]
37
- def rendered_component
38
- ViewComponent::Deprecation.deprecation_warning("`rendered_component`", :"`page`")
39
-
40
- rendered_content
41
- end
42
-
43
34
  # Render a component inline. Internally sets `page` to be a `Capybara::Node::Simple`,
44
35
  # allowing for Capybara assertions to be used:
45
36
  #
@@ -2,11 +2,12 @@
2
2
 
3
3
  module ViewComponent
4
4
  module VERSION
5
- MAJOR = 2
6
- MINOR = 83
5
+ MAJOR = 3
6
+ MINOR = 0
7
7
  PATCH = 0
8
+ PRE = "rc1"
8
9
 
9
- STRING = [MAJOR, MINOR, PATCH].join(".")
10
+ STRING = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
10
11
  end
11
12
  end
12
13
 
@@ -23,13 +23,4 @@ module ViewComponent
23
23
  autoload :Translatable
24
24
  end
25
25
 
26
- # :nocov:
27
- if defined?(ViewComponent::Engine)
28
- ViewComponent::Deprecation.deprecation_warning(
29
- "Manually loading the engine",
30
- "remove `require \"view_component/engine\"`"
31
- )
32
- elsif defined?(Rails::Engine)
33
- require "view_component/engine"
34
- end
35
- # :nocov:
26
+ require "view_component/engine" if defined?(Rails::Engine)
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.83.0
4
+ version: 3.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - ViewComponent Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-08 00:00:00.000000000 Z
11
+ date: 2023-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -358,7 +358,6 @@ files:
358
358
  - lib/view_component/compiler.rb
359
359
  - lib/view_component/component_error.rb
360
360
  - lib/view_component/config.rb
361
- - lib/view_component/content_areas.rb
362
361
  - lib/view_component/deprecation.rb
363
362
  - lib/view_component/docs_builder_component.html.erb
364
363
  - lib/view_component/docs_builder_component.rb
@@ -374,7 +373,6 @@ files:
374
373
  - lib/view_component/render_to_string_monkey_patch.rb
375
374
  - lib/view_component/rendering_component_helper.rb
376
375
  - lib/view_component/rendering_monkey_patch.rb
377
- - lib/view_component/slot.rb
378
376
  - lib/view_component/slot_v2.rb
379
377
  - lib/view_component/slotable.rb
380
378
  - lib/view_component/slotable_v2.rb
@@ -402,14 +400,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
402
400
  requirements:
403
401
  - - ">="
404
402
  - !ruby/object:Gem::Version
405
- version: 2.4.0
403
+ version: 2.7.0
406
404
  required_rubygems_version: !ruby/object:Gem::Requirement
407
405
  requirements:
408
- - - ">="
406
+ - - ">"
409
407
  - !ruby/object:Gem::Version
410
- version: '0'
408
+ version: 1.3.1
411
409
  requirements: []
412
- rubygems_version: 3.4.5
410
+ rubygems_version: 3.2.32
413
411
  signing_key:
414
412
  specification_version: 4
415
413
  summary: A framework for building reusable, testable & encapsulated view components
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_support/concern"
4
-
5
- require "view_component/slot"
6
-
7
- # DEPRECATED - ContentAreas is deprecated and will be removed in v3.0.0
8
- module ViewComponent
9
- module ContentAreas
10
- extend ActiveSupport::Concern
11
-
12
- # Assign the provided content to the content area accessor
13
- #
14
- # @private
15
- def with(area, content = nil, &block)
16
- unless content_areas.include?(area)
17
- raise ArgumentError.new(
18
- "Unknown content_area '#{area}' for #{self} - expected one of '#{content_areas}'.\n\n" \
19
- "To fix this issue, add `with_content_area :#{area}` to #{self} or reference " \
20
- "a valid content area."
21
- )
22
- end
23
-
24
- if block
25
- content = view_context.capture(&block)
26
- end
27
-
28
- instance_variable_set("@#{area}".to_sym, content)
29
- nil
30
- end
31
-
32
- class_methods do
33
- def with_content_areas(*areas)
34
- ViewComponent::Deprecation.deprecation_warning(
35
- "`with_content_areas`", "use slots (https://viewcomponent.org/guide/slots.html) instead"
36
- )
37
-
38
- if areas.include?(:content)
39
- raise ArgumentError.new(
40
- "#{self} defines a content area called :content, which is a reserved name. \n\n" \
41
- "To fix this issue, use another name, such as `:body`."
42
- )
43
- end
44
-
45
- areas.each do |area|
46
- define_method area.to_sym do
47
- content unless content_evaluated? # ensure content is loaded so content_areas will be defined
48
- instance_variable_get(:"@#{area}") if instance_variable_defined?(:"@#{area}")
49
- end
50
- end
51
-
52
- self.content_areas = areas
53
- end
54
- end
55
- end
56
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ViewComponent
4
- class Slot
5
- attr_accessor :content
6
- end
7
- end