spree_core 4.2.3.1 → 4.3.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) 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 +82 -26
  10. data/app/finders/spree/stores/find_current.rb +24 -0
  11. data/app/helpers/spree/base_helper.rb +63 -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/display_money.rb +6 -2
  16. data/app/models/concerns/spree/filter_param.rb +21 -0
  17. data/app/models/concerns/spree/memoized_data.rb +24 -0
  18. data/app/models/concerns/spree/multi_store_resource.rb +24 -0
  19. data/app/models/concerns/spree/product_scopes.rb +71 -8
  20. data/app/models/concerns/spree/single_store_resource.rb +19 -0
  21. data/app/models/concerns/spree/user_address.rb +19 -0
  22. data/app/models/concerns/spree/user_methods.rb +14 -12
  23. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  24. data/app/models/concerns/spree/user_reporting.rb +35 -10
  25. data/app/models/concerns/spree/user_roles.rb +25 -0
  26. data/app/models/spree/ability.rb +3 -1
  27. data/app/models/spree/address.rb +27 -6
  28. data/app/models/spree/app_configuration.rb +8 -0
  29. data/app/models/spree/app_dependencies.rb +18 -6
  30. data/app/models/spree/base.rb +18 -0
  31. data/app/models/spree/classification.rb +3 -0
  32. data/app/models/spree/cms/pages/feature_page.rb +7 -0
  33. data/app/models/spree/cms/pages/homepage.rb +20 -0
  34. data/app/models/spree/cms/pages/standard_page.rb +4 -0
  35. data/app/models/spree/cms/sections/featured_article.rb +29 -0
  36. data/app/models/spree/cms/sections/hero_image.rb +47 -0
  37. data/app/models/spree/cms/sections/image_gallery.rb +103 -0
  38. data/app/models/spree/cms/sections/product_carousel.rb +14 -0
  39. data/app/models/spree/cms/sections/rich_text_content.rb +13 -0
  40. data/app/models/spree/cms/sections/side_by_side_images.rb +74 -0
  41. data/app/models/spree/cms_page.rb +66 -0
  42. data/app/models/spree/cms_section.rb +57 -0
  43. data/app/models/spree/country.rb +14 -6
  44. data/app/models/spree/credit_card.rb +2 -8
  45. data/app/models/spree/customer_return.rb +8 -2
  46. data/app/models/spree/icon.rb +9 -0
  47. data/app/models/spree/image/configuration/active_storage.rb +2 -0
  48. data/app/models/spree/inventory_unit.rb +1 -1
  49. data/app/models/spree/line_item.rb +1 -1
  50. data/app/models/spree/menu.rb +63 -0
  51. data/app/models/spree/menu_item.rb +76 -0
  52. data/app/models/spree/option_type.rb +1 -1
  53. data/app/models/spree/option_value.rb +11 -0
  54. data/app/models/spree/option_value_variant.rb +1 -1
  55. data/app/models/spree/order/address_book.rb +3 -5
  56. data/app/models/spree/order/currency_updater.rb +1 -1
  57. data/app/models/spree/order/emails.rb +32 -0
  58. data/app/models/spree/order/payments.rb +1 -1
  59. data/app/models/spree/order/store_credit.rb +1 -1
  60. data/app/models/spree/order.rb +46 -45
  61. data/app/models/spree/payment.rb +7 -0
  62. data/app/models/spree/payment_method.rb +4 -0
  63. data/app/models/spree/preferences/preferable.rb +12 -0
  64. data/app/models/spree/preferences/preferable_class_methods.rb +10 -1
  65. data/app/models/spree/product.rb +36 -22
  66. data/app/models/spree/product_property.rb +19 -4
  67. data/app/models/spree/promotion/rules/country.rb +1 -1
  68. data/app/models/spree/promotion/rules/first_order.rb +4 -3
  69. data/app/models/spree/promotion/rules/taxon.rb +10 -7
  70. data/app/models/spree/promotion.rb +6 -15
  71. data/app/models/spree/promotion_handler/cart.rb +7 -2
  72. data/app/models/spree/promotion_handler/coupon.rb +5 -4
  73. data/app/models/spree/promotion_handler/free_shipping.rb +5 -6
  74. data/app/models/spree/promotion_handler/page.rb +3 -2
  75. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -0
  76. data/app/models/spree/promotion_rule.rb +2 -0
  77. data/app/models/spree/property.rb +28 -1
  78. data/app/models/spree/reimbursement.rb +3 -1
  79. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -1
  80. data/app/models/spree/shipment_handler.rb +4 -2
  81. data/app/models/spree/stock/quantifier.rb +6 -6
  82. data/app/models/spree/stock_location.rb +19 -12
  83. data/app/models/spree/store.rb +90 -7
  84. data/app/models/spree/store_credit.rb +7 -3
  85. data/app/models/spree/store_credit_event.rb +2 -2
  86. data/app/models/spree/store_payment_method.rb +11 -0
  87. data/app/models/spree/store_product.rb +11 -0
  88. data/app/models/spree/store_promotion.rb +11 -0
  89. data/app/models/spree/taxon.rb +21 -1
  90. data/app/models/spree/taxon_image/configuration/active_storage.rb +2 -0
  91. data/app/models/spree/taxonomy.rb +3 -1
  92. data/app/models/spree/variant.rb +13 -4
  93. data/app/presenters/spree/filters/options_presenter.rb +27 -0
  94. data/app/presenters/spree/filters/price_presenter.rb +22 -0
  95. data/app/presenters/spree/filters/price_range_presenter.rb +29 -0
  96. data/app/presenters/spree/filters/properties_presenter.rb +23 -0
  97. data/app/presenters/spree/filters/property_presenter.rb +22 -0
  98. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +44 -0
  99. data/app/services/spree/account/addresses/create.rb +1 -0
  100. data/app/services/spree/account/addresses/helper.rb +6 -0
  101. data/app/services/spree/account/addresses/update.rb +9 -3
  102. data/app/services/spree/account/create.rb +17 -0
  103. data/app/services/spree/account/update.rb +15 -0
  104. data/app/services/spree/build_localized_redirect_url.rb +1 -1
  105. data/app/services/spree/cart/create.rb +5 -3
  106. data/app/services/spree/cart/destroy.rb +40 -0
  107. data/app/services/spree/cart/empty.rb +36 -0
  108. data/app/services/spree/cart/estimate_shipping_rates.rb +3 -3
  109. data/app/services/spree/checkout/add_store_credit.rb +1 -1
  110. data/app/services/spree/classifications/reposition.rb +18 -0
  111. data/app/services/spree/credit_cards/destroy.rb +41 -0
  112. data/app/validators/db_maximum_length_validator.rb +5 -0
  113. data/app/validators/email_validator.rb +3 -1
  114. data/app/views/spree/shared/_purchased_items_table.text.erb +25 -0
  115. data/config/initializers/active_storage.rb +2 -0
  116. data/config/locales/en.yml +175 -3
  117. data/config/routes.rb +0 -5
  118. data/db/migrate/20191016134113_add_deafult_value_for_store_default_currency.rb +1 -1
  119. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +1 -1
  120. data/db/migrate/20200102141311_add_social_to_spree_stores.rb +1 -1
  121. data/db/migrate/20200212144523_add_hide_from_nav_to_taxons.rb +1 -1
  122. data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +1 -1
  123. data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +1 -1
  124. data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +1 -1
  125. data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +1 -1
  126. data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +1 -1
  127. data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +1 -1
  128. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +1 -1
  129. data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +1 -1
  130. data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +1 -1
  131. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +1 -1
  132. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +1 -1
  133. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +1 -1
  134. data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +1 -1
  135. data/db/migrate/20201023152810_add_filterable_to_spree_properties.rb +8 -0
  136. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +1 -1
  137. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +1 -1
  138. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +1 -1
  139. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +1 -1
  140. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +1 -1
  141. data/db/migrate/20210120142527_ensure_default_locale_in_spree_stores.rb +1 -1
  142. data/db/migrate/20210205211040_add_supported_locales_to_spree_stores.rb +1 -1
  143. data/db/migrate/20210215202602_migrate_spree_i18n_globalize_config.rb +1 -1
  144. data/db/migrate/20210407200948_create_spree_menus.rb +16 -0
  145. data/db/migrate/20210408092939_create_spree_menu_items.rb +31 -0
  146. data/db/migrate/20210504163720_add_filter_param_to_spree_product_properties.rb +8 -0
  147. data/db/migrate/20210505114659_add_filter_param_to_spree_properties.rb +8 -0
  148. data/db/migrate/20210512191732_create_spree_cms_pages.rb +24 -0
  149. data/db/migrate/20210514204251_create_spree_cms_sections.rb +22 -0
  150. data/db/migrate/20210527094055_create_spree_products_stores.rb +36 -0
  151. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +5 -0
  152. data/db/migrate/20210702112334_add_missing_timestamp_columns.rb +46 -0
  153. data/db/migrate/20210713131614_add_unique_index_on_property_id_and_product_id_to_product_properties.rb +29 -0
  154. data/db/migrate/20210715091956_add_store_id_to_spree_store_credits.rb +10 -0
  155. data/db/migrate/20210716093151_add_store_id_to_spree_taxonomies.rb +11 -0
  156. data/db/migrate/20210716104141_add_index_on_name_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  157. data/db/migrate/20210721120857_add_index_on_permalink_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  158. data/db/migrate/20210721125657_create_spree_promotions_stores.rb +29 -0
  159. data/db/migrate/20210722090705_add_store_id_to_spree_customer_returns.rb +11 -0
  160. data/db/migrate/20210726065456_change_integer_id_columns_into_bigint.rb +305 -0
  161. data/db/migrate/20210730154425_fix_promotion_code_and_path_unique_indexes.rb +9 -0
  162. data/lib/generators/spree/dummy/dummy_generator.rb +11 -7
  163. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  164. data/lib/generators/spree/dummy_model/templates/model.rb.tt +1 -1
  165. data/lib/generators/spree/install/install_generator.rb +12 -24
  166. data/lib/spree/core/components.rb +8 -0
  167. data/lib/spree/core/controller_helpers/auth.rb +7 -1
  168. data/lib/spree/core/controller_helpers/common.rb +1 -1
  169. data/lib/spree/core/controller_helpers/order.rb +4 -4
  170. data/lib/spree/core/controller_helpers/search.rb +1 -0
  171. data/lib/spree/core/controller_helpers/store.rb +24 -1
  172. data/lib/spree/core/engine.rb +6 -0
  173. data/lib/spree/core/importer/product.rb +3 -1
  174. data/lib/spree/core/product_duplicator.rb +1 -0
  175. data/lib/spree/core/search/base.rb +17 -22
  176. data/lib/spree/core/version.rb +1 -1
  177. data/lib/spree/core.rb +8 -4
  178. data/lib/spree/i18n.rb +1 -1
  179. data/lib/spree/money.rb +2 -1
  180. data/lib/spree/permitted_attributes.rb +14 -3
  181. data/lib/spree/testing_support/authorization_helpers.rb +6 -3
  182. data/lib/spree/testing_support/capybara_config.rb +3 -1
  183. data/lib/spree/testing_support/common_rake.rb +17 -4
  184. data/lib/spree/testing_support/extension_rake.rb +2 -2
  185. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  186. data/lib/spree/testing_support/factories/classification_factory.rb +8 -0
  187. data/lib/spree/testing_support/factories/cms_page_factory.rb +20 -0
  188. data/lib/spree/testing_support/factories/cms_section_factory.rb +31 -0
  189. data/lib/spree/testing_support/factories/customer_return_factory.rb +24 -17
  190. data/lib/spree/testing_support/factories/icon_factory.rb +7 -0
  191. data/lib/spree/testing_support/factories/line_item_factory.rb +6 -2
  192. data/lib/spree/testing_support/factories/menu_factory.rb +16 -0
  193. data/lib/spree/testing_support/factories/menu_item_factory.rb +10 -0
  194. data/lib/spree/testing_support/factories/options_factory.rb +15 -0
  195. data/lib/spree/testing_support/factories/order_factory.rb +11 -2
  196. data/lib/spree/testing_support/factories/payment_method_factory.rb +21 -4
  197. data/lib/spree/testing_support/factories/product_factory.rb +17 -1
  198. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  199. data/lib/spree/testing_support/factories/promotion_factory.rb +18 -9
  200. data/lib/spree/testing_support/factories/property_factory.rb +22 -0
  201. data/lib/spree/testing_support/factories/stock_location_factory.rb +5 -4
  202. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -0
  203. data/lib/spree/testing_support/factories/store_factory.rb +11 -0
  204. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -1
  205. data/lib/spree/testing_support/factories/taxon_image_factory.rb +7 -0
  206. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -0
  207. data/lib/spree/testing_support/factories/user_factory.rb +7 -2
  208. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  209. data/lib/spree/testing_support/flatpickr_capybara.rb +58 -35
  210. data/lib/spree/testing_support/locale_helpers.rb +1 -1
  211. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  212. data/lib/spree/testing_support/rspec_retry_config.rb +5 -0
  213. data/lib/tasks/core.rake +1 -1
  214. data/spec/fixtures/favicon.ico +0 -0
  215. data/spec/fixtures/files/icon_256x256.gif +0 -0
  216. data/spec/fixtures/files/icon_256x256.png +0 -0
  217. data/spec/fixtures/files/icon_512x512.png +0 -0
  218. data/spec/fixtures/files/img_256x128.png +0 -0
  219. data/spree_core.gemspec +21 -21
  220. metadata +225 -207
  221. data/app/assets/images/logo/spree_50.png +0 -0
  222. data/app/assets/images/noimage/large.png +0 -0
  223. data/app/assets/images/noimage/mini.png +0 -0
  224. data/app/assets/images/noimage/product.png +0 -0
  225. data/app/assets/images/noimage/small.png +0 -0
  226. data/app/assets/javascripts/spree.js +0 -78
  227. data/app/controllers/spree/errors_controller.rb +0 -11
  228. data/app/helpers/spree/mail_helper.rb +0 -29
  229. data/app/mailers/spree/base_mailer.rb +0 -46
  230. data/app/mailers/spree/order_mailer.rb +0 -26
  231. data/app/mailers/spree/reimbursement_mailer.rb +0 -12
  232. data/app/mailers/spree/shipment_mailer.rb +0 -12
  233. data/app/mailers/spree/test_mailer.rb +0 -8
  234. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -22
  235. data/app/views/layouts/spree/base_mailer.html.erb +0 -46
  236. data/app/views/spree/errors/forbidden.html.erb +0 -0
  237. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  238. data/app/views/spree/order_mailer/cancel_email.html.erb +0 -24
  239. data/app/views/spree/order_mailer/cancel_email.text.erb +0 -38
  240. data/app/views/spree/order_mailer/confirm_email.html.erb +0 -23
  241. data/app/views/spree/order_mailer/confirm_email.text.erb +0 -39
  242. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +0 -23
  243. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +0 -38
  244. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -56
  245. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -24
  246. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -12
  247. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -13
  248. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -456
  249. data/app/views/spree/shared/_error_messages.html.erb +0 -11
  250. data/app/views/spree/shared/_mailer_line_item.html.erb +0 -16
  251. data/app/views/spree/shared/_paths.html.erb +0 -8
  252. data/app/views/spree/shared/_purchased_items_table.html.erb +0 -69
  253. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +0 -13
  254. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +0 -27
  255. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +0 -13
  256. data/app/views/spree/shared/purchased_items_table/_total.html.erb +0 -13
  257. data/app/views/spree/shipment_mailer/shipped_email.html.erb +0 -36
  258. data/app/views/spree/shipment_mailer/shipped_email.text.erb +0 -17
  259. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  260. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  261. data/config/initializers/assets.rb +0 -2
  262. data/config/initializers/premailer_assets.rb +0 -1
  263. data/config/initializers/premailer_rails.rb +0 -3
  264. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +0 -10
  265. data/lib/generators/spree/dummy/templates/initializers/bullet.rb +0 -5
  266. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -15
  267. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -16
  268. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -16
  269. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -16
  270. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +0 -23
  271. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +0 -13
  272. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +0 -5
  273. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +0 -5
  274. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +0 -11
  275. data/lib/tasks/email.rake +0 -10
  276. data/vendor/assets/javascripts/cleave.js +0 -1669
  277. data/vendor/assets/javascripts/fetch.umd.js +0 -531
  278. data/vendor/assets/javascripts/jquery.payment.js +0 -652
  279. data/vendor/assets/javascripts/jsuri.js +0 -458
  280. data/vendor/assets/javascripts/polyfill.min.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0c372dea2c75fd41b1007170fd71a99bec886b2ea9de47bf69c155d1f9e44e1
