spree_frontend 3.7.13 → 4.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/app/assets/javascripts/spree/frontend.js +4 -1
  4. data/app/assets/javascripts/spree/frontend/checkout/address.js +42 -14
  5. data/app/assets/javascripts/spree/frontend/checkout/address_book.js +56 -0
  6. data/app/assets/javascripts/spree/frontend/product.js +54 -39
  7. data/app/assets/stylesheets/spree/frontend.css +1 -0
  8. data/app/assets/stylesheets/spree/frontend/_variables.scss +1 -1
  9. data/app/assets/stylesheets/spree/frontend/address_book.scss +8 -0
  10. data/app/assets/stylesheets/spree/frontend/frontend_bootstrap.css.scss +13 -35
  11. data/app/controllers/concerns/spree/checkout/address_book.rb +53 -0
  12. data/app/controllers/spree/addresses_controller.rb +72 -0
  13. data/app/controllers/spree/checkout_controller.rb +2 -0
  14. data/app/controllers/spree/orders_controller.rb +0 -55
  15. data/app/controllers/spree/products_controller.rb +5 -1
  16. data/app/controllers/spree/store_controller.rb +1 -1
  17. data/app/helpers/spree/addresses_helper.rb +36 -0
  18. data/app/helpers/spree/frontend_helper.rb +16 -15
  19. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_first_page.html.erb +2 -2
  20. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_gap.html.erb +5 -1
  21. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_last_page.html.erb +2 -2
  22. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_next_page.html.erb +2 -2
  23. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_page.html.erb +8 -2
  24. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_paginator.html.erb +1 -1
  25. data/app/views/kaminari/{twitter-bootstrap-3 → twitter-bootstrap-4}/_prev_page.html.erb +2 -2
  26. data/app/views/spree/address/_form.html.erb +27 -24
  27. data/app/views/spree/addresses/_form.html.erb +18 -0
  28. data/app/views/spree/addresses/destroy.js.erb +2 -0
  29. data/app/views/spree/addresses/edit.html.erb +23 -0
  30. data/app/views/spree/addresses/new.html.erb +23 -0
  31. data/app/views/spree/checkout/_address.html.erb +61 -37
  32. data/app/views/spree/checkout/_confirm.html.erb +12 -10
  33. data/app/views/spree/checkout/_delivery.html.erb +27 -15
  34. data/app/views/spree/checkout/_payment.html.erb +14 -9
  35. data/app/views/spree/checkout/_summary.html.erb +59 -57
  36. data/app/views/spree/checkout/edit.html.erb +6 -6
  37. data/app/views/spree/checkout/payment/_gateway.html.erb +43 -35
  38. data/app/views/spree/layouts/spree_application.html.erb +5 -2
  39. data/app/views/spree/orders/_form.html.erb +38 -25
  40. data/app/views/spree/orders/edit.html.erb +28 -22
  41. data/app/views/spree/orders/show.html.erb +2 -1
  42. data/app/views/spree/products/_cart_form.html.erb +28 -26
  43. data/app/views/spree/products/_product.html.erb +7 -8
  44. data/app/views/spree/products/_promotions.html.erb +13 -11
  45. data/app/views/spree/products/_properties.html.erb +10 -3
  46. data/app/views/spree/products/_thumbnails.html.erb +5 -7
  47. data/app/views/spree/products/show.html.erb +8 -8
  48. data/app/views/spree/shared/_filters.html.erb +29 -9
  49. data/app/views/spree/shared/_header.html.erb +2 -2
  50. data/app/views/spree/shared/_login_bar.html.erb +9 -3
  51. data/app/views/spree/shared/_main_nav_bar.html.erb +15 -15
  52. data/app/views/spree/shared/_nav_bar.html.erb +2 -2
  53. data/app/views/spree/shared/_order_details.html.erb +143 -89
  54. data/app/views/spree/shared/_products.html.erb +2 -2
  55. data/app/views/spree/shared/_search.html.erb +19 -12
  56. data/app/views/spree/shared/_sidebar.html.erb +1 -1
  57. data/app/views/spree/shared/_taxonomies.html.erb +7 -3
  58. data/config/routes.rb +2 -0
  59. data/lib/spree/frontend.rb +3 -3
  60. data/lib/spree/frontend/engine.rb +4 -0
  61. data/spree_frontend.gemspec +4 -3
  62. metadata +48 -25
