Skip to content

Commit c010cae

Browse files
authored
Merge pull request #6191 from chaimann/admin-update-address-component
Refactor `ui/forms/address` component
2 parents dad997b + 4ff6e68 commit c010cae

7 files changed

Lines changed: 44 additions & 30 deletions

File tree

admin/app/components/solidus_admin/orders/show/address/component.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
<div class="w-full flex gap-4">
3030
<%= turbo_frame_tag address_frame_id do %>
31-
<%= render component('ui/forms/address').new(address: @address, name: "order[#{@type}_address_attributes]") %>
31+
<%= render component('ui/forms/address').new(addressable: @address, form_field_name: "order[#{@type}_address_attributes]") %>
3232
<% end %>
3333
</div>
3434

admin/app/components/solidus_admin/ui/forms/address/component.html.erb

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,52 @@
33
<%= :disabled if @disabled %>
44
>
55
<div class="<%= stimulus_id %>--address-form flex flex-wrap gap-4 pb-4">
6-
<%= render component("ui/forms/field").text_field(@name, :name, object: @address) %>
7-
<%= render component("ui/forms/field").text_field(@name, :address1, object: @address) %>
8-
<%= render component("ui/forms/field").text_field(@name, :address2, object: @address) %>
6+
<%= render component("ui/forms/field").text_field(@form_field_name, :name, object: @addressable) if @include_name_field %>
7+
<%= render component("ui/forms/field").text_field(@form_field_name, :address1, object: @addressable) %>
8+
<%= render component("ui/forms/field").text_field(@form_field_name, :address2, object: @addressable) %>
99
<div class="flex gap-4 w-full">
10-
<%= render component("ui/forms/field").text_field(@name, :city, object: @address) %>
11-
<%= render component("ui/forms/field").text_field(@name, :zipcode, object: @address) %>
10+
<%= render component("ui/forms/field").text_field(@form_field_name, :city, object: @addressable) %>
11+
<%= render component("ui/forms/field").text_field(@form_field_name, :zipcode, object: @addressable) %>
1212
</div>
1313

1414
<%= render component("ui/forms/field").select(
15-
@name,
15+
@form_field_name,
1616
:country_id,
1717
Spree::Country.all.map { |c| [c.name, c.id] },
18-
object: @address,
19-
value: @address.try(:country_id),
18+
object: @addressable,
19+
value: @addressable.try(:country_id),
2020
"data-#{stimulus_id}-target": "country",
2121
"data-action": "change->#{stimulus_id}#loadStates"
2222
) %>
2323

2424
<%= content_tag(:div,
2525
data: { "#{stimulus_id}-target": "stateNameWrapper" },
26-
class: (@address.country&.states&.empty? ? "flex flex-col gap-2 w-full" : "hidden flex flex-col gap-2 w-full")
26+
class: (@addressable.country&.states&.empty? ? "flex flex-col gap-2 w-full" : "hidden flex flex-col gap-2 w-full")
2727
) do %>
2828
<%= render component("ui/forms/field").text_field(
29-
@name,
29+
@form_field_name,
3030
:state_name,
31-
object: @address,
32-
value: @address.try(:state_name),
31+
object: @addressable,
32+
value: @addressable.try(:state_name),
3333
"data-#{stimulus_id}-target": "stateName"
3434
) %>
3535
<% end %>
36-
<input autocomplete="off" type="hidden" name=<%= "#{@name}[state_id]" %>>
36+
<input autocomplete="off" type="hidden" name=<%= "#{@form_field_name}[state_id]" %>>
3737

3838
<%= content_tag(:div,
3939
data: { "#{stimulus_id}-target": "stateWrapper" },
40-
class: (@address.country&.states&.empty? ? "hidden flex flex-col gap-2 w-full" : "flex flex-col gap-2 w-full")
40+
class: (@addressable.country&.states&.empty? ? "hidden flex flex-col gap-2 w-full" : "flex flex-col gap-2 w-full")
4141
) do %>
4242
<%= render component("ui/forms/field").select(
43-
@name,
43+
@form_field_name,
4444
:state_id,
4545
state_options,
46-
object: @address,
47-
value: @address.try(:state_id),
46+
object: @addressable,
47+
value: @addressable.try(:state_id),
4848
"data-#{stimulus_id}-target": "state"
4949
) %>
5050
<% end %>
5151

