spree_core 4.2.7 → 4.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. checksums.yaml +4 -4
  2. data/app/finders/concerns/spree/product_filterable.rb +9 -0
  3. data/app/finders/spree/cms_pages/find.rb +41 -0
  4. data/app/finders/spree/menus/find.rb +11 -0
  5. data/app/finders/spree/option_values/find_available.rb +20 -0
  6. data/app/finders/spree/orders/find_complete.rb +14 -2
  7. data/app/finders/spree/orders/find_current.rb +1 -13
  8. data/app/finders/spree/product_properties/find_available.rb +20 -0
  9. data/app/finders/spree/products/find.rb +55 -20
  10. data/app/finders/spree/stores/find_current.rb +24 -0
  11. data/app/helpers/spree/base_helper.rb +62 -2
  12. data/app/helpers/spree/locale_helper.rb +5 -1
  13. data/app/helpers/spree/products_helper.rb +7 -3
  14. data/app/models/concerns/spree/display_link.rb +42 -0
  15. data/app/models/concerns/spree/filter_param.rb +21 -0
  16. data/app/models/concerns/spree/memoized_data.rb +24 -0
  17. data/app/models/concerns/spree/multi_store_resource.rb +24 -0
  18. data/app/models/concerns/spree/product_scopes.rb +59 -8
  19. data/app/models/concerns/spree/single_store_resource.rb +9 -0
  20. data/app/models/concerns/spree/user_address.rb +19 -0
  21. data/app/models/concerns/spree/user_methods.rb +5 -4
  22. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  23. data/app/models/spree/ability.rb +3 -1
  24. data/app/models/spree/address.rb +27 -6
  25. data/app/models/spree/app_configuration.rb +8 -0
  26. data/app/models/spree/app_dependencies.rb +18 -6
  27. data/app/models/spree/base.rb +18 -0
  28. data/app/models/spree/classification.rb +3 -0
  29. data/app/models/spree/cms/pages/feature_page.rb +7 -0
  30. data/app/models/spree/cms/pages/homepage.rb +20 -0
  31. data/app/models/spree/cms/pages/standard_page.rb +4 -0
  32. data/app/models/spree/cms/sections/featured_article.rb +29 -0
  33. data/app/models/spree/cms/sections/hero_image.rb +47 -0
  34. data/app/models/spree/cms/sections/image_gallery.rb +103 -0
  35. data/app/models/spree/cms/sections/product_carousel.rb +14 -0
  36. data/app/models/spree/cms/sections/rich_text_content.rb +13 -0
  37. data/app/models/spree/cms/sections/side_by_side_images.rb +74 -0
  38. data/app/models/spree/cms_page.rb +66 -0
  39. data/app/models/spree/cms_section.rb +57 -0
  40. data/app/models/spree/country.rb +14 -6
  41. data/app/models/spree/credit_card.rb +2 -8
  42. data/app/models/spree/customer_return.rb +8 -2
  43. data/app/models/spree/icon.rb +9 -0
  44. data/app/models/spree/image/configuration/active_storage.rb +2 -0
  45. data/app/models/spree/inventory_unit.rb +1 -1
  46. data/app/models/spree/line_item.rb +1 -1
  47. data/app/models/spree/menu.rb +63 -0
  48. data/app/models/spree/menu_item.rb +76 -0
  49. data/app/models/spree/option_type.rb +1 -1
  50. data/app/models/spree/option_value.rb +11 -0
  51. data/app/models/spree/option_value_variant.rb +1 -1
  52. data/app/models/spree/order/address_book.rb +3 -5
  53. data/app/models/spree/order/currency_updater.rb +1 -1
  54. data/app/models/spree/order/emails.rb +32 -0
  55. data/app/models/spree/order/payments.rb +1 -1
  56. data/app/models/spree/order/store_credit.rb +1 -9
  57. data/app/models/spree/order.rb +46 -45
  58. data/app/models/spree/payment.rb +7 -0
  59. data/app/models/spree/payment_method.rb +4 -0
  60. data/app/models/spree/preferences/preferable.rb +12 -0
  61. data/app/models/spree/preferences/preferable_class_methods.rb +10 -1
  62. data/app/models/spree/product.rb +27 -22
  63. data/app/models/spree/product_property.rb +19 -4
  64. data/app/models/spree/promotion/rules/country.rb +1 -1
  65. data/app/models/spree/promotion/rules/first_order.rb +4 -3
  66. data/app/models/spree/promotion/rules/taxon.rb +10 -7
  67. data/app/models/spree/promotion.rb +6 -15
  68. data/app/models/spree/promotion_handler/cart.rb +7 -2
  69. data/app/models/spree/promotion_handler/coupon.rb +5 -4
  70. data/app/models/spree/promotion_handler/free_shipping.rb +5 -6
  71. data/app/models/spree/promotion_handler/page.rb +3 -2
  72. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -0
  73. data/app/models/spree/promotion_rule.rb +2 -0
  74. data/app/models/spree/property.rb +27 -0
  75. data/app/models/spree/reimbursement.rb +3 -1
  76. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -1
  77. data/app/models/spree/shipment_handler.rb +4 -2
  78. data/app/models/spree/stock/quantifier.rb +6 -6
  79. data/app/models/spree/store.rb +90 -7
  80. data/app/models/spree/store_credit.rb +7 -3
  81. data/app/models/spree/store_credit_event.rb +2 -2
  82. data/app/models/spree/store_payment_method.rb +11 -0
  83. data/app/models/spree/store_product.rb +11 -0
  84. data/app/models/spree/store_promotion.rb +11 -0
  85. data/app/models/spree/taxon.rb +21 -1
  86. data/app/models/spree/taxon_image/configuration/active_storage.rb +2 -0
  87. data/app/models/spree/taxonomy.rb +3 -1
  88. data/app/models/spree/variant.rb +13 -4
  89. data/app/presenters/spree/filters/options_presenter.rb +27 -0
  90. data/app/presenters/spree/filters/price_presenter.rb +22 -0
  91. data/app/presenters/spree/filters/price_range_presenter.rb +29 -0
  92. data/app/presenters/spree/filters/properties_presenter.rb +23 -0
  93. data/app/presenters/spree/filters/property_presenter.rb +22 -0
  94. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +44 -0
  95. data/app/services/spree/account/addresses/create.rb +1 -0
  96. data/app/services/spree/account/addresses/helper.rb +6 -0
  97. data/app/services/spree/account/addresses/update.rb +9 -3
  98. data/app/services/spree/account/create.rb +17 -0
  99. data/app/services/spree/account/update.rb +15 -0
  100. data/app/services/spree/build_localized_redirect_url.rb +1 -1
  101. data/app/services/spree/cart/create.rb +5 -3
  102. data/app/services/spree/cart/destroy.rb +40 -0
  103. data/app/services/spree/cart/empty.rb +36 -0
  104. data/app/services/spree/cart/estimate_shipping_rates.rb +3 -3
  105. data/app/services/spree/checkout/add_store_credit.rb +1 -1
  106. data/app/services/spree/classifications/reposition.rb +18 -0
  107. data/app/services/spree/credit_cards/destroy.rb +41 -0
  108. data/app/validators/db_maximum_length_validator.rb +5 -0
  109. data/app/validators/email_validator.rb +3 -1
  110. data/app/views/spree/shared/_purchased_items_table.text.erb +25 -0
  111. data/config/initializers/active_storage.rb +2 -0
  112. data/config/locales/en.yml +166 -2
  113. data/config/routes.rb +0 -5
  114. data/db/migrate/20201023152810_add_filterable_to_spree_properties.rb +8 -0
  115. data/db/migrate/20210407200948_create_spree_menus.rb +16 -0
  116. data/db/migrate/20210408092939_create_spree_menu_items.rb +31 -0
  117. data/db/migrate/20210504163720_add_filter_param_to_spree_product_properties.rb +8 -0
  118. data/db/migrate/20210505114659_add_filter_param_to_spree_properties.rb +8 -0
  119. data/db/migrate/20210512191732_create_spree_cms_pages.rb +24 -0
  120. data/db/migrate/20210514204251_create_spree_cms_sections.rb +22 -0
  121. data/db/migrate/20210527094055_create_spree_products_stores.rb +29 -0
  122. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +5 -0
  123. data/db/migrate/20210702112334_add_missing_timestamp_columns.rb +46 -0
  124. data/db/migrate/20210713131614_add_unique_index_on_property_id_and_product_id_to_product_properties.rb +29 -0
  125. data/db/migrate/20210715091956_add_store_id_to_spree_store_credits.rb +10 -0
  126. data/db/migrate/20210716093151_add_store_id_to_spree_taxonomies.rb +11 -0
  127. data/db/migrate/20210716104141_add_index_on_name_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  128. data/db/migrate/20210721120857_add_index_on_permalink_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  129. data/db/migrate/20210721125657_create_spree_promotions_stores.rb +29 -0
  130. data/db/migrate/20210722090705_add_store_id_to_spree_customer_returns.rb +11 -0
  131. data/db/migrate/20210726065456_change_integer_id_columns_into_bigint.rb +305 -0
  132. data/db/migrate/20210730154425_fix_promotion_code_and_path_unique_indexes.rb +9 -0
  133. data/lib/generators/spree/dummy/dummy_generator.rb +11 -6
  134. data/lib/generators/spree/dummy_model/templates/model.rb.tt +1 -1
  135. data/lib/generators/spree/install/install_generator.rb +12 -24
  136. data/lib/spree/core/components.rb +8 -0
  137. data/lib/spree/core/controller_helpers/auth.rb +7 -1
  138. data/lib/spree/core/controller_helpers/common.rb +1 -1
  139. data/lib/spree/core/controller_helpers/order.rb +4 -4
  140. data/lib/spree/core/controller_helpers/search.rb +1 -0
  141. data/lib/spree/core/controller_helpers/store.rb +10 -1
  142. data/lib/spree/core/engine.rb +6 -0
  143. data/lib/spree/core/importer/product.rb +3 -1
  144. data/lib/spree/core/product_duplicator.rb +1 -0
  145. data/lib/spree/core/search/base.rb +17 -22
  146. data/lib/spree/core/version.rb +1 -1
  147. data/lib/spree/core.rb +8 -4
  148. data/lib/spree/i18n.rb +1 -1
  149. data/lib/spree/money.rb +2 -1
  150. data/lib/spree/permitted_attributes.rb +14 -3
  151. data/lib/spree/testing_support/authorization_helpers.rb +6 -3
  152. data/lib/spree/testing_support/capybara_config.rb +3 -1
  153. data/lib/spree/testing_support/common_rake.rb +17 -4
  154. data/lib/spree/testing_support/extension_rake.rb +2 -2
  155. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  156. data/lib/spree/testing_support/factories/classification_factory.rb +8 -0
  157. data/lib/spree/testing_support/factories/cms_page_factory.rb +20 -0
  158. data/lib/spree/testing_support/factories/cms_section_factory.rb +31 -0
  159. data/lib/spree/testing_support/factories/customer_return_factory.rb +24 -17
  160. data/lib/spree/testing_support/factories/icon_factory.rb +7 -0
  161. data/lib/spree/testing_support/factories/line_item_factory.rb +6 -2
  162. data/lib/spree/testing_support/factories/menu_factory.rb +16 -0
  163. data/lib/spree/testing_support/factories/menu_item_factory.rb +10 -0
  164. data/lib/spree/testing_support/factories/options_factory.rb +5 -0
  165. data/lib/spree/testing_support/factories/order_factory.rb +11 -2
  166. data/lib/spree/testing_support/factories/payment_method_factory.rb +6 -2
  167. data/lib/spree/testing_support/factories/product_factory.rb +11 -1
  168. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/promotion_factory.rb +18 -9
  170. data/lib/spree/testing_support/factories/property_factory.rb +22 -0
  171. data/lib/spree/testing_support/factories/stock_location_factory.rb +5 -4
  172. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -0
  173. data/lib/spree/testing_support/factories/store_factory.rb +11 -0
  174. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -1
  175. data/lib/spree/testing_support/factories/taxon_image_factory.rb +7 -0
  176. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -0
  177. data/lib/spree/testing_support/factories/user_factory.rb +7 -2
  178. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  179. data/lib/spree/testing_support/flatpickr_capybara.rb +58 -35
  180. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  181. data/lib/tasks/core.rake +1 -1
  182. data/spec/fixtures/favicon.ico +0 -0
  183. data/spec/fixtures/files/icon_256x256.gif +0 -0
  184. data/spec/fixtures/files/icon_256x256.png +0 -0
  185. data/spec/fixtures/files/icon_512x512.png +0 -0
  186. data/spec/fixtures/files/img_256x128.png +0 -0
  187. data/spree_core.gemspec +11 -10
  188. metadata +207 -159
  189. data/app/assets/images/logo/spree_50.png +0 -0
  190. data/app/assets/images/noimage/large.png +0 -0
  191. data/app/assets/images/noimage/mini.png +0 -0
  192. data/app/assets/images/noimage/product.png +0 -0
  193. data/app/assets/images/noimage/small.png +0 -0
  194. data/app/assets/javascripts/spree.js +0 -78
  195. data/app/controllers/spree/errors_controller.rb +0 -11
  196. data/app/helpers/spree/mail_helper.rb +0 -29
  197. data/app/mailers/spree/base_mailer.rb +0 -46
  198. data/app/mailers/spree/order_mailer.rb +0 -26
  199. data/app/mailers/spree/reimbursement_mailer.rb +0 -12
  200. data/app/mailers/spree/shipment_mailer.rb +0 -12
  201. data/app/mailers/spree/test_mailer.rb +0 -8
  202. data/app/models/spree/order_contents.rb +0 -31
  203. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -22
  204. data/app/views/layouts/spree/base_mailer.html.erb +0 -46
  205. data/app/views/spree/errors/forbidden.html.erb +0 -0
  206. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  207. data/app/views/spree/order_mailer/cancel_email.html.erb +0 -24
  208. data/app/views/spree/order_mailer/cancel_email.text.erb +0 -38
  209. data/app/views/spree/order_mailer/confirm_email.html.erb +0 -23
  210. data/app/views/spree/order_mailer/confirm_email.text.erb +0 -39
  211. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +0 -23
  212. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +0 -38
  213. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -56
  214. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -24
  215. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -12
  216. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -13
  217. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -456
  218. data/app/views/spree/shared/_error_messages.html.erb +0 -11
  219. data/app/views/spree/shared/_mailer_line_item.html.erb +0 -16
  220. data/app/views/spree/shared/_paths.html.erb +0 -8
  221. data/app/views/spree/shared/_purchased_items_table.html.erb +0 -69
  222. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +0 -13
  223. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +0 -27
  224. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +0 -13
  225. data/app/views/spree/shared/purchased_items_table/_total.html.erb +0 -13
  226. data/app/views/spree/shipment_mailer/shipped_email.html.erb +0 -36
  227. data/app/views/spree/shipment_mailer/shipped_email.text.erb +0 -17
  228. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  229. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  230. data/config/initializers/assets.rb +0 -2
  231. data/config/initializers/premailer_assets.rb +0 -1
  232. data/config/initializers/premailer_rails.rb +0 -3
  233. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +0 -10
  234. data/lib/generators/spree/dummy/templates/initializers/bullet.rb +0 -5
  235. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -15
  236. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -16
  237. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -16
  238. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -16
  239. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +0 -23
  240. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +0 -13
  241. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +0 -5
  242. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +0 -5
  243. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +0 -11
  244. data/lib/tasks/email.rake +0 -10
  245. data/vendor/assets/javascripts/cleave.js +0 -1669
  246. data/vendor/assets/javascripts/fetch.umd.js +0 -531
  247. data/vendor/assets/javascripts/jquery.payment.js +0 -652
  248. data/vendor/assets/javascripts/jsuri.js +0 -458
  249. data/vendor/assets/javascripts/polyfill.min.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b469e8dee55a662982149fbc79bb798341a52da2d7d7ded1e0353a4c8010859