4
- data.tar.gz: fd41eb8af4537f2a3fa12c52005a4fd6f2d7854dd097e355d5a748a73f6f777a
3
+ metadata.gz: d280751e897448ce4593ebe1d5f2fc9cd823e998699864ac8b52d2dfa28b49d6
4
+ data.tar.gz: 21ed38407942b369d6a7a2360730190a124264bd9b8137e79c49d4058fac16f6
5
5
  SHA512:
6
- metadata.gz: 621917d1e07ccf5c72a0947efe43c96ab48aa3c4f9cb85e4c0e78d4d5427f81ff41284af6f2d738cfa4df5a563daf5b24ac1a70ec66756ea765b78bd8c66d6e0
7
- data.tar.gz: 148e557777a9f21d7bc7e366498fa7ecbea69b3aa0f6286d62c0e1ef389af98499a07910581b6dbe5ec89e37219e4651dc7f52109d0b54638666aa3b590509e3
6
+ metadata.gz: 803917626fa68a87c54fd9d88dbb2388e84fefce8873ef3a7a96e7a49e1a1a7a9b327864a7c222fc31006795eaefbf10c12db584e5cd308b19464617b3235b80
7
+ data.tar.gz: f1ecb88f76d6061727b9bd569f24ae672491507248584106d1be936a2dfb3c78a1a1693b0affb84d0f8e34fe2991346b2884386ac7ac67df838408a81d10bc85
@@ -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,10 @@ 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)
30
+ @in_stock = params.dig(:filter, :in_stock)
31
+ @backorderable = params.dig(:filter, :backorderable)
32
+ @purchasable = params.dig(:filter, :purchasable)
19
33
  end
