ba_spree 1.0.0

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 (160) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +673 -0
  3. data/README.md +150 -0
  4. data/app/assets/config/manifest.js +1 -0
  5. data/app/assets/javascripts/ba_spree/admin_overrides/query_builder_controller.js +505 -0
  6. data/app/assets/javascripts/ba_spree/storefront/ba_spree_local_time.js +9 -0
  7. data/app/assets/stylesheets/spree/admin/custom.scss +40 -0
  8. data/app/controllers/ba_spree/checkout_controller_decorator.rb +111 -0
  9. data/app/controllers/ba_spree/store_controller_decorator.rb +55 -0
  10. data/app/controllers/concerns/ba_spree/theme_concern_decorator.rb +16 -0
  11. data/app/controllers/spree/admin/assets_controller_decorator.rb +48 -0
  12. data/app/controllers/spree/admin/products_controller_decorator.rb +25 -0
  13. data/app/controllers/spree/admin/promotion_rules_controller_decorator.rb +30 -0
  14. data/app/controllers/spree/admin/users_controller_decorator.rb +34 -0
  15. data/app/controllers/spree/contacts_controller_decorator.rb +23 -0
  16. data/app/controllers/spree/digital_links_controller.rb +61 -0
  17. data/app/controllers/spree/orders_controller_decorator.rb +24 -0
  18. data/app/decorators/ba_spree/product_pricing_decorator.rb +65 -0
  19. data/app/decorators/spree/current_decorator.rb +17 -0
  20. data/app/decorators/spree/money_decorator.rb +51 -0
  21. data/app/decorators/spree/order_email_subscriber_decorator.rb +64 -0
  22. data/app/decorators/spree/page_sections/featured_posts_decorator.rb +17 -0
  23. data/app/helpers/currency_rounding_helper.rb +10 -0
  24. data/app/helpers/spree/admin/filter_params_preservation.rb +130 -0
  25. data/app/helpers/spree/admin/navigation_helper_decorator.rb +23 -0
  26. data/app/helpers/spree/admin/promotion_rules_helper_decorator.rb +33 -0
  27. data/app/helpers/spree/admin/table_helper_decorator.rb +40 -0
  28. data/app/helpers/spree/base_helper_decorator.rb +63 -0
  29. data/app/helpers/spree/checkout_analytics_helper_decorator.rb +32 -0
  30. data/app/javascript/ba_spree/controllers/disable_when_hidden_controller.js +70 -0
  31. data/app/javascript/ba_spree/index.js +11 -0
  32. data/app/javascript/spree/admin/controllers/calendar_range_controller.js +61 -0
  33. data/app/javascript/spree/admin/controllers/slug_form_controller.js +17 -0
  34. data/app/models/ba_spree/address_decorator.rb +43 -0
  35. data/app/models/ba_spree/adjustment_decorator.rb +13 -0
  36. data/app/models/ba_spree/order_decorator.rb +95 -0
  37. data/app/models/ba_spree/order_updater_decorator.rb +33 -0
  38. data/app/models/ba_spree/payment_method_decorator.rb +10 -0
  39. data/app/models/ba_spree/product_decorator.rb +44 -0
  40. data/app/models/ba_spree/store_decorator.rb +23 -0
  41. data/app/models/ba_spree/variant_decorator.rb +49 -0
  42. data/app/models/concerns/spree/adjustment_source_decorator.rb +66 -0
  43. data/app/models/concerns/spree/product_property_metafields.rb +52 -0
  44. data/app/models/spree/adjustable/adjuster/promotion_decorator.rb +16 -0
  45. data/app/models/spree/admin/table/filter_decorator.rb +52 -0
  46. data/app/models/spree/admin/table/filter_group_decorator.rb +64 -0
  47. data/app/models/spree/asset_decorator.rb +102 -0
  48. data/app/models/spree/contact_decorator.rb +22 -0
  49. data/app/models/spree/digital_link_decorator.rb +9 -0
  50. data/app/models/spree/export_decorator.rb +34 -0
  51. data/app/models/spree/line_item_destroy_callback_decorator.rb +30 -0
  52. data/app/models/spree/metafield_definition_decorator.rb +34 -0
  53. data/app/models/spree/option_type_decorator.rb +22 -0
  54. data/app/models/spree/option_value_decorator.rb +19 -0
  55. data/app/models/spree/option_value_variant_decorator.rb +30 -0
  56. data/app/models/spree/order/address_book_decorator.rb +14 -0
  57. data/app/models/spree/order_merger_decorator.rb +29 -0
  58. data/app/models/spree/price_rules/customer_group_rule_decorator.rb +18 -0
  59. data/app/models/spree/price_rules/user_rule_decorator.rb +25 -0
  60. data/app/models/spree/price_rules/volume_rule_decorator.rb +25 -0
  61. data/app/models/spree/price_rules/zone_rule_decorator.rb +25 -0
  62. data/app/models/spree/pricing/batch_resolver.rb +96 -0
  63. data/app/models/spree/promotion_handler/cart_decorator.rb +51 -0
  64. data/app/models/spree/stock/packer_decorator.rb +61 -0
  65. data/app/models/spree/stock/prioritizer_decorator.rb +27 -0
  66. data/app/models/spree/tax_rate_decorator.rb +93 -0
  67. data/app/models/spree/taxon_decorator.rb +42 -0
  68. data/app/models/spree/user_bill_address_sync_decorator.rb +33 -0
  69. data/app/overrides/add_ba_spree_storefront_javascript_importmap_tags.rb +8 -0
  70. data/app/overrides/add_cache_to_product_listing_page.rb +41 -0
  71. data/app/overrides/add_class_to_login_link.rb +6 -0
  72. data/app/overrides/add_confirm_state_to_checkout_content_block.rb.rb +30 -0
  73. data/app/overrides/add_promotions_nav.rb +8 -0
  74. data/app/overrides/add_turbo_frame_to_admin_order_line_item_edit_link.rb +23 -0
  75. data/app/overrides/add_turbo_frame_to_promotion_action_edit_link.rb +20 -0
  76. data/app/overrides/add_turbo_stream_format_to_cart_path_in_cart_pane.rb +8 -0
  77. data/app/overrides/ba_spree_local_time_add_custom_javascript_import_map_tags.rb +8 -0
  78. data/app/overrides/disable_hidden_bill_address_fields_on_payment.rb +15 -0
  79. data/app/overrides/disable_turbo_on_user_registration_form.rb +18 -0
  80. data/app/overrides/fix_coupon_apply_button_layout.rb +7 -0
  81. data/app/overrides/hide_gift_cards_and_store_credits_from_account_nav.rb +11 -0
  82. data/app/overrides/hide_shipping_message_for_digital_only_orders.rb +15 -0
  83. data/app/overrides/localize_apply_button_text.rb +6 -0
  84. data/app/overrides/localize_newsletter_button_text.rb +6 -0
  85. data/app/overrides/replace_announcement_bar_text.rb +6 -0
  86. data/app/overrides/replace_button_edit_checkout.rb +10 -0
  87. data/app/overrides/replace_checkout_delivery_info.rb +6 -0
  88. data/app/overrides/replace_checkout_pay_button_with_dynamic_label.rb +14 -0
  89. data/app/overrides/replace_variant_not_available_button.rb +19 -0
  90. data/app/overrides/set_logo_width_height_in_admin_store_basic_form.rb +12 -0
  91. data/app/overrides/show_breadcrumbs_on_taxon_page.rb +30 -0
  92. data/app/overrides/show_individual_adjustments_in_order_details.rb +18 -0
  93. data/app/overrides/show_only_selected_payment_method_on_confirm.rb +29 -0
  94. data/app/overrides/spree/admin/preserve_filter_params_across_table_forms.rb +64 -0
  95. data/app/overrides/spree/admin/promotion_rules/_promotion_rule/set_turbo_frame_on_edit_link.html.erb.deface +11 -0
  96. data/app/overrides/spree/admin/stores/add_special_instruction_message_settings.rb +17 -0
  97. data/app/overrides/use_absolute_time_for_order_header_completed_at.rb +15 -0
  98. data/app/presenters/spree/mega_nav_presenter_decorator.rb +26 -0
  99. data/app/services/ba_spree/setup_service.rb +144 -0
  100. data/app/services/spree/assets/position_normalizer.rb +67 -0
  101. data/app/services/spree/products/duplicator_decorator.rb +39 -0
  102. data/app/services/spree/products/prepare_nested_attributes_decorator.rb +58 -0
  103. data/app/views/spree/addresses/edit.html.erb +64 -0
  104. data/app/views/spree/admin/orders/_order.html.erb +32 -0
  105. data/app/views/spree/admin/orders/_summary.html.erb +122 -0
  106. data/app/views/spree/admin/shared/_custom_head.html.erb +56 -0
  107. data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +55 -0
  108. data/app/views/spree/admin/stores/_special_instruction_message_settings.html.erb +14 -0
  109. data/app/views/spree/checkout/_accept_marketing_checkbox.html.erb +40 -0
  110. data/app/views/spree/checkout/_address.html.erb +135 -0
  111. data/app/views/spree/checkout/_confirm.html.erb +25 -0
  112. data/app/views/spree/checkout/_line_item.html.erb +26 -0
  113. data/app/views/spree/checkout/_payment_method_confirm.html.erb +8 -0
  114. data/app/views/spree/checkout/_payment_methods.html.erb +88 -0
  115. data/app/views/spree/checkout/_summary.html.erb +146 -0
  116. data/app/views/spree/shared/_purchased_items_table.html.erb +60 -0
  117. data/app/views/spree/shared/_purchased_items_table.text.erb +24 -0
  118. data/app/views/themes/default/spree/orders/_empty.html.erb +14 -0
  119. data/app/views/themes/default/spree/orders/_summary.html.erb +87 -0
  120. data/app/views/themes/default/spree/orders/edit.turbo_stream.erb +10 -0
  121. data/app/views/themes/default/spree/page_sections/_featured_taxons.html.erb +38 -0
  122. data/app/views/themes/default/spree/page_sections/_header.html.erb +124 -0
  123. data/app/views/themes/default/spree/page_sections/_newsletter.html.erb +4 -0
  124. data/app/views/themes/default/spree/page_sections/_post_details.html.erb +22 -0
  125. data/app/views/themes/default/spree/page_sections/_product_details.html.erb +88 -0
  126. data/app/views/themes/default/spree/page_sections/_product_grid.html.erb +58 -0
  127. data/app/views/themes/default/spree/page_sections/nav/_desktop.html.erb +94 -0
  128. data/app/views/themes/default/spree/page_sections/nav/_mobile.html.erb +148 -0
  129. data/app/views/themes/default/spree/posts/_post.html.erb +16 -0
  130. data/app/views/themes/default/spree/products/_description.html.erb +7 -0
  131. data/app/views/themes/default/spree/products/_details.html.erb +65 -0
  132. data/app/views/themes/default/spree/products/_json_ld_variant.html.erb +15 -0
  133. data/app/views/themes/default/spree/products/_price.html.erb +76 -0
  134. data/app/views/themes/default/spree/products/_swiper.html.erb +90 -0
  135. data/app/views/themes/default/spree/shared/_account_pane.html.erb +18 -0
  136. data/app/views/themes/default/spree/shared/_cart_icon.html.erb +19 -0
  137. data/app/views/themes/default/spree/shared/_line_item_options.html.erb +9 -0
  138. data/app/views/themes/default/spree/shared/_logo.html.erb +39 -0
  139. data/app/views/themes/default/spree/shared/_nav_taxon_square_image.html.erb +8 -0
  140. data/app/views/themes/default/spree/shared/_order_shipment.html.erb +79 -0
  141. data/app/views/themes/default/spree/shared/_search.html.erb +33 -0
  142. data/app/views/themes/default/spree/shared/icons/_cart.html.erb +6 -0
  143. data/app/views/themes/default/spree/shared/icons/_cart_48.html.erb +8 -0
  144. data/app/views/themes/default/spree/shared/icons/_heart.html.erb +15 -0
  145. data/config/importmap.rb +12 -0
  146. data/config/initializers/admin_navigation.rb +43 -0
  147. data/config/initializers/spree.rb +6 -0
  148. data/config/initializers/spree_admin_label_i18n_alias.rb +52 -0
  149. data/config/initializers/spree_admin_tables.rb +57 -0
  150. data/config/initializers/spree_permitted_attributes.rb +1 -0
  151. data/config/locales/en.yml +15 -0
  152. data/config/locales/ja.yml +18 -0
  153. data/config/locales/spree.en.yml +4 -0
  154. data/config/locales/spree.ja.yml +3493 -0
  155. data/lib/ba_spree/engine.rb +41 -0
  156. data/lib/ba_spree/spree_events_dedup_patch.rb +44 -0
  157. data/lib/ba_spree/version.rb +3 -0
  158. data/lib/ba_spree.rb +20 -0
  159. data/lib/generators/ba_spree/install/install_generator.rb +85 -0
  160. metadata +594 -0