4
- data.tar.gz: b633068dd8204485b512dd395216ffbda53e9fc7cc62f113a08b1fcbe7183d4d
3
+ metadata.gz: 2b031163e0c77da6776854068fb9769ed6cd44ff048e75a088ee6526c40db986
4
+ data.tar.gz: 2cfbcbfb7a1c5221270e7b677222a94047b5965cb32e5144ca6540d927f2b51b
5
5
  SHA512:
6
- metadata.gz: feecadebe12b6959f521a39bcce7508acb1f48b815679a7916b0003d6330e96a6003e2f19a9c9b58e76c016e79af71f865586097534013739c1a7371160aabc5
7
- data.tar.gz: c020b19d48c81bf75ae67f1c3404e0b18a69a7d6021a06f0edff442d5bee5d8e7d627d2e207adec190d74b6a4c66f93ec1eaa34bfe1b494e05c1d682846c08f0
6
+ metadata.gz: 375bd44efe93e706a1bd58abcc9be1fb3f2af0b0a993fe223a1e093033193105012284e0a7f03413fad0099feb105fa4b1526b8d576d76e58e62e37967c67768
7
+ data.tar.gz: c82f2406e121b6fff092677e91d0344e35c5b6e19aee5aca1916ee819d7909a42ef854653922413e215c67934cb73df2a1af002fbe3d48f53db99ff854d80f93
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module ProductFilterable
3
+ private
4
+
5
+ def find_available(scope, products_scope)
6
+ scope.filterable.for_products(products_scope)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ module Spree
2
+ module CmsPages
3
+ class Find < ::Spree::BaseFinder
4
+ ALLOWED_KINDS = %w[standard home feature].freeze
5
+
6
+ def initialize(scope:, params:)
7
+ @scope = scope
8
+ @title = params.dig(:filter, :title)
9
+ @kind = params.dig(:filter, :type)
10
+ end
11
+
12
+ def execute
13
+ pages = by_title(scope)
14
+ pages = by_kind(pages)
15
+
16
+ pages
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :scope, :title, :kind
22
+
23
+ def title_matcher
24
+ Spree::CmsPage.arel_table[:title].matches("%#{title}%")
25
+ end
26
+
27
+ def by_title(pages)
28
+ return pages if title.blank?
29
+
30
+ pages.where(title_matcher)
31
+ end
32
+
33
+ def by_kind(pages)
34
+ return pages if kind.blank?
35
+ return pages if ALLOWED_KINDS.exclude?(kind)
36
+
37
+ pages.send(kind)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ module Menus
3
+ class Find < ::Spree::BaseFinder
4
+ def execute
5
+ return scope.where(location: params[:filter]['location']) if params[:filter].present? && params[:filter]['location'].present?
6
+
7
+ scope
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module OptionValues
3
+ class FindAvailable
4
+ include ProductFilterable
5
+
6
+ def initialize(scope: OptionValue.spree_base_scopes, products_scope: Product.spree_base_scopes)
7
+ @scope = scope
8
+ @products_scope = products_scope
9
+ end
10
+
11
+ def execute
12
+ find_available(scope, products_scope)
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :scope, :products_scope
18
+ end
19
+ end
20
+ end
@@ -1,18 +1,20 @@
1
1
  module Spree