@@ -3,11 +3,11 @@
3
3
  <div id="checkout" data-hook>
4
4
  <%= render partial: 'spree/shared/error_messages', locals: { target: @order } %>
5
5
 
6
- <div class="row" data-hook="checkout_header">
7
- <div class="col-sm-3">
8
- <h1 data-hook="checkout_title"><%= Spree.t(:checkout) %></h1>
6
+ <div class="row align-items-center" data-hook="checkout_header">
7
+ <div class="col-md-3 mb-4">
8
+ <h1 class="mb-0" data-hook="checkout_title"><%= Spree.t(:checkout) %></h1>
9
9
  </div>
10
- <div class="col-sm-9" data-hook="checkout_progress">
10
+ <div class="col-md-9 mb-4" data-hook="checkout_progress">
11
11
  <%= checkout_progress %>
12
12
  </div>
13
13
  </div>
@@ -16,8 +16,8 @@
16
16
  <div class="<%= if @order.state != 'confirm' then 'col-md-9' else 'col-md-12' end %>" data-hook="checkout_form_wrapper">
17
17
  <%= form_for @order, url: update_checkout_path(@order.state), html: { id: "checkout_form_#{@order.state}" } do |form| %>
18
18
  <% if @order.state == 'address' || !@order.email? %>
19
- <div class="panel panel-default">
20
- <div class="panel-body">
19
+ <div class="card card-default mb-4">
20
+ <div class="card-body">
21
21
  <div class="form-group">
22
22
  <%= form.label :email %>
23
23
  <%= form.email_field :email, class: 'form-control', required: true %>
@@ -1,42 +1,50 @@
1
- <div class="well clearfix">
2
- <%= image_tag 'credit_cards/credit_card.gif', id: 'credit-card-image', class: 'pull-right', width: '170', height: '28' %>
3
- <% param_prefix = "payment_source[#{payment_method.id}]" %>
1
+ <div class="card mt-4 w-100">
2
+ <div class="card-body">
3
+ <%= image_tag 'credit_cards/credit_card.gif',
4
+ id: 'credit-card-image',
5
+ width: '170',
6
+ height: '28',
7
+ class: 'position-absolute',
8
+ style: 'right: 1rem' %>
4
9
 
5
- <p class="field">
6
- <%= label_tag "name_on_card_#{payment_method.id}" do %>
7
- <%= Spree.t(:name_on_card) %><abbr class="required" title="required">*</abbr>
8
- <% end %>
9
- <%= text_field_tag "#{param_prefix}[name]", "#{@order.bill_address_firstname} #{@order.bill_address_lastname}", { id: "name_on_card_#{payment_method.id}", class: 'form-control required'} %>
10
- </p>
10
+ <% param_prefix = "payment_source[#{payment_method.id}]" %>
11
11
 
12
- <p class="field" data-hook="card_number">
13
- <%= label_tag "card_number" do %>
14
- <%= Spree.t(:card_number) %><abbr class="required" title="required">*</abbr>
15
- <% end %>
16
- <% options_hash = Rails.env.production? ? {autocomplete: 'off'} : {} %>
17
- <%= text_field_tag "#{param_prefix}[number]", '', options_hash.merge(id: 'card_number', class: 'form-control required cardNumber', size: 19, maxlength: 19, autocomplete: "off") %>
18
- &nbsp;
19
- <span id="card_type" style="display:none;">
20
- ( <span id="looks_like" ><%= Spree.t(:card_type_is) %> <span id="type"></span></span>
21
- <span id="unrecognized"><%= Spree.t(:unrecognized_card_type) %></span>
22
- )
23
- </span>
24
- </p>
25
- <div class="row">
26
- <div class="col-md-8 field" data-hook="card_expiration">
27
- <%= label_tag "card_expiry" do %>
28
- <%= Spree.t(:expiration) %><abbr class="required" title="required">*</abbr>
12
+ <p class="field">
13
+ <%= label_tag "name_on_card_#{payment_method.id}" do %>
14
+ <%= Spree.t(:name_on_card) %><abbr class="required" title="required">*</abbr>
29
15
  <% end %>
