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