20
34
 
21
35
  def execute
@@ -28,8 +42,12 @@ module Spree
28
42
  products = by_name(products)
29
43
  products = by_options(products)
30
44
  products = by_option_value_ids(products)
45
+ products = by_properties(products)
31
46
  products = include_deleted(products)
32
47
  products = include_discontinued(products)
48
+ products = show_only_stock(products)
49
+ products = show_only_backorderable(products)
50
+ products = show_only_purchasable(products)
33
51
  products = ordered(products)
34
52
 
35
53
  products.distinct
@@ -37,8 +55,8 @@ module Spree
37
55
 
38
56
  private
39
57
 
40
- attr_reader :ids, :skus, :price, :currency, :taxons, :concat_taxons, :name, :options,
41
- :option_value_ids, :scope, :sort_by, :deleted, :discontinued
58
+ attr_reader :ids, :skus, :price, :currency, :taxons, :concat_taxons, :name, :options, :option_value_ids, :scope,
59
+ :sort_by, :deleted, :discontinued, :properties, :store, :in_stock, :backorderable, :purchasable
42
60
 
43
61
  def ids?
44
62
  ids.present?
@@ -80,8 +98,8 @@ module Spree
80
98
  sort_by.present?
81
99
  end
82
100
 
83
- def name_matcher
84
- Spree::Product.arel_table[:name].matches("%#{name}%")
101
+ def properties?
102
+ properties.present? && properties.values.reject(&:empty?).present?
85
103
  end
