view_component 2.18.2 → 2.19.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a2198b33fb53185423a45c6f13023650604e7dacc2f5b44c2455f44b684ffdbc
4
- data.tar.gz: f9eaffd030eb7bef12b243cfdf42333e4f5b28bf6a975f6b4720b65ef0d6aedc
3
+ metadata.gz: 365d7ffb66f4ec6321b0d736bf032d5fe2d9911e1aae9081f23fe09f53d2becc
4
+ data.tar.gz: c547db15e07b7e69d2422cacdf1d450ceeab79f6b9fdb2efcdd93867da68e5d8
5
5
  SHA512:
6
- metadata.gz: 9ab6f420e32b85e912b4407ab3679e3fd696800547aecaa13c15c7833c82564f7ba8bc7db4fad8dbd7aa201250db156901486ee3c12b13f37ffedca3e5cbacf1
7
- data.tar.gz: 22103cb47921ba57712808c6a3130f48926a40179a3564fab9b2235dc892edde3ed81df28e6c23535685d13121b4be1f232836612e7132d4be04143595eebb6d
6
+ metadata.gz: 5e73a2c8950e10c09f01231c8ba40906086f943cbcd670b79e807238047f4250ab9e214c8642ff464909913010a58cbc8dd8d7e006655092f565c34420690247
7
+ data.tar.gz: efb52c65561bf10cf345ddde5ecbfffec4543d568f32a8c4d61ea1152d8200c9fa0564152012414a48739054f568a4b20d5185431f7a84782152166e84a93a60
@@ -1,6 +1,22 @@
1
- # master
1
+ # CHANGELOG
2
2
 
3
- # 2.18.2
3
+ ## master
4
+
5
+ ## 2.19.0
6
+
7
+ * Extend documentation for using Stimulus within sidecar directories.
8
+
9
+ *Ciprian Redinciuc*
10
+
11
+ * Subclassed components inherit templates from parent.
12
+
13
+ *Blake Williams*
14
+
15
+ * Fix uninitialized constant error from `with_collection` when `eager_load` is disabled.
16
+
17
+ *Josh Gross*
18
+
19
+ ## 2.18.2
4
20
 
5
21
  * Raise an error if controller or view context is accessed during initialize as they are only available in render.
6
22
 
@@ -10,13 +26,13 @@
10
26
 
11
27
  *Joel Hawksley*
12
28
 
13
- # 2.18.1
29
+ ## 2.18.1
14
30
 
15
31
  * Fix bug where previews didn't work when monkey patch was disabled.
16
32
 
17
33
  *Mixer Gutierrez*
18
34
 
19
- # 2.18.0
35
+ ## 2.18.0
20
36
 
21
37
  * Fix auto-loading of previews (changes no longer require a server restart)
22
38
 
@@ -30,31 +46,31 @@
30
46
 
31
47
  *Brad Parker*
32
48
 
33
- # 2.17.1
49
+ ## 2.17.1
34
50
 
35
51
  * Fix bug where rendering Slot with empty block resulted in error.
36
52
 
37
53
  *Joel Hawksley*
38
54
 
39
- # 2.17.0
55
+ ## 2.17.0
40
56
 
41
57
  * Slots return stripped HTML, removing leading and trailing whitespace.
42
58
 
43
59
  *Jason Long, Joel Hawksley*
44
60
 
45
- # 2.16.0
61
+ ## 2.16.0
46
62
 
47
63
  * Add `--sidecar` option to the erb, haml and slim generators. Places the generated template in the sidecar directory.
48
64
 
49
65
  *Michael van Rooijen*
50
66
 
51
- # 2.15.0
67
+ ## 2.15.0
52
68
 
53
69
  * Add support for templates as ViewComponent::Preview examples.
54
70
 
55
71
  *Juan Manuel Ramallo
56
72
 
57
- # 2.14.1
73
+ ## 2.14.1
58
74
 
59
75
  * Allow using `render_inline` in test when the render monkey patch is disabled with `config.view_component.render_monkey_patch_enabled = false` in versions of Rails < 6.1.
60
76
 
@@ -64,14 +80,14 @@
64
80
 
65
81
  Fixes:
66
82
 
67
- ```
83
+ ```console
68
84
  view_component/lib/view_component/slotable.rb:98: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
69
85
  view_component/test/app/components/slots_component.rb:18: warning: The called method `initialize' is defined here
70
86
  ```
71
87
 
72
88
  *Eileen M. Uchitelle*
73
89
 
74
- # 2.14.0
90
+ ## 2.14.0
75
91
 
76
92
  * Add `config.preview_paths` to support multiple locations of component preview files. Deprecate `config.preview_path`.
77
93
 
@@ -81,25 +97,25 @@
81
97
 
82
98
  *Richard Macklin*
83
99
 
84
- # 2.13.0
100
+ ## 2.13.0
85
101
 
86
102
  * Add the ability to disable the render monkey patch with `config.view_component.render_monkey_patch_enabled`. In versions of Rails < 6.1, add `render_component` and `render_component_to_string` methods which can be used for rendering components instead of `render`.