30
- <%= text_field_tag "#{param_prefix}[expiry]", '', id: 'card_expiry', class: "form-control required cardExpiry", placeholder: "MM / YY" %>
31
- </div>
32
- <div class="col-md-4 field" data-hook="card_code">
33
- <%= label_tag "card_code" do %>
34
- <%= Spree.t(:card_code) %><abbr class="required" title="required">*</abbr>
16
+ <%= text_field_tag "#{param_prefix}[name]", "#{@order.bill_address_firstname} #{@order.bill_address_lastname}", { id: "name_on_card_#{payment_method.id}", class: 'form-control required'} %>
17
+ </p>
18
+
19
+ <p class="field" data-hook="card_number">
20
+ <%= label_tag "card_number" do %>
21
+ <%= Spree.t(:card_number) %><abbr class="required" title="required">*</abbr>
35
22
  <% end %>
36
- <%= text_field_tag "#{param_prefix}[verification_value]", '', options_hash.merge(id: 'card_code', class: 'form-control required cardCode', size: 5) %>
37
- <%= link_to Spree.t(:what_is_this), spree.cvv_path, target: :blank, "data-hook" => "cvv_link", id: "cvv_link" %>
23
+ <% options_hash = Rails.env.production? ? {autocomplete: 'off'} : {} %>
24
+ <%= text_field_tag "#{param_prefix}[number]", '', options_hash.merge(id: 'card_number', class: 'form-control required cardNumber', size: 19, maxlength: 19, autocomplete: "off") %>
25
+ &nbsp;
26
+ <span id="card_type" style="display:none;">
27
+ ( <span id="looks_like" ><%= Spree.t(:card_type_is) %> <span id="type"></span></span>
28
+ <span id="unrecognized"><%= Spree.t(:unrecognized_card_type) %></span>
29
+ )
30
+ </span>
31
+ </p>
32
+ <div class="row">
33
+ <div class="col-md-8 field" data-hook="card_expiration">
34
+ <%= label_tag "card_expiry" do %>
35
+ <%= Spree.t(:expiration) %><abbr class="required" title="required">*</abbr>
36
+ <% end %>
37
+ <%= text_field_tag "#{param_prefix}[expiry]", '', id: 'card_expiry', class: "form-control required cardExpiry", placeholder: "MM / YY" %>
38
+ </div>
39
+ <div class="col-md-4 field" data-hook="card_code">
40
+ <%= label_tag "card_code" do %>
41
+ <%= Spree.t(:card_code) %><abbr class="required" title="required">*</abbr>
42
+ <% end %>
43
+ <%= text_field_tag "#{param_prefix}[verification_value]", '', options_hash.merge(id: 'card_code', class: 'form-control required cardCode', size: 5) %>
44
+ <%= link_to Spree.t(:what_is_this), spree.cvv_path, target: :blank, "data-hook" => "cvv_link", id: "cvv_link" %>
45
+ </div>
38
46
  </div>
39
- </div>
40
47
 
41
- <%= hidden_field_tag "#{param_prefix}[cc_type]", '', id: "cc_type", class: 'ccType' %>
48
+ <%= hidden_field_tag "#{param_prefix}[cc_type]", '', id: "cc_type", class: 'ccType' %>
49
+ </div>
42
50
  </div>
@@ -16,10 +16,13 @@
16
16
 
17
17
  <%= render partial: 'spree/shared/sidebar' if content_for? :sidebar %>
18
18
 
19
- <div id="content" class="<%= !content_for?(:sidebar) ? "col-sm-12" : "col-sm-8 col-md-9" %>" data-hook>
19
+ <main
20
+ id="content"
21
+ class="mt-4 <%= !content_for?(:sidebar) ? "col-sm-12" : "col-sm-12 col-md-9" %>"
22
+ data-hook>
20
23
  <%= flash_messages %>
21
24
  <%= yield %>
22
- </div>
25
+ </main>
23
26
 
24
27
  <%= yield :templates %>
25
28
  </div>
@@ -1,28 +1,41 @@
1
1
  <%= render partial: 'spree/shared/error_messages', locals: { target: @order } %>
