spree_frontend 3.7.14.1 → 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/checkout/address.js +42 -14
  4. data/app/assets/javascripts/spree/frontend/checkout/address_book.js +56 -0
  5. data/app/assets/javascripts/spree/frontend/product.js +54 -39
  6. data/app/assets/javascripts/spree/frontend.js +4 -1
  7. data/app/assets/stylesheets/spree/frontend/_variables.scss +1 -1
  8. data/app/assets/stylesheets/spree/frontend/address_book.scss +8 -0
  9. data/app/assets/stylesheets/spree/frontend/frontend_bootstrap.css.scss +13 -35
  10. data/app/assets/stylesheets/spree/frontend.css +1 -0
  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/engine.rb +4 -0
  60. data/lib/spree/frontend.rb +3 -3
  61. data/spree_frontend.gemspec +4 -3
  62. metadata +48 -25
@@ -11,7 +11,7 @@ module Spree
11
11
  @searcher = build_searcher(params.merge(include_images: true))
12
12
  @products = @searcher.retrieve_products
13
13
  @products = @products.includes(:possible_promotions) if @products.respond_to?(:includes)
14
- @taxonomies = Spree::Taxonomy.includes(root: :children)
14
+ @taxonomies = load_taxonomies
15
15
  end
16
16
 
17
17
  def show
@@ -58,5 +58,9 @@ module Spree
58
58
  redirect_to url_for(params), status: :moved_permanently
59
59
  end
60
60
  end
61
+
62
+ def load_taxonomies
63
+ Spree::Taxonomy.includes(root: :children)
64
+ end
61
65
  end
62
66
  end
@@ -3,7 +3,7 @@ module Spree
3
3
  include Spree::Core::ControllerHelpers::Order
4
4
 
5
5
  skip_before_action :set_current_order, only: :cart_link
6
- skip_before_action :verify_authenticity_token, only: :ensure_cart, raise: false
6
+ skip_before_action :verify_authenticity_token, only: :ensure_cart
7
7
 
8
8
  def forbidden
9
9
  render 'spree/shared/forbidden', layout: Spree::Config[:layout], status: 403
@@ -0,0 +1,36 @@
1
+ # https://github.com/spree-contrib/spree_address_book/blob/master/app/helpers/spree/addresses_helper.rb
2
+ module Spree
3
+ module AddressesHelper
4
+ def address_field(form, method, address_id = 'b', &handler)
5
+ content_tag :div, id: [address_id, method].join, class: 'form-group' do
6
+ if handler
7
+ yield
8
+ else
9
+ is_required = Spree::Address.required_fields.include?(method)
10
+ separator = is_required ? '<span class="required">*</span><br />' : '<br />'
11
+ form.label(method) + separator.html_safe +
12
+ form.text_field(method, class: [is_required ? 'required' : nil, 'form-control'].compact, required: is_required)
13
+ end
14
+ end
15
+ end
16
+
17
+ def address_state(form, country, _address_id = 'b')
18
+ country ||= Spree::Country.find(Spree::Config[:default_country_id])
19
+ have_states = country.states.any?
20
+ state_elements = [
21
+ form.collection_select(:state_id, country.states.order(:name),
22
+ :id, :name,
23
+ { include_blank: true },
24
+ class: have_states ? 'form-control' : 'hidden',
25
+ disabled: !have_states) +
26
+ form.text_field(:state_name,
27
+ class: !have_states ? 'form-control' : 'hidden',
28
+ disabled: have_states)
29
+ ].join.tr('"', "'").delete("\n")
30
+
31
+ form.label(:state, Spree.t(:state)) + '<span class="req">*</span><br />'.html_safe +
32
+ content_tag(:noscript, form.text_field(:state_name, class: 'required form-control')) +
33
+ javascript_tag("document.write(\"#{state_elements.html_safe}\");")
34
+ end
35
+ end
36
+ end
@@ -5,20 +5,20 @@ module Spree
5
5
  @body_class
6
6
  end
7
7
 
8
- def spree_breadcrumbs(taxon, separator = '&nbsp;')
8
+ def spree_breadcrumbs(taxon, separator = '')
9
9
  return '' if current_page?('/') || taxon.nil?
10
10
 