2
2
  module Orders
3
3
  class FindComplete
4
- attr_reader :user, :number, :token
4
+ attr_reader :user, :number, :token, :store
5
5
 
6
- def initialize(user: nil, number: nil, token: nil)
6
+ def initialize(user: nil, number: nil, token: nil, store: nil)
7
7
  @user = user
8
8
  @number = number
9
9
  @token = token
10
+ @store = store
10
11
  end
11
12
 
12
13
  def execute
13
14
  orders = by_user(scope)
14
15
  orders = by_number(orders)
15
16
  orders = by_token(orders)
17
+ orders = by_store(orders)
16
18
 
17
19
  orders
18
20
  end
@@ -35,6 +37,10 @@ module Spree
35
37
  token.present?
36
38
  end
37
39
 
40
+ def store?
41
+ store.present?
42
+ end
43
+
38
44
  def by_user(orders)
39
45
  return orders unless user?
40
46
 
@@ -53,6 +59,12 @@ module Spree
53
59
  orders.where(token: token)
54
60
  end
55
61
 
62
+ def by_store(orders)
63
+ return orders unless store?
64
+
65
+ orders.where(store: store)
66
+ end
67
+
56
68
  def scope_includes
57
69
  {
58
70
  line_items: [
@@ -15,19 +15,7 @@ module Spree
15
15
  private
16
16
 
17
17
  def incomplete_orders
18
- Spree::Order.incomplete.not_canceled.includes(scope_includes)
19
- end
20
-
21
- def scope_includes
22
- {
23
- line_items: [
24
- variant: [
25
- :images,
26
- option_values: :option_type,
27
- product: :product_properties,
28
- ]
29
- ]
30
- }
18
+ Spree::Order.incomplete.not_canceled
31
19
  end
32
20
  end
33
21
  end
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module ProductProperties
3
+ class FindAvailable
4
+ include ProductFilterable
5
+
6
+ def initialize(scope: ProductProperty.spree_base_scopes, products_scope: Product.spree_base_scopes)
7
+ @scope = scope
8
+ @products_scope = products_scope
9
+ end
10
+
11
+ def execute
12
+ find_available(scope, products_scope)
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :scope, :products_scope
18
+ end
19
+ end
20
+ end
@@ -1,13 +1,23 @@
1
1
  module Spree
2
2
  module Products
3
3
  class Find
4
- def initialize(scope:, params:, current_currency:)
4
+ def initialize(scope:, params:, current_currency: nil)
5
5
  @scope = scope
6
6
 
7
+ ActiveSupport::Deprecation.warn('`current_currency` param is deprecated and will be removed in Spree 5') if current_currency
8
+
9
+ if current_currency.present?
10
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
11
+ `current_currency` param is deprecated and will be removed in Spree 5.
12
+ Please pass `:currency` in `params` hash instead.
13
+ DEPRECATION
14
+ end
15
+
7
16
  @ids = String(params.dig(:filter, :ids)).split(',')
8
17
  @skus = String(params.dig(:filter, :skus)).split(',')
9
- @price = String(params.dig(:filter, :price)).split(',').map(&:to_f)
10
- @currency = current_currency
18
+ @store = params[:store] || Spree::Store.default
19
+ @price = map_prices(String(params.dig(:filter, :price)).split(','))
20
+ @currency = current_currency || params.dig(:filter, :currency) || params[:currency]
11
21
  @taxons = taxon_ids(params.dig(:filter, :taxons))
12
22
  @concat_taxons = taxon_ids(params.dig(:filter, :concat_taxons))
13
23
  @name = params.dig(:filter, :name)
@@ -16,6 +26,7 @@ module Spree
16
26
  @sort_by = params.dig(:sort_by)
17
27
  @deleted = params.dig(:filter, :show_deleted)
18
28
  @discontinued = params.dig(:filter, :show_discontinued)
29
+ @properties = params.dig(:filter, :properties)
19
30
  end
20
31
 
21
32
  def execute
@@ -28,6 +39,7 @@ module Spree
28
39
  products = by_name(products)
29
40
  products = by_options(products)
30
41
  products = by_option_value_ids(products)
42
+ products = by_properties(products)
31
43
  products = include_deleted(products)
32
44
  products = include_discontinued(products)
33
45
  products = ordered(products)
@@ -38,7 +50,7 @@ module Spree
38
50
  private
39
51
 
40
52
  attr_reader :ids, :skus, :price, :currency, :taxons, :concat_taxons, :name, :options,
41
- :option_value_ids, :scope, :sort_by, :deleted, :discontinued
53
+ :option_value_ids, :scope, :sort_by, :deleted, :discontinued, :properties, :store
42
54
 
43
55
  def ids?
44
56
  ids.present?
@@ -80,8 +92,8 @@ module Spree
80
92
  sort_by.present?
81
93
  end
82
94
 
83
- def name_matcher
84
- Spree::Product.arel_table[:name].matches("%#{name}%")
95
+ def properties?
96
+ properties.present? && properties.values.reject(&:empty?).present?
85
97
  end
86
98
 
87
99
  def by_ids(products)
@@ -99,19 +111,13 @@ module Spree
99
111
  def by_price(products)
100
112
  return products unless price?
101
113
 
102
- products.joins(master: :prices).
103
- where(
104
- spree_prices: {
105
- amount: price.min..price.max,
106
- currency: currency&.upcase
107
- }
108
- )
114
+ products.price_between(price.min, price.max)
109
115
  end
110
116
 
111
117
  def by_currency(products)
112
118
  return products unless currency?
113
119
 
114
- products.joins(master: :prices).where(spree_prices: { currency: currency.upcase })
120
+ products.with_currency(currency)
115
121
  end
116
122
 
117
123
  def by_taxons(products)
@@ -136,7 +142,7 @@ module Spree
136
142
  def by_name(products)
137
143
  return products unless name?
138
144
 
139
- products.where(name_matcher)
145
+ products.like_any([:name], [name])
140
146
  end
141
147
 
142
148
  def by_options(products)
@@ -160,6 +166,27 @@ module Spree
160
166
  products.where(id: product_ids)
161
167
  end
162
168
 
169
+ def by_properties(products)
170
+ return products unless properties?
171
+
172
+ product_ids = []
173
+ index = 0
174
+
175
+ properties.to_unsafe_hash.each do |property_filter_param, product_properties_values|
176
+ next if property_filter_param.blank? || product_properties_values.empty?
177
+
178
+ values = product_properties_values.split(',').reject(&:empty?).uniq.map(&:parameterize)
179
+
180
+ next if values.empty?
181
+
182
+ ids = products.with_property_values(property_filter_param, values).ids
183
+ product_ids = index == 0 ? ids : product_ids & ids
184
+ index += 1
185
+ end
186
+
187
+ products.where(id: product_ids)
188
+ end
189
+
163
190
  def option_types_count(option_value_ids)
164
191
  Spree::OptionValue.
165
192
  where(id: option_value_ids).
@@ -173,12 +200,14 @@ module Spree
173
200
  case sort_by
174
201
  when 'default'
175
202
  if taxons?
176
- products.
177
- select("#{Product.table_name}.*, #{Classification.table_name}.position").
178
- order("#{Classification.table_name}.position" => :asc)
203
+ products.ascend_by_taxons_min_position(taxons)
179
204
  else
180
205
  products
181
206
  end
207
+ when 'name-a-z'
208
+ products.order(name: :asc)
209
+ when 'name-z-a'
210
+ products.order(name: :desc)
182
211
  when 'newest-first'
183
212
  products.order(available_on: :desc)
184
213
  when 'price-high-to-low'
@@ -199,13 +228,19 @@ module Spree
199
228
  end
200
229
 
201
230
  def include_discontinued(products)
202
- discontinued ? products : products.available
231
+ discontinued ? products : products.active(currency)
232
+ end
233
+
234
+ def map_prices(prices)
235
+ prices.map do |price|
236
+ price == 'Infinity' ? Float::INFINITY : price.to_f
237
+ end
203
238
  end
204
239
 
205
240
  def taxon_ids(taxons_ids)
206
241
  return if taxons_ids.nil? || taxons_ids.to_s.blank?
207
242
 
208
- taxons = Spree::Taxon.where(id: taxons_ids.to_s.split(','))
243
+ taxons = store.taxons.where(id: taxons_ids.to_s.split(','))
209
244
  taxons.map(&:cached_self_and_descendants_ids).flatten.compact.uniq.map(&:to_s)
210
245
  end
211
246
  end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module Stores
3
+ class FindCurrent
4
+ def initialize(scope: nil, url: nil)
5
+ @scope = scope || Spree::Store
6
+ @url = url
7
+ end
8
+
9
+ def execute
10
+ by_url(scope) || scope.default
11
+ end
12
+
13
+ protected
14
+
15
+ attr_reader :scope, :url
16
+
17
+ def by_url(scope)
18
+ return if url.blank?
19
+
20
+ scope.by_url(url).first
21
+ end
22
+ end
23
+ end
24
+ end
@@ -9,6 +9,25 @@ module Spree
9
9
  end.sort_by { |c| c.name.parameterize }
10
10
  end
11
11
 
12
+ def all_countries
13
+ countries = Spree::Country.all
14
+
15
+ countries.collect do |country|
16
+ country.name = Spree.t(country.iso, scope: 'country_names', default: country.name)
17
+ country
18
+ end.sort_by { |c| c.name.parameterize }
19
+ end
20
+
21
+ def spree_resource_path(resource)
22
+ last_word = resource.class.name.split('::', 10).last
23
+
24
+ spree_class_name_as_path(last_word)
25
+ end
26
+
27
+ def spree_class_name_as_path(class_name)
28
+ class_name.underscore.humanize.parameterize(separator: '_')
29
+ end
30
+
12
31
  def display_price(product_or_variant)
13
32
  product_or_variant.
14
33
  price_in(current_currency).
@@ -36,6 +55,11 @@ module Spree
36
55
  end
37
56
 
38
57
  def logo(image_path = nil, options = {})
58
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
59
+ `BaseHelper#logo` is deprecated and will be removed in Spree 5.0.
60
+ Please use `FrontendHelper#logo` instead
61
+ DEPRECATION
62
+
39
63
  image_path ||= if current_store.logo.attached? && current_store.logo.variable?
40
64
  main_app.url_for(current_store.logo.variant(resize: '244x104>'))
41
65
  elsif current_store.logo.attached? && current_store.logo.image?
@@ -51,6 +75,10 @@ module Spree
51
75
  end
52
76
  end
53
77
 
78
+ def spree_favicon_path
79
+ main_app.url_for(current_store.favicon || 'favicon.ico')
80
+ end
81
+
54
82
  def object
55
83
  instance_variable_get('@' + controller_name.singularize)
56
84
  end
@@ -95,7 +123,7 @@ module Spree
95
123
  description: [object.name, current_store.meta_description].reject(&:blank?).join(', '))
96
124
  else
97
125
  meta.reverse_merge!(keywords: (current_store.meta_keywords || current_store.seo_title),
98
- description: (current_store.meta_description || current_store.seo_title))
126
+ description: (current_store.homepage(I18n.locale)&.seo_meta_description || current_store.seo_meta_description))
99
127
  end