2
- <table class="table" id="cart-detail" data-hook>
3
- <thead>
4
- <tr class="active" data-hook="cart_items_headers">
5
- <th class="cart-item-description-header" colspan="2"><%= Spree.t(:item) %></th>
6
- <th class="cart-item-price-header"><%= Spree.t(:price) %></th>
7
- <th class="cart-item-quantity-header"><%= Spree.t(:qty) %></th>
8
- <th class="cart-item-total-header"><%= Spree.t(:total) %></th>
9
- <th class="cart-item-delete-header"></th>
10
- </tr>
11
- </thead>
12
- <tbody id="line_items" data-hook>
13
- <%= render partial: 'spree/orders/line_item', collection: order_form.object.line_items, locals: { order_form: order_form } %>
14
- </tbody>
15
- <% if @order.adjustments.nonzero.exists? || @order.line_item_adjustments.nonzero.exists? || @order.shipment_adjustments.nonzero.exists? || @order.shipments.any? %>
16
- <tr class="cart-subtotal">
17
- <td colspan="4" align='right'><h5><%= Spree.t(:cart_subtotal, count: @order.line_items.sum(:quantity)) %></h5></td>
18
- <td colspan><h5><%= order_form.object.display_item_total %></h5></td>
2
+
3
+ <div class="table-responsive">
4
+ <table class="table" id="cart-detail" data-hook>
5
+ <thead>
6
+ <tr class="active" data-hook="cart_items_headers">
7
+ <th class="cart-item-description-header" colspan="2"><%= Spree.t(:item) %></th>
8
+ <th class="cart-item-price-header"><%= Spree.t(:price) %></th>
9
+ <th class="cart-item-quantity-header"><%= Spree.t(:qty) %></th>
10
+ <th class="cart-item-total-header"><%= Spree.t(:total) %></th>
11
+ <th class="cart-item-delete-header"></th>
12
+ </tr>
13
+ </thead>
14
+ <tbody id="line_items" data-hook>
15
+ <%= render partial: 'spree/orders/line_item', collection: order_form.object.line_items, locals: { order_form: order_form } %>
16
+ </tbody>
17
+ <% if @order.adjustments.nonzero.exists? || @order.line_item_adjustments.nonzero.exists? || @order.shipment_adjustments.nonzero.exists? || @order.shipments.any? %>
18
+ <tr class="cart-subtotal">
19
+ <td colspan="4" align='right'><h5><%= Spree.t(:cart_subtotal, count: @order.line_items.sum(:quantity)) %></h5></td>
20
+ <td colspan>
21
+ <h5>
22
+ <%= order_form.object.display_item_total %>
23
+ </h5>
24
+ </td>
25
+ <td></td>
26
+ </tr>
27
+ <%= render "spree/orders/adjustments" %>
28
+ <% end %>
29
+ <tr class="table-warning cart-total">
30
+ <td colspan="4" align='right' class="align-middle">
31
+ <h5 class="mb-0">
32
+ <%= Spree.t(:total) %>
33
+ </h5>
34
+ </td>
35
+ <td class="lead" colspan>
36
+ <%= order_form.object.display_total %>
37
+ </td>
19
38
  <td></td>
20
39
  </tr>
21
- <%= render "spree/orders/adjustments" %>
22
- <% end %>
23
- <tr class="warning cart-total">
24
- <td colspan="4" align='right'><h5><%= Spree.t(:total) %></h5></td>
25
- <td class="lead" colspan><%= order_form.object.display_total %></td>
26
- <td></td>
27
- </tr>
28
- </table>
40
+ </table>
41
+ </div>
@@ -1,12 +1,14 @@
1
1
  <% @body_id = 'cart' %>
2
2
 
3
- <div data-hook="cart_container">
3
+ <div data-hook="cart_container" class="col-12">
4
4
  <h1><%= Spree.t(:shopping_cart) %></h1>
5
5
 
6
6
  <% if @order.line_items.empty? %>
7
7
  <div data-hook="empty_cart">
8
8
  <div class="alert alert-info"><%= Spree.t(:your_cart_is_empty) %></div>
