spree_admin 5.2.0.rc2 → 5.2.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 (188) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/spree/admin/application.scss +1 -1
  3. data/app/assets/stylesheets/spree/admin/components/_alerts.scss +1 -1
  4. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +5 -4
  5. data/app/assets/stylesheets/spree/admin/components/_dialogs.scss +0 -1
  6. data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +6 -0
  7. data/app/assets/stylesheets/spree/admin/components/_main.scss +2 -233
  8. data/app/assets/stylesheets/spree/admin/components/_sidebar.scss +693 -0
  9. data/app/assets/stylesheets/spree/admin/components/_tables.scss +2 -2
  10. data/app/assets/stylesheets/spree/admin/components/_variants_form.scss +1 -2
  11. data/app/assets/stylesheets/spree/admin/global/_variables.scss +15 -12
  12. data/app/assets/stylesheets/spree/admin/shared/_base.scss +9 -3
  13. data/app/assets/stylesheets/spree/admin/shared/_forms.scss +5 -6
  14. data/app/assets/stylesheets/spree/admin/views/_dashboard.scss +14 -0
  15. data/app/controllers/spree/admin/admin_users_controller.rb +0 -2
  16. data/app/controllers/spree/admin/checkouts_controller.rb +1 -4
  17. data/app/controllers/spree/admin/coupon_codes_controller.rb +0 -14
  18. data/app/controllers/spree/admin/customer_returns_controller.rb +0 -13
  19. data/app/controllers/spree/admin/digital_assets_controller.rb +2 -2
  20. data/app/controllers/spree/admin/exports_controller.rb +2 -9
  21. data/app/controllers/spree/admin/gift_cards_controller.rb +7 -14
  22. data/app/controllers/spree/admin/integrations_controller.rb +1 -1
  23. data/app/controllers/spree/admin/invitations_controller.rb +0 -2
  24. data/app/controllers/spree/admin/metafields_controller.rb +1 -1
  25. data/app/controllers/spree/admin/oauth_applications_controller.rb +0 -10
  26. data/app/controllers/spree/admin/option_types_controller.rb +0 -10
  27. data/app/controllers/spree/admin/orders_controller.rb +1 -1
  28. data/app/controllers/spree/admin/page_blocks_controller.rb +1 -1
  29. data/app/controllers/spree/admin/pages_controller.rb +1 -1
  30. data/app/controllers/spree/admin/payment_methods_controller.rb +1 -11
  31. data/app/controllers/spree/admin/policies_controller.rb +4 -0
  32. data/app/controllers/spree/admin/posts_controller.rb +2 -10
  33. data/app/controllers/spree/admin/promotion_actions_controller.rb +1 -1
  34. data/app/controllers/spree/admin/promotion_rules_controller.rb +1 -1
  35. data/app/controllers/spree/admin/promotions_controller.rb +1 -1
  36. data/app/controllers/spree/admin/properties_controller.rb +0 -12
  37. data/app/controllers/spree/admin/reports_controller.rb +1 -1
  38. data/app/controllers/spree/admin/resource_controller.rb +27 -17
  39. data/app/controllers/spree/admin/return_authorizations_controller.rb +0 -10
  40. data/app/controllers/spree/admin/shipping_methods_controller.rb +4 -0
  41. data/app/controllers/spree/admin/stock_items_controller.rb +8 -11
  42. data/app/controllers/spree/admin/stock_locations_controller.rb +1 -1
  43. data/app/controllers/spree/admin/stock_transfers_controller.rb +0 -10
  44. data/app/controllers/spree/admin/store_credits_controller.rb +35 -35
  45. data/app/controllers/spree/admin/taxonomies_controller.rb +0 -10
  46. data/app/controllers/spree/admin/taxons_controller.rb +1 -1
  47. data/app/controllers/spree/admin/themes_controller.rb +6 -2
  48. data/app/controllers/spree/admin/translations_controller.rb +1 -1
  49. data/app/controllers/spree/admin/users_controller.rb +7 -17
  50. data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +0 -10
  51. data/app/controllers/spree/admin/zones_controller.rb +0 -7
  52. data/app/helpers/spree/admin/base_helper.rb +1 -1
  53. data/app/helpers/spree/admin/drawer_helper.rb +6 -6
  54. data/app/helpers/spree/admin/dropdown_helper.rb +26 -16
  55. data/app/helpers/spree/admin/modal_helper.rb +2 -0
  56. data/app/helpers/spree/admin/navigation_helper.rb +47 -4
  57. data/app/helpers/spree/admin/orders_filters_helper.rb +3 -0
  58. data/app/helpers/spree/admin/promotion_actions_helper.rb +1 -1
  59. data/app/helpers/spree/admin/promotion_rules_helper.rb +1 -1
  60. data/app/helpers/spree/admin/translations_helper.rb +1 -1
  61. data/app/javascript/spree/admin/application.js +2 -1
  62. data/app/javascript/spree/admin/controllers/dropdown_controller.js +85 -14
  63. data/app/javascript/spree/admin/controllers/sidebar_controller.js +231 -0
  64. data/app/javascript/spree/admin/controllers/tooltip_controller.js +84 -31
  65. data/app/models/spree/admin/form_builder.rb +76 -17
  66. data/app/models/spree/admin/navigation/builder.rb +82 -0
  67. data/app/models/spree/admin/navigation/item.rb +177 -0
  68. data/app/models/spree/admin/navigation.rb +193 -0
  69. data/app/views/layouts/spree/admin.html.erb +1 -1
  70. data/app/views/spree/admin/assets/edit.html.erb +1 -1
  71. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +1 -1
  72. data/app/views/spree/admin/custom_domains/_form.html.erb +2 -14
  73. data/app/views/spree/admin/digital_assets/_table.html.erb +1 -1
  74. data/app/views/spree/admin/gift_cards/_filters.html.erb +25 -16
  75. data/app/views/spree/admin/gift_cards/index.html.erb +1 -1
  76. data/app/views/spree/admin/integrations/index.html.erb +20 -8
  77. data/app/views/spree/admin/invitations/new.html.erb +2 -1
  78. data/app/views/spree/admin/metafield_definitions/_filters.html.erb +1 -1
  79. data/app/views/spree/admin/newsletter_subscribers/_filters.html.erb +1 -1
  80. data/app/views/spree/admin/newsletter_subscribers/_table_header.html.erb +2 -2
  81. data/app/views/spree/admin/oauth_applications/_table_header.html.erb +1 -1
  82. data/app/views/spree/admin/orders/_customer.html.erb +3 -3
  83. data/app/views/spree/admin/orders/_filters.html.erb +33 -25
  84. data/app/views/spree/admin/orders/_header.html.erb +0 -5
  85. data/app/views/spree/admin/orders/_list.html.erb +3 -3
  86. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +1 -1
  87. data/app/views/spree/admin/page_blocks/edit.html.erb +3 -3
  88. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +2 -5
  89. data/app/views/spree/admin/page_builder/_add_block.html.erb +1 -1
  90. data/app/views/spree/admin/page_builder/_header.html.erb +1 -1
  91. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +2 -2
  92. data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +1 -1
  93. data/app/views/spree/admin/page_builder/_sidebar_colors.html.erb +2 -2
  94. data/app/views/spree/admin/page_builder/_sidebar_fonts.html.erb +3 -3
  95. data/app/views/spree/admin/page_builder/_sidebar_section.html.erb +1 -1
  96. data/app/views/spree/admin/page_links/_form.html.erb +4 -13
  97. data/app/views/spree/admin/page_links/_list.html.erb +1 -1
  98. data/app/views/spree/admin/page_links/edit.html.erb +1 -1
  99. data/app/views/spree/admin/page_sections/edit.html.erb +3 -3
  100. data/app/views/spree/admin/page_sections/forms/_header.html.erb +0 -2
  101. data/app/views/spree/admin/page_sections/new.html.erb +1 -1
  102. data/app/views/spree/admin/pages/_table_header.html.erb +3 -3
  103. data/app/views/spree/admin/payment_methods/index.html.erb +5 -1
  104. data/app/views/spree/admin/payments/_payment.html.erb +7 -0
  105. data/app/views/spree/admin/policies/_filters.html.erb +1 -1
  106. data/app/views/spree/admin/posts/_form.html.erb +1 -4
  107. data/app/views/spree/admin/posts/filters.html.erb +18 -8
  108. data/app/views/spree/admin/products/_bulk_operations.html.erb +2 -2
  109. data/app/views/spree/admin/products/_filters.html.erb +17 -6
  110. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +1 -1
  111. data/app/views/spree/admin/products/edit.html.erb +0 -2
  112. data/app/views/spree/admin/products/form/_status.html.erb +0 -3
  113. data/app/views/spree/admin/products/form/_variants.html.erb +1 -1
  114. data/app/views/spree/admin/profile/edit.html.erb +9 -61
  115. data/app/views/spree/admin/promotions/_filters.html.erb +23 -13
  116. data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +1 -1
  117. data/app/views/spree/admin/promotions/_table_header.html.erb +1 -1
  118. data/app/views/spree/admin/promotions/form/_kind.html.erb +4 -4
  119. data/app/views/spree/admin/promotions/form/_settings.html.erb +2 -13
  120. data/app/views/spree/admin/refund_reasons/_table_header.html.erb +1 -1
  121. data/app/views/spree/admin/refunds/_form.html.erb +1 -9
  122. data/app/views/spree/admin/reimbursement_types/_table_header.html.erb +1 -1
  123. data/app/views/spree/admin/return_authorization_reasons/_table_header.html.erb +1 -1
  124. data/app/views/spree/admin/return_authorizations/filters.html.erb +1 -1
  125. data/app/views/spree/admin/roles/index.html.erb +1 -1
  126. data/app/views/spree/admin/shared/_audit_nav.html.erb +2 -0
  127. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +2 -2
  128. data/app/views/spree/admin/shared/_content_header.html.erb +5 -2
  129. data/app/views/spree/admin/shared/_developers_nav.html.erb +2 -4
  130. data/app/views/spree/admin/shared/_header.html.erb +5 -7
  131. data/app/views/spree/admin/shared/_index_table.html.erb +5 -4
  132. data/app/views/spree/admin/shared/_index_table_options.html.erb +1 -1
  133. data/app/views/spree/admin/shared/_navigation.html.erb +5 -0
  134. data/app/views/spree/admin/shared/_navigation_item.html.erb +64 -0
  135. data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +2 -2
  136. data/app/views/spree/admin/shared/_page_section_image.html.erb +2 -5
  137. data/app/views/spree/admin/shared/_page_section_logo.html.erb +1 -1
  138. data/app/views/spree/admin/shared/_returns_and_refunds_nav.html.erb +2 -3
  139. data/app/views/spree/admin/shared/_shipping_nav.html.erb +3 -2
  140. data/app/views/spree/admin/shared/_sidebar.html.erb +33 -7
  141. data/app/views/spree/admin/shared/_stock_nav.html.erb +6 -3
  142. data/app/views/spree/admin/shared/_tax_nav.html.erb +1 -2
  143. data/app/views/spree/admin/shared/_team_nav.html.erb +2 -3
  144. data/app/views/spree/admin/shared/_user_dropdown.html.erb +29 -19
  145. data/app/views/spree/admin/shared/sidebar/_customers_nav.html.erb +7 -0
  146. data/app/views/spree/admin/shared/sidebar/_orders_nav.html.erb +22 -2
  147. data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +21 -0
  148. data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +8 -0
  149. data/app/views/spree/admin/shared/sidebar/_returns_nav.html.erb +12 -0
  150. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +4 -2
  151. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +15 -1
  152. data/app/views/spree/admin/shared/sidebar/_storefront_nav.html.erb +25 -3
  153. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +1 -1
  154. data/app/views/spree/admin/shipping_categories/_table_header.html.erb +1 -1
  155. data/app/views/spree/admin/shipping_methods/_table_header.html.erb +1 -1
  156. data/app/views/spree/admin/stock_items/_filters.html.erb +18 -8
  157. data/app/views/spree/admin/stock_locations/_table_header.html.erb +2 -2
  158. data/app/views/spree/admin/stock_locations/_table_row.html.erb +1 -1
  159. data/app/views/spree/admin/stock_transfers/_filters.html.erb +19 -9
  160. data/app/views/spree/admin/store_credit_categories/index.html.erb +1 -1
  161. data/app/views/spree/admin/store_credits/_list.html.erb +3 -3
  162. data/app/views/spree/admin/storefront/edit.html.erb +2 -14
  163. data/app/views/spree/admin/stores/form/_basic.html.erb +2 -8
  164. data/app/views/spree/admin/stores/form/_checkout.html.erb +2 -2
  165. data/app/views/spree/admin/stores/form/_checkout_links.html.erb +1 -1
  166. data/app/views/spree/admin/stores/form/_emails.html.erb +1 -1
  167. data/app/views/spree/admin/tax_categories/_table_header.html.erb +2 -2
  168. data/app/views/spree/admin/tax_rates/_form.html.erb +1 -10
  169. data/app/views/spree/admin/tax_rates/_table_header.html.erb +2 -2
  170. data/app/views/spree/admin/taxonomies/_table_header.html.erb +1 -1
  171. data/app/views/spree/admin/taxons/_form.html.erb +2 -9
  172. data/app/views/spree/admin/themes/_theme.html.erb +1 -1
  173. data/app/views/spree/admin/translations/translation_rows/_permalink_field_row.html.erb +1 -12
  174. data/app/views/spree/admin/users/_filters.html.erb +26 -17
  175. data/app/views/spree/admin/users/index.html.erb +1 -1
  176. data/config/initializers/spree_admin_navigation.rb +510 -0
  177. data/config/locales/en.yml +6 -0
  178. data/lib/generators/spree/admin/scaffold/templates/controller.rb.tt +3 -1
  179. data/lib/generators/spree/admin/scaffold/templates/views/_filters.html.erb.tt +1 -1
  180. data/lib/generators/spree/admin/scaffold/templates/views/_table_header.html.erb.tt +2 -2
  181. data/lib/generators/spree/admin/scaffold/templates/views/_table_row.html.erb.tt +8 -6
  182. data/lib/spree/admin/engine.rb +64 -2
  183. data/lib/spree/admin/runtime_configuration.rb +1 -0
  184. data/lib/spree/admin.rb +20 -0
  185. metadata +17 -15
  186. data/app/assets/stylesheets/spree/admin/components/_offcanvas.scss +0 -26
  187. data/app/javascript/spree/admin/helpers/canvas.js +0 -29
  188. data/app/views/spree/admin/shared/_offcanvas_nav.html.erb +0 -12