86
104
 
87
105
  def by_ids(products)
@@ -99,19 +117,13 @@ module Spree
99
117
  def by_price(products)
100
118
  return products unless price?
101
119
 
102
- products.joins(master: :prices).
103
- where(
104
- spree_prices: {
105
- amount: price.min..price.max,
106
- currency: currency&.upcase
107
- }
108
- )
120
+ products.price_between(price.min, price.max)
109
121
  end
110
122
 
111
123
  def by_currency(products)
112
124
  return products unless currency?
113
125
 
114
- products.joins(master: :prices).where(spree_prices: { currency: currency.upcase })
126
+ products.with_currency(currency)
115
127
  end
116
128
 
117
129
  def by_taxons(products)
@@ -136,17 +148,14 @@ module Spree
136
148
  def by_name(products)
137
149
  return products unless name?
138
150
 
139
- products.where(name_matcher)
151
+ products.like_any([:name], [name])
140
152
  end
141
153
 
142
154
  def by_options(products)
143
155
  return products unless options?
144
156
 
145
- products.where(
146
- id: options.map do |key, value|
147
- products.with_option_value(key, value).ids
148
- end.flatten.compact.uniq
149
- )
157
+ products_ids = options.map { |key, value| products.with_option_value(key, value).ids }
158
+ products.where(id: products_ids.reduce(&:intersection))
150
159
  end