9
- <p><%= link_to Spree.t(:continue_shopping), products_path, class: 'btn btn-default' %></p>
9
+ <p>
10
+ <%= link_to Spree.t(:continue_shopping), products_path, class: 'btn btn-outline-secondary' %>
11
+ </p>
10
12
  </div>
11
13
  <% else %>
12
14
  <div data-hook="outside_cart_form">
@@ -17,34 +19,38 @@
17
19
  <%= render partial: 'form', locals: { order_form: order_form } %>
18
20
  </div>
19
21
 
20
- <div class="links col-md-3 navbar-form pull-right text-right" data-hook="cart_buttons">
21
- <div class="form-group">
22
- <%= button_tag class: 'btn btn-primary', id: 'update-button' do %>
23
- <%= Spree.t(:update) %>
24
- <% end %>
25
- <%= button_tag class: 'btn btn-lg btn-success', id: 'checkout-link', name: 'checkout' do %>
26
- <%= Spree.t(:checkout) %>
27
- <% end %>
28
- </div>
29
- </div>
22
+ <div class="row">
23
+ <% if Spree::Frontend::Config[:coupon_codes_enabled] %>
24
+ <div class='col-md-6 form-inline' data-hook='coupon_code'>
25
+ <%= order_form.label :coupon_code, class: 'mr-2' %>
26
+ <div class="input-group">
27
+ <%= order_form.text_field :coupon_code, size: '30', class: 'form-control' %>
28
+ <div class="input-group-append">
29
+ <%= button_tag Spree.t(:coupon_code_apply), class: 'btn btn-outline-secondary' %>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ <% end %>
30
34
 
31
- <% if Spree::Frontend::Config[:coupon_codes_enabled] %>
32
- <div class='col-md-6 form-inline pull-right' data-hook='coupon_code'>
33
- <label>
34
- <%= order_form.label :coupon_code %>
35
- <%= order_form.text_field :coupon_code, size: '30', class: 'form-control' %>
36
- <%= button_tag Spree.t(:coupon_code_apply), class: 'btn btn-default' %>
37
- </label>
35
+ <div class="links col-md-6 d-flex justify-content-end" data-hook="cart_buttons">
36
+ <div class="form-group">
37
+ <%= button_tag class: 'btn btn-primary', id: 'update-button' do %>
38
+ <%= Spree.t(:update) %>
39
+ <% end %>
40
+ <%= button_tag class: 'btn btn-lg btn-success', id: 'checkout-link', name: 'checkout' do %>
41
+ <%= Spree.t(:checkout) %>
42
+ <% end %>
43
+ </div>
38
44
  </div>
39
- <% end %>
45
+ </div>
40
46
  </div>
41
47
  <% end %>
42
48
  </div>
43
49
 
44
- <div id="empty-cart" class="col-md-3 pull-left" data-hook>
50
+ <div id="empty-cart" class="mt-4" data-hook>
45
51
  <%= form_tag empty_cart_path, method: :put do %>
46
52
  <p id="clear_cart_link" data-hook>
47
- <%= submit_tag Spree.t(:empty_cart), class: 'btn btn-default' %>
53
+ <%= submit_tag Spree.t(:empty_cart), class: 'btn btn-outline-secondary' %>
48
54
  <%= Spree.t(:or) %>
49
55
  <%= link_to Spree.t(:continue_shopping), products_path, class: 'continue' %>
50
56
  </p>
@@ -1,7 +1,8 @@
1
1
  <fieldset id="order_summary" data-hook>
2
2
  <h1><%= accurate_title %></h1>
3
+
3
4
  <% if order_just_completed?(@order) %>
4
- <strong><%= Spree.t(:thank_you_for_your_order) %></strong>
5
+ <p><strong><%= Spree.t(:thank_you_for_your_order) %></strong></p>
5
6
  <% end %>
6
7
 
7
8
  <div id="order" data-hook>
@@ -1,27 +1,30 @@
1
1
  <%= form_for :order, html: { id: 'add-to-cart-form' } do |f| %>
2
2
  <div class="row" id="inside-product-cart-form" data-hook="inside_product_cart_form" itemprop="offers" itemscope itemtype="https://schema.org/Offer">
3
3
  <% if @product.variants_and_option_values(current_currency).any? %>
