spree_frontend 4.1.0.rc2 → 4.1.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree/frontend/cart.js +12 -0
  3. data/app/assets/javascripts/spree/frontend/checkout/address.js +2 -3
  4. data/app/assets/javascripts/spree/frontend/checkout/shipment.js +16 -4
  5. data/app/assets/javascripts/spree/frontend/views/spree/layouts/spree_application.js +30 -0
  6. data/app/assets/javascripts/spree/frontend/views/spree/products/modal_carousel.js +31 -12
  7. data/app/assets/javascripts/spree/frontend/views/spree/shared/carousel/thumbnails.js +77 -37
  8. data/app/assets/javascripts/spree/frontend/views/spree/shared/nav_bar.js +16 -7
  9. data/app/assets/javascripts/spree/frontend/views/spree/shared/product_added_modal.js +1 -1
  10. data/app/assets/stylesheets/spree/frontend/application.scss +1 -0
  11. data/app/assets/stylesheets/spree/frontend/components-bootstrap/modal.scss +4 -0
  12. data/app/assets/stylesheets/spree/frontend/components-custom/inputs.scss +14 -13
  13. data/app/assets/stylesheets/spree/frontend/views/spree/checkout/confirm.scss +5 -0
  14. data/app/assets/stylesheets/spree/frontend/views/spree/checkout/edit.scss +7 -0
  15. data/app/assets/stylesheets/spree/frontend/views/spree/checkout/registration.scss +0 -1
  16. data/app/assets/stylesheets/spree/frontend/views/spree/orders/edit.scss +9 -0
  17. data/app/assets/stylesheets/spree/frontend/views/spree/products/cart_form.scss +17 -15
  18. data/app/assets/stylesheets/spree/frontend/views/spree/products/show.scss +7 -0
  19. data/app/assets/stylesheets/spree/frontend/views/spree/shared/carousel/thumbnails.scss +3 -12
  20. data/app/assets/stylesheets/spree/frontend/views/spree/shared/delete_address_popup.scss +3 -26
  21. data/app/assets/stylesheets/spree/frontend/views/spree/shared/dropdown.scss +3 -0
  22. data/app/assets/stylesheets/spree/frontend/views/spree/shared/main_nav_bar.scss +2 -1
  23. data/app/assets/stylesheets/spree/frontend/views/spree/shared/quantity_select.scss +3 -1
  24. data/app/controllers/spree/products_controller.rb +13 -0
  25. data/app/controllers/spree/taxons_controller.rb +32 -7
  26. data/app/helpers/spree/addresses_helper.rb +3 -1
  27. data/app/helpers/spree/frontend_helper.rb +15 -6
  28. data/app/views/spree/checkout/_delivery.html.erb +2 -1
  29. data/app/views/spree/checkout/_summary.html.erb +29 -2
  30. data/app/views/spree/checkout/edit.html.erb +7 -5
  31. data/app/views/spree/checkout/registration.html.erb +1 -1
  32. data/app/views/spree/products/_cart_form.html.erb +2 -2
  33. data/app/views/spree/products/_filters_desktop.html.erb +3 -3
  34. data/app/views/spree/products/_filters_mobile.html.erb +7 -7
  35. data/app/views/spree/products/_gallery_modal.html.erb +2 -2
  36. data/app/views/spree/products/_sort_desktop.html.erb +2 -2
  37. data/app/views/spree/products/_sort_mobile.html.erb +2 -2
  38. data/app/views/spree/shared/_cart.html.erb +0 -2
  39. data/app/views/spree/shared/_checkout_header.html.erb +1 -1
  40. data/app/views/spree/shared/_copyright.html.erb +1 -1
  41. data/app/views/spree/shared/_header.html.erb +1 -1
  42. data/app/views/spree/shared/_link_to_cart.html.erb +5 -2
  43. data/app/views/spree/shared/_main_nav_bar.html.erb +3 -3
  44. data/app/views/spree/shared/_nav_bar.html.erb +1 -1
  45. data/app/views/spree/shared/_option_values.html.erb +1 -1
  46. data/app/views/spree/shared/_registration.html.erb +1 -1
  47. data/app/views/spree/shared/carousel/_thumbnails.html.erb +1 -1
  48. data/app/views/spree/taxons/_subcategories.html.erb +2 -3
  49. metadata +7 -6