11
11
  separator = raw(separator)
12
- 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')]
12
+ 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')]
13
13
  if taxon
14
- crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, Spree.t(:products), itemprop: 'name'), spree.products_path, itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement')
15
- crumbs << taxon.ancestors.collect { |ancestor| content_tag(:li, content_tag(:span, link_to(content_tag(:span, ancestor.name, itemprop: 'name'), seo_url(ancestor), itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement') } unless taxon.ancestors.empty?
16
- crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, taxon.name, itemprop: 'name'), seo_url(taxon), itemprop: 'url'), itemprop: 'item'), class: 'active', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement')
14
+ crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, Spree.t(:products), itemprop: 'name'), spree.products_path, itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', class: 'breadcrumb-item')
15
+ crumbs << taxon.ancestors.collect { |ancestor| content_tag(:li, content_tag(:span, link_to(content_tag(:span, ancestor.name, itemprop: 'name'), seo_url(ancestor), itemprop: 'url') + separator, itemprop: 'item'), itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement', class: 'breadcrumb-item') } unless taxon.ancestors.empty?
16
+ crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, taxon.name, itemprop: 'name'), seo_url(taxon), itemprop: 'url'), itemprop: 'item'), class: 'active breadcrumb-item', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement')
17
17
  else
18
18
  crumbs << content_tag(:li, content_tag(:span, Spree.t(:products), itemprop: 'item'), class: 'active', itemscope: 'itemscope', itemtype: 'https://schema.org/ListItem', itemprop: 'itemListElement')
19
19
  end
20
20
  crumb_list = content_tag(:ol, raw(crumbs.flatten.map(&:mb_chars).join), class: 'breadcrumb', itemscope: 'itemscope', itemtype: 'https://schema.org/BreadcrumbList')
21
- content_tag(:nav, crumb_list, id: 'breadcrumbs', class: 'col-md-12')
21
+ content_tag(:nav, crumb_list, id: 'breadcrumbs', class: 'col-12 mt-4', aria: { label: 'breadcrumb' })
22
22
  end
23
23
 
24
24
  def checkout_progress(numbers: false)
@@ -27,13 +27,13 @@ module Spree
27
27
  text = Spree.t("order_state.#{state}").titleize
28
28
  text.prepend("#{i.succ}. ") if numbers
29
29
 
30
- css_classes = []
30
+ css_classes = ['nav-item']
31
31
  current_index = states.index(@order.state)
32
32
  state_index = states.index(state)
33
33
 
34
34
  if state_index < current_index
35
35
  css_classes << 'completed'
36
- text = link_to text, checkout_state_path(state)
36
+ text = link_to text, checkout_state_path(state), class: 'nav-link'
37
37
  end
38
38
 
39
39
  css_classes << 'next' if state_index == current_index + 1
@@ -45,10 +45,10 @@ module Spree
45
45
  if state_index < current_index
46
46
  content_tag('li', text, class: css_classes.join(' '))
47
47
  else
48
- content_tag('li', content_tag('a', text), class: css_classes.join(' '))
48
+ content_tag('li', content_tag('a', text, class: "nav-link #{'active text-white' if state == @order.state}"), class: css_classes.join(' '))
49
49
  end
50
50
  end
51
- content_tag('ul', raw(items.join("\n")), class: 'progress-steps nav nav-pills nav-justified', id: "checkout-step-#{@order.state}")
51
+ content_tag('ul', raw(items.join("\n")), class: 'progress-steps nav nav-pills nav-justified flex-column flex-md-row', id: "checkout-step-#{@order.state}")
52
52
  end
53
53
 
54
54
  def flash_messages(opts = {})
@@ -68,11 +68,12 @@ module Spree
68
68
  text = "<span class='glyphicon glyphicon-shopping-cart'></span> #{text}: (#{Spree.t('empty')})"
69
69
  css_class = 'empty'
70
70
  else
71
- text = "<span class='glyphicon glyphicon-shopping-cart'></span> #{text}: (#{simple_current_order.item_count}) <span class='amount'>#{simple_current_order.display_total.to_html}</span>"
71
+ text = "<span class='glyphicon glyphicon-shopping-cart'></span> #{text}: (#{simple_current_order.item_count})
72
+ <span class='amount'>#{simple_current_order.display_total.to_html}</span>"
72
73
  css_class = 'full'
