spree_core 4.2.3.1 → 4.3.0.rc2

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