100
128
  end
101
129
  meta
@@ -143,6 +171,34 @@ module Spree
143
171
  Spree::Core::Engine.frontend_available?
144
172
  end
145
173
 
174
+ def rails_5?
175
+ Rails::VERSION::STRING < '6.0'
176
+ end
177
+
178
+ def spree_storefront_resource_url(resource, options = {})
179
+ if defined?(locale_param) && locale_param.present?
180
+ options.merge!(locale: locale_param)
181
+ end
182
+
183
+ localize = if options[:locale].present?
184
+ "/#{options[:locale]}"
185
+ else
186
+ ''
187
+ end
188
+
189
+ if resource.instance_of?(Spree::Product)
190
+ "#{current_store.formatted_url + localize}/#{Spree::Config[:storefront_products_path]}/#{resource.slug}"
191
+ elsif resource.instance_of?(Spree::Taxon)
192
+ "#{current_store.formatted_url + localize}/#{Spree::Config[:storefront_taxons_path]}/#{resource.permalink}"
193
+ elsif resource.instance_of?(Spree::Cms::Pages::FeaturePage) || resource.instance_of?(Spree::Cms::Pages::StandardPage)
194
+ "#{current_store.formatted_url + localize}/#{Spree::Config[:storefront_pages_path]}/#{resource.slug}"
195
+ elsif localize.blank?
196
+ current_store.formatted_url
197
+ else
198
+ current_store.formatted_url + localize
199
+ end
200
+ end
201
+
146
202
  # we should always try to render image of the default variant