151
160
 
152
161
  def by_option_value_ids(products)
@@ -163,6 +172,27 @@ module Spree
163
172
  products.where(id: product_ids)
164
173
  end
165
174
 
175
+ def by_properties(products)
176
+ return products unless properties?
177
+
178
+ product_ids = []
179
+ index = 0
180
+
181
+ properties.to_unsafe_hash.each do |property_filter_param, product_properties_values|
182
+ next if property_filter_param.blank? || product_properties_values.empty?
183
+
184
+ values = product_properties_values.split(',').reject(&:empty?).uniq.map(&:parameterize)
185
+
186
+ next if values.empty?
187
+
188
+ ids = products.with_property_values(property_filter_param, values).ids
189
+ product_ids = index == 0 ? ids : product_ids & ids
190
+ index += 1
191
+ end
192
+
193
+ products.where(id: product_ids)
194
+ end
195
+
166
196
  def option_types_count(option_value_ids)
167
197
  Spree::OptionValue.
168
198
  where(id: option_value_ids).
@@ -176,12 +206,14 @@ module Spree
176
206
  case sort_by
177
207
  when 'default'
178
208
  if taxons?
179
- products.
180
- select("#{Product.table_name}.*, #{Classification.table_name}.position").
181
- order("#{Classification.table_name}.position" => :asc)
209
+ products.ascend_by_taxons_min_position(taxons)
182
210
  else
