spree_frontend 4.1.0.rc2 → 4.1.0.rc3

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 (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