87
103
 
88
104
  *Johannes Engl*
89
105
 
90
- # 2.12.0
106
+ ## 2.12.0
91
107
 
92
108
  * Implement Slots as potential successor to Content Areas.
93
109
 
94
110
  *Jens Ljungblad, Brian Bugh, Jon Palmer, Joel Hawksley*
95
111
 
96
- # 2.11.1
112
+ ## 2.11.1
97
113
 
98
114
  * Fix kwarg warnings in Ruby 2.7.
99
115
 
100
116
  *Joel Hawksley*
101
117
 
102
- # 2.11.0
118
+ ## 2.11.0
103
119
 
104
120
  * Ensure Rails configuration is available within components.
105
121
 
@@ -109,25 +125,25 @@
109
125
 
110
126
  *Franco Sebregondi*
111
127
 
112
- # 2.10.0
128
+ ## 2.10.0
113
129
 
114
130
  * Raise an `ArgumentError` with a helpful message when Ruby cannot parse a component class.
115
131
 
116
132
  *Max Beizer*
117
133
 
118
- # 2.9.0
134
+ ## 2.9.0
119
135
 
120
136
  * Cache components per-request in development, preventing unnecessary recompilation during a single request.
121
137
 
122
138
  *Felipe Sateler*
123
139
 
124
- # 2.8.0
140
+ ## 2.8.0
125
141
 
126
142
  * Add `before_render`, deprecating `before_render_check`.
127
143
 
128
144
  *Joel Hawksley*
129
145
 
130
- # 2.7.0
146
+ ## 2.7.0
131
147
 
132
148
  * Add `rendered_component` method to `ViewComponent::TestHelpers` which exposes the raw output of the rendered component.
133
149
 
@@ -137,7 +153,7 @@
137
153
 
138
154
  *Jon Palmer*
139
155
 
140
- # 2.6.0
156
+ ## 2.6.0
141
157
 
142
158
  * Add `config.view_component.preview_route` to set the endpoint for component previews. By default `/rails/view_components` is used.
143
159
 
@@ -147,13 +163,13 @@
147
163
 
148
164
  *Joel Hawksley*
149
165
 
150
- # 2.5.1
166
+ ## 2.5.1
151
167
 
152
168
  * Compile component before rendering collection.
153
169
 
154
170
  *Rainer Borene*
155
171
 
156
- # v2.5.0
172
+ ## v2.5.0
157
173
 
158
174
  * Add counter variables when rendering collections.
159
175
 
@@ -163,7 +179,7 @@
163
179
 
164
180
  *Fabio Cantoni*
165
181
 
166
- # v2.4.0
182
+ ## v2.4.0
167
183
 
168
184
  * Add `#render_to_string` support.
169
185
 
@@ -181,7 +197,7 @@
181
197
 
182
198
  *Richard Macklin*
183
199
 
184
- # v2.3.0
200
+ ## v2.3.0
185
201
 
186
202
  * Allow using inline render method(s) defined on a parent.
187
203
 
@@ -195,19 +211,19 @@
195
211
 
196
212
  *Juan Manuel Ramallo*
197
213
 
198
- # v2.2.2
214
+ ## v2.2.2
199
215
 
200
216
  * Add `Base.format` for better compatibility with `ActionView::Template`.
201
217
 
202
218
  *Joel Hawksley*
203
219
 
204
- # v2.2.1
220
+ ## v2.2.1
205
221
 
206
222
  * Fix bug where template could not be found if `inherited` was redefined.
207
223
 
208
224
  *Joel Hawksley*
209
225
 
210
- # v2.2.0
226
+ ## v2.2.0
211
227
 
212
228
  * Add support for `config.action_view.annotate_template_file_names` (coming in Rails 6.1).
213
229
 
@@ -217,25 +233,25 @@
217
233
 
218
234
  *Vasiliy Ermolovich*
219
235
 
220
- # v2.1.0
236
+ ## v2.1.0
221
237
 
222
238
  * Support rendering collections (e.g., `render(MyComponent.with_collection(@items))`).
223
239
 
224
240
  *Tim Clem*
225
241
 
226
- # v2.0.0
242
+ ## v2.0.0
227
243
 
228
244
  * Move to `ViewComponent` namespace, removing all references to `ActionView`.
229
245
 
230
- * The gem name is now `view_component`.
231
- * ViewComponent previews are now accessed at `/rails/view_components`.
232
- * ViewComponents can _only_ be rendered with the instance syntax: `render(MyComponent.new)`. Support for all other syntaxes has been removed.
233
- * ActiveModel::Validations have been removed. ViewComponent generators no longer include validations.
234
- * In Rails 6.1, no monkey patching is used.
235
- * `to_component_class` has been removed.
236
- * All gem configuration is now in `config.view_component`.
246
+ * The gem name is now `view_component`.
247
+ * ViewComponent previews are now accessed at `/rails/view_components`.
248
+ * ViewComponents can _only_ be rendered with the instance syntax: `render(MyComponent.new)`. Support for all other syntaxes has been removed.
249
+ * ActiveModel::Validations have been removed. ViewComponent generators no longer include validations.
250
+ * In Rails 6.1, no monkey patching is used.
251
+ * `to_component_class` has been removed.
252
+ * All gem configuration is now in `config.view_component`.
237
253
 
