Skip to content

Commit 6bde654

Browse files
nicolas-brousseSpone
authored andcommitted
wip
1 parent c64c79f commit 6bde654

9 files changed

Lines changed: 137 additions & 26 deletions

File tree

‎config.ru‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ Combustion.initialize! :all do
1111
config.logger = ActiveSupport::TaggedLogging.new(Logger.new(nil))
1212
config.log_level = :fatal
1313

14+
config.cache_classes = false
15+
16+
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
17+
1418
config.view_component.preview_paths << Rails.root.join("test/components/previews")
1519
config.view_component.default_preview_layout = "component_preview"
1620

‎lib/view_component/form/test_helpers.rb‎

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,35 @@
77
module ViewComponent
88
module Form
99
module TestHelpers
10-
def form_with(object, builder: ViewComponent::Form::Builder, **options)
11-
builder.new(object_name, object, template, options)
10+
include ActionView::ModelNaming
11+
12+
# See: https://github.com/rails/rails/blob/83217025a171593547d1268651b446d3533e2019/actionview/lib/action_view/helpers/form_helper.rb#L737
13+
def form_with(model: nil, scope: nil, **options)
14+
if model
15+
model = model.last if model.is_a?(Array)
16+
scope ||= model_name_from_record_or_class(model).param_key
17+
end
18+
19+
instanciate_form_builder(scope, model, options)
1220
end
1321

14-
def object_name
15-
:user
22+
# See: https://github.com/rails/rails/blob/83217025a171593547d1268651b446d3533e2019/actionview/lib/action_view/helpers/form_helper.rb#L1561
23+
def instanciate_form_builder(record_name, record_object = nil, **options)
24+
case record_name
25+
when String, Symbol
26+
object = record_object
27+
object_name = record_name
28+
else
29+
object = record_name
30+
object_name = model_name_from_record_or_class(object).param_key if object
31+
end
32+
33+
builder = options[:builder] || ViewComponent::Form::Builder
34+
builder.new(object_name, object, template, options)
1635
end
1736

37+
private
38+
1839
if Gem::Version.new(Rails::VERSION::STRING) >= Gem::Version.new("6.1")
1940
def template
2041
lookup_context = ActionView::LookupContext.new(ActionController::Base.view_paths)

‎spec/internal/app/models/user.rb‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class User < ActiveRecord::Base
2+
end

‎spec/internal/config/routes.rb‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
Rails.application.routes.draw do
44
# Add your own routes here, or remove this file if you don't have need for it.
55

6-
mount Lookbook::Engine, at: "/" if Rails.env.development?
6+
mount Lookbook::Engine, at: "/lookbook" if Rails.env.development? # TODO: path to "/" but broke cable path
77
end

‎spec/internal/db/schema.rb‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333

3434
create_table(:cities, force: true) do |t|
3535
t.belongs_to :country
36+
end
37+
38+
create_table(:users, force: true) do |t|
39+
t.string :first_name
40+
t.string :last_name
3641
t.timestamps
3742
end
3843
end

‎spec/internal/test/components/previews/view_component/form/label_component_preview.rb‎

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,21 @@
11
# frozen_string_literal: true
22

3+
require "view_component/form/test_helpers"
4+
35
module ViewComponent
46
module Form
57
class LabelComponentPreview < ViewComponent::Preview
6-
def test
7-
render ViewComponent::Form::LabelComponent.new(form_builder, object_name, :first_name)
8+
include ViewComponent::Form::TestHelpers
9+
10+
def default
11+
# TODO: maybe stop passing object_name to components since it is accessing from form_builder (delegate in BaseComponent)
12+
render ViewComponent::Form::LabelComponent.new(form_builder, form_builder.object_name, :first_name)
813
end
914

1015
private
1116

1217
def form_builder
13-
@form_builder ||= ViewComponent::Form::Builder.new(object_name, object, template, {})
14-
end
15-
16-
def object
17-
OpenStruct.new
18-
end
19-
20-
def object_name
21-
:user
22-
end
23-
24-
def template
25-
lookup_context = ActionView::LookupContext.new(ActionController::Base.view_paths)
26-
27-
if Gem::Version.new(Rails::VERSION::STRING) >= Gem::Version.new("6.1")
28-
ActionView::Base.new(lookup_context, {}, ActionController::Base.new)
29-
else
30-
ActionView::Base.new(lookup_context, {})
31-
end
18+
instanciate_form_builder(User.new)
3219
end
3320
end
3421
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
require "view_component/form/test_helpers"
4+
5+
module ViewComponent
6+
module Form
7+
class SubmitComponentPreview < ViewComponent::Preview
8+
include ViewComponent::Form::TestHelpers
9+
10+
def default
11+
# TODO: maybe stop passing object_name to components since it is accessing from form_builder (delegate in BaseComponent)
12+
render ViewComponent::Form::SubmitComponent.new(form_builder, form_builder.object_name)
13+
end
14+
15+
private
16+
17+
def form_builder
18+
instanciate_form_builder(User.new)
19+
end
20+
end
21+
end
22+
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
require "view_component/form/test_helpers"
4+
5+
module ViewComponent
6+
module Form
7+
class TextAreaComponentPreview < ViewComponent::Preview
8+
include ViewComponent::Form::TestHelpers
9+
10+
def default
11+
@object = User.new
12+
13+
# TODO: maybe stop passing object_name to components since it is accessing from form_builder (delegate in BaseComponent)
14+
render_f ViewComponent::Form::TextAreaComponent, :first_name
15+
end
16+
17+
def with_value
18+
@object = User.new(first_name: "John\John")
19+
20+
render_f ViewComponent::Form::TextAreaComponent, :first_name
21+
end
22+
23+
24+
private
25+
26+
def render_f(component_klass, *args, **options)
27+
options[:object] ||= @object
28+
29+
builder = instanciate_form_builder(options[:object])
30+
31+
render component_klass.new(builder, builder.object_name, *args, options)
32+
end
33+
end
34+
end
35+
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# frozen_string_literal: true
2+
3+
require "view_component/form/test_helpers"
4+
5+
module ViewComponent
6+
module Form
7+
class TextFieldComponentPreview < ViewComponent::Preview
8+
include ViewComponent::Form::TestHelpers
9+
10+
def default
11+
@object = User.new
12+
13+
# TODO: maybe stop passing object_name to components since it is accessing from form_builder (delegate in BaseComponent)
14+
render_f ViewComponent::Form::TextFieldComponent, :first_name
15+
end
16+
17+
def with_value
18+
@object = User.new(first_name: "John")
19+
20+
render_f ViewComponent::Form::TextFieldComponent, :first_name
21+
end
22+
23+
24+
private
25+
26+
def render_f(component_klass, *args, **options)
27+
options[:object] ||= @object
28+
29+
builder = instanciate_form_builder(options[:object])
30+
31+
render component_klass.new(builder, builder.object_name, *args, options)
32+
end
33+
end
34+
end
35+
end

0 commit comments

Comments
 (0)