@@ -15,7 +15,7 @@ module Spree
15
15
 
16
16
  private
17
17
 
18
- def collection
18
+ def scope
19
19
  super.order_default
20
20
  end
21
21
 
@@ -15,16 +15,6 @@ module Spree
15
15
  spree.admin_stock_transfer_path(@object)
16
16
  end
17
17
 
18
- def collection
19
- params[:q] ||= {}
20
- params[:q][:s] ||= 'created_at desc'
21
-
22
- @search = super.accessible_by(current_ability, :index).ransack(params[:q])
23
- @stock_transfers = @search.result.
24
- page(params[:page]).
25
- per(params[:per_page])
26
- end
27
-
28
18
  def permitted_resource_params
29
19
  params.require(:stock_transfer).permit(permitted_stock_transfer_attributes)
30
20
  end
@@ -2,18 +2,10 @@ module Spree
2
2
  module Admin
3
3
  class StoreCreditError < StandardError; end
4
4
 
5
- class StoreCreditsController < Spree::Admin::BaseController
6
- before_action :load_user
7
- before_action :load_store_credit, only: [:new, :edit, :update, :destroy]
5
+ class StoreCreditsController < Spree::Admin::ResourceController
6
+ before_action :set_breadcrumbs
7
+ before_action :set_user
8
8
  before_action :ensure_unused_store_credit, only: [:update]