4
- <div id="product-variants" class="col-md-6">
4
+ <div id="product-variants" class="col-lg-6 mt-4">
5
5
  <h3 class="product-section-title"><%= Spree.t(:variants) %></h3>
6
6
  <ul class="list-group">
7
7
  <% @product.variants_and_option_values(current_currency).each_with_index do |variant, index| %>
8
- <li>
9
- <%= radio_button_tag "variant_id", variant.id, index == 0,
10
- 'data-price' => variant.price_in(current_currency).money,
11
- 'data-in-stock' => variant.can_supply?,
12
- 'data-backordered' => variant.backordered?
13
- %>
14
- <%= label_tag "variant_id_#{ variant.id }" do %>
15
- <span class="variant-description">
16
- <%= variant.options_text %>
17
- </span>
18
- <% if variant_price variant %>
19
- <span class="price diff"><%= variant_price variant %></span>
8
+ <li class="list-group-item <%= "active" if index == 0 %>">
9
+ <div class="form-check">
10
+ <%= radio_button_tag "variant_id", variant.id, index == 0,
11
+ 'data-price' => variant.price_in(current_currency).money,
12
+ 'data-in-stock' => variant.can_supply?,
13
+ 'data-backordered' => variant.backordered?,
14
+ class: 'form-check-input'
15
+ %>
16
+ <%= label_tag "variant_id_#{ variant.id }", class: "form-check-label" do %>
17
+ <span class="variant-description">
18
+ <%= variant.options_text %>
19
+ </span>
20
+ <% if variant_price variant %>
21
+ <span class="price diff"><%= variant_price variant %></span>
22
+ <% end %>
23
+ <% unless variant.can_supply? %>
24
+ <span class="out-of-stock"><%= Spree.t(:out_of_stock) %></span>
25
+ <% end %>
20
26
  <% end %>
21
- <% unless variant.can_supply? %>
22
- <span class="out-of-stock"><%= Spree.t(:out_of_stock) %></span>
23
- <% end %>
24
- <% end %>
27
+ </div>
25
28
  </li>
26
29
  <% end%>
27
30
  </ul>
@@ -31,9 +34,9 @@
31
34
  <% end %>
32
35
 
33
36
  <% if @product.price_in(current_currency) && !@product.price.nil? %>
34
- <div data-hook="product_price" class="col-md-5">
37
+ <div data-hook="product_price" class="col-lg-5 mt-4">
35
38
  <div id="product-price">
36
- <h6 class="product-section-title"><%= Spree.t(:price) %></h6>
39
+ <h3 class="product-section-title"><%= Spree.t(:price) %></h3>
37
40
  <div>
38
41
  <span class="lead price selling" itemprop="price" content="<%= @product.price_in(current_currency).amount.to_d %>">
39
42
  <%= display_price(@product) %>
@@ -44,8 +47,9 @@
44
47
  <% if @product.master.can_supply? %>
45
48
  <link itemprop="availability" href="https://schema.org/InStock" />
46
49
  <% elsif @product.variants.empty? %>
47
- <br />
48
- <span class="out-of-stock"><%= Spree.t(:out_of_stock) %></span>
50
+ <span class="out-of-stock d-block mt-2">
51
+ <%= Spree.t(:out_of_stock) %>
52
+ </span>
49
53
  <% end %>
50
54
  <% if @product.backordered? %>
51
55
  <div class="alert alert-warning" id="cart-backordered-info">
@@ -55,22 +59,20 @@
55
59
  </div>
56
60
 
57
61
  <% if @product.can_supply? %>
58
- <div class="add-to-cart">
59
- <br />
62
+ <div class="add-to-cart mt-2">
60
63
  <div class="input-group">
61
64
  <%= number_field_tag :quantity, 1, class: 'title form-control', min: 1 %>
62
- <span class="input-group-btn">
65
+ <div class="input-group-append">
63
66
  <%= button_tag class: 'btn btn-success', id: 'add-to-cart-button', type: :submit, disabled: true do %>
64
67
  <%= Spree.t(:add_to_cart) %>
65
68
  <% end %>
66
- </span>
69
+ </div>
67
70
  </div>
68
71
  </div>
69
72
  <% end %>
70
73
  </div>
71
74
  <% else %>
72
75
  <div id="product-price">