183
211
  products
184
212
  end
213
+ when 'name-a-z'
214
+ products.order(name: :asc)
215
+ when 'name-z-a'
216
+ products.order(name: :desc)
185
217
  when 'newest-first'
186
218
  products.order(available_on: :desc)
187
219
  when 'price-high-to-low'
@@ -202,13 +234,37 @@ module Spree
202
234
  end
203
235
 
204
236
  def include_discontinued(products)
205
- discontinued ? products : products.available
237
+ discontinued ? products : products.active(currency)
238
+ end
239
+
240
+ def show_only_stock(products)
241
+ return products unless in_stock.to_s == 'true'
242
+
243
+ products.in_stock
244
+ end
245
+
246
+ def show_only_backorderable(products)
247
+ return products unless backorderable.to_s == 'true'
248
+
249
+ products.backorderable
250
+ end
251
+
252
+ def show_only_purchasable(products)
253
+ return products unless purchasable.to_s == 'true'
254
+
255
+ products.in_stock_or_backorderable
256
+ end
257
+
258
+ def map_prices(prices)
259
+ prices.map do |price|
260
+ price == 'Infinity' ? Float::INFINITY : price.to_f
261
+ end
206
262
  end
207
263
 
208
264
  def taxon_ids(taxons_ids)
209
265
  return if taxons_ids.nil? || taxons_ids.to_s.blank?
210
266
 
211
- taxons = Spree::Taxon.where(id: taxons_ids.to_s.split(','))
267
+ taxons = store.taxons.where(id: taxons_ids.to_s.split(','))
212
268
  taxons.map(&:cached_self_and_descendants_ids).flatten.compact.uniq.map(&:to_s)
213
269
  end
214
270
  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)
@@ -170,7 +226,8 @@ module Spree
170
226
  end
171
227
 
172
228
  def base_cache_key
173
- [I18n.locale, current_currency]
229
+ [I18n.locale, current_currency, defined?(try_spree_current_user) && try_spree_current_user.present?,
230
+ defined?(try_spree_current_user) && try_spree_current_user.try(:has_spree_role?, 'admin')]
174
231
  end
175
232
 
176
233
  def maximum_quantity
@@ -210,5 +267,9 @@ module Spree
210
267
 
211
268
  tag('meta', name: 'robots', content: current_store.seo_robots)
212
269
  end
270
+
271
+ def taxon_wysiwyg_editor_enabled?
272
+ Spree::Config[:taxon_wysiwyg_editor_enabled]
273
+ end
213
274
  end
214
275
  end