238
- # v1.17.0
254
+ ## v1.17.0
239
255
 
240
256
  * Support Ruby 2.4 in CI.
241
257
 
@@ -249,7 +265,7 @@
249
265
 
250
266
  *Joel Hawksley*
251
267
 
252
- # v1.16.0
268
+ ## v1.16.0
253
269
 
254
270
  * Add `refute_component_rendered` test helper.
255
271
 
@@ -263,7 +279,7 @@
263
279
 
264
280
  *Rainer Borene*
265
281
 
266
- # v1.15.0
282
+ ## v1.15.0
267
283
 
268
284
  * Re-introduce ActionView::Component::TestHelpers.
269
285
 
@@ -287,19 +303,19 @@
287
303
 
288
304
  *Sean Doyle*
289
305
 
290
- # v1.14.1
306
+ ## v1.14.1
291
307
 
292
308
  * Fix bug where generator created invalid test code.
293
309
 
294
310
  *Joel Hawksley*
295
311
 
296
- # v1.14.0
312
+ ## v1.14.0
297
313
 
298
314
  * Rename ActionView::Component::Base to ViewComponent::Base
299
315
 
300
316
  *Joel Hawksley*
301
317
 
302
- # v1.13.0
318
+ ## v1.13.0
303
319
 
304
320
  * Allow components to be rendered inside controllers.
305
321
 
@@ -309,7 +325,7 @@
309
325
 
310
326
  *Blake Williams*
311
327
 
312
- # v1.12.0
328
+ ## v1.12.0
313
329
 
314
330
  * Revert: Remove initializer requirement for Ruby 2.7+
315
331
 
@@ -323,13 +339,13 @@
323
339
 
324
340
  *Joel Hawksley*
325
341
 
326
- # v1.11.1
342
+ ## v1.11.1
327
343
 
328
344
  * Relax Capybara requirement.
329
345
 
330
346
  *Joel Hawksley*
331
347
 
332
- # v1.11.0
348
+ ## v1.11.0
333
349
 
334
350
  * Add support for Capybara matchers.
335
351
 
@@ -339,25 +355,25 @@
339
355
 
340
356
  *Asger Behncke Jacobsen*
341
357
 
342
- # v1.10.0
358
+ ## v1.10.0
343
359
 
344
360
  * Deprecate all `render` syntaxes except for `render(MyComponent.new(foo: :bar))`
345
361
 
346
362
  *Joel Hawksley*
347
363
 
348
- # v1.9.0
364
+ ## v1.9.0
349
365
 
350
366
  * Remove initializer requirement for Ruby 2.7+
351
367
 
352
368
  *Dylan Clark*
353
369
 
354
- # v1.8.1
370
+ ## v1.8.1
355
371
 
356
372
  * Run validation checks before calling `#render?`.
357
373
 
358
374
  *Ash Wilson*
359
375
 
360
- # v1.8.0
376
+ ## v1.8.0
361
377
 
362
378
  * Remove the unneeded ComponentExamplesController and simplify preview rendering.
363
379
 
@@ -383,7 +399,7 @@
383
399
 
384
400
  *Sergey Malykh*
385
401
 
386
- # v1.7.0
402
+ ## v1.7.0
387
403
 
388
404
  * Simplify validation of templates and compilation.
389
405
 
@@ -393,7 +409,7 @@
393
409
 
394
410
  *Jon Palmer*
395
411
 
396
- # v1.6.2
412
+ ## v1.6.2
397
413
 
398
414
  * Fix Uninitialized Constant error.
399
415
 
@@ -407,7 +423,7 @@
407
423
 
408
424
  *Justin Coyne*
409
425
 
410
- # v1.6.1
426
+ ## v1.6.1
411
427
 
412
428
  * Allow Previews to have no layout.
413
429
 
@@ -433,7 +449,7 @@
433
449
 
434
450
  *Ryan Workman*
435
451
 
436
- # v1.6.0
452
+ ## v1.6.0
437
453
 
438
454
  * Avoid dropping elements in the render_inline test helper.
439
455
 
@@ -463,7 +479,7 @@
463
479
 
464
480
  *Vinicius Stock*
465
481
 
466
- # v1.5.3
482
+ ## v1.5.3
467
483
 
468
484
  * Add support for RSpec to generators.
469
485
 
@@ -473,19 +489,19 @@
473
489
 
474
490
  *Joel Hawksley*
475
491
 
476
- # v1.5.2
492
+ ## v1.5.2
477
493
 
478
494
  * Disable eager loading initializer.
479
495
 
480
496
  *Kasper Meyer*
481
497
 