147
203
  # same as it's done on PDP
148
204
  def default_image_for_product(product)
@@ -171,7 +227,7 @@ module Spree
171
227
 
172
228
  def base_cache_key
173
229
  [I18n.locale, current_currency, defined?(try_spree_current_user) && try_spree_current_user.present?,
174
- defined?(try_spree_current_user) && try_spree_current_user.try(:has_spree_role?, 'admin')]
230
+ defined?(try_spree_current_user) && try_spree_current_user.try(:has_spree_role?, 'admin')]
175
231
  end
176
232
 
177
233
  def maximum_quantity
@@ -211,5 +267,9 @@ module Spree
211
267
 
212
268
  tag('meta', name: 'robots', content: current_store.seo_robots)
213
269
  end
270
+
271
+ def taxon_wysiwyg_editor_enabled?
272
+ Spree::Config[:taxon_wysiwyg_editor_enabled]
273
+ end
214
274
  end
215
275
  end
@@ -16,12 +16,16 @@ module Spree
16
16
 
17
17
  def locale_presentation(locale)
18
18
  if I18n.exists?('spree.i18n.this_file_language', locale: locale)
19
- [Spree.t('i18n.this_file_language', locale: locale), locale.to_s]
19
+ [locale_full_name(locale), locale.to_s]
20
20
  else