73
- <br />
74
76
  <div>
75
77
  <span class="price selling" itemprop="price">
76
78
  <%= Spree.t('product_not_available_in_this_currency') %>
@@ -1,15 +1,14 @@
1
1
  <% url = spree.product_path(product, taxon_id: taxon.try(:id)) %>
2
- <div id="product_<%= product.id %>" class="col-md-3 col-sm-6 col-xs-6 product-list-item" data-hook="products_list_item" itemscope itemtype="https://schema.org/Product">
3
- <div class="panel panel-default">
2
+ <div id="product_<%= product.id %>" class="d-flex w-100 col-12 col-sm-6 col-lg-4 col-xl-3 product-list-item mb-4" data-hook="products_list_item" itemscope itemtype="https://schema.org/Product">
3
+ <div class="card w-100">
4
4
  <% cache(taxon.present? ? [I18n.locale, current_currency, taxon, product] : cache_key_for_product(product)) do %>
5
- <div class="panel-body text-center product-body">
6
- <%= link_to url, itemprop: "url" do %>
7
- <%= small_image(product, itemprop: "image") %><br/>
8
- <%= content_tag(:span, truncate(product.name, length: 50), class: 'info', itemprop: "name", title: product.name) %>
5
+ <div class="card-body text-center product-body">
6
+ <%= link_to url, itemprop: "url", class: 'd-block text-center' do %>
7
+ <%= small_image(product, itemprop: "image", class: "d-block mx-auto") %>
8
+ <%= content_tag(:span, truncate(product.name, length: 50), class: 'info mt-3 d-block', itemprop: "name", title: product.name) %>
9
9
  <% end %>
10
- <br/>
11
10
  </div>
12
- <div class="panel-footer text-center">
11
+ <div class="card-footer text-center">
13
12
  <span itemprop="offers" itemscope itemtype="https://schema.org/Offer">
14
13
  <span class="price selling lead" itemprop="price" content="<%= (product.price_in(current_currency).amount.nil?)? 0 : product.price_in(current_currency).amount.to_d %>">
15
14
  <%= display_price(product) %>
@@ -4,17 +4,19 @@
4
4
  <div id="promotions">
5
5
  <h3><%= Spree.t(:promotions) %></h3>
6
6
  <% promotions.each do |promotion| %>
7
- <div class="well well-sm">
8
- <h4><%= promotion.name %></h4>
9
- <p><%= promotion.description %></p>
10
- <% if promotion.products.any? %>
11
- <ul>
12
- <% promotion.products.each do |product| %>
13
- <li><%= link_to product.name, product_path(product) %></li>
14
- <% end %>
15
- </ul>
16
- <% end %>
17
- </div>
7
+ <div class="card mb-3 bg-light">
8
+ <div class="card-body p-1">
9
+ <h4><%= promotion.name %></h4>
10
+ <p><%= promotion.description %></p>
11
+ <% if promotion.products.any? %>
12
+ <ul>
13
+ <% promotion.products.each do |product| %>
14
+ <li><%= link_to product.name, product_path(product) %></li>
15
+ <% end %>
16
+ </ul>
17
+ <% end %>
18
+ </div>
19
+ </div>
18
20
  <% end %>
19
21
  </div>
20
22
  <% end %>
@@ -1,11 +1,18 @@
1
- <% unless @product_properties.blank? %>
2
- <h3 class="product-section-title"><%= Spree.t('properties')%></h3>
1
+ <% unless @product_properties.blank? %>
2
+ <h3 class="product-section-title h4 mt-4">
3
+ <%= Spree.t('properties')%>
4
+ </h3>
5
+
3
6
  <table id="product-properties" class="table table-striped" data-hook>
4
7
  <tbody>
5
8
  <% @product_properties.each do |product_property| %>
6
9
  <% css_class = cycle('even', 'odd', name: "properties") %>
7
10
  <tr class="<%= css_class %>">
8
- <td><strong><%= product_property.property.presentation %></strong></td>
11
+ <td>
12
+ <strong>
13
+ <%= product_property.property.presentation %>
14
+ </strong>
15
+ </td>
9
16
  <td><%= product_property.value %></td>
10
17
  </tr>
11
18
  <% end %>