Skip to content

Commit ba1f9e1

Browse files
committed
Use new ui/forms/address component
1 parent 77b9f54 commit ba1f9e1

File tree

11 files changed

+211
-5
lines changed

11 files changed

+211
-5
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<div class="<%= stimulus_id %>" data-controller="<%= stimulus_id %>">
2+
<%= page do %>
3+
<%= page_header do %>
4+
<%= page_header_back(solidus_admin.edit_order_path(@order)) %>
5+
<%= page_header_title(t(".title", address: t(".#{@type}_address"))) %>
6+
<%= page_header_actions do %>
7+
<%= render component("ui/button").new(
8+
tag: :a,
9+
scheme: :secondary,
10+
text: t(".cancel"),
11+
href: solidus_admin.edit_order_path(@order)
12+
) %>
13+
14+
<%= render component("ui/button").new(
15+
tag: :button,
16+
text: t(".save"),
17+
form: form_id
18+
) %>
19+
<% end %>
20+
<% end %>
21+
22+
<%= page_with_sidebar do %>
23+
<%= page_with_sidebar_main do %>
24+
<%= render component('ui/panel').new do %>
25+
<%= form_for @order, url: solidus_admin.send("order_#{@type}_address_path", @order), html: { id: form_id } do |f| %>
26+
<div class="w-full flex flex-col mb-4">
27+
<h2 class="text-sm mb-4 font-semibold"><%= t(".#{@type}_address") %></h2>
28+
<div class="w-full flex gap-4">
29+
<%= f.fields_for :"#{@type}_address" do |form| %>
30+
<%= render component('ui/forms/address').new(form: form, disabled: false) %>
31+
<% end %>
32+
</div>
33+
</div>
34+
<% end %>
35+
<% end %>
36+
<% end %>
37+
<% end %>
38+
39+
<%= page_footer do %>
40+
<%= page_footer_actions do %>
41+
<%= render component("ui/button").new(
42+
tag: :a,
43+
scheme: :secondary,
44+
text: t(".cancel"),
45+
href: solidus_admin.edit_order_path(@order)
46+
) %>
47+
48+
<%= render component("ui/button").new(
49+
tag: :button,
50+
text: t(".save"),
51+
form: form_id
52+
) %>
53+
<% end %>
54+
<% end %>
55+
<% end %>
56+
</div>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Controller } from '@hotwired/stimulus'
2+
3+
export default class extends Controller {
4+
static targets = ['output']
5+
6+
typed(event) {
7+
this.text = event.currentTarget.value
8+
this.render()
9+
}
10+
11+
render() {
12+
this.outputTarget.innerText = this.text
13+
}
14+
}
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+
class SolidusAdmin::Orders::Address::Component < SolidusAdmin::BaseComponent
4+
include SolidusAdmin::Layout::PageHelpers
5+
6+
VALID_TYPES = ['ship', 'bill'].freeze
7+
8+
def initialize(order:, type: "ship")
9+
@order = order
10+
@type = validate_address_type(type)
11+
end
12+
13+
def form_id
14+
@form_id ||= "#{stimulus_id}--form-#{@type}-#{@order.id}"
15+
end
16+
17+
private
18+
19+
def validate_address_type(type)
20+
VALID_TYPES.include?(type) ? type : raise(ArgumentError, "Invalid address type: #{type}")
21+
end
22+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Add your component translations here.
2+
# Use the translation in the example in your template with `t(".hello")`.
3+
en:
4+
save: Save
5+
cancel: Cancel
6+
back: Back
7+
title: "Edit %{address}"
8+
ship_address: Shipping Address
9+
bill_address: Billing Address

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
<%= page_with_sidebar_aside do %>
1717
<%= render component('ui/panel').new(title: panel_title_with_more_links(t(".customer"), [
1818
link_to("Edit order email", "#", class: "p-2 hover:bg-gray-25 rounded-sm text-black"),
19-
link_to("Edit shipping address", "#", class: "p-2 hover:bg-gray-25 rounded-sm text-black"),
20-
link_to("Edit billing address", "#", class: "p-2 hover:bg-gray-25 rounded-sm text-black"),
19+
link_to("Edit shipping address", solidus_admin.new_order_ship_address_path(@order), class: "p-2 hover:bg-gray-25 rounded-sm text-black"),
20+
link_to("Edit billing address", solidus_admin.new_order_bill_address_path(@order), class: "p-2 hover:bg-gray-25 rounded-sm text-black"),
2121
link_to("Remove customer", "#", 'data-turbo-method': :delete, class: "p-2 hover:bg-gray-25 rounded-sm text-red-500"),
2222
])) do %>
2323
<div class="flex flex-col -m-6 p-6 gap-6 border-t border-gray-100 mt-0">

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
<%= render component("ui/forms/field").text_field(@form, :name) %>
77
<%= render component("ui/forms/field").text_field(@form, :address1) %>
88
<%= render component("ui/forms/field").text_field(@form, :address2) %>
9-
<div class="flex w-full space-x-4">
10-
<%= render component("ui/forms/field").text_field(@form, :city, class: "flex-1") %>
11-
<%= render component("ui/forms/field").text_field(@form, :zipcode, class: "flex-1") %>
9+
<div class="flex gap-4 w-full">
10+
<%= render component("ui/forms/field").text_field(@form, :city) %>
11+
<%= render component("ui/forms/field").text_field(@form, :zipcode) %>
1212
</div>
1313