73
74
  end
74
75
 
75
- link_to text.html_safe, spree.cart_path, class: "cart-info #{css_class}"
76
+ link_to text.html_safe, spree.cart_path, class: "cart-info nav-link #{css_class}"
76
77
  end
77
78
 
78
79
  def taxons_tree(root_taxon, current_taxon, max_level = 1)
@@ -80,15 +81,15 @@ module Spree
80
81
 
81
82
  content_tag :div, class: 'list-group' do
82
83
  taxons = root_taxon.children.map do |taxon|
83
- css_class = current_taxon&.self_and_ancestors&.include?(taxon) ? 'list-group-item active' : 'list-group-item'
84
+ css_class = current_taxon&.self_and_ancestors&.include?(taxon) ? 'list-group-item list-group-item-action active' : 'list-group-item list-group-item-action'
84
85
  link_to(taxon.name, seo_url(taxon), class: css_class) + taxons_tree(taxon, current_taxon, max_level - 1)
85
86
  end
86
87
  safe_join(taxons, "\n")
87
88
  end
88
89
  end
89
90
 
90
- def set_image_alt(image, size)
91
- image.alt.present? ? image.alt : image_alt(main_app.url_for(image.url(size)))
91
+ def set_image_alt(image)
92
+ return image.alt if image.alt.present?
92
93
  end
93
94
  end
94
95
  end
@@ -7,7 +7,7 @@
7
7
  remote: data-remote
8
8
  -%>
9
9
  <% unless current_page.first? %>
10
- <li class="first">
11
- <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote %>
10
+ <li class="first page-item">
11
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote, class: 'page-link' %>
12
12
  </li>
13
13
  <% end %>
@@ -5,4 +5,8 @@
5
5
  per_page: number of items to fetch per page
6
6
  remote: data-remote
7
7
  -%>
8
- <li class="page gap disabled"><a href="#" onclick="return false;"><%= raw(t 'views.pagination.truncate') %></a></li>
8
+ <li class="page gap disabled page-item">
9
+ <a href="#" onclick="return false;" class="page-link">
10
+ <%= raw(t 'views.pagination.truncate') %>
11
+ </a>
12
+ </li>
@@ -7,7 +7,7 @@
7
7
  remote: data-remote
8
8
  -%>
9
9
  <% unless current_page.last? %>
10
- <li class="last next"><%# "next" class present for border styling in twitter bootstrap %>
11
- <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {remote: remote} %>
10
+ <li class="last next page-item"><%# "next" class present for border styling in twitter bootstrap %>
11
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, remote: remote, class: 'page-link' %>
12
12
  </li>
13
13
  <% end %>
@@ -7,7 +7,7 @@
7
7
  remote: data-remote
8
8
  -%>
9
9
  <% unless current_page.last? %>
10
- <li class="next_page">
11
- <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, rel: 'next', remote: remote %>
10
+ <li class="next_page page-item">
11
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, rel: 'next', remote: remote, class: 'page-link' %>
12
12
  </li>
13
13
  <% end %>
@@ -7,6 +7,12 @@
7
7
  per_page: number of items to fetch per page
8
8
  remote: data-remote
9
9
  -%>
