Skip to content

Commit

Permalink
Marketplace: ask for missing delivery details to proceed to check…
Browse files Browse the repository at this point in the history
…out (#1396)

* Show a button asking for delivery details when checkout button can't be shown
due to missing delivery details.

* Update spec expectations with somewhat gross, but effective, comparisons against
expected HTML.
  • Loading branch information
anaulin authored Apr 20, 2023
1 parent 170fdf4 commit 43e5779
Show file tree
Hide file tree
Showing 9 changed files with 63 additions and 21 deletions.
6 changes: 1 addition & 5 deletions app/furniture/marketplace/cart.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,8 @@ def price_total
product_total + delivery_fee + tax_total
end

def ready_for_shopping?
(delivery_address.present? && contact_phone_number.present? && delivery_window.present?)
end

def ready_for_checkout?
ready_for_shopping? && cart_products.present? && cart_products.all?(&:valid?)
delivery.details_filled_in? && cart_products.present? && cart_products.all?(&:valid?)
end
end
end
27 changes: 20 additions & 7 deletions app/furniture/marketplace/cart/deliveries/_delivery.html.erb
Original file line number Diff line number Diff line change
@@ -1,14 +1,27 @@
<div id="<%=dom_id(delivery) %>" class="flex flex-wrap items-center justify-between text-sm mt-1 sm:mt-2">
<span>
<span class="font-bold">Delivering to:</span>
<%= render(delivery.delivery_area) if delivery.delivery_area.present? %>
</span>
<span>
<% if delivery.details_filled_in? || delivery.delivery_area.present? %>
<span class="font-bold">Delivering to:</span>
<%= delivery.delivery_address if delivery.delivery_address.present? %>
<%= render(delivery.delivery_area) if delivery.delivery_area.present? %>
<% end %>
</span>

<%= render ButtonComponent.new(
label: t("marketplace.cart.deliveries.edit.link_to"),
<% if delivery.details_filled_in? %>
<%= render ButtonComponent.new(
label: t("marketplace.cart.deliveries.edit.link_to"),
href: delivery.location(:edit),
method: :get,
turbo_stream: true,
scheme: :secondary,
) %>
<% else %>
<%= render ButtonComponent.new(
label: t("marketplace.cart.deliveries.edit.details_missing"),
href: delivery.location(:edit),
method: :get,
turbo_stream: true,
scheme: :secondary,
scheme: :primary,
) %>
<% end %>
</div>
7 changes: 5 additions & 2 deletions app/furniture/marketplace/cart/deliveries/_form.html.erb
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<div id="<%= dom_id(delivery) %>">
<%= render CardComponent.new(dom_id: dom_id(delivery), classes: "text-left") do %>
<h3>
<%= t("marketplace.cart.deliveries.edit.header") %>
</h3>
<%= form_with model: delivery.location do |delivery_form| %>
<%= render "text_field", attribute: :delivery_address, form: delivery_form %>
<%= render "window_field", attribute: :delivery_window, form: delivery_form %>
Expand All @@ -7,4 +10,4 @@
<%= render "text_field", attribute: :contact_phone_number, form: delivery_form %>
<%= delivery_form.submit %>
<%- end %>
</div>
<% end %>
14 changes: 12 additions & 2 deletions app/furniture/marketplace/cart/deliveries_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,22 @@ def update
if delivery.errors.present?
render turbo_stream: [turbo_stream.replace(delivery, partial: "form")]
else
render turbo_stream: [turbo_stream.replace(delivery)]
# Replace the entire cart footer so that the "Checkout" button updates as well
render turbo_stream: [
turbo_stream.replace("cart-footer-#{cart.id}",
partial: "marketplace/carts/footer", locals: {cart: cart})
]
end
end

helper_method def delivery
@delivery ||= policy_scope(marketplace.carts).find(params[:cart_id]).delivery
@delivery ||= cart.delivery
end

private

def cart
@cart ||= policy_scope(marketplace.carts).find(params[:cart_id])
end

def delivery_params
Expand Down
7 changes: 6 additions & 1 deletion app/furniture/marketplace/carts/_footer.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,16 @@

<tfoot id="cart-footer-<%= cart.id%>" class="bg-gray-50">
<tr>
<td class="text-left px-3 py-3.5 text-right" colspan="8">
<td class="px-3 py-3.5 text-right" colspan="8">
<%= render "marketplace/carts/total", cart: cart %>
<%- if cart.ready_for_checkout? %>
<%= button_to("Checkout", cart.location(child: :checkout), data: { turbo: false }) %>
<%- end %>
</td>
</tr>
<tr>
<td class="px-3 pb-3.5 text-right" colspan="8">
<%= render cart.delivery %>
</td>
</tr>
</tfoot>
4 changes: 4 additions & 0 deletions app/furniture/marketplace/delivery.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,9 @@ def window
def fee
delivery_area&.price.presence || marketplace&.delivery_fee.presence
end

def details_filled_in?
delivery_address.present? && contact_phone_number.present? && delivery_window.present?
end
end
end
4 changes: 3 additions & 1 deletion app/furniture/marketplace/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ en:
cart:
deliveries:
edit:
link_to: "Change Delivery Details"
header: "Delivery Details"
link_to: "Change delivery details"
details_missing: "Add delivery details to checkout"
delivery_areas:
index:
link_to: "Delivery Areas"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ end %>

<%- cart = marketplace.carts.create_with(contact_email: shopper.person&.email, delivery_window: marketplace.delivery_window).find_or_create_by(shopper: shopper, status: :pre_checkout) %>

<%= render cart.delivery %>
<%= render cart %>

<div class="my-2 text-right">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@
context "when a `Guest`" do
let(:person) { nil }

it { is_expected.to have_rendered_turbo_stream(:replace, delivery) }
it "replaces the cart footer" do
perform_request
expect(response.parsed_body).to include(
"<turbo-stream action=\"replace\" target=\"cart-footer-#{cart.id}\""
)
end

specify do
expect { perform_request }
Expand All @@ -46,7 +51,12 @@

before { sign_in(space, person) }

it { is_expected.to have_rendered_turbo_stream(:replace, delivery) }
it "replaces the cart footer" do
perform_request
expect(response.parsed_body).to include(
"<turbo-stream action=\"replace\" target=\"cart-footer-#{cart.id}\""
)
end

specify do
expect { perform_request }
Expand Down

0 comments on commit 43e5779

Please sign in to comment.