1414
<%= render component("ui/forms/field").select(
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# frozen_string_literal: true
2+
3+
module SolidusAdmin
4+
class AddressesController < BaseController
5+
include Spree::Core::ControllerHelpers::StrongParameters
6+
7+
before_action :load_order
8+
before_action :validate_address_type
9+
10+
def new
11+
address = @order.send("#{address_type}_address")
12+
@order.send("build_#{address_type}_address", country_id: default_country_id) if address.nil?
13+
address ||= @order.send("#{address_type}_address")
14+
address.country_id ||= default_country_id if address.country.nil?
15+
16+
respond_to do |format|
17+
format.html { render component('orders/address').new(order: @order, type: address_type) }
18+
end
19+
end
20+
21+
def update
22+
if @order.contents.update_cart(order_params)
23+
flash[:success] = t('spree.customer_details_updated')
24+
redirect_to edit_order_url(@order)
25+
else
26+
respond_to do |format|
27+
format.html { render component('orders/address').new(order: @order, type: address_type) }
28+
end
29+
end
30+
end
31+
32+
private
33+
34+
def address_type
35+
params[:address_type].presence_in(%w[bill ship])
36+
end
37+
38+
def validate_address_type
39+
unless address_type
40+
flash[:error] = t('spree.address_type_invalid')
41+
redirect_to spree.admin_order_url(@order)
42+
end
43+
end
44+
45+
def default_country_id
46+
@default_country_id ||= begin
47+
country = Spree::Country.default
48+
country.id if Spree::Country.available.exists?(id: country.id)
49+
end
50+
end
51+
52+
def load_order
53+
@order = Spree::Order.find_by!(number: params[:order_id])
54+
authorize! action_name, @order
55+
end
56+
57+
def order_params
58+
params.require(:order).permit(
59+
bill_address_attributes: permitted_address_attributes,
60+
ship_address_attributes: permitted_address_attributes
61+
)
62+
end
63+
end
64+
end

admin/config/routes.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
resources :orders, only: [:index, :show, :edit] do
2222
resources :line_items, only: [:destroy, :create, :update]
23+
resource :ship_address, only: [:new, :update], controller: "addresses", address_type: "ship"
24+
resource :bill_address, only: [:new, :update], controller: "addresses", address_type: "bill"
2325

2426
member do
2527
get :variants_for
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
# @component "orders/address"
4+
class SolidusAdmin::Orders::Address::ComponentPreview < ViewComponent::Preview
5+
include SolidusAdmin::Preview
6+
7+
def overview
8+
render_with_template
9+
end
10+
11+
# @param address text
12+
# @param type text
13+
def playground(address: "address", type: "type")
14+
render component("orders/address").new(address: address, type: type)
15+
end
16+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<div class="mb-8">
2+
<h6 class="text-gray-500 mb-3 mt-0">
3+
Scenario 1
4+
</h6>
5+
6+
<%= render current_component.new(address: "address", type: "type") %>
7+
</div>

0 commit comments

Comments
 (0)