10
- <li class="page<%= ' active' if page.current? %>">
11
- <%= link_to page, url, opts = {remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
10
+ <li class="page<%= ' active' if page.current? %> page-item">
11
+ <%= link_to page,
12
+ url,
13
+ opts = {
14
+ remote: remote,
15
+ rel: page.next? ? 'next' : page.prev? ? 'prev' : nil,
16
+ class: 'page-link'
17
+ } %>
12
18
  </li>
@@ -9,7 +9,7 @@
9
9
  <% pagination_class ||= '' %>
10
10
 
11
11
  <%= paginator.render do %>
12
- <ul class="pagination <%= pagination_class %>">
12
+ <ul class="pagination mt-4 <%= pagination_class %>">
13
13
  <%= first_page_tag unless current_page.first? %>
14
14
  <%= prev_page_tag unless current_page.first? %>
15
15
  <% each_page do |page| %>
@@ -7,7 +7,7 @@
7
7
  remote: data-remote
8
8
  -%>
9
9
  <% unless current_page.first? %>
10
- <li class="prev">
11
- <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, rel: 'prev', remote: remote %>
10
+ <li class="prev page-item">
11
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, rel: 'prev', remote: remote, class: 'page-link' %>
12
12
  </li>
13
13
  <% end %>
@@ -1,51 +1,52 @@
1
1
  <% address_id = address_type.chars.first %>
2
2
 
3
3
  <div class="inner" data-hook=<%="#{address_type}_inner" %>>
4
- <p class="form-group" id=<%="#{address_id}firstname" %>>
4
+ <div class="form-group" id=<%="#{address_id}firstname" %>>
5
5
  <%= form.label :firstname do %>
6
6
  <%= Spree.t(:first_name) %><abbr class="required" title="required">*</abbr>
7
7
  <% end %>
8
8
  <%= form.text_field :firstname, class: 'form-control', required: true %>
9
- </p>
10
- <p class="form-group" id=<%="#{address_id}lastname" %>>
9
+ </div>
10
+ <div class="form-group" id=<%="#{address_id}lastname" %>>
11
11
  <%= form.label :lastname do %>
12
12
  <%= Spree.t(:last_name) %><abbr class="required" title="required">*</abbr>
13
13
  <% end %>
14
14
  <%= form.text_field :lastname, class: 'form-control', required: true %>
15
- </p>
15
+ </div>
16
16
  <% if Spree::Config[:company] %>
17
- <p class="form-group" id=<%="#{address_id}company" %>>
17
+ <div class="form-group" id=<%="#{address_id}company" %>>
18
18
  <%= form.label :company, Spree.t(:company) %>
19
19
  <%= form.text_field :company, class: 'form-control' %>
20
- </p>
20
+ </div>
21
21
  <% end %>
22
- <p class="form-group" id=<%="#{address_id}address1" %>>
22
+ <div class="form-group" id=<%="#{address_id}address1" %>>
23
23
  <%= form.label :address1 do %>
24
24
  <%= Spree.t(:street_address) %><abbr class="required" title="required">*</abbr>
25
25
  <% end %>
26
26
  <%= form.text_field :address1, class: 'form-control required' %>
27
- </p>
28
- <p class="form-group" id=<%="#{address_id}address2" %>>
27
+ </div>
28
+ <div class="form-group" id=<%="#{address_id}address2" %>>
29
29
  <%= form.label :address2, Spree.t(:street_address_2) %>
30
30
  <%= form.text_field :address2, class: 'form-control' %>
31
- </p>
32
- <p class="form-group" id=<%="#{address_id}city" %>>
31
+ </div>
32
+ <div class="form-group" id=<%="#{address_id}city" %>>
33
33
  <%= form.label :city do %>
34
34
  <%= Spree.t(:city) %><abbr class="required" title="required">*</abbr>
35
35
  <% end %>
36
36
  <%= form.text_field :city, class: 'form-control', required: true %>
37
- </p>
38
- <p class="form-group" id=<%="#{address_id}country" %>>
37
+ </div>
38
+
39
+ <div class="form-group" id=<%="#{address_id}country" %>>
39
40
  <%= form.label :country_id do %>
40
41
  <%= Spree.t(:country) %><abbr class="required" title="required">*</abbr>
41
42
  <% end %>
42
43
  <span id=<%="#{address_id}country-selection" %>>
43
44
  <%= form.collection_select :country_id, available_countries, :id, :name, {}, { class: 'form-control', required: true } %>
44
45
  </span>
45
- </p>
46
+ </div>
46
47
 
47
48
  <% if Spree::Config[:address_requires_state] %>
48
- <p class="form-group" id=<%="#{address_id}state" %>>
49
+ <div class="form-group" id=<%="#{address_id}state" %>>
49
50
  <% have_states = !address.country.states.empty? %>
50
51
  <%= form.label :state do %>
51
52
  <%= Spree.t(:state) %><abbr class='required' title="required" id=<%="#{address_id}state-required"%>>*</abbr>
@@ -55,37 +56,39 @@
55
56
  form.collection_select(:state_id, address.country.states,
56
57
  :id, :name,
57
58
  {include_blank: true},
58
- {class: have_states ? 'form-control' : 'form-control hidden',
59
+ {class: have_states ? 'form-control' : 'hidden',
59
60
  required: have_states,
60
61
  disabled: !have_states}) +
61
62
  form.text_field(:state_name,
62
- class: !have_states ? 'form-control' : 'form-control hidden',
63
+ class: !have_states ? 'form-control' : 'hidden',
63
64
  required: !have_states,
64
65
  disabled: have_states)
65
66
  ].join.gsub('"', "'").gsub("\n", "")
66
67
  %>
67
- </p>
68
+ </div>
68
69
  <noscript>
69
70
  <%= form.text_field :state_name, class: 'form-control', required: true %>
70
71
  </noscript>
71
72
  <% end %>
72
73
 
73
- <p class="form-group" id=<%="#{address_id}zipcode" %>>
74
+ <div class="form-group" id=<%="#{address_id}zipcode" %>>
74
75
  <%= form.label :zipcode do %>
75
76
  <%= Spree.t(:zip) %><% if address.require_zipcode? %><abbr class="required" title="required">*</abbr><% end %>
76
77
  <% end %>
77
78
  <%= form.text_field :zipcode, class: 'form-control', required: address.require_zipcode? %>
78
- </p>
79
- <p class="form-group" id=<%="#{address_id}phone" %>>
79
+ </div>
80
+
81
+
82
+ <div class="form-group" id=<%="#{address_id}phone" %>>
80
83
  <%= form.label :phone do %>
81
84
  <%= Spree.t(:phone) %><% if address.require_phone? %><abbr class="required" title="required">*</abbr><% end %>
82
85
  <% end %>
83
86
  <%= form.phone_field :phone, class: 'form-control', required: address.require_phone? %>
84
- </p>
87
+ </div>
85
88
  <% if Spree::Config[:alternative_shipping_phone] %>
86
- <p class="form-group" id=<%="#{address_id}altphone" %>>
89
+ <div class="form-group" id=<%="#{address_id}altphone" %>>
87
90
  <%= form.label :alternative_phone, Spree.t(:alternative_phone) %>
88
91
  <%= form.phone_field :alternative_phone, class: 'form-control' %>
89
- </p>
92
+ </div>
90
93
  <% end %>
91
94
  </div>
@@ -0,0 +1,18 @@
1
+ <% address_id = address_type.chars.first %>
2
+
3
+ <% Spree::Address::ADDRESS_FIELDS.each do |field| %>
4
+ <% if field == "country" %>
5
+ <div class="form-group" id="<%= "#{address_id}country" %>">
6
+ <%= address_form.label :country_id, Spree.t(:country) %><span class="required">*</span><br />
7
+ <span id="<%= "#{address_id}country-selection" %>">
8
+ <%= address_form.collection_select :country_id, available_countries, :id, :name, {}, {:class => 'required form-control'} %>
9
+ </span>
10
+ </div>
11
+ <% elsif field == "state" %>
12
+ <%= address_field(address_form, :state, address_id) { address_state(address_form, address.country, address_id)} if Spree::Config[:address_requires_state] %>
13
+ <% else %>
14
+ <% next if field == "company" && !Spree::Config[:company] %>
15
+ <% next if field == "alternative_#{address_id}_phone" && !Spree::Config["alternative_#{address_id}_phone"] %>
16
+ <%= address_field(address_form, field.to_sym, address_id) %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,2 @@
1
+ $("#billing_address_<%= @address.id %>").fadeOut();
2
+ $("#shipping_address_<%= @address.id %>").fadeOut();
@@ -0,0 +1,23 @@
1
+ <div class="col-lg-6 offset-lg-3">
2
+ <div class="card mb-3">
3
+ <div class="card-header">
4
+ <h3 class="card-title mb-0 h5"><%= t(:edit_shipping_address, scope: :address_book) %></h3>
5
+ </div>
6
+ <div class="card-body">
7
+ <%= render 'spree/shared/error_messages', target: @address %>
8
+ <%= form_for @address, html: { id: 'checkout_form_address' } do |f| %>
9
+ <fieldset>
10
+ <div class="inner">
11
+ <%= render 'spree/addresses/form',
12
+ address_name: 'address',
13
+ address_form: f,
14
+ address_type: 'shipping',
15
+ address: @address
16
+ %>
17
+ </div>
18
+ <%= f.submit Spree.t(:update), class: 'btn btn-primary' %>
19
+ </fieldset>
20
+ <% end %>
21
+ </div>
22
+ </div>
23
+ </div>
@@ -0,0 +1,23 @@
1
+ <div class="col-lg-6 offset-lg-3">
2
+ <div class="card mb-3">
3
+ <div class="card-header">
4
+ <h3 class="card-title h5 mb-0"><%= t(:new_shipping_address, scope: :address_book) %></h3>
5
+ </div>
6
+ <div class="card-body">
7
+ <%= render 'spree/shared/error_messages', target: @address %>
8
+ <%= form_for @address, html: { id: 'checkout_form_address' } do |f| %>
9
+ <fieldset>
10
+ <div class="inner">
11
+ <%= render 'spree/addresses/form',
12
+ address_name: 'address',
13
+ address_form: f,
14
+ address_type: 'shipping',
15
+ address: @address
16
+ %>
17
+ </div>
18
+ <%= f.submit t(:save, scope: :address_book), class: 'btn btn-primary' %>
19
+ </fieldset>
20
+ <% end %>
21
+ </div>
22
+ </div>
23
+ </div>
@@ -1,44 +1,68 @@
1
- <div class="row">
2
- <div class="col-sm-6" data-hook="billing_fieldset_wrapper">
3
- <div class="panel panel-default" id="billing" data-hook>
4
- <%= form.fields_for :bill_address do |bill_form| %>
5
- <div class="panel-heading">
6
- <h3 class="panel-title"><%= Spree.t(:billing_address) %></h3>
7
- </div>
8
- <div class="panel-body">
9
- <%= render partial: 'spree/address/form', locals: { form: bill_form, address_type: 'billing', address: @order.bill_address } %>
10
- </div>
11
- <% end %>
12
- </div>
13
- </div>
1
+ <% @addresses = try_spree_current_user ? try_spree_current_user.addresses : [] %>
14
2
 
15
- <div class="col-sm-6" data-hook="shipping_fieldset_wrapper">
16
- <div class="panel panel-default" id="shipping" data-hook>
17
- <%= form.fields_for :ship_address do |ship_form| %>
18
- <div class="panel-heading">
19
- <h3 class="panel-title"><%= Spree.t(:shipping_address) %></h3>
3
+ <div class="row">
4
+ <% ['billing', 'shipping'].each do |address_type|
5
+ address_name = "#{address_type[0...4]}_address" %>
6
+ <div class="col-12 col-md-6 mb-4" data-hook="<%= address_type %>_fieldset_wrapper">
7
+ <div class="card card-default" id="<%= address_type %>" data-hook>
8
+ <div class="card-header">
9
+ <h5 class="mb-0">
10
+ <%= Spree.t(address_type + '_address') %>
11
+ </h5>
20
12
  </div>
21
- <div class="panel-body">
22
- <p class="field checkbox" data-hook="use_billing">
23
- <%= label_tag :order_use_billing, id: 'use_billing' do %>
24
- <%= check_box_tag 'order[use_billing]', '1', @order.shipping_eq_billing_address? %>
25
- <%= Spree.t(:use_billing_address) %>
26
- <% end %>
27
- </p>
28
- <%= render partial: 'spree/address/form', locals: { form: ship_form, address_type: 'shipping', address: @order.ship_address } %>
13
+ <div class="card-body">
14
+ <% if address_type == 'shipping' %>
15
+ <div class="mb-0 form-check" data-hook="use_billing">
16
+ <%= label_tag :order_use_billing, id: 'use_billing' do %>
17
+ <%= check_box_tag 'order[use_billing]', '1', @order.shipping_eq_billing_address?, { class: 'form-check-input'} %>
18
+ <%= Spree.t(:use_billing_address) %>
19
+ <% end %>
20
+ </div>
21
+ <% end %>
22
+ <% if @addresses.present? %>
23
+ <div class="select_address">
24
+ <div class="form-group">
25
+ <% @addresses.each_with_index do |address, idx| %>
26
+ <span class="d-block mb-2" id="<%= [address_type, dom_id(address)].join('_') %>">
27
+ <label class="form-check-label">
28
+ <%= form.radio_button "#{address_name}_id", address.id, checked: (address.id == try_spree_current_user["#{address_name}_id"] || idx == 0) %> <%= address.to_s.html_safe %>
29
+ </label>
30
+ <a class="mb-3" href="<%= edit_address_path(address) %>" data-hook="edit_address"><%= Spree.t(:edit) %></a>
31
+ </span>
32
+ <% end %>
33
+ <div class="form-check">
34
+ <label class="form-check-label">
35
+ <%= form.radio_button "#{address_name}_id", 0, class: 'form-check-input' %> <%= Spree.t('address_book.other_address') %>
36
+ </label>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <% end %>
41
+ <%= form.fields_for address_name do |address_form| %>
42
+ <div class="inner" data-hook=<%="#{address_type}_inner" %>>
43
+ <%= render partial: 'spree/addresses/form', locals: {
44
+ address_name: address_name,
45
+ address_form: address_form,
46
+ address_type: address_type,
47
+ address: Spree::Address.default
48
+ } %>
49
+ </div>
50
+ <% end %>
29
51
  </div>
30
- <% end %>
52
+ </div>
31
53
  </div>
32
- </div>
54
+ <% end %>
33
55
  </div>
34
56
 
35
- <div class="well text-right form-buttons" data-hook="buttons">
36
- <%= submit_tag Spree.t(:save_and_continue), class: 'btn btn-lg btn-success' %>
37
- <% if try_spree_current_user %>
38
- <span data-hook="save_user_address" class='save-user-address-wrapper'>
39
- &nbsp; &nbsp;
40
- <%= check_box_tag 'save_user_address', '1', try_spree_current_user.respond_to?(:persist_order_address) %>
41
- <%= label_tag :save_user_address, Spree.t(:save_my_address) %>
42
- </span>
43
- <% end %>
57
+ <div class="card text-right form-buttons my-4" data-hook="buttons">
58
+ <div class="card-body">
59
+ <%= submit_tag Spree.t(:save_and_continue), class: 'btn btn-lg btn-success' %>
60
+ <% if try_spree_current_user %>
61
+ <span data-hook="save_user_address" class='save-user-address-wrapper'>
62
+ &nbsp; &nbsp;
63
+ <%= check_box_tag 'save_user_address', '1', try_spree_current_user.respond_to?(:persist_order_address) %>
64
+ <%= label_tag :save_user_address, Spree.t(:save_my_address) %>
65
+ </span>
66
+ <% end %>
67
+ </div>
44
68
  </div>
@@ -1,16 +1,18 @@
1
- <div class="panel panel-default" id="order_details" data-hook>
2
- <div class="panel-heading">
3
- <h3 class="panel-title"><%= Spree.t(:confirm) %></h3>
1
+ <div class="card" id="order_details" data-hook>
2
+ <div class="card-header">
3
+ <h3 class="card-title mb-0 h5"><%= Spree.t(:confirm) %></h3>
4
4
  </div>
5
- <div class="panel-body">
5
+ <div class="card-body">
6
6
  <%= render partial: 'spree/shared/order_details', locals: { order: @order } %>
7
7
  </div>
8
8
  </div>
9
9
 
10
- <div class="well text-right form-buttons" data-hook="buttons">
11
- <% if @order.using_store_credit? %>
12
- <%= button_tag Spree.t('store_credit.remove'), name: 'remove_store_credit', class: 'continue btn' %>
13
- <% end %>
14
- <%= submit_tag Spree.t(:place_order), class: 'btn btn-lg btn-success' %>
15
- <script>Spree.disableSaveOnClick();</script>
10
+ <div class="card text-right form-buttons mt-4" data-hook="buttons">
11
+ <div class="card-body">
12
+ <% if @order.using_store_credit? %>
13
+ <%= button_tag Spree.t('store_credit.remove'), name: 'remove_store_credit', class: 'continue btn' %>
14
+ <% end %>
15
+ <%= submit_tag Spree.t(:place_order), class: 'btn btn-lg btn-success' %>
16
+ <script>Spree.disableSaveOnClick();</script>
17
+ </div>
16
18
  </div>