@@ -1,22 +1,27 @@
1
1
  module Spree
2
2
  class TaxonsController < Spree::StoreController
3
+ include Spree::FrontendHelper
3
4
  helper 'spree/products'
4
5
 
5
- before_action :load_taxon, :load_products
6
+ before_action :load_taxon
6
7
 
7
8
  respond_to :html
8
9
 
9
10
  def show
11
+ if stale?(etag: etag, last_modified: last_modified, public: true)
12
+ load_products
13
+ end
10
14
  end
11
15
 
12
16
  def product_carousel
13
- if @products.any?
14
- render template: 'spree/taxons/product_carousel', layout: false
15
- else
16
- head :no_content
17
+ if stale?(etag: carousel_etag, last_modified: last_modified, public: true)
18
+ load_products
19
+ if @products.any?
20
+ render template: 'spree/taxons/product_carousel', layout: false
21
+ else
22
+ head :no_content
23
+ end
17
24
  end
18
-
19
- fresh_when etag: "product-carousel/#{@taxon.cache_key_with_version}", last_modified: @taxon.updated_at.utc, public: true
20
25
  end
21
26
 
22
27
  private
@@ -33,5 +38,25 @@ module Spree
33
38
  @searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true))
34
39
  @products = @searcher.retrieve_products
35
40
  end
41
+
42
+ def etag
43
+ [
44
+ store_etag,
45
+ @taxon,
46
+ available_option_types_cache_key,
47
+ filtering_params_cache_key
48
+ ]
49
+ end
50
+
51
+ def carousel_etag
52
+ [
53
+ store_etag,
54
+ @taxon
55
+ ]
56
+ end
57
+
58
+ def last_modified
59
+ @taxon.updated_at&.utc
60
+ end
36
61
  end
37
62
  end
@@ -7,10 +7,12 @@ module Spree
7
7
  yield
8
8
  else
9
9
  is_required = Spree::Address.required_fields.include?(method)
10
+ method_name = I18n.t("activerecord.attributes.spree/address.#{method}")
11
+ required = Spree.t(:required)
10
12
  form.text_field(method,
11
13
  class: [is_required ? 'required' : nil, 'spree-flat-input'].compact,
12
14
  required: is_required,
13
- placeholder: I18n.t("activerecord.attributes.spree/address.#{method}"))
15
+ placeholder: is_required ? "#{method_name} #{required}" : method_name)
14
16
  end
15
17
  end
16
18
  end
@@ -11,13 +11,14 @@ module Spree
11
11
  return '' if current_page?('/') || taxon.nil?
12
12
 
13
13
  separator = raw(separator)
