Skip to content

Commit

Permalink
Marketplace: Shopper chooses DeliveryArea independently
Browse files Browse the repository at this point in the history
- #1672

So, in reviewing a bunch of the delivery app workflows, most of them have:

- Choose Pickup or Delivery
- Enter Address
- Browse Menu
- Tap Item
- Add Item to Order

This lends me to believe we want to switch to gathering the
`DeliveryArea` *then* `DeliveryAddress` *then* showing the
`Products` that are available.

This uses TurboFrames to replace pieces of the page, rather than relying
on TurboStreams. On the one hand, it's lot easier (just respond with
html with matching `turbo_frame_tag`s`).

Blerg; anyway, I'm checking this in now; but not sure if I like it
enough.

Thoughts? In particular:

- Copy-editing
- Design tweaks?
- Name Collisions: How Undo?
  • Loading branch information
zspencer committed Aug 14, 2023
1 parent b955757 commit 20a1445
Show file tree
Hide file tree
Showing 12 changed files with 90 additions and 1 deletion.
5 changes: 5 additions & 0 deletions app/furniture/marketplace/breadcrumbs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
link t("marketplace.marketplace.edit.link_to"), marketplace.location(:edit)
end

crumb :edit_marketplace_cart_delivery_area do |delivery_area|
parent :room, delivery_area.cart.room
link t("marketplace.cart.delivery_areas.edit.link_to"), marketplace.location(:edit)
end

crumb :marketplace_checkout do |checkout|
parent :marketplace, checkout.cart.marketplace
link "Checkout", checkout.location
Expand Down
5 changes: 4 additions & 1 deletion app/furniture/marketplace/cart.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@ class Cart < Record

belongs_to :shopper, inverse_of: :carts

belongs_to :delivery_area, inverse_of: :carts, optional: true
belongs_to :delivery_area, inverse_of: :carts, class_name: "::Marketplace::DeliveryArea"
def cart_delivery_area
DeliveryArea.new(cart: self, delivery_area: delivery_area)
end

has_many :cart_products, dependent: :destroy, inverse_of: :cart
has_many :products, through: :cart_products, inverse_of: :carts
Expand Down
10 changes: 10 additions & 0 deletions app/furniture/marketplace/cart/delivery_area.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class Marketplace
class Cart::DeliveryArea < Model
attr_accessor :cart, :delivery_area
extend StripsNamespaceFromModelName
location parent: :cart, routed_as: :resource

delegate :label, to: :delivery_area
delegate :marketplace, :update, :persisted?, to: :cart
end
end
17 changes: 17 additions & 0 deletions app/furniture/marketplace/cart/delivery_area_policy.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

class Marketplace
class Cart::DeliveryAreaPolicy < Policy
alias_method :delivery_area, :object

def permitted_attributes(_params)
%(delivery_area_id)
end

class Scope < ApplicationScope
def resolve
scope.all
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<%= turbo_frame_tag(dom_id(delivery_area.cart, :delivery_area)) do %>
<%- if delivery_area.delivery_area.present? %>
<%= render CardComponent.new(classes: "text-left") do %>
<%= delivery_area.label %>
<%= link_to(t('marketplace.cart.delivery_areas.edit.link_to'), delivery_area.location(:edit)) %>
<%- end %>
<%- else %>
<%= render "marketplace/cart/delivery_areas/form", delivery_area: delivery_area %>
<%- end %>
<%- end %>
6 changes: 6 additions & 0 deletions app/furniture/marketplace/cart/delivery_areas/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<%= render CardComponent.new(dom_id: dom_id(delivery_area), classes: "text-left") do %>
<%= form_with model: delivery_area.location do |form| %>
<%= render "select", options: delivery_area.marketplace.delivery_areas.pluck(:label, :id), include_blank: true, attribute: :delivery_area_id, form: form %>
<%= form.submit %>
<%- end %>
<%- end %>
4 changes: 4 additions & 0 deletions app/furniture/marketplace/cart/delivery_areas/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<%- breadcrumb :edit_marketplace_cart_delivery_area, delivery_area %>
<%= turbo_frame_tag(dom_id(cart, :delivery_area)) do %>
<%= render "form", cart: cart %>
<%- end %>
2 changes: 2 additions & 0 deletions app/furniture/marketplace/cart/delivery_areas/show.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<%- breadcrumb :marketplace_cart_delivery_area, :delivery_area %>
<%= render delivery_area %>
25 changes: 25 additions & 0 deletions app/furniture/marketplace/cart/delivery_areas_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class Marketplace
class Cart::DeliveryAreasController < Controller
expose :delivery_area, -> { cart.cart_delivery_area }
expose :cart, scope: -> { carts }, model: Cart
expose :carts, -> { policy_scope(marketplace.carts) }

def show
authorize(delivery_area)
end

def edit
authorize(delivery_area)
end

def update
authorize(delivery_area)
delivery_area.update(delivery_area_params)
redirect_to delivery_area.location
end

def delivery_area_params
params.require(:delivery_area).permit(:delivery_area_id)
end
end
end
3 changes: 3 additions & 0 deletions app/furniture/marketplace/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ en:
required: "can't be blank"
marketplace:
cart:
delivery_areas:
edit:
link_to: "Change Your Location"
deliveries:
edit:
header: "Delivery Details"
Expand Down
3 changes: 3 additions & 0 deletions app/furniture/marketplace/marketplace_component.html.erb
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@

<%= render onboarding_component %>


<%= render(cart.cart_delivery_area) %>

<%= render cart %>

<%- if policy(marketplace).edit? %>
Expand Down
1 change: 1 addition & 0 deletions app/furniture/marketplace/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ def self.append_routes(router)
router.resources :cart_products
router.resource :checkout, only: [:show, :create]
router.resource :delivery, controller: "cart/deliveries"
router.resource :delivery_area, controller: "cart/delivery_areas"
end

router.resources :delivery_areas
Expand Down

0 comments on commit 20a1445

Please sign in to comment.