52-
<%= render component("ui/forms/field").text_field(@name, :phone, object: @address) %>
52+
<%= render component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) %>
5353
</div>
5454
</fieldset>
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
# frozen_string_literal: true
22

33
class SolidusAdmin::UI::Forms::Address::Component < SolidusAdmin::BaseComponent
4-
def initialize(address:, name:, disabled: false)
5-
@address = address
6-
@name = name
4+
def initialize(addressable:, form_field_name:, disabled: false, include_name_field: true)
5+
@addressable = addressable
6+
@form_field_name = form_field_name
77
@disabled = disabled
8+
@include_name_field = include_name_field
89
end
910

1011
def state_options
11-
return [] unless @address.country
12-
@address.country.states.map { |s| [s.name, s.id] }
12+
return [] unless @addressable.country
13+
@addressable.country.states.map { |s| [s.name, s.id] }
1314
end
1415
end

admin/app/components/solidus_admin/users/addresses/component.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<%= render component('ui/panel').new(title: t(".billing_address")) do %>
2020
<%= form_for @user, url: solidus_admin.update_addresses_user_path(@user), method: :put, html: { id: "#{form_id}_billing", autocomplete: "off", class: "bill_address" } do |f| %>
2121

22-
<%= render component('ui/forms/address').new(address: @bill_address, name: "user[bill_address_attributes]") %>
22+
<%= render component('ui/forms/address').new(addressable: @bill_address, form_field_name: "user[bill_address_attributes]") %>
2323
<div class="py-1.5 text-center">
2424
<%= render component("ui/button").new(tag: :button, text: t(".update"), form: "#{form_id}_billing") %>
2525
<%= render component("ui/button").new(tag: :a, text: t(".cancel"), href: solidus_admin.addresses_user_path(@user), scheme: :secondary) %>
@@ -30,7 +30,7 @@
3030
<%= render component('ui/panel').new(title: t(".shipping_address")) do %>
3131
<%= form_for @user, url: solidus_admin.update_addresses_user_path(@user), method: :put, html: { id: "#{form_id}_shipping", autocomplete: "off", class: "ship_address" } do |f| %>
3232

33-
<%= render component('ui/forms/address').new(address: @ship_address, name: "user[ship_address_attributes]") %>
33+
<%= render component('ui/forms/address').new(addressable: @ship_address, form_field_name: "user[ship_address_attributes]") %>
3434
<div class="py-1.5 text-center">
3535
<%= render component("ui/button").new(tag: :button, text: t(".update"), form: "#{form_id}_shipping") %>
3636
<%= render component("ui/button").new(tag: :a, text: t(".cancel"), href: solidus_admin.addresses_user_path(@user), scheme: :secondary) %>

admin/spec/components/previews/solidus_admin/ui/forms/address/component_preview.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ class SolidusAdmin::UI::Forms::Address::ComponentPreview < ViewComponent::Previe
55
include SolidusAdmin::Preview
66

77
def overview
8-
render_with_template(locals: { address: fake_address })
8+
render_with_template(locals: { addressable: fake_address })
99
end
1010

1111
# @param disabled toggle
1212
def playground(disabled: false)
1313
render component("ui/forms/address").new(
14-
name: "",
15-
address: fake_address,
14+
form_field_name: "",
15+
addressable: fake_address,
1616
disabled:
1717
)
1818
end
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<%= render current_component.new(name: "", address: address) %>
1+
<%= render current_component.new(form_field_name: "", addressable:) %>

admin/spec/components/solidus_admin/ui/forms/address/component_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,17 @@
66
it "renders the overview preview" do
77
render_preview(:overview)
88
end
9+
10+
context "with include_name_field: false" do
11+
it "does not render name field" do
12+
component = described_class.new(
13+
form_field_name: "",
14+
addressable: Spree::Address.new(country: Spree::Country.find_or_initialize_by(iso: "US")),
15+
include_name_field: false
16+
)
17+
18+
render_inline(component)
19+
expect(page).not_to have_content("Name")
20+
end
21+
end
922
end

0 commit comments

Comments
 (0)