@@ -0,0 +1,41 @@
1
+ module BaSpree
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'ba_spree'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib)
8
+
9
+ initializer 'ba_spree.autoloader' do |app|
10
+ if Rails.autoloaders.zeitwerk_enabled?
11
+ Rails.autoloaders.main.ignore("#{root}/app/overrides")
12
+ end
13
+ end
14
+
15
+ # Spree 5.3 のイベント subscriber 二重登録(注文確認/キャンセルメールの多重送信)対策。
16
+ # subscriber 登録(after_initialize 内の Spree::Events.activate!)より前に適用する必要があるため
17
+ # initializer で require する。 @see https://github.com/be-agile/giga-repeat/issues/1230
18
+ initializer 'ba_spree.spree_events_dedup_patch' do
19
+ require 'ba_spree/spree_events_dedup_patch'
20
+ end
21
+
22
+ initializer 'ba_spree.importmap', before: 'importmap' do |app|
23
+ app.config.importmap.paths << root.join('config/importmap.rb')
24
+ app.config.importmap.cache_sweepers << root.join('app/assets/javascripts')
25
+ app.config.importmap.cache_sweepers << root.join('app/javascript')
26
+ end
27
+
28
+ initializer 'ba_spree.assets' do |app|
29
+ app.config.assets.paths << root.join('app/javascript')
30
+ app.config.assets.precompile += %w( spree/admin/custom.css )
31
+ end
32
+
33
+ def self.activate
34
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
35
+ Rails.configuration.cache_classes ? require(c) : load(c)
36
+ end
37
+ end
38
+
39
+ config.to_prepare &method(:activate).to_proc
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Spree 5.3 のイベント subscriber 登録に重複ガードが無い問題への対策。
4
+ #
5
+ # `spree_emails` の Engine#after_initialize は無条件で
6
+ # `Spree.subscribers.concat([Spree::OrderEmailSubscriber, ...])` を行い、
7
+ # `Spree::Events.register_subscribers!` は `Spree.subscribers` を `.uniq` せず反復、
8
+ # さらに `Spree::Events::Registry#register` も重複チェックをしない。
9
+ # このため何らかの理由で subscriber が二重に登録されると subscription も二重化し、
10
+ # 注文確認メール / キャンセルメールが 2 通ずつ送信される。
11
+ #
12
+ # resolve 後の subscriber クラス単位で重複排除し、同一 subscriber を
13
+ # 1 回しか登録しないようにする(環境非依存で堅牢)。
14
+ #
15
+ # @see https://github.com/be-agile/giga-repeat/issues/1230
16
+ module BaSpree
17
+ # @gem-override spree_core-5.3.6/lib/spree/events.rb#register_subscribers!
18
+ # @see https://github.com/be-agile/giga-repeat/issues/1230
19
+ module SpreeEventsDedupPatch
20
+ def register_subscribers!
21
+ return unless defined?(Spree) && Spree.respond_to?(:subscribers)
22
+
23
+ registered = []
24
+
25
+ Spree.subscribers&.each do |subscriber|
26
+ # Resolve the subscriber constant fresh to handle code reload in development
27
+ # The array may contain stale class objects after Zeitwerk reload
28
+ resolved_subscriber = resolve_subscriber(subscriber)
29
+ next unless resolved_subscriber
30
+
31
+ # 同一 subscriber を二重登録しない(subscription 二重化=メール多重送信の防止)
32
+ next if registered.include?(resolved_subscriber)
33
+
34
+ registered << resolved_subscriber
35
+
36
+ resolved_subscriber.subscription_patterns.each do |pattern|
37
+ subscribe(pattern, resolved_subscriber, resolved_subscriber.subscription_options)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ Spree::Events.singleton_class.prepend(BaSpree::SpreeEventsDedupPatch)
@@ -0,0 +1,3 @@
1
+ module BaSpree
2
+ VERSION = "1.0.0"
3
+ end
data/lib/ba_spree.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'spree_core'
2
+ require 'spree_admin'
3
+ require 'spree_storefront'
4
+ require 'spree_i18n'
5
+ require 'spree_emails'
6
+ # gemspec で add_dependency している engine は、ここでも require してロード順を固定する。
7
+ # ba_spree_loyalty_points は Spree::Order / Spree::Store / Spree::PaymentMethod /
8
+ # Spree::CheckoutController を ba_spree と同じく decorate しており、どちらの decorator が外側に
9
+ # prepend されるかが Gemfile の記載順で決まってしまう。依存先を先にロードすることで、土台である
10
+ # 依存先の上に ba_spree が重なる形(ba_spree が外側)に固定する。
11
+ # spree_materials は現時点では ba_spree 側からのコード参照がないが、同じ理由で順序を固定しておく。
12
+ # @see https://github.com/be-agile/giga-repeat/issues/1307
13
+ require 'ba_spree_loyalty_points'
14
+ require 'spree_materials'
15
+ # Spree::BaseHelperDecorator#sort_adjustments_with_flat_percent_last が
16
+ # Spree::Calculator::FlatPercentOrderTotal を参照する。
17
+ # @see https://github.com/be-agile/giga-repeat/issues/1307
18
+ require 'spree_order_total_discount'
19
+ require 'ba_spree/engine'
20
+ require 'ba_spree/version'
@@ -0,0 +1,85 @@
1
+ module BaSpree
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_javascripts
7
+ js_directory = BaSpree::Engine.root.join('app', 'assets', 'javascripts')
8
+ manifest_file = 'app/assets/config/manifest.js'
9
+ Dir.glob("#{js_directory}/**/*.js").each do |file|
10
+ relative_path = file.sub("#{js_directory}/", '')
11
+ append_file manifest_file, "//= link #{relative_path}\n"
12
+ end
13
+ end
14
+
15
+ def add_stylesheets
16
+ css_directory = BaSpree::Engine.root.join('app', 'assets', 'stylesheets')
17
+ manifest_file = 'app/assets/config/manifest.js'
18
+ Dir.glob("#{css_directory}/**/*.scss").each do |file|
19
+ relative_path = file.sub("#{css_directory}/", '').sub('.scss', '.css')
20
+ append_file manifest_file, "//= link #{relative_path}\n"
21
+ end
22
+ end
23
+
24
+ # ba_spree が束ねる engine の migration をまとめてコピーする。
25
+ # 利用者が各 engine のジェネレータを 20 個順に叩かなくて済むようにするのが狙い。
26
+ # @see https://github.com/be-agile/giga-repeat/issues/1317
27
+ def add_migrations
28
+ railties = migratable_railtie_names
29
+
30
+ if railties.empty?
31
+ say_status :skip, 'migration を持つ ba_spree の engine が見つかりませんでした', :yellow
32
+ return
33
+ end
34
+
35
+ # FROM を省略すると spree 本体・spree_api・active_storage 等、
36
+ # アプリにロードされている全 railtie からコピーしてしまうため必ず列挙する
37
+ run "bundle exec rake railties:install:migrations FROM=#{railties.join(',')}"
38
+ end
39
+
40
+ def run_migrations
41
+ if options[:auto_run_migrations] || [ '', 'y', 'Y' ].include?(ask('Would you like to run the migrations now? [Y/n]'))
42
+ run 'bundle exec rake db:migrate'
43
+ else
44
+ say_status :skip, 'db:migrate をスキップしました。あとで実行してください', :yellow
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ # ba_spree の gemspec が依存に挙げている gem のうち、db/migrate を持つ
51
+ # engine の railtie 名を返す。
52
+ # gem 名と railtie 名は一致しないことがある
53
+ # (例: ba_spree_loyalty_points gem の engine_name は spree_loyalty_points)
54
+ # ため、gem のインストールパスと railtie の root を突き合わせて対応付ける。
55
+ def migratable_railtie_names
56
+ paths = dependency_gem_paths
57
+ return [] if paths.empty?
58
+
59
+ Rails.application.railties.filter_map do |railtie|
60
+ next unless railtie.respond_to?(:root) && railtie.respond_to?(:railtie_name)
61
+ next unless paths.include?(realpath(railtie.root))
62
+ next unless railtie.paths['db/migrate']&.existent&.any?
63
+
64
+ railtie.railtie_name
65
+ end.uniq.sort
66
+ end
67
+
68
+ def dependency_gem_paths
69
+ Gem::Specification.find_by_name('ba_spree').dependencies.select(&:runtime?).filter_map do |dependency|
70
+ realpath(Gem::Specification.find_by_name(dependency.name).full_gem_path)
71
+ rescue Gem::MissingSpecError
72
+ nil
73
+ end
74
+ rescue Gem::MissingSpecError
75
+ []
76
+ end
77
+
78
+ def realpath(path)
79
+ File.realpath(path.to_s)
80
+ rescue Errno::ENOENT
81
+ nil
82
+ end
83
+ end
84
+ end
85
+ end