21
21
  locale.to_s == 'en' ? ['English (US)', 'en'] : [locale, locale.to_s]
22
22
  end
23
23
  end
24
24
 
25
+ def locale_full_name(locale)
26
+ Spree.t('i18n.this_file_language', locale: locale)
27
+ end
28
+
25
29
  def should_render_locale_dropdown?
26
30
  return false if current_store.nil?
27
31
 
@@ -44,9 +44,13 @@ module Spree
44
44
  variants_option_types_presenter(variants, product).options
45
45
  end
46
46
 
47
+ def product_wysiwyg_editor_enabled?
48
+ Spree::Config[:product_wysiwyg_editor_enabled]
49
+ end
50
+
47
51
  # converts line breaks in product description into <p> tags (for html display purposes)
48
52
  def product_description(product)
49
- description = if Spree::Config[:show_raw_product_description]
53
+ description = if Spree::Config[:show_raw_product_description] || product_wysiwyg_editor_enabled?
50
54
  product.description
51
55
  else
52
56
  product.description.to_s.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>')
@@ -63,7 +67,7 @@ module Spree
63
67
  end
64
68
 
65
69
  def cache_key_for_products(products = @products, additional_cache_key = nil)
66
- max_updated_at = (products.maximum(:updated_at) || Date.today).to_s(:number)
70
+ max_updated_at = (products.except(:group, :order).maximum(:updated_at) || Date.today).to_s(:number)
67
71
  products_cache_keys = "spree/products/#{products.map(&:id).join('-')}-#{params[:page]}-#{params[:sort_by]}-#{max_updated_at}-#{@taxon&.id}"