482
- # v1.5.1
498
+ ## v1.5.1
483
499
 
484
500
  * Update railties class to work with Rails 6.
485
501
 
486
502
  *Juan Manuel Ramallo*
487
503
 
488
- # v1.5.0
504
+ ## v1.5.0
489
505
 
490
506
  Note: `actionview-component` is now loaded by requiring `actionview/component`, not `actionview/component/base`.
491
507
 
@@ -505,7 +521,7 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
505
521
 
506
522
  *Juan Manuel Ramallo*
507
523
 
508
- # v1.4.0
524
+ ## v1.4.0
509
525
 
510
526
  * Fix bug where components broke in application paths with periods.
511
527
 
@@ -527,7 +543,7 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
527
543
 
528
544
  *Elia Schito*
529
545
 
530
- # v1.3.6
546
+ ## v1.3.6
531
547
 
532
548
  * Allow template file names without format.
533
549
 
@@ -537,7 +553,7 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
537
553
 
538
554
  *Juan Manuel Ramallo*
539
555
 
540
- # v1.3.5
556
+ ## v1.3.5
541
557
 
542
558
  * Re-expose `controller` method.
543
559
 
@@ -551,7 +567,7 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
551
567
 
552
568
  *ars moriendi*
553
569
 
554
- # v1.3.4
570
+ ## v1.3.4
555
571
 
556
572
  * Template errors surface correct file and line number.
557
573
 
@@ -561,57 +577,57 @@ Note: `actionview-component` is now loaded by requiring `actionview/component`,
561
577
 
562
578
  *Joel Hawksley*
563
579
 
564
- # v1.3.3
580
+ ## v1.3.3
565
581
 
566
- * Do not raise error when sidecar files that are not templates exist.
582
+ * Do not raise error when sidecar files that are not templates exist.
567
583
 
568
584
  *Joel Hawksley*
569
585
 
570
- # v1.3.2
586
+ ## v1.3.2
571
587
 
572
- * Support rendering views from inside component templates.
588
+ * Support rendering views from inside component templates.
573
589
 
574
590
  *Patrick Sinclair*
575
591
 
576
- # v1.3.1
592
+ ## v1.3.1
577
593
 
578
- * Fix bug where rendering nested content caused an error.
594
+ * Fix bug where rendering nested content caused an error.
579
595
 
580
596
  *Joel Hawksley, Aaron Patterson*
581
597
 
582
- # v1.3.0
598
+ ## v1.3.0
583
599
 
584
- * Components are rendered with enough controller context to support rendering of partials and forms.
600
+ * Components are rendered with enough controller context to support rendering of partials and forms.
585
601
 
586
602
  *Patrick Sinclair, Joel Hawksley, Aaron Patterson*
587
603
 
588
- # v1.2.1
604
+ ## v1.2.1
589
605
 
590
- * `actionview-component` is now tested against Ruby 2.3/2.4 and Rails 5.0.0.
606
+ * `actionview-component` is now tested against Ruby 2.3/2.4 and Rails 5.0.0.
591
607
 
592
- # v1.2.0
608
+ ## v1.2.0
593
609
 
594
- * The `render_component` test helper has been renamed to `render_inline`. `render_component` has been deprecated and will be removed in v2.0.0.
610
+ * The `render_component` test helper has been renamed to `render_inline`. `render_component` has been deprecated and will be removed in v2.0.0.
595
611
 
596
612
  *Joel Hawksley*
597
613
 
598
- * Components are now rendered with `render MyComponent, foo: :bar` syntax. The existing `render MyComponent.new(foo: :bar)` syntax has been deprecated and will be removed in v2.0.0.
614
+ * Components are now rendered with `render MyComponent, foo: :bar` syntax. The existing `render MyComponent.new(foo: :bar)` syntax has been deprecated and will be removed in v2.0.0.
599
615
 
600
616
  *Joel Hawksley*
601
617
 
602
- # v1.1.0
618
+ ## v1.1.0
603
619
 
604
- * Components now inherit from ActionView::Component::Base
620
+ * Components now inherit from ActionView::Component::Base
605
621
 
606
622
  *Joel Hawksley*
607
623
 
608
- # v1.0.1
624
+ ## v1.0.1
609
625
 
610
- * Always recompile component templates outside production.
626
+ * Always recompile component templates outside production.
611
627
 
612
628
  *Joel Hawksley, John Hawthorn*
613
629
 
614
- # v1.0.0
630
+ ## v1.0.0
615
631
 
616
632
  This release extracts the `ActionView::Component` library from the GitHub application.
617
633
 
data/README.md CHANGED
@@ -1,10 +1,13 @@
1
1
  # ViewComponent
2
+
2
3
  ViewComponent is a framework for building view components that are reusable, testable & encapsulated, in Ruby on Rails.
3
4
 
4
5
  ## Design philosophy
