diff --git a/app/controllers/split_checkout_controller.rb b/app/controllers/split_checkout_controller.rb index 344ca96a36..6ec8532e13 100644 --- a/app/controllers/split_checkout_controller.rb +++ b/app/controllers/split_checkout_controller.rb @@ -16,16 +16,10 @@ class SplitCheckoutController < ::BaseController helper OrderHelper def edit - return redirect_to_step unless params[:step] - - return redirect_to_guest if !spree_current_user && - !@order.distributor.allow_guest_orders? && - params[:step] != "guest" + redirect_to_step unless params[:step] end def update - return redirect_to_guest if !spree_current_user && !@order.distributor.allow_guest_orders? - if confirm_order || update_order clear_invalid_payments advance_order_state @@ -33,10 +27,9 @@ class SplitCheckoutController < ::BaseController else flash.now[:error] = I18n.t('split_checkout.errors.global') - render operations: cable_car. + render status: :unprocessable_entity, operations: cable_car. replace("#checkout", partial("split_checkout/checkout")). - replace("#flashes", partial("shared/flashes", locals: { flashes: flash })), - status: :unprocessable_entity + replace("#flashes", partial("shared/flashes", locals: { flashes: flash })) end end @@ -91,13 +84,7 @@ class SplitCheckoutController < ::BaseController @order_params ||= Checkout::Params.new(@order, params).call end - def redirect_to_guest - redirect_to checkout_step_path(:guest) - end - def redirect_to_step - return redirect_to_guest if !spree_current_user && !params[:step] - case @order.state when "cart", "address", "delivery" redirect_to checkout_step_path(:details) diff --git a/app/views/split_checkout/_checkout.html.haml b/app/views/split_checkout/_checkout.html.haml index de3e5010c5..f26c8c4ca9 100644 --- a/app/views/split_checkout/_checkout.html.haml +++ b/app/views/split_checkout/_checkout.html.haml @@ -1,4 +1,4 @@ %checkout.row#checkout .small-12.medium-12.columns - = render partial: "split_checkout/tabs" unless checkout_step?(:guest) + = render partial: "split_checkout/tabs" = render partial: "split_checkout/form" diff --git a/app/views/split_checkout/_guest.html.haml b/app/views/split_checkout/_guest.html.haml index b0d9125405..189d7aa842 100644 --- a/app/views/split_checkout/_guest.html.haml +++ b/app/views/split_checkout/_guest.html.haml @@ -1,12 +1,13 @@ -.medium-10 - %div.checkout-guest-title - = t :checkout_headline +.checkout-step + .medium-10 + %div.checkout-guest-title + = t :checkout_headline - %div.checkout-submit{ class: "#{@order.distributor.allow_guest_orders? ? 'checkout-submit-inline' : 'medium-6' }" } - %a.primary.button{href: main_app.login_path} - = t :label_login - -if @order.distributor.allow_guest_orders? - %span.checkout-submit-or - or - %a.button.cancel{href: main_app.checkout_step_path(:details)} - = t :checkout_as_guest + %div.checkout-submit{ class: "#{@order.distributor.allow_guest_orders? ? 'checkout-submit-inline' : 'medium-6' }" } + %a.primary.button{ href: main_app.login_path } + = t :label_login + -if @order.distributor.allow_guest_orders? + %span.checkout-submit-or + or + %button.button.cancel{ "data-action": "click->guest-checkout#guestSelected" } + = t :checkout_as_guest diff --git a/app/views/split_checkout/edit.html.haml b/app/views/split_checkout/edit.html.haml index 282da26f2c..7043b31543 100644 --- a/app/views/split_checkout/edit.html.haml +++ b/app/views/split_checkout/edit.html.haml @@ -19,6 +19,12 @@ .sub-header.show-for-medium-down = render partial: "shopping_shared/order_cycles" - = render partial: "checkout" + .row{ "data-controller": "guest-checkout", "data-guest-checkout-distributor-value": @order.distributor.id } + %div{ style: "display: #{spree_current_user ? 'block' : 'none'}", "data-guest-checkout-target": "checkout" } + = render partial: "checkout" + + - unless spree_current_user + %div{ style: "display: block", "data-guest-checkout-target": "guest" } + = render partial: "guest" = render partial: "shared/footer" diff --git a/app/webpacker/controllers/guest_checkout_controller.js b/app/webpacker/controllers/guest_checkout_controller.js new file mode 100644 index 0000000000..a8ba6b18bb --- /dev/null +++ b/app/webpacker/controllers/guest_checkout_controller.js @@ -0,0 +1,31 @@ +import { Controller } from "stimulus" + +export default class extends Controller { + static targets = ["checkout", "guest"]; + static values = { + distributor: String, + session: { type: String, default: "guest-checkout" } + }; + + connect() { + if(!this.hasGuestTarget) { return } + + if(this.usingGuestCheckout()) { + this.showCheckout(); + } + } + + showCheckout() { + this.checkoutTarget.style.display = "block"; + this.guestTarget.style.display = "none"; + } + + guestSelected() { + this.showCheckout(); + sessionStorage.setItem(this.sessionValue, this.distributorValue); + } + + usingGuestCheckout() { + return sessionStorage.getItem(this.sessionValue) === this.distributorValue + } +} diff --git a/config/routes.rb b/config/routes.rb index 0fa8f94a0a..d6a135b3dd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -87,7 +87,7 @@ Openfoodnetwork::Application.routes.draw do constraints SplitCheckoutConstraint.new do get '/checkout', to: 'split_checkout#edit' - constraints step: /(guest|details|payment|summary)/ do + constraints step: /(details|payment|summary)/ do get '/checkout/:step', to: 'split_checkout#edit', as: :checkout_step put '/checkout/:step', to: 'split_checkout#update', as: :checkout_update end diff --git a/spec/system/consumer/split_checkout_spec.rb b/spec/system/consumer/split_checkout_spec.rb index 5a6f2cd0d9..281c81f003 100644 --- a/spec/system/consumer/split_checkout_spec.rb +++ b/spec/system/consumer/split_checkout_spec.rb @@ -53,26 +53,18 @@ describe "As a consumer, I want to checkout my order", js: true do context "guest checkout when distributor doesn't allow guest orders" do before do - visit checkout_path + visit checkout_step_path(:details) end it "should display the split checkout login page" do - expect(page).to have_content distributor.name expect(page).to have_content("Ok, ready to checkout?") expect(page).to have_content("Login") expect(page).to have_no_content("Checkout as guest") end - it "should be redirected if user enter the url" do - order.update(state: "payment") - get checkout_step_path(:details) - expect(response).to have_http_status(:redirect) - expect(page).to have_content("Ok, ready to checkout?") - end - it "should redirect to the login page when clicking the login button" do click_on "Login" - expect(page).to have_content("Login") + expect(page).to have_current_path "/" end end @@ -83,7 +75,7 @@ describe "As a consumer, I want to checkout my order", js: true do visit checkout_path end - it "should display the split checkout login/guest page" do + it "should display the split checkout login/guest form" do expect(page).to have_content distributor.name expect(page).to have_content("Ok, ready to checkout?") expect(page).to have_content("Login") @@ -126,7 +118,7 @@ describe "As a consumer, I want to checkout my order", js: true do it "should allow visit '/checkout/details'" do order.update(state: "payment") visit checkout_step_path(:details) - expect(page).to have_button("Next - Payment method") + expect(page).to have_current_path("/checkout/details") end end end @@ -236,8 +228,10 @@ describe "As a consumer, I want to checkout my order", js: true do before do variant.update!(on_demand: false, on_hand: 0) end + it "returns me to the cart with an error message" do visit checkout_path + expect(page).not_to have_selector 'closing', text: "Checkout now" expect(page).to have_selector 'closing', text: "Your shopping cart" expect(page).to have_content "An item in your cart has become unavailable"