68
72
  (common_product_cache_keys + [products_cache_keys] + [additional_cache_key]).compact.join('/')
69
73
  end
@@ -131,7 +135,7 @@ module Spree
131
135
 
132
136
  return [] if product_ids.empty?
133
137
 
134
- Spree::Product.
138
+ current_store.products.
135
139
  available.not_discontinued.distinct.
136
140
  where(id: product_ids).
137
141
  includes(
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module DisplayLink
3
+ def link
4
+ case linked_resource_type
5
+ when 'Spree::Taxon'
6
+ return if linked_resource&.permalink.blank?
7
+
8
+ if spree_routes.method_defined?(:nested_taxons_path)
9
+ spree_routes.nested_taxons_path(linked_resource.permalink)
10
+ else
11
+ "/#{Spree::Config[:storefront_taxons_path]}/#{linked_resource.permalink}"
12
+ end
13
+ when 'Spree::Product'
14
+ return if linked_resource&.slug.blank?
15
+
16
+ if spree_routes.method_defined?(:products_path)
17
+ spree_routes.product_path(linked_resource)
18
+ else
19
+ "/#{Spree::Config[:storefront_products_path]}/#{linked_resource.slug}"
20
+ end
21
+ when 'Spree::CmsPage'
22
+ return if linked_resource&.slug.blank?
23
+
24
+ if spree_routes.method_defined?(:page_path)
25
+ spree_routes.page_path(linked_resource.slug)
26
+ else
27
+ "/#{Spree::Config[:storefront_pages_path]}/#{linked_resource.slug}"
28
+ end
29
+ when 'Home Page'
30
+ '/'
31
+ when 'URL'
32
+ destination
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def spree_routes
39
+ Spree::Core::Engine.routes.url_helpers
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ module Spree
2
+ module FilterParam
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ before_save :set_filter_param
7
+ end
8
+
9
+ protected
10
+
11
+ def set_filter_param
12
+ return if param_candidate.blank?
13
+
14
+ self.filter_param = param_candidate.parameterize
15
+ end
16
+
17
+ def param_candidate
18
+ name
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module MemoizedData
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ # reset cache on save inside trasaction and transaction commit
7
+ after_save :reset_memoized_data
8
+ after_commit :reset_memoized_data
9
+
10
+ def reload(options = {})
11
+ reset_memoized_data
12
+ super(options)
13
+ end
14
+
15
+ private
16
+
17
+ def reset_memoized_data
18
+ self.class.const_get('MEMOIZED_METHODS').each do |v|
19
+ instance_variable_set(:"@#{v.gsub(/\?/, '')}", nil)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module MultiStoreResource
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ scope :for_store, ->(store) { joins(:stores).where(Store.table_name => { id: store.id }) }
7
+
8
+ validate :must_have_one_store, unless: :disable_store_presence_validation?
9
+ end
10
+
11
+ protected
12
+
13
+ def must_have_one_store
14
+ return if stores.any?
15
+
16
+ errors.add(:stores, Spree.t(:must_have_one_store))
17
+ end
18
+
19
+ # this can be overriden on model basis
20
+ def disable_store_presence_validation?
21
+ Spree::Config[:disable_store_presence_validation]
22
+ end
23
+ end
24
+ end