14
- crumbs = [content_tag(:li, content_tag(:span, link_to(content_tag(:span, Spree.t(:home), itemprop: 'name'), spree.root_path, itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', class: 'breadcrumb-item')]
14
+ crumbs = [content_tag(:li, content_tag(:span, link_to(content_tag(:span, Spree.t(:home), itemprop: 'name'), spree.root_path, itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', itemid: spree.root_path, class: 'breadcrumb-item', position: 0)]
15
15
  if taxon
16
- crumbs << taxon.ancestors.where.not(parent_id: nil).map { |ancestor| content_tag(:li, content_tag(:span, link_to(content_tag(:span, ancestor.name, itemprop: 'name'), seo_url(ancestor, params: permitted_product_params), itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', class: 'breadcrumb-item') } unless taxon.ancestors.empty?
17
- crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, taxon.name, itemprop: 'name'), seo_url(taxon, params: permitted_product_params), itemprop: 'url') + separator, itemprop: 'item'), class: 'breadcrumb-item', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement')
18
- crumbs << content_tag(:li, content_tag(:span, content_tag(:span, product.name) + separator), class: 'breadcrumb-item') if product
16
+ ancestors = taxon.ancestors.where.not(parent_id: nil)
17
+ crumbs << ancestors.each_with_index.map { |ancestor, index| content_tag(:li, content_tag(:span, link_to(content_tag(:span, ancestor.name, itemprop: 'name'), seo_url(ancestor, params: permitted_product_params), itemprop: 'url', itemid: seo_url(ancestor, params: permitted_product_params), position: index + 1) + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', itemid: seo_url(ancestor, params: permitted_product_params), class: 'breadcrumb-item', position: index + 1) }
18
+ crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, taxon.name, itemprop: 'name'), seo_url(taxon, params: permitted_product_params), itemprop: 'url', itemid: seo_url(taxon, params: permitted_product_params), position: ancestors.size + 1) + separator, itemprop: 'item'), class: 'breadcrumb-item', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', itemid: seo_url(taxon, params: permitted_product_params), position: ancestors.size + 1)
19
+ crumbs << content_tag(:li, content_tag(:span, content_tag(:span, product.name) + separator, itemid: spree.product_path(product, taxon_id: taxon.try(:id)), position: ancestors.size + 2), class: 'breadcrumb-item', itemid: spree.product_path(product, taxon_id: taxon.try(:id)), position: ancestors.size + 2) if product
19
20
  else
20
- crumbs << content_tag(:li, content_tag(:span, Spree.t(:products), itemprop: 'item'), class: 'active', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement')
21
+ crumbs << content_tag(:li, content_tag(:span, Spree.t(:products), itemprop: 'item'), class: 'active', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', position: 1)
21
22
  end
22
23
  crumb_list = content_tag(:ol, raw(crumbs.flatten.map(&:mb_chars).join), class: 'breadcrumb', itemscope: 'itemscope', itemtype: 'https://schema.org/BreadcrumbList')
23
24
  content_tag(:nav, crumb_list, id: 'breadcrumbs', class: 'col-12 mt-1 mt-sm-3 mt-lg-4', aria: { label: 'breadcrumb' })
@@ -205,8 +206,16 @@ module Spree
205
206
  available_option_types.map(&:filter_param).concat(static_filters)
206
207
  end
207
208
 
209
+ def filtering_params_cache_key
210
+ params.permit(*filtering_params)&.reject { |_, v| v.blank? }&.to_s
211
+ end
212
+
213
+ def available_option_types_cache_key
214
+ @available_option_types_cache_key ||= Spree::OptionType.maximum(:updated_at)&.utc&.to_i
215
+ end
216
+
208
217
  def available_option_types
209
- @available_option_types ||= Rails.cache.fetch('available-option-types', expires_in: 3.minutes) do
218
+ @available_option_types ||= Rails.cache.fetch("available-option-types/#{available_option_types_cache_key}") do
210
219
  Spree::OptionType.includes(:option_values).to_a
211
220
  end
212
221
  @available_option_types
@@ -15,7 +15,8 @@
15
15
  rate.id,
16
16
  data: {
17
17
  behavior: 'shipping-method-selector',
18
- cost: rate.display_cost
18
+ cost: rate.display_cost,
19
+ tax: rate.display_tax_amount
19
20
  } %>
20
21
  <span class="spree-radio-label-custom-input"></span>
21
22
  <span class="rate-name"><%= rate.name %></span>
@@ -13,13 +13,40 @@
13
13
 
14
14
  <% order.all_adjustments.nonzero.tax.eligible.group_by(&:label).each do |label, adjustments| %>
15
15
  <div class="d-table-cell"><%= label %></div>
16
- <div class="d-table-cell text-right"><%= Spree::Money.new(adjustments.sum(&:amount), currency: order.currency).to_html %></div>
16
+ <% tax_total = Spree::Money.new(adjustments.sum(&:amount), currency: order.currency) %>
17
+ <div class="d-table-cell text-right"
18
+ data-hook='tax-total'
19
+ data-currency='<%= Money::Currency.find(order.currency).symbol %>'
20
+ data-non-shipment-tax='<%= adjustments.reject{ |adj| adj.adjustable_type== 'Spree::Shipment'}.sum(&:amount) %>'
21
+ thousands-separator='<%= tax_total.thousands_separator %>'
22
+ decimal-mark='<%= tax_total.decimal_mark %>'
23
+ precision='<%= Money::Currency.find(order.currency).exponent %>'
24
+ >
25
+ <%= tax_total.to_html %>
26
+ </div>
27
+ <% end %>
28
+ <% if order.all_adjustments.nonzero.tax.eligible.empty? %>
29
+ <div class="d-table-cell"><%= Spree::TaxRate.first&.name || Spree.t(:tax) %></div>
30
+ <div class="d-table-cell text-right"
31
+ data-hook='tax-total'
32
+ data-non-shipment-tax='0'
33
+ >
34
+ <%= Spree::Money.new(0, currency: order.currency) %>
35
+ </div>
17
36
  <% end %>
18
37
 
19
38
  <% if order.passed_checkout_step?("address") && order.shipments.any? %>
20
39
  <div class="d-table-cell"><%= Spree.t(:shipping) %>:</div>
21
40
  <% shipping_total = Spree::Money.new(order.shipments.to_a.sum(&:cost), currency: order.currency) %>
22
- <div class="d-table-cell text-right" data-hook='shipping-total' data-currency='<%= Money::Currency.find(order.currency).symbol %>' thousands-separator='<%= shipping_total.thousands_separator %>' decimal-mark='<%= shipping_total.decimal_mark %>' precision='<%= Money::Currency.find(order.currency).exponent %>'><%= shipping_total.to_html %></div>
41
+ <div class="d-table-cell text-right"
42
+ data-hook='shipping-total'
43
+ data-currency='<%= Money::Currency.find(order.currency).symbol %>'
44
+ thousands-separator='<%= shipping_total.thousands_separator %>'
45
+ decimal-mark='<%= shipping_total.decimal_mark %>'
46
+ precision='<%= Money::Currency.find(order.currency).exponent %>'
47
+ >
48
+ <%= shipping_total.to_html %>
49
+ </div>
23
50
 
24
51
  <% if order.shipment_adjustments.nonzero.exists? %>
25
52
  <% order.shipment_adjustments.nonzero.promotion.eligible.group_by(&:label).each do |label, adjustments| %>
@@ -20,11 +20,13 @@
20
20
  </div>
21
21
 
22
22
  <% unless @order.confirm? %>
23
- <div id="checkout-summary" class="col-md-12 col-lg-auto" data-hook="checkout_summary_box">
24
- <%= render partial: 'summary', locals: { order: @order } %>
25
- <div data-hook="buttons">
26
- <% submit_label_key = @order.confirm? ? :place_order : :save_and_continue %>
27
- <%= submit_tag Spree.t(submit_label_key), class: 'btn btn-primary text-uppercase font-weight-bold w-100 checkout-content-save-continue-button' %>
23
+ <div id="checkout-summary" class="col-md-12 col-lg-auto h-100" data-hook="checkout_summary_box">
24
+ <div class="checkout-summary-container position-sticky">
25
+ <%= render partial: 'summary', locals: { order: @order } %>
26
+ <div data-hook="buttons">
27
+ <% submit_label_key = @order.confirm? ? :place_order : :save_and_continue %>
28
+ <%= submit_tag Spree.t(submit_label_key), class: 'btn btn-primary text-uppercase font-weight-bold w-100 checkout-content-save-continue-button' %>
29
+ </div>
28
30
  </div>
29
31
  </div>
30
32
  <% end %>
@@ -5,7 +5,7 @@
5
5
  <%= render partial: 'spree/shared/login' if defined?(spree_login_path) %>
6
6
  </div>
7
7
  <div class="col-xs-12 col-lg-6">
8
- <div class="col-lg-11 mx-auto pt-lg-2">
8
+ <div class="col-lg-11 mx-auto">
9
9
  <% if defined?(spree_signup_path) %>
10
10
  <%= render partial: 'spree/shared/registration', locals: { registration_button: '' } %>
11
11
  <div class="checkout-registration-styled-or">
@@ -14,7 +14,7 @@
14
14
  <%= render 'cart_form_availability_templates', type: 'out-of-stock' %>
15
15
  </template>
16
16
 
17
- <% is_product_available_in_currency = product_available_in_currency?(@product) %>
17
+ <% is_product_available_in_currency = product_available_in_currency? %>
18
18
  <% default_variant = default_variant(@variants) %>
19
19
 
20
20
  <%= form_for :order, html: {
@@ -27,7 +27,7 @@
27
27
  <div id="inside-product-cart-form" data-hook="inside_product_cart_form">
28
28
  <% if is_product_available_in_currency %>
29
29
  <div id="product-price" class="mb-2 text-center text-md-left add-to-cart-form-price" data-hook="product_price">
30
- <span class="price selling" content="<%= @product.price_in(current_currency).amount.to_d %>">
30
+ <span class="price selling" content="<%= @product_price.to_d %>">
31
31
  <%= display_price(default_variant) %>
32
32
  </span>
33
33
  <span content="<%= current_currency %>"></span>
@@ -1,7 +1,7 @@
1
- <% cache base_cache_key + [available_option_types, permitted_params, @taxon] do %>
1
+ <% cache base_cache_key + [available_option_types, permitted_params] do %>
2
2
  <div id="plp-filters-accordion" class="d-none d-lg-block col-lg-3 pr-5 position-sticky h-100 plp-filters" data-hook="taxon_sidebar_navigation">
3
3
  <% @available_option_types.each do |option_type| %>
4
- <div class="w-100 py-2 card plp-filters-card">
4
+ <div class="w-100 card plp-filters-card">
5
5
  <% ot_downcase_name = option_type.filter_param %>
6
6
  <% option_type_name = ot_downcase_name.titleize %>
7
7
 
@@ -29,7 +29,7 @@
29
29
  </div>
30
30
  <% end %>
31
31
 
32
- <div class="w-100 py-2 card plp-filters-card">
32
+ <div class="w-100 card plp-filters-card">
33
33
  <div class="card-header <%= 'collapsed' if params[:price].blank? %> px-1 plp-filters-card-header" id="filtersPrice" data-toggle="collapse" data-target="#collapseFilterPrice" aria-expanded="false" aria-controls="collapseFilterPrice" role="heading" aria-level="2">
34
34
  <%= Spree.t('plp.price') %>
35
35
  <%= icon(name: 'plus',
@@ -1,7 +1,7 @@
1
1
  <% is_visible = params[:menu_open] ? 'block' : 'none' %>
2
2
 
3
- <% cache base_cache_key + [available_option_types, permitted_params, @taxon, is_visible] do %>
4
- <div id="filter-by-overlay" class="d-lg-none plp-overlay" style="display: <%= is_visible %>;">
3
+ <div id="filter-by-overlay" class="d-lg-none plp-overlay" style="display: <%= is_visible %>;">
4
+ <% cache base_cache_key + [available_option_types, permitted_params] do %>
5
5
  <div class="plp-scroll">
6
6
  <div class="container">
7
7
  <div class="plp-overlay-header">
@@ -53,10 +53,10 @@
53
53
  </div>
54
54
  </div>
55
55
  </div>
56
+ <% end %>
56
57
 
57
- <div class="container position-absolute text-center mb-2 plp-overlay-buttons pt-3">
58
- <%= link_to Spree.t('plp.clear_all'), permitted_params.select { |key, value| key == "sort_by"}, class: 'btn spree-btn btn-outline-primary w-100 mb-4' %>
59
- <%= link_to Spree.t('plp.done'), permitted_params, class: 'btn btn-primary spree-btn w-100' %>
60
- </div>
58
+ <div class="container position-absolute text-center mb-2 plp-overlay-buttons pt-3">
59
+ <%= link_to Spree.t('plp.clear_all'), permitted_params.select { |key, value| key == "sort_by"}, class: 'btn spree-btn btn-outline-primary w-100 mb-4' %>
60
+ <%= link_to Spree.t('plp.done'), permitted_params, class: 'btn btn-primary spree-btn w-100' %>
61
61
  </div>
62
- <% end %>
62
+ </div>
@@ -1,13 +1,13 @@
1
1
  <div class="modal fade" id="picturesModal" tabindex="-1" role="dialog" >
2
2
  <div class="modal-dialog--zoom modal-dialog mw-100 vh-100 mt-0 mb-0" role="document">
3
3
  <div class="modal-content h-100">
4
- <div class="modal-body">
4
+ <div class="modal-body h-100">
5
5
  <button class="modal-close" type="button" class="close" data-dismiss="modal" aria-label="Close">
6
6
  <span aria-hidden="true">&#x2715;</span>
7
7
  </button>
8
8
  <div class="d-flex justify-content-center align-items-center product-details-images h-100">
9
9
  <% if @product_images.size > 1 %>
10
- <div class="d-none d-sm-block product-details-thumbnails">
10
+ <div class="h-100 d-none d-sm-block product-details-thumbnails">
11
11
  <%= render 'spree/shared/carousel/thumbnails',
12
12
  images: @product_images,
13
13
  group_id: 'main-product-modal-carousel',
@@ -13,8 +13,8 @@
13
13
 
14
14
  <div class="dropdown-menu text-right plp-sort-dropdown">
15
15
  <ul class="pt-1 plp-sort-dropdown-ul">
16
- <li class="p-3 plp-sort-dropdown-ul-li<%= '--active' if params[:sort_by] == 'default' || params[:sort_by].blank? %>">
17
- <%= link_to Spree.t('plp.default'), url_for(permitted_params.merge(sort_by: 'default')) %>
16
+ <li class="p-3 plp-sort-dropdown-ul-li<%= '--active' if params[:sort_by].blank? %>">
17
+ <%= link_to Spree.t('plp.default'), url_for(permitted_params.merge(sort_by: nil)) %>
18
18
  </li>
19
19
  <li class="p-3 plp-sort-dropdown-ul-li<%= '--active' if params[:sort_by] == 'newest-first' %>">
20
20
  <%= link_to Spree.t('plp.newest_first'), url_for(permitted_params.merge(sort_by: 'newest-first')) %>
@@ -7,8 +7,8 @@
7
7
  </div>
8
8
  <div class="plp-overlay-header-border"></div>
9
9
  <ul class="pt-1 plp-overlay-ul">
10
- <li class="p-3 plp-overlay-ul-li<%= '--active' if params[:sort_by] == 'default' || params[:sort_by].blank? %>">
11
- <a href="<%= url_for(permitted_params.merge(sort_by: 'default')) %>" >
10
+ <li class="p-3 plp-overlay-ul-li<%= '--active' if params[:sort_by].blank? %>">
11
+ <a href="<%= url_for(permitted_params.merge(sort_by: nil)) %>" >
12
12
  <div class="plp-empty-dot">
13
13
  <div class="filled-dot"></div>
14
14
  </div>
@@ -1,5 +1,3 @@
1
- <% item_count = simple_current_order&.item_count || 0 %>
2
-
3
1
  <%= link_to spree.cart_path,
4
2
  class: "cart-icon #{'cart-icon--visible-count' if item_count > 0} #{local_assigns[:class]}",
5
3
  'aria-label': Spree.t(:cart) do %>
@@ -10,7 +10,7 @@
10
10
  <%= link_to Spree.t('back'), spree.cart_path, class: "d-sm-none text-uppercase", method: :get %>
11
11
  </div>
12
12
  <div class="d-flex flex-nowrap align-items-center justify-content-center">
13
- <figure class="logo flex-grow-0 flex-xl-grow-0 order-xl-0 header-spree-fluid-logo">
13
+ <figure class="logo flex-grow-0 flex-xl-grow-0 order-xl-0 header-spree-fluid-logo m-0">
14
14
  <%= logo(Spree::Config[:logo], method: :get) %>
15
15
  </figure>
16
16
  </div>
@@ -1,4 +1,4 @@
1
- <div class="border-bottom border-top footer-spree-copyright">
1
+ <div class="border-top footer-spree-copyright">
2
2
  <div class="container">
3
3
  <div class="d-flex flex-column flex-lg-row align-items-center justify-content-center py-3 footer-spree-copyright-content">
4
4
  <div>Designed and developed by</div>
@@ -11,7 +11,7 @@
11
11
  height: 16) %>
12
12
  </button>
13
13
  </div>
14
- <figure class="logo flex-grow-0 flex-xl-grow-1 order-xl-0 header-spree-fluid-logo">
14
+ <figure class="logo flex-grow-0 flex-xl-grow-1 order-xl-0 header-spree-fluid-logo m-0">
15
15
  <%= logo %>
16
16
  </figure>
17
17
  <div id="main-nav-bar" class="flex-grow-0 d-none d-xl-block h-100 header-spree-fluid-primary-navigation">
@@ -1,2 +1,5 @@
1
- <%= render 'spree/shared/cart', class: 'd-none d-xl-inline-block cart-icon--xl', size: 36 %>
2
- <%= render 'spree/shared/cart', class: 'd-xl-none', size: 24 %>
1
+ <% item_count = simple_current_order&.item_count || 0 %>
2
+ <% cache [base_cache_key, 'cart-indicator', item_count] do %>
3
+ <%= render 'spree/shared/cart', class: 'd-none d-xl-inline-block cart-icon--xl', size: 36, item_count: item_count %>
4
+ <%= render 'spree/shared/cart', class: 'd-xl-none', size: 24, item_count: item_count %>
5
+ <% end %>
@@ -2,7 +2,7 @@
2
2
  <ul class="nav h-100 main-nav-bar">
3
3
  <% spree_navigation_data.each do |root| %>
4
4
  <li class="navbar main-nav-bar-dropdown main-nav-bar-category">
5
- <%= link_to root[:title], root[:url], class: 'p-2 main-nav-bar-item main-nav-bar-category-button' %>
5
+ <%= link_to root[:title], root[:url], class: "p-2 main-nav-bar-item main-nav-bar-category-button" %>
6
6
  <% if root[:items].present? || root[:promo_banners].present? %>
7
7
  <div class="w-100 shadow main-nav-bar-category-dropdown">
8
8
  <div class="container p-0 d-flex justify-content-xl-around mx-auto">
@@ -17,7 +17,7 @@
17
17
  <ul class="pl-0">
18
18
  <% root[:items].each do |item| %>
19
19
  <li>
20
- <%= link_to item[:title], item[:url], class: 'text-uppercase' %>
20
+ <%= link_to item[:title], item[:url], class: "text-uppercase main-nav-bar-category-links" %>
21
21
  </li>
22
22
  <% end %>
23
23
  </ul>
@@ -26,7 +26,7 @@
26
26
  <% if root[:promo_banners].present? %>
27
27
  <% root[:promo_banners].each do |promo_banner| %>
28
28
  <%= link_to promo_banner[:url] do %>
29
- <div class="category-image category-image text-center mx-3">
29
+ <div class="category-image text-center mx-3">
30
30
  <%= main_nav_image(promo_banner[:image], promo_banner[:title]) %>
31
31
  <div class="category-box">
32
32
  <div class="category-box-small-text">
@@ -21,7 +21,7 @@
21
21
  <% if defined?(spree.account_link_path) %>
22
22
  <li>
23
23
  <div class="dropdown navbar-right-dropdown">
24
- <button type="button" data-toggle="dropdown" class="navbar-right-dropdown-toggle" aria-label="<%= Spree.t('nav_bar.show_user_menu')%>">
24
+ <button id="account-button" type="button" data-toggle="dropdown" class="navbar-right-dropdown-toggle" aria-label="<%= Spree.t('nav_bar.show_user_menu')%>">
25
25
  <%= icon(name: 'person',
26
26
  classes: 'd-none d-xl-inline-block',
27
27
  width: 41.4,
@@ -1,4 +1,4 @@
1
- <% cache base_cache_key + [ot_downcase_name, params_ot_downcase_name, permitted_params, @taxon] do %>
1
+ <% cache base_cache_key + [ot_downcase_name, params_ot_downcase_name, permitted_params] do %>
2
2
  <% selected_option_values = params_ot_downcase_name&.split(',')&.map(&:to_i) || [] %>
3
3
  <% option_type.option_values.each do |option_value| %>
4
4
  <% id = option_value.id %>
@@ -1,4 +1,4 @@
1
1
  <% if defined?(spree_signup_path) %>
2
- <h3 class="spree-header header-sm spree-mt-medium mb-3 mb-sm-4 mb-xl-4"><%= Spree.t('dont_have_account') %></h3>
2
+ <h3 class="spree-mb-large spree-mt-large spree-header"><%= Spree.t('dont_have_account') %></h3>
3
3
  <%= link_to Spree.t(:sign_up), spree_signup_path, class: "btn btn-block btn-outline-primary spree-btn #{registration_button}" %>
4
4
  <% end %>
@@ -13,7 +13,7 @@
13
13
  <% if image_index % per_page == 0 %>
14
14
  <div class="carousel-item product-thumbnails-carousel-item<%= ' active' if image_index == 0 %>">
15
15
  <div class="h-100 d-flex flex-column justify-content-center">
16
- <div class="product-thumbnails-carousel-item-content">
16
+ <div class="product-thumbnails-carousel-item-content py-1">
17
17
  <% end %>
18
18
  <div
19
19
  class="product-thumbnails-carousel-item-single product-thumbnails-carousel-item-single--visible"
@@ -1,7 +1,6 @@
1
1
  <% cache([base_cache_key, taxon, 'subcategories', permitted_product_params]) do %>
2
- <% [taxon.parent, taxon].each do |current_taxon| %>
3
- <% child_taxons = [current_taxon, *current_taxon.children] %>
4
-
2
+ <% [taxon.parent, taxon].compact.each do |current_taxon| %>
3
+ <% child_taxons = [current_taxon, *current_taxon.children.where(hide_from_nav: false)] %>
5
4
  <% if current_taxon.level > 0 && child_taxons.size > 1 %>
6
5
  <div class="d-flex justify-content-center position-sticky sticky-top-90px taxon-subcategories-wrapper">
7
6
  <div class="py-1 text-uppercase d-none d-xl-flex overflow-x taxon-subcategories">
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_frontend
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0.rc2
4
+ version: 4.1.0.rc3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-04 00:00:00.000000000 Z
11
+ date: 2020-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spree_api
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 4.1.0.rc2
19
+ version: 4.1.0.rc3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 4.1.0.rc2
26
+ version: 4.1.0.rc3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: spree_core
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 4.1.0.rc2
33
+ version: 4.1.0.rc3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 4.1.0.rc2
40
+ version: 4.1.0.rc3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bootstrap
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -340,6 +340,7 @@ files:
340
340
  - app/assets/stylesheets/spree/frontend/views/spree/shared/cart.scss
341
341
  - app/assets/stylesheets/spree/frontend/views/spree/shared/category_nav_bar.scss
342
342
  - app/assets/stylesheets/spree/frontend/views/spree/shared/delete_address_popup.scss
343
+ - app/assets/stylesheets/spree/frontend/views/spree/shared/dropdown.scss
343
344
  - app/assets/stylesheets/spree/frontend/views/spree/shared/footer.scss
344
345
  - app/assets/stylesheets/spree/frontend/views/spree/shared/header.scss
345
346
  - app/assets/stylesheets/spree/frontend/views/spree/shared/login.scss