6
+
5
7
  ViewComponent is designed to integrate as seamlessly as possible [with Rails](https://rubyonrails.org/doctrine/), with the [least surprise](https://www.artima.com/intv/ruby4.html).
6
8
 
7
9
  ## Compatibility
10
+
8
11
  ViewComponent is [supported natively](https://edgeguides.rubyonrails.org/layouts_and_rendering.html#rendering-objects) in Rails 6.1, and compatible with Rails 5.0+ via an included [monkey patch](https://github.com/github/view_component/blob/master/lib/view_component/render_monkey_patch.rb).
9
12
 
10
13
  ViewComponent is tested for compatibility [with combinations of](https://github.com/github/view_component/blob/22e3d4ccce70d8f32c7375e5a5ccc3f70b22a703/.github/workflows/ruby_on_rails.yml#L10-L11) Ruby 2.4+ and Rails 5+.
@@ -67,6 +70,8 @@ Component names end in -`Component`.
67
70
 
68
71
  Component module names are plural, as for controllers and jobs: `Users::AvatarComponent`
69
72
 
73
+ Name components for what they render, not what they accept. (`AvatarComponent` instead of `UserComponent`)
74
+
70
75
  #### Quick start
71
76
 
72
77
  Use the component generator to create a new ViewComponent.
@@ -94,6 +99,7 @@ bin/rails generate component Example title content --template-engine slim
94
99
  A ViewComponent is a Ruby file and corresponding template file with the same base name:
95
100
 
96
101
  `app/components/test_component.rb`:
102
+
97
103
  ```ruby
98
104
  class TestComponent < ViewComponent::Base
99
105
  def initialize(title:)
@@ -103,6 +109,7 @@ end
103
109
  ```
104
110
 
105
111
  `app/components/test_component.html.erb`:
112
+
106
113
  ```erb
107
114
  <span title="<%= @title %>"><%= content %></span>
108
115
  ```
@@ -128,6 +135,7 @@ Content passed to a ViewComponent as a block is captured and assigned to the `co
128
135
  ViewComponents can declare additional content areas. For example:
129
136
 
130
137
  `app/components/modal_component.rb`:
138
+
131
139
  ```ruby
132
140
  class ModalComponent < ViewComponent::Base
133
141
  with_content_areas :header, :body
@@ -135,6 +143,7 @@ end
135
143
  ```
136
144
 
137
145
  `app/components/modal_component.html.erb`:
146
+
138
147
  ```erb
139
148
  <div class="modal">
140
149
  <div class="header"><%= header %></div>
@@ -174,7 +183,7 @@ By default, slots can be rendered once per component. They provide an accessor w
174
183
 
175
184
  Slots declared with `collection: true` can be rendered multiple times. They provide an accessor with the pluralized name of the slot (`#rows`), which is an Array of `ViewComponent::Slot` instances.
176
185
 
177
- To learn more about the design of the Slots API, see https://github.com/github/view_component/pull/348 and https://github.com/github/view_component/discussions/325.
186
+ To learn more about the design of the Slots API, see [#348](https://github.com/github/view_component/pull/348) and [#325](https://github.com/github/view_component/discussions/325).
178
187
 
179
188
  ##### Defining Slots
180
189
 
@@ -195,6 +204,7 @@ _Note: Slot classes must be subclasses of `ViewComponent::Slot`._
195
204
  ##### Example ViewComponent with Slots
196
205
 
197
206
  `# box_component.rb`
207
+
198
208
  ```ruby
199
209
  class BoxComponent < ViewComponent::Base
200
210
  include ViewComponent::Slotable
@@ -239,6 +249,7 @@ end
239
249
  ```
240
250
 
241
251
  `# box_component.html.erb`
252
+
242
253
  ```erb
243
254
  <div class="Box">
244
255
  <% if header %>
@@ -269,6 +280,7 @@ end
269
280
  ```
270
281
 
271
282
  `# index.html.erb`
283
+
272
284
  ```erb
273
285
  <%= render(BoxComponent.new) do |component| %>
274
286
  <% component.slot(:header, classes: "my-class-name") do %>
@@ -294,6 +306,7 @@ end
294
306
  ViewComponents can render without a template file, by defining a `call` method:
295
307
 
296
308
  `app/components/inline_component.rb`:
309
+
297
310
  ```ruby
298
311
  class InlineComponent < ViewComponent::Base
299
312
  def call
@@ -320,6 +333,18 @@ class InlineVariantComponent < ViewComponent::Base
320
333
  end
321
334
  ```
322
335
 
336
+ ### Template Inheritance
337
+
338
+ Components that subclass another component inherit the parent component's
339
+ template if they don't define their own template.
340
+
341
+ ```ruby
342
+ # If `my_link_component.html.erb` is not defined the component will fall back
343
+ # to `LinkComponent`s template
344
+ class MyLinkComponent < LinkComponent
345
+ end
346
+ ```
347
+
323
348
  ### Sidecar Assets
324
349
 
325
350
  ViewComponents supports two options for defining view files.
@@ -328,7 +353,7 @@ ViewComponents supports two options for defining view files.
328
353
 
329
354
  The simplest option is to place the view next to the Ruby component:
330
355
 
331
- ```
356
+ ```console
332
357
  app/components
333
358
  ├── ...
334
359
  ├── test_component.rb
@@ -340,7 +365,7 @@ app/components
340
365
 
341
366
  As an alternative, views and other assets can be placed in a sidecar directory with the same name as the component, which can be useful for organizing views alongside other assets like Javascript and CSS.
342
367
 
343
- ```
368
+ ```console
344
369
  app/components
345
370
  ├── ...
346
371
  ├── example_component.rb
@@ -349,12 +374,11 @@ app/components
349
374
  | ├── example_component.html.erb
350
375
  | └── example_component.js
351
376
  ├── ...
352
-
353
377
  ```
354
378
 
355
379
  To generate a component with a sidecar directory, use the `--sidecar` flag:
356
380
 
357
- ```
381
+ ```console
358
382
  bin/rails generate component Example title content --sidecar
359
383
  invoke test_unit
360
384
  create test/components/example_component_test.rb
@@ -368,7 +392,7 @@ It's also possible to place the Ruby component file inside the sidecar directory
368
392
 
369
393
  _Note: Avoid giving your containing folder the same name as your `.rb` file or there will be a conflict between Module and Class definitions_
370
394
 
371
- ```
395
+ ```console
372
396
  app/components
373
397
  ├── ...
374
398
  ├── example
@@ -395,7 +419,8 @@ Components can implement a `#render?` method to be called after initialization t
395
419
  Traditionally, the logic for whether to render a view could go in either the component template:
396
420
 
397
421
  `app/components/confirm_email_component.html.erb`
398
- ```
422
+
423
+ ```erb
399
424
  <% if user.requires_confirmation? %>
400
425
  <div class="alert">Please confirm your email address.</div>
401
426
  <% end %>
@@ -404,6 +429,7 @@ Traditionally, the logic for whether to render a view could go in either the com
404
429
  or the view that renders the component:
405
430
 
406
431
  `app/views/_banners.html.erb`
432
+
407
433
  ```erb
408
434
  <% if current_user.requires_confirmation? %>
409
435
  <%= render(ConfirmEmailComponent.new(user: current_user)) %>
@@ -413,6 +439,7 @@ or the view that renders the component:
413
439
  Using the `#render?` hook simplifies the view:
414
440
 
415
441
  `app/components/confirm_email_component.rb`
442
+
416
443
  ```ruby
417
444
  class ConfirmEmailComponent < ViewComponent::Base
418
445
  def initialize(user:)
@@ -426,13 +453,15 @@ end
426
453
  ```
427
454
 
428
455
  `app/components/confirm_email_component.html.erb`
429
- ```
456
+
457
+ ```erb
430
458
  <div class="banner">
431
459
  Please confirm your email address.
432
460
  </div>
433
461
  ```
434
462
 
435
463
  `app/views/_banners.html.erb`
464
+
436
465
  ```erb
437
466
  <%= render(ConfirmEmailComponent.new(user: current_user)) %>
438
467
  ```
@@ -444,6 +473,7 @@ _To assert that a component has not been rendered, use `refute_component_rendere
444
473
  Components can define a `before_render` method to be called before a component is rendered, when `helpers` is able to be used:
445
474
 
446
475
  `app/components/confirm_email_component.rb`
476
+
447
477
  ```ruby
448
478
  class MyComponent < ViewComponent::Base
449
479
  def before_render
@@ -457,11 +487,13 @@ end
457
487
  Use `with_collection` to render a ViewComponent with a collection:
458
488
 
459
489
  `app/view/products/index.html.erb`
490
+
460
491
  ``` erb
461
492
  <%= render(ProductComponent.with_collection(@products)) %>
462
493
  ```
463
494
 
464
495
  `app/components/product_component.rb`
496
+
465
497
  ``` ruby
466
498
  class ProductComponent < ViewComponent::Base
467
499
  def initialize(product:)
@@ -477,6 +509,7 @@ end
477
509
  Use `with_collection_parameter` to change the name of the collection parameter:
478
510
 
479
511
  `app/components/product_component.rb`
512
+
480
513
  ``` ruby
481
514
  class ProductComponent < ViewComponent::Base
482
515
  with_collection_parameter :item
@@ -492,11 +525,13 @@ end
492
525
  Additional arguments besides the collection are passed to each component instance:
493
526
 
494
527
  `app/view/products/index.html.erb`
528
+
495
529
  ``` erb
496
530
  <%= render(ProductComponent.with_collection(@products, notice: "hi")) %>
497
531
  ```
498
532
 
499
533
  `app/components/product_component.rb`
534
+
500
535
  ``` ruby
501
536
  class ProductComponent < ViewComponent::Base
502
537
  with_collection_parameter :item
@@ -509,6 +544,7 @@ end
509
544
  ```
510
545
 
511
546
  `app/components/product_component.html.erb`
547
+
512
548
  ``` erb
513
549
  <li>
514
550
  <h2><%= @item.name %></h2>
@@ -521,6 +557,7 @@ end
521
557
  ViewComponent defines a counter variable matching the parameter name above, followed by `_counter`. To access the variable, add it to `initialize` as an argument:
522
558
 
523
559
  `app/components/product_component.rb`
560
+
524
561
  ``` ruby
525
562
  class ProductComponent < ViewComponent::Base
526
563
  def initialize(product:, product_counter:)
@@ -531,6 +568,7 @@ end
531
568
  ```
532
569
 
533
570
  `app/components/product_component.html.erb`
571
+
534
572
  ``` erb
535
573
  <li>
536
574
  <%= @counter %> <%= @product.name %>
@@ -579,7 +617,7 @@ class UserComponent < ViewComponent::Base
579
617
  end
580
618
  ```
581
619
 
582
- ### Testing
620
+ ### Writing tests
583
621
 
584
622
  Unit test components directly, using the `render_inline` test helper, asserting against the rendered output.
585
623
 
@@ -647,9 +685,11 @@ end
647
685
  ```
648
686
 
649
687
  ### Previewing Components
688
+
650
689
  `ViewComponent::Preview`, like `ActionMailer::Preview`, provides a way to preview components in isolation:
651
690
 
652
691
  `test/components/previews/test_component_preview.rb`
692
+
653
693
  ```ruby
654
694
  class TestComponentPreview < ViewComponent::Preview
655
695
  def with_default_title
@@ -677,6 +717,7 @@ and <http://localhost:3000/rails/view_components/test_component/with_content_blo
677
717
  It's also possible to set dynamic values from the params by setting them as arguments:
678
718
 
679
719
  `test/components/previews/test_component_preview.rb`
720
+
680
721
  ```ruby
681
722
  class TestComponentPreview < ViewComponent::Preview
682
723
  def with_dynamic_title(title: "Test component default")
@@ -694,6 +735,7 @@ and [`content_tag`](https://api.rubyonrails.org/classes/ActionView/Helpers/TagHe
694
735
  Previews use the application layout by default, but can use a specific layout with the `layout` option:
695
736
 
696
737
  `test/components/previews/test_component_preview.rb`
738
+
697
739
  ```ruby
698
740
  class TestComponentPreview < ViewComponent::Preview
699
741
  layout "admin"
@@ -705,6 +747,7 @@ end
705
747
  You can also set a custom layout to be used by default for previews as well as the preview index pages via the `default_preview_layout` configuration option:
706
748
 
707
749
  `config/application.rb`
750
+
708
751
  ```ruby
709
752
  # Set the default layout to app/views/layouts/component_preview.html.erb
710
753
  config.view_component.default_preview_layout = "component_preview"
@@ -713,6 +756,7 @@ config.view_component.default_preview_layout = "component_preview"
713
756
  Preview classes live in `test/components/previews`, which can be configured using the `preview_paths` option:
714
757
 
715
758
  `config/application.rb`
759
+
716
760
  ```ruby
717
761
  config.view_component.preview_paths << "#{Rails.root}/lib/component_previews"
718
762
  ```
@@ -720,6 +764,7 @@ config.view_component.preview_paths << "#{Rails.root}/lib/component_previews"
720
764
  Previews are served from <http://localhost:3000/rails/view_components> by default. To use a different endpoint, set the `preview_route` option:
721
765
 
722
766
  `config/application.rb`
767
+
723
768
  ```ruby
724
769
  config.view_component.preview_route = "/previews"
725
770
  ```
@@ -731,6 +776,7 @@ This example will make the previews available from <http://localhost:3000/previe
731
776
  Given a preview `test/components/previews/cell_component_preview.rb`, template files can be defined at `test/components/previews/cell_component_preview/`:
732
777
 
733
778
  `test/components/previews/cell_component_preview.rb`
779
+
734
780
  ```ruby
735
781
  class CellComponentPreview < ViewComponent::Preview
736
782
  def default
@@ -739,6 +785,7 @@ end
739
785
  ```
740
786
 
741
787
  `test/components/previews/cell_component_preview/default.html.erb`
788
+
742
789
  ```erb
743
790
  <table class="table">
744
791
  <tbody>
@@ -753,6 +800,7 @@ To use a different location for preview templates, pass the `template` argument:
753
800
  (the path should be relative to `config.view_component.preview_path`):
754
801
 
755
802
  `test/components/previews/cell_component_preview.rb`
803
+
756
804
  ```ruby
757
805
  class CellComponentPreview < ViewComponent::Preview
758
806
  def default
@@ -764,6 +812,7 @@ end
764
812
  Values from `params` can be accessed through `locals`:
765
813
 
766
814
  `test/components/previews/cell_component_preview.rb`
815
+
767
816
  ```ruby
768
817
  class CellComponentPreview < ViewComponent::Preview
769
818
  def default(title: "Default title", subtitle: "A subtitle")
@@ -782,6 +831,7 @@ Which enables passing in a value with <http://localhost:3000/rails/components/ce
782
831
  Component tests and previews assume the existence of an `ApplicationController` class, which be can be configured using the `test_controller` option:
783
832
 
784
833
  `config/application.rb`
834
+
785
835
  ```ruby
786
836
  config.view_component.test_controller = "BaseController"
787
837
  ```
@@ -791,6 +841,7 @@ config.view_component.test_controller = "BaseController"
791
841
  To use RSpec, add the following:
792
842
 
793
843
  `spec/rails_helper.rb`
844
+
794
845
  ```ruby
795
846
  require "view_component/test_helpers"
796
847
 
@@ -804,6 +855,7 @@ Specs created by the generator have access to test helpers like `render_inline`.
804
855
  To use component previews:
805
856
 
806
857
  `config/application.rb`
858
+
807
859
  ```ruby
808
860
  config.view_component.preview_paths << "#{Rails.root}/spec/components/previews"
809
861
  ```
@@ -816,7 +868,7 @@ In order to [avoid conflicts](https://github.com/github/view_component/issues/28
816
868
 
817
869
  With the monkey patch disabled, use `render_component` (or `render_component_to_string`) instead:
818
870
 
819
- ```
871
+ ```erb
820
872
  <%= render_component Component.new(message: "bar") %>
821
873
  ```
822
874
 
@@ -854,6 +906,7 @@ One approach is to use Web Components, which contain all Javascript functionalit
854
906
  For example:
855
907
 
856
908
  `app/components/comment_component.rb`
909
+
857
910
  ```ruby
858
911
  class CommentComponent < ViewComponent::Base
859
912
  def initialize(comment:)
@@ -883,6 +936,7 @@ end
883
936
  ```
884
937
 
885
938
  `app/components/comment_component.html.erb`
939
+
886
940
  ```erb
887
941
  <my-comment comment-id="<%= comment.id %>">
888
942
  <time slot="posted" datetime="<%= comment.created_at.iso8601 %>"><%= comment.created_at.strftime("%b %-d") %></time>
@@ -896,6 +950,7 @@ end
896
950
  ```
897
951
 
898
952
  `app/components/comment_component.js`
953
+
899
954
  ```js
900
955
  class Comment extends HTMLElement {
901
956
  styles() {
@@ -949,6 +1004,29 @@ application.load(
949
1004
 
950
1005
  This enables the creation of files such as `app/components/widget_controller.js`, where the controller identifier matches the `data-controller` attribute in the component's HTML template.
951
1006
 
1007
+ When placing a Stimulus controller inside a sidecar directory, be aware that when referencing the controller [each forward slash in a namespaced controller file’s path becomes two dashes in its identifier](
1008
+ https://stimulusjs.org/handbook/installing#controller-filenames-map-to-identifiers):
1009
+
1010
+ ```console
1011
+ app/components
1012
+ ├── ...
1013
+ ├── example
1014
+ | ├── component.rb
1015
+ | ├── component.css
1016
+ | ├── component.html.erb
1017
+ | └── component_controller.js
1018
+ ├── ...
1019
+ ```
1020
+
1021
+ `component_controller.js`'s Stimulus identifier becomes: `example--component`:
1022
+
1023
+ ```erb
1024
+ <div data-controller="example--component">
1025
+ <input type="text">
1026
+ <button data-action="click->example--component#greet">Greet</button>
1027
+ </div>
1028
+ ```
1029
+
952
1030
  ## Frequently Asked Questions
953
1031
 
954
1032
  ### Can I use other templating languages besides ERB?
@@ -980,7 +1058,7 @@ ViewComponent is far from a novel idea! Popular implementations of view componen
980
1058
 
981
1059
  ## Contributing
982
1060
 
983
- Bug reports and pull requests are welcome on GitHub at https://github.com/github/view_component. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. We recommend reading the [contributing guide](./CONTRIBUTING.md) as well.
1061
+ This project is intended to be a safe, welcoming space for collaboration. Contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. We recommend reading the [contributing guide](./CONTRIBUTING.md) as well.
984
1062
 
985
1063
  ## Contributors
986
1064
 
@@ -183,6 +183,10 @@ module ViewComponent
183
183
  end
184
184
 
185
185
  def inherited(child)
186
+ # Compile so child will inherit compiled `call_*` template methods that
187
+ # `compile` defines
188
+ compile
189
+
186
190
  # If we're in Rails, add application url_helpers to the component context
187
191
  if defined?(Rails)
188
192
  child.include Rails.application.routes.url_helpers unless child < Rails.application.routes.url_helpers
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "action_view/renderer/collection_renderer" if Rails.version.to_f >= 6.1
4
+
3
5
  module ViewComponent
4
6
  class Collection
5
7
  def render_in(view_context, &block)
@@ -3,8 +3,8 @@
3
3
  module ViewComponent
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 18
7
- PATCH = 2
6
+ MINOR = 19
7
+ PATCH = 0
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
10
10
  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.18.2
4
+ version: 2.19.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: 2020-09-09 00:00:00.000000000 Z
11
+ date: 2020-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport