spree_core 4.2.4 → 4.3.0.rc3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) 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/finders/spree/taxons/find.rb +22 -6
  12. data/app/helpers/spree/base_helper.rb +70 -7
  13. data/app/helpers/spree/locale_helper.rb +5 -1
  14. data/app/helpers/spree/products_helper.rb +7 -3
  15. data/app/models/concerns/spree/display_link.rb +42 -0
  16. data/app/models/concerns/spree/display_money.rb +6 -2
  17. data/app/models/concerns/spree/filter_param.rb +21 -0
  18. data/app/models/concerns/spree/image_methods.rb +24 -0
  19. data/app/models/concerns/spree/memoized_data.rb +24 -0
  20. data/app/models/concerns/spree/multi_store_resource.rb +24 -0
  21. data/app/models/concerns/spree/product_scopes.rb +71 -8
  22. data/app/models/concerns/spree/single_store_resource.rb +19 -0
  23. data/app/models/concerns/spree/user_address.rb +19 -0
  24. data/app/models/concerns/spree/user_methods.rb +14 -12
  25. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  26. data/app/models/concerns/spree/user_reporting.rb +35 -10
  27. data/app/models/concerns/spree/user_roles.rb +25 -0
  28. data/app/models/spree/ability.rb +3 -1
  29. data/app/models/spree/address.rb +27 -6
  30. data/app/models/spree/app_configuration.rb +8 -0
  31. data/app/models/spree/app_dependencies.rb +18 -6
  32. data/app/models/spree/base.rb +18 -0
  33. data/app/models/spree/classification.rb +3 -0
  34. data/app/models/spree/cms/pages/feature_page.rb +7 -0
  35. data/app/models/spree/cms/pages/homepage.rb +20 -0
  36. data/app/models/spree/cms/pages/standard_page.rb +4 -0
  37. data/app/models/spree/cms/sections/featured_article.rb +29 -0
  38. data/app/models/spree/cms/sections/hero_image.rb +47 -0
  39. data/app/models/spree/cms/sections/image_gallery.rb +103 -0
  40. data/app/models/spree/cms/sections/product_carousel.rb +14 -0
  41. data/app/models/spree/cms/sections/rich_text_content.rb +13 -0
  42. data/app/models/spree/cms/sections/side_by_side_images.rb +74 -0
  43. data/app/models/spree/cms_page.rb +66 -0
  44. data/app/models/spree/cms_section.rb +57 -0
  45. data/app/models/spree/country.rb +14 -6
  46. data/app/models/spree/credit_card.rb +2 -8
  47. data/app/models/spree/customer_return.rb +8 -2
  48. data/app/models/spree/gateway/bogus.rb +6 -4
  49. data/app/models/spree/icon.rb +9 -0
  50. data/app/models/spree/image/configuration/active_storage.rb +2 -0
  51. data/app/models/spree/image.rb +5 -24
  52. data/app/models/spree/inventory_unit.rb +1 -1
  53. data/app/models/spree/line_item.rb +1 -1
  54. data/app/models/spree/menu.rb +63 -0
  55. data/app/models/spree/menu_item.rb +76 -0
  56. data/app/models/spree/option_type.rb +1 -1
  57. data/app/models/spree/option_value.rb +11 -0
  58. data/app/models/spree/option_value_variant.rb +1 -1
  59. data/app/models/spree/order/address_book.rb +3 -5
  60. data/app/models/spree/order/currency_updater.rb +1 -1
  61. data/app/models/spree/order/emails.rb +32 -0
  62. data/app/models/spree/order/payments.rb +1 -1
  63. data/app/models/spree/order/store_credit.rb +1 -1
  64. data/app/models/spree/order.rb +46 -45
  65. data/app/models/spree/payment.rb +7 -0
  66. data/app/models/spree/payment_method.rb +16 -0
  67. data/app/models/spree/preferences/preferable.rb +12 -0
  68. data/app/models/spree/preferences/preferable_class_methods.rb +10 -1
  69. data/app/models/spree/product.rb +27 -22
  70. data/app/models/spree/product_property.rb +19 -4
  71. data/app/models/spree/promotion/rules/country.rb +1 -1
  72. data/app/models/spree/promotion/rules/first_order.rb +4 -3
  73. data/app/models/spree/promotion/rules/taxon.rb +10 -7
  74. data/app/models/spree/promotion.rb +6 -15
  75. data/app/models/spree/promotion_handler/cart.rb +7 -2
  76. data/app/models/spree/promotion_handler/coupon.rb +5 -4
  77. data/app/models/spree/promotion_handler/free_shipping.rb +5 -6
  78. data/app/models/spree/promotion_handler/page.rb +3 -2
  79. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -0
  80. data/app/models/spree/promotion_rule.rb +2 -0
  81. data/app/models/spree/property.rb +28 -1
  82. data/app/models/spree/reimbursement.rb +3 -1
  83. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -1
  84. data/app/models/spree/shipment_handler.rb +4 -2
  85. data/app/models/spree/stock/quantifier.rb +6 -6
  86. data/app/models/spree/stock_location.rb +19 -12
  87. data/app/models/spree/store.rb +90 -7
  88. data/app/models/spree/store_credit.rb +7 -3
  89. data/app/models/spree/store_credit_event.rb +2 -2
  90. data/app/models/spree/store_payment_method.rb +11 -0
  91. data/app/models/spree/store_product.rb +11 -0
  92. data/app/models/spree/store_promotion.rb +11 -0
  93. data/app/models/spree/taxon.rb +21 -1
  94. data/app/models/spree/taxon_image/configuration/active_storage.rb +2 -0
  95. data/app/models/spree/taxon_image.rb +1 -0
  96. data/app/models/spree/taxonomy.rb +3 -1
  97. data/app/models/spree/variant.rb +13 -4
  98. data/app/presenters/spree/filters/options_presenter.rb +27 -0
  99. data/app/presenters/spree/filters/price_presenter.rb +22 -0
  100. data/app/presenters/spree/filters/price_range_presenter.rb +29 -0
  101. data/app/presenters/spree/filters/properties_presenter.rb +23 -0
  102. data/app/presenters/spree/filters/property_presenter.rb +22 -0
  103. data/app/presenters/spree/filters/quantified_price_range_presenter.rb +44 -0
  104. data/app/services/spree/account/addresses/create.rb +1 -0
  105. data/app/services/spree/account/addresses/helper.rb +6 -0
  106. data/app/services/spree/account/addresses/update.rb +9 -3
  107. data/app/services/spree/account/create.rb +17 -0
  108. data/app/services/spree/account/update.rb +15 -0
  109. data/app/services/spree/build_localized_redirect_url.rb +1 -1
  110. data/app/services/spree/cart/create.rb +5 -3
  111. data/app/services/spree/cart/destroy.rb +40 -0
  112. data/app/services/spree/cart/empty.rb +36 -0
  113. data/app/services/spree/cart/estimate_shipping_rates.rb +3 -3
  114. data/app/services/spree/checkout/add_store_credit.rb +1 -1
  115. data/app/services/spree/classifications/reposition.rb +18 -0
  116. data/app/services/spree/credit_cards/destroy.rb +41 -0
  117. data/app/sorters/spree/base_sorter.rb +23 -11
  118. data/app/sorters/spree/products/sort.rb +17 -7
  119. data/app/validators/db_maximum_length_validator.rb +5 -0
  120. data/app/validators/email_validator.rb +3 -1
  121. data/app/views/spree/shared/_purchased_items_table.text.erb +25 -0
  122. data/config/initializers/active_storage.rb +2 -0
  123. data/config/locales/en.yml +175 -3
  124. data/config/routes.rb +0 -5
  125. data/db/migrate/20191016134113_add_deafult_value_for_store_default_currency.rb +1 -1
  126. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +1 -1
  127. data/db/migrate/20200102141311_add_social_to_spree_stores.rb +1 -1
  128. data/db/migrate/20200212144523_add_hide_from_nav_to_taxons.rb +1 -1
  129. data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +1 -1
  130. data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +1 -1
  131. data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +1 -1
  132. data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +1 -1
  133. data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +1 -1
  134. data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +1 -1
  135. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +1 -1
  136. data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +1 -1
  137. data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +1 -1
  138. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +1 -1
  139. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +1 -1
  140. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +1 -1
  141. data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +1 -1
  142. data/db/migrate/20201023152810_add_filterable_to_spree_properties.rb +8 -0
  143. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +1 -1
  144. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +1 -1
  145. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +1 -1
  146. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +1 -1
  147. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +1 -1
  148. data/db/migrate/20210120142527_ensure_default_locale_in_spree_stores.rb +1 -1
  149. data/db/migrate/20210205211040_add_supported_locales_to_spree_stores.rb +1 -1
  150. data/db/migrate/20210215202602_migrate_spree_i18n_globalize_config.rb +1 -1
  151. data/db/migrate/20210407200948_create_spree_menus.rb +16 -0
  152. data/db/migrate/20210408092939_create_spree_menu_items.rb +31 -0
  153. data/db/migrate/20210504163720_add_filter_param_to_spree_product_properties.rb +8 -0
  154. data/db/migrate/20210505114659_add_filter_param_to_spree_properties.rb +8 -0
  155. data/db/migrate/20210512191732_create_spree_cms_pages.rb +24 -0
  156. data/db/migrate/20210514204251_create_spree_cms_sections.rb +22 -0
  157. data/db/migrate/20210527094055_create_spree_products_stores.rb +36 -0
  158. data/db/migrate/20210608045519_ensure_store_default_country_is_set.rb +5 -0
  159. data/db/migrate/20210702112334_add_missing_timestamp_columns.rb +46 -0
  160. data/db/migrate/20210713131614_add_unique_index_on_property_id_and_product_id_to_product_properties.rb +29 -0
  161. data/db/migrate/20210715091956_add_store_id_to_spree_store_credits.rb +10 -0
  162. data/db/migrate/20210716093151_add_store_id_to_spree_taxonomies.rb +11 -0
  163. data/db/migrate/20210716104141_add_index_on_name_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  164. data/db/migrate/20210721120857_add_index_on_permalink_parent_id_and_taxonomy_id_on_spree_taxons.rb +31 -0
  165. data/db/migrate/20210721125657_create_spree_promotions_stores.rb +29 -0
  166. data/db/migrate/20210722090705_add_store_id_to_spree_customer_returns.rb +11 -0
  167. data/db/migrate/20210726065456_change_integer_id_columns_into_bigint.rb +305 -0
  168. data/db/migrate/20210730154425_fix_promotion_code_and_path_unique_indexes.rb +9 -0
  169. data/lib/generators/spree/dummy/dummy_generator.rb +11 -7
  170. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  171. data/lib/generators/spree/dummy_model/templates/model.rb.tt +1 -1
  172. data/lib/generators/spree/install/install_generator.rb +12 -24
  173. data/lib/spree/core/components.rb +8 -0
  174. data/lib/spree/core/controller_helpers/auth.rb +7 -1
  175. data/lib/spree/core/controller_helpers/common.rb +1 -1
  176. data/lib/spree/core/controller_helpers/order.rb +4 -4
  177. data/lib/spree/core/controller_helpers/search.rb +1 -0
  178. data/lib/spree/core/controller_helpers/store.rb +24 -1
  179. data/lib/spree/core/engine.rb +6 -0
  180. data/lib/spree/core/importer/product.rb +3 -1
  181. data/lib/spree/core/product_duplicator.rb +1 -0
  182. data/lib/spree/core/search/base.rb +17 -22
  183. data/lib/spree/core/version.rb +1 -1
  184. data/lib/spree/core.rb +8 -4
  185. data/lib/spree/i18n.rb +1 -1
  186. data/lib/spree/money.rb +2 -1
  187. data/lib/spree/permitted_attributes.rb +21 -3
  188. data/lib/spree/testing_support/authorization_helpers.rb +6 -3
  189. data/lib/spree/testing_support/capybara_config.rb +3 -1
  190. data/lib/spree/testing_support/common_rake.rb +17 -4
  191. data/lib/spree/testing_support/extension_rake.rb +2 -2
  192. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  193. data/lib/spree/testing_support/factories/classification_factory.rb +8 -0
  194. data/lib/spree/testing_support/factories/cms_page_factory.rb +20 -0
  195. data/lib/spree/testing_support/factories/cms_section_factory.rb +31 -0
  196. data/lib/spree/testing_support/factories/customer_return_factory.rb +24 -17
  197. data/lib/spree/testing_support/factories/icon_factory.rb +7 -0
  198. data/lib/spree/testing_support/factories/line_item_factory.rb +6 -2
  199. data/lib/spree/testing_support/factories/menu_factory.rb +16 -0
  200. data/lib/spree/testing_support/factories/menu_item_factory.rb +10 -0
  201. data/lib/spree/testing_support/factories/options_factory.rb +15 -0
  202. data/lib/spree/testing_support/factories/order_factory.rb +11 -2
  203. data/lib/spree/testing_support/factories/payment_method_factory.rb +21 -4
  204. data/lib/spree/testing_support/factories/product_factory.rb +17 -1
  205. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  206. data/lib/spree/testing_support/factories/promotion_factory.rb +18 -9
  207. data/lib/spree/testing_support/factories/property_factory.rb +22 -0
  208. data/lib/spree/testing_support/factories/stock_location_factory.rb +5 -4
  209. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -0
  210. data/lib/spree/testing_support/factories/store_factory.rb +11 -0
  211. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -1
  212. data/lib/spree/testing_support/factories/taxon_image_factory.rb +7 -0
  213. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -0
  214. data/lib/spree/testing_support/factories/user_factory.rb +7 -2
  215. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  216. data/lib/spree/testing_support/flatpickr_capybara.rb +58 -35
  217. data/lib/spree/testing_support/locale_helpers.rb +1 -1
  218. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  219. data/lib/spree/testing_support/rspec_retry_config.rb +5 -0
  220. data/lib/tasks/core.rake +1 -1
  221. data/spec/fixtures/favicon.ico +0 -0
  222. data/spec/fixtures/files/icon_256x256.gif +0 -0
  223. data/spec/fixtures/files/icon_256x256.png +0 -0
  224. data/spec/fixtures/files/icon_512x512.png +0 -0
  225. data/spec/fixtures/files/img_256x128.png +0 -0
  226. data/spree_core.gemspec +21 -21
  227. metadata +226 -207
  228. data/app/assets/images/logo/spree_50.png +0 -0
  229. data/app/assets/images/noimage/large.png +0 -0
  230. data/app/assets/images/noimage/mini.png +0 -0
  231. data/app/assets/images/noimage/product.png +0 -0
  232. data/app/assets/images/noimage/small.png +0 -0
  233. data/app/assets/javascripts/spree.js +0 -78
  234. data/app/controllers/spree/errors_controller.rb +0 -11
  235. data/app/helpers/spree/mail_helper.rb +0 -29
  236. data/app/mailers/spree/base_mailer.rb +0 -46
  237. data/app/mailers/spree/order_mailer.rb +0 -26
  238. data/app/mailers/spree/reimbursement_mailer.rb +0 -12
  239. data/app/mailers/spree/shipment_mailer.rb +0 -12
  240. data/app/mailers/spree/test_mailer.rb +0 -8
  241. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -22
  242. data/app/views/layouts/spree/base_mailer.html.erb +0 -46
  243. data/app/views/spree/errors/forbidden.html.erb +0 -0
  244. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  245. data/app/views/spree/order_mailer/cancel_email.html.erb +0 -24
  246. data/app/views/spree/order_mailer/cancel_email.text.erb +0 -38
  247. data/app/views/spree/order_mailer/confirm_email.html.erb +0 -23
  248. data/app/views/spree/order_mailer/confirm_email.text.erb +0 -39
  249. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +0 -23
  250. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +0 -38
  251. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -56
  252. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -24
  253. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -12
  254. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -13
  255. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -456
  256. data/app/views/spree/shared/_error_messages.html.erb +0 -11
  257. data/app/views/spree/shared/_mailer_line_item.html.erb +0 -16
  258. data/app/views/spree/shared/_paths.html.erb +0 -8
  259. data/app/views/spree/shared/_purchased_items_table.html.erb +0 -69
  260. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +0 -13
  261. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +0 -27
  262. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +0 -13
  263. data/app/views/spree/shared/purchased_items_table/_total.html.erb +0 -13
  264. data/app/views/spree/shipment_mailer/shipped_email.html.erb +0 -36
  265. data/app/views/spree/shipment_mailer/shipped_email.text.erb +0 -17
  266. data/app/views/spree/test_mailer/test_email.html.erb +0 -40
  267. data/app/views/spree/test_mailer/test_email.text.erb +0 -4
  268. data/config/initializers/assets.rb +0 -2
  269. data/config/initializers/premailer_assets.rb +0 -1
  270. data/config/initializers/premailer_rails.rb +0 -3
  271. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +0 -10
  272. data/lib/generators/spree/dummy/templates/initializers/bullet.rb +0 -5
  273. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -15
  274. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -16
  275. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -16
  276. data/lib/generators/spree/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -16
  277. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +0 -23
  278. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +0 -13
  279. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +0 -5
  280. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +0 -5
  281. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +0 -11
  282. data/lib/tasks/email.rake +0 -10
  283. data/vendor/assets/javascripts/cleave.js +0 -1669
  284. data/vendor/assets/javascripts/fetch.umd.js +0 -531
  285. data/vendor/assets/javascripts/jquery.payment.js +0 -652
  286. data/vendor/assets/javascripts/jsuri.js +0 -458
  287. data/vendor/assets/javascripts/polyfill.min.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73a956aa0f5f8359d02e3804606a880d73af297547ef3eca07066e7ee244a728
4
- data.tar.gz: 55cb848ec873396022bcaa67b8d8f6281ce4dd2d48dd1692e59f72e012c0dd13
3
+ metadata.gz: 9fd663cedb276d7b23b137c9ff65cb153f986deee175e19672198a5ba9078707
4
+ data.tar.gz: d9105ced36ac4078df6963e6ca7cd9c2e45bfec3dbed2b2872ff76c99d05dfb3
5
5
  SHA512:
6
- metadata.gz: '0749dcc7a17168458bfa742d9f4df1ad99c2f642fd6a4654be232cc8b75c8f72f73286effb135909a17bbcc27d5bdf7932f75c073068eb1492d4159f23793a66'
7
- data.tar.gz: 8ddae63ba67bf3c68492f80605646176bb82bdb2ca1d80ffa3139cafca4402d4156e9f14d15353bff0b7d7fa1f72cd340b4dbf826697ee0b995c64383bfcf5a2
6
+ metadata.gz: db4eb2dfeeca9a7acb56d3146b1e73a97485eec348e9b9537b3145f3ce1c8fc66a7b48d3a68c177fac4cf5d9c93ed7a47738487e034a9698e0eb2f5dba2025de
7
+ data.tar.gz: fecab76acd9f180cc9cbe79d23a11f26a2cd86c86ca83e9157b9d8dbe1e475de8d59fea914b75bcab2dc29a4edc1b40074ed056f528abbd96a2750e3088f80df
@@ -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
@@ -3,16 +3,18 @@ module Spree
3
3
  class Find
4
4
  def initialize(scope:, params:)
5
5
  @scope = scope
6
- @ids = String(params.dig(:filter, :ids)).split(',')
7
- @parent = params.dig(:filter, :parent_id)
8
- @taxonomy = params.dig(:filter, :taxonomy_id)
9
- @name = params.dig(:filter, :name)
10
- @roots = params.dig(:filter, :roots)
6
+ @ids = String(params.dig(:filter, :ids)).split(',')
7
+ @parent = params.dig(:filter, :parent_id)
8
+ @parent_permalink = params.dig(:filter, :parent_permalink)
9
+ @taxonomy = params.dig(:filter, :taxonomy_id)
10
+ @name = params.dig(:filter, :name)
11
+ @roots = params.dig(:filter, :roots)
11
12
  end
12
13
 
13
14
  def execute
14
15
  taxons = by_ids(scope)
15
16
  taxons = by_parent(taxons)
17
+ taxons = by_parent_permalink(taxons)
16
18
  taxons = by_taxonomy(taxons)
17
19
  taxons = by_roots(taxons)
18
20
  taxons = by_name(taxons)
@@ -22,7 +24,7 @@ module Spree
22
24
 
23
25
  private
24
26
 
25
- attr_reader :ids, :parent, :taxonomy, :roots, :name, :scope
27
+ attr_reader :ids, :parent, :parent_permalink, :taxonomy, :roots, :name, :scope
26
28
 
27
29
  def ids?
28
30
  ids.present?
@@ -32,6 +34,10 @@ module Spree
32
34
  parent.present?
33
35
  end
34
36
 
37
+ def parent_permalink?
38
+ parent_permalink.present?
39
+ end
40
+
35
41
  def taxonomy?
36
42
  taxonomy.present?
37
43
  end
@@ -60,6 +66,16 @@ module Spree
60
66
  taxons.where(parent_id: parent)
61
67
  end
62
68
 
69
+ def by_parent_permalink(taxons)
70
+ return taxons unless parent_permalink?
71
+
72
+ if Rails::VERSION::STRING >= '6.1'
73
+ taxons.joins(:parent).where(parent: { permalink: parent_permalink })
74
+ else
75
+ taxons.joins("INNER JOIN #{Spree::Taxon.table_name} AS parent_taxon ON parent_taxon.id = #{Spree::Taxon.table_name}.parent_id").where(["parent_taxon.permalink = ?", parent_permalink])
76
+ end
77
+ end
78
+
63
79
  def by_taxonomy(taxons)
64
80
  return taxons unless taxonomy?
65
81