9
- helper_method :collection_url
10
-
11
- def index
12
- @store_credits = scope.includes(:created_by).order(created_at: :desc)
13
- @store_credits = @store_credits.page(params[:page]).per(params[:per_page])
14
-
15
- @collection = @store_credits
16
- end
17
9
 
18
10
  def show
19
11
  @store_credit = scope.find(params[:id])
@@ -21,8 +13,8 @@ module Spree
21
13
  end
22
14
 
23
15
  def create
24
- @store_credit = @user.store_credits.build(
25
- permitted_store_credit_params.merge(
16
+ @store_credit = parent.store_credits.build(
17
+ permitted_resource_params.merge(
26
18
  created_by: try_spree_current_user,
27
19
  action_originator: try_spree_current_user,
28
20
  store: current_store
@@ -31,7 +23,7 @@ module Spree
31
23
 
32
24
  if @store_credit.save
33
25
  flash[:success] = flash_message_for(@store_credit, :successfully_created)
34
- redirect_to spree.admin_user_path(@user)
26
+ redirect_to spree.admin_user_path(parent)
35
27
  else
36
28
  flash[:error] = Spree.t('store_credit.errors.unable_to_create')
37
29
  render :new, status: :unprocessable_entity
@@ -39,11 +31,11 @@ module Spree
39
31
  end
40
32
 
41
33
  def update
42
- @store_credit.assign_attributes(permitted_store_credit_params)
34
+ @store_credit.assign_attributes(permitted_resource_params)
43
35
 
44
36
  if @store_credit.save
45
37
  flash[:success] = flash_message_for(@store_credit, :successfully_updated)
46
- redirect_to spree.admin_user_store_credit_path(@user, @store_credit)
38
+ redirect_to spree.admin_user_store_credit_path(parent, @store_credit)
47
39
  else
48
40
  flash[:error] = Spree.t('store_credit.errors.unable_to_update')
49
41
  render :edit, status: :unprocessable_entity
@@ -59,37 +51,41 @@ module Spree
59
51
  flash[:error] = Spree.t('store_credit.errors.unable_to_delete')
60
52
  end
61
53
 
62
- redirect_to spree.admin_user_path(@user)
54
+ redirect_to spree.admin_user_path(parent)
63
55
  end
64
56
 
65
57
  protected
66
58
 
67
- def permitted_store_credit_params
68
- params.require(:store_credit).permit(permitted_store_credit_attributes)
59
+ def parent
60
+ @parent ||= Spree.user_class.find_by(id: params[:user_id])
69
61
  end
70
62
 
71
- private
63
+ def parent_data
64
+ {
65
+ model_name: 'spree/user',
66
+ model_class: Spree.user_class,
67
+ find_by: :id
68
+ }
69
+ end
72
70
 
73
- def load_user
74
- @user = Spree.user_class.find_by(id: params[:user_id])
71
+ def permitted_resource_params
72
+ params.require(:store_credit).permit(permitted_store_credit_attributes)
73
+ end
75
74
 
76
- unless @user
77
- flash[:error] = Spree.t(:user_not_found)
78
- redirect_to spree.admin_path
79
- end
75
+ private
80
76
 
81
- @breadcrumb_icon = 'users'
82
- add_breadcrumb Spree.t(:customers), :admin_users_path
83
- add_breadcrumb @user.name, spree.admin_user_path(@user)
77
+ def set_user
78
+ @user = parent
84
79
  end
85
80
 
86
- def load_store_credit
87
- @store_credit = scope.find_by(id: params[:id]) || scope.new
88
- @object = @store_credit
81
+ def object_url
82
+ spree.admin_user_store_credit_path(parent, @store_credit)
89
83
  end
90
84
 
91
- def scope
92
- current_store.store_credits.where(user: @user)
85
+ def set_breadcrumbs
86
+ @breadcrumb_icon = 'users'
87
+ add_breadcrumb Spree.t(:customers), :admin_users_path
88
+ add_breadcrumb parent.name, spree.admin_user_path(parent)
93
89
  end
94
90
 
95
91
  def ensure_unused_store_credit
@@ -99,7 +95,11 @@ module Spree
99
95
  end
100
96
 
101
97
  def collection_url
102
- spree.admin_user_store_credits_path(@user)
98
+ spree.admin_user_store_credits_path(parent)
99
+ end
100
+
101
+ def update_turbo_stream_enabled?
102
+ true
103
103
  end
104
104
  end
105
105
  end
@@ -8,16 +8,6 @@ module Spree
8
8
 
9
9
  private
10
10
 
11
- def collection
12
- return @collection if @collection.present?
13
-
14
- @collection = super
15
-
16
- params[:q] ||= {}
17
- @search = @collection.ransack(params[:q])
18
- @collection = @search.result.all
19
- end
20
-
21
11
  def location_after_save
22
12
  spree.admin_taxonomy_path(@taxonomy)
23
13
  end
@@ -97,7 +97,7 @@ module Spree
97
97
  end
98
98
 
99
99
  def load_form_data
100
- @taxon_rules = Rails.application.config.spree.taxon_rules
100
+ @taxon_rules = Spree.taxon_rules
101
101
  @rule_types = @taxon_rules.map do |taxon_rule|
102
102
  [Spree.t("admin.taxon_rules.#{taxon_rule.to_s.demodulize.underscore}"), taxon_rule.to_s]
103
103
  end
@@ -70,8 +70,12 @@ module Spree
70
70
  true
71
71
  end
72
72
 
73
- def collection
74
- super.without_previews.order(default: :desc).includes(screenshot_attachment: :blob)
73
+ def scope
74
+ super.without_previews.order(default: :desc)
75
+ end
76
+
77
+ def collection_includes
78
+ { screenshot_attachment: :blob }
75
79
  end
76
80
 
77
81
  def permitted_resource_params
@@ -42,7 +42,7 @@ module Spree
42
42
 
43
43
  # Allowed translatable resources configured in Spree
44
44
  def allowed_model_classes
45
- Rails.application.config.spree.translatable_resources
45
+ Spree.translatable_resources
46
46
  end
47
47
 
48
48
  # Determine the translation locale to use
@@ -50,23 +50,13 @@ module Spree
50
50
 
51
51
  protected
52
52
 
53
- def collection
54
- return @collection if @collection.present?
55
-
56
- params[:q] ||= {}
57
- params[:q][:s] ||= 'created_at desc'
58
- params[:q][:created_at_not_null] ||= 1
59
-
60
- @collection = model_class.accessible_by(current_ability, :index)
61
- @search = @collection.ransack(params[:q])
62
- @collection = @search.result(distinct: true).
63
- includes(
64
- addresses: [:country, :state],
65
- ship_address: [:country, :state],
66
- bill_address: [:country, :state],
67
- avatar_attachment: :blob
68
- ).
69
- page(params[:page]).per(params[:per_page])
53
+ def collection_includes
54
+ {
55
+ addresses: [:country, :state],
56
+ ship_address: [:country, :state],
57
+ bill_address: [:country, :state],
58
+ avatar_attachment: :blob
59
+ }
70
60
  end
71
61
 
72
62
  def find_resource
@@ -19,16 +19,6 @@ module Spree
19
19
  @resource ||= Spree::Admin::Resource.new 'spree/admin/webhooks/subscribers', 'subscribers', nil
20
20
  end
21
21
 
22
- def collection
23
- params[:q] ||= {}
24
- params[:q][:s] ||= 'created_at desc'
25
-
26
- @search = Webhooks::Subscriber.accessible_by(current_ability).ransack(params[:q])
27
- @collection = @search.result.
28
- page(params[:page]).
29
- per(params[:per_page])
30
- end
31
-
32
22
  def process_subscriptions
33
23
  return if params[:webhooks_subscriber].blank?
34
24
 
@@ -14,13 +14,6 @@ module Spree
14
14
  edit_object_url(@object, states_country_id: @selected_country&.id)
15
15
  end
16
16
 
17
- def collection
18
- params[:q] ||= {}
19
- params[:q][:s] ||= 'name asc'
20
- @search = super.ransack(params[:q])
21
- @zones = @search.result.page(params[:page]).per(params[:per_page])
22
- end
23
-
24
17
  def load_data
25
18
  @selected_country = if params[:states_country_id]
26
19
  Spree::Country.find_by(id: params[:states_country_id])
@@ -4,7 +4,7 @@ module Spree
4
4
  include Spree::ImagesHelper
5
5
 
6
6
  def render_admin_partials(section, options = {})
7
- Rails.application.config.spree_admin.send(section).map do |partial|
7
+ Spree.admin.partials.send(section.to_s.gsub('_partials', '').to_sym).map do |partial|
8
8
  render partial, options
9
9
  end.join.html_safe
10
10
  end
@@ -1,18 +1,18 @@
1
1
  module Spree
2
2
  module Admin
3
3
  module DrawerHelper
4
- def drawer_header(title)
4
+ def drawer_header(title, controller_name = 'drawer')
5
5
  content_tag(:div, class: 'drawer-header') do
6
- content_tag(:h5, title, class: 'drawer-title') + drawer_close_button
6
+ content_tag(:h5, title, class: 'drawer-title') + drawer_close_button(controller_name)
7
7
  end.html_safe
8
8
  end
9
9
 
10
- def drawer_close_button
11
- button_tag('', type: 'button', class: 'btn-close', data: { action: 'drawer#close', dismiss: 'drawer', aria_label: Spree.t(:close) }).html_safe
10
+ def drawer_close_button(controller_name = 'drawer')
11
+ button_tag('', type: 'button', class: 'btn-close', data: { action: "#{controller_name}#close", dismiss: controller_name, aria_label: Spree.t(:close) }).html_safe
12
12
  end
13
13
 
14
- def drawer_discard_button
15
- button_tag(type: 'button', class: 'btn btn-light', data: { action: 'drawer#close', dismiss: 'drawer' }) do
14
+ def drawer_discard_button(controller_name = 'drawer')
15
+ button_tag(type: 'button', class: 'btn btn-light', data: { action: "#{controller_name}#close", dismiss: controller_name }) do
16
16
  Spree.t('actions.discard')
17
17
  end.html_safe
18
18
  end
@@ -3,7 +3,31 @@ module Spree
3
3
  module DropdownHelper
4
4
  def dropdown(options = {}, &block)
5
5
  options[:class] = ['dropdown'] + Array(options[:class])
6
- options[:data] = { controller: 'dropdown' }.merge(options[:data] || {})
6
+
7
+ # Extract direction option for backward compatibility and convert to Floating UI placement
8
+ placement = case options.delete(:direction)
9
+ when 'left'
10
+ 'bottom-end'
11
+ when 'top'
12
+ 'top-start'
13
+ when 'top-left'
14
+ 'top-end'
15
+ else
16
+ options[:placement] || 'bottom-start'
17
+ end
18
+
19
+ # Extract portal option
20
+ portal = options.delete(:portal)
21
+
22
+ data_attrs = {
23
+ controller: 'dropdown',
24
+ dropdown_placement_value: placement
25
+ }
26
+
27
+ # Add portal value if explicitly set
28
+ data_attrs[:dropdown_portal_value] = portal unless portal.nil?
29
+
30
+ options[:data] = data_attrs.merge(options[:data] || {})
7
31
  content_tag(:div, options, &block)
8
32
  end
9
33
 
@@ -19,22 +43,8 @@ module Spree
19
43
 
20
44
  def dropdown_menu(options = {}, &block)
21
45
  options[:class] = ['dropdown-container hidden'] + Array(options[:class])
22
-
23
- # Extract direction option for backward compatibility and convert to Floating UI placement
24
- placement = case options.delete(:direction)
25
- when 'left'
26
- 'bottom-end'
27
- when 'top'
28
- 'top-start'
29
- when 'top-left'
30
- 'top-end'
31
- else
32
- options[:placement] || 'bottom-start'
33
- end
34
-
35
46
  options[:data] = {
36
- dropdown_target: 'menu',
37
- dropdown_placement_value: placement
47
+ dropdown_target: 'menu'
38
48
  }.merge(options[:data] || {})
39
49
 
40
50
  content_tag(:div, options, &block)
@@ -5,6 +5,8 @@ module Spree
5
5
  # @param title [String, Proc] the title of the modal
6
6
  # @return [String]
7
7
  def modal_header(title)
8
+ Spree::Deprecation.warn('Bootstrap modals are deprecated and will be removed in Spree 6. Please use native dialogs with `dialog_header` helper.')
9
+
8
10
  title = capture(&title) if block_given?
9
11
  content_tag(:div, class: 'modal-header') do
10
12
  content_tag(:h5, title, class: 'modal-title') + modal_close_button
@@ -7,15 +7,15 @@ module Spree
7
7
  # @param [String, nil] icon Optional icon name to prepend to the label
8
8
  # @param [Boolean, nil] active Whether the link should be marked as active
9
9
  # @return [SafeBuffer] The navigation item HTML
10
- def nav_item(label = nil, url, icon: nil, active: nil, data: {})
10
+ def nav_item(label = nil, url, icon: nil, active: nil, data: {}, **options)
11
11
  content_tag :li, class: 'nav-item', role: 'presentation' do
12
12
  if block_given?
13
- active_link_to url, class: 'nav-link', active: active, data: data do
13
+ active_link_to url, class: 'nav-link', active: active, data: data, **options do
14
14
  yield
15
15
  end
16
16
  else
17
17
  label = icon(icon) + label if icon.present? && label.present?
18
- active_link_to label, url, class: 'nav-link', active: active, data: data
18
+ active_link_to label, url, class: 'nav-link', active: active, data: data, **options
19
19
  end
20
20
  end
21
21
  end
@@ -248,7 +248,7 @@ module Spree
248
248
  end
249
249
 
250
250
  link_to url, class: 'd-flex align-items-center text-decoration-none' do
251
- content_tag(:span, icon('chevron-left', class: 'mr-0'), class: 'btn hover-gray px-2 d-flex align-items-center') +
251
+ content_tag(:span, icon('chevron-left', class: 'mr-0'), class: 'btn hover-gray shadow-none px-2 d-flex align-items-center shadow-none') +
252
252
  content_tag(:span, label, class: 'font-size-base text-black')
253
253
  end
254
254
  end
@@ -312,6 +312,49 @@ module Spree
312
312
  icon(@breadcrumb_icon)
313
313
  end
314
314
  end
315
+
316
+ # Renders the navigation for the given context
317
+ # @param context [Symbol] the navigation context (:sidebar, :settings, etc.)
318
+ # @param options [Hash] additional options for rendering
319
+ # @return [String] the rendered navigation HTML
320
+ def render_navigation(context = :sidebar, **options)
321
+ return '' if Spree::Admin::RuntimeConfig.legacy_sidebar_navigation
322
+
323
+ items = navigation_items(context)
324
+ return '' if items.empty?
325
+
326
+ render 'spree/admin/shared/navigation',
327
+ items: items,
328
+ context: context,
329
+ **options
330
+ end
331
+
332
+ # Get navigation items for the given context
333
+ # @param context [Symbol] the navigation context
334
+ # @return [Array<Spree::Admin::Navigation::Item>] the visible navigation items
335
+ def navigation_items(context = :sidebar)
336
+ # Pass the view context (self) so that can? and other helpers are available
337
+ Spree.admin.navigation.send(context)&.visible_items(self) || []
338
+ end
339
+
340
+ # Renders page tab navigation for the given context
341
+ # @param context [Symbol] the navigation context (:tax_tabs, :shipping_tabs, etc.)
342
+ # @param options [Hash] additional options for rendering
343
+ # @return [String] the rendered tab navigation HTML wrapped in content_for(:page_tabs)
344
+ def render_tab_navigation(context, **options)
345
+ items = navigation_items(context)
346
+ return '' if items.empty?
347
+
348
+ content_for :page_tabs do
349
+ items.map do |item|
350
+ item_url = item.resolve_url(self)
351
+ item_label = item.resolve_label
352
+ is_active = item.active?(request.path, self)
353
+
354
+ nav_item(item_label, item_url, active: is_active)
355
+ end.join.html_safe
356
+ end
357
+ end
315
358
  end
316
359
  end
317
360
  end
@@ -2,6 +2,8 @@ module Spree
2
2
  module Admin
3
3
  module OrdersFiltersHelper
4
4
  def params_to_filters(search_params:, vendor: nil, user: nil)
5
+ return if search_params.blank?
6
+
5
7
  if search_params.is_a?(String)
6
8
  search_params = JSON.parse(search_params).deep_symbolize_keys
7
9
  end
@@ -68,6 +70,7 @@ module Spree
68
70
  # e.g. SELECT DISTINCT DISTINCT "spree_orders".id, "spree_orders"."created_at" AS alias_0 FROM "spree_orders"
69
71
  # see https://github.com/spree/spree/pull/3919
70
72
  @orders = @search.result(distinct: true).page(params[:page]).per(params[:per_page] || Spree::Admin::RuntimeConfig.admin_orders_per_page)
73
+ @collection = @orders
71
74
  end
72
75
 
73
76
  def load_user
@@ -3,7 +3,7 @@ module Spree
3
3
  module PromotionActionsHelper
4
4
  def options_for_promotion_action_types(promotion)
5
5
  existing = promotion.actions.pluck(:type)
6
- Rails.application.config.spree.promotions.actions.map(&:name).reject { |r| existing.include? r }
6
+ Spree.promotions.actions.map(&:name).reject { |r| existing.include? r }
7
7
  end
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@ module Spree
3
3
  module PromotionRulesHelper
4
4
  def options_for_promotion_rule_types(promotion)
5
5
  existing = promotion.rules.pluck(:type)
6
- Rails.application.config.spree.promotions.rules.map(&:name).reject { |r| existing.include? r }
6
+ Spree.promotions.rules.map(&:name).reject { |r| existing.include? r }
7
7
  end
8
8
 
9
9
  def active_options_for_option_value_promotion_rule(promotion_rule)
@@ -2,7 +2,7 @@ module Spree
2
2
  module Admin
3
3
  module TranslationsHelper
4
4
  def link_to_edit_translations(resource, options = {})
5
- return unless Rails.application.config.spree.translatable_resources.map(&:name).include?(resource.class.name)
5
+ return unless Spree.translatable_resources.map(&:name).include?(resource.class.name)
6
6
  return unless can?(:update, resource)
7
7
  return unless can?(:update, :translations)
8
8
 
@@ -15,7 +15,6 @@ import "mapkick/bundle"
15
15
 
16
16
  // Helpers
17
17
  import 'spree/admin/helpers/tinymce'
18
- import 'spree/admin/helpers/canvas'
19
18
  import 'spree/admin/helpers/trix/video_embed'
20
19
  import 'spree/admin/helpers/bootstrap'
21
20
 
@@ -76,6 +75,7 @@ import SearchPickerController from 'spree/admin/controllers/search_picker_contro
76
75
  import SectionFormController from 'spree/admin/controllers/section_form_controller'
77
76
  import SelectController from 'spree/admin/controllers/select_controller'
78
77
  import SeoFormController from 'spree/admin/controllers/seo_form_controller'
78
+ import SidebarController from 'spree/admin/controllers/sidebar_controller'
79
79
  import SlugFormController from 'spree/admin/controllers/slug_form_controller'
80
80
  import StickyController from 'spree/admin/controllers/sticky_controller'
81
81
  import SortableAutoSubmit from 'spree/admin/controllers/sortable_auto_submit_controller'
@@ -141,6 +141,7 @@ application.register('search-picker', SearchPickerController)
141
141
  application.register('section-form', SectionFormController)
142
142
  application.register('select', SelectController)
143
143
  application.register('seo-form', SeoFormController)
144
+ application.register('sidebar', SidebarController)
144
145
  application.register('slug-form', SlugFormController)
145
146
  application.register('sticky', StickyController)
146
147
  application.register('sortable', Sortable)