spree_admin 5.0.3 → 5.1.0.beta

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 (268) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/login_sidebar_background.png +0 -0
  3. data/app/assets/stylesheets/spree/admin/components/_bulk_panel.scss +8 -1
  4. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +12 -20
  5. data/app/assets/stylesheets/spree/admin/components/_cards.scss +9 -3
  6. data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +13 -40
  7. data/app/assets/stylesheets/spree/admin/components/_filters.scss +32 -3
  8. data/app/assets/stylesheets/spree/admin/components/_main.scss +107 -31
  9. data/app/assets/stylesheets/spree/admin/components/_media_form.scss +21 -9
  10. data/app/assets/stylesheets/spree/admin/components/_modals.scss +4 -3
  11. data/app/assets/stylesheets/spree/admin/components/_navbar.scss +5 -9
  12. data/app/assets/stylesheets/spree/admin/components/_navigation.scss +0 -1
  13. data/app/assets/stylesheets/spree/admin/components/_sortable_tree.scss +6 -2
  14. data/app/assets/stylesheets/spree/admin/components/_tables.scss +35 -5
  15. data/app/assets/stylesheets/spree/admin/global/_variables.scss +37 -17
  16. data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap4.scss +5 -4
  17. data/app/assets/stylesheets/spree/admin/shared/_base.scss +50 -17
  18. data/app/assets/stylesheets/spree/admin/shared/_forms.scss +6 -2
  19. data/app/assets/stylesheets/spree/admin/views/_page_builder.scss +30 -21
  20. data/app/controllers/concerns/spree/admin/breadcrumb_concern.rb +22 -0
  21. data/app/controllers/concerns/spree/admin/preferences_concern.rb +22 -0
  22. data/app/controllers/concerns/spree/admin/products_breadcrumb_concern.rb +22 -0
  23. data/app/controllers/concerns/spree/admin/promotions_breadcrumb_concern.rb +23 -0
  24. data/app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb +12 -0
  25. data/app/controllers/spree/admin/addresses_controller.rb +4 -0
  26. data/app/controllers/spree/admin/admin_users_controller.rb +112 -0
  27. data/app/controllers/spree/admin/assets_controller.rb +7 -9
  28. data/app/controllers/spree/admin/base_controller.rb +21 -10
  29. data/app/controllers/spree/admin/checkouts_controller.rb +4 -0
  30. data/app/controllers/spree/admin/classifications_controller.rb +4 -0
  31. data/app/controllers/spree/admin/coupon_codes_controller.rb +2 -0
  32. data/app/controllers/spree/admin/custom_domains_controller.rb +6 -0
  33. data/app/controllers/spree/admin/customer_returns_controller.rb +4 -0
  34. data/app/controllers/spree/admin/dashboard_controller.rb +19 -14
  35. data/app/controllers/spree/admin/digital_assets_controller.rb +8 -0
  36. data/app/controllers/spree/admin/exports_controller.rb +6 -2
  37. data/app/controllers/spree/admin/integrations_controller.rb +61 -0
  38. data/app/controllers/spree/admin/invitations_controller.rb +128 -0
  39. data/app/controllers/spree/admin/line_items_controller.rb +4 -0
  40. data/app/controllers/spree/admin/oauth_applications_controller.rb +6 -0
  41. data/app/controllers/spree/admin/option_types_controller.rb +15 -0
  42. data/app/controllers/spree/admin/option_values_controller.rb +4 -0
  43. data/app/controllers/spree/admin/orders/return_authorizations_controller.rb +4 -0
  44. data/app/controllers/spree/admin/orders_controller.rb +11 -0
  45. data/app/controllers/spree/admin/page_blocks_controller.rb +3 -2
  46. data/app/controllers/spree/admin/page_links_controller.rb +9 -0
  47. data/app/controllers/spree/admin/page_sections_controller.rb +13 -4
  48. data/app/controllers/spree/admin/pages_controller.rb +7 -0
  49. data/app/controllers/spree/admin/payment_methods_controller.rb +23 -12
  50. data/app/controllers/spree/admin/post_categories_controller.rb +3 -0
  51. data/app/controllers/spree/admin/posts_controller.rb +11 -0
  52. data/app/controllers/spree/admin/products_controller.rb +11 -8
  53. data/app/controllers/spree/admin/promotion_actions_controller.rb +10 -2
  54. data/app/controllers/spree/admin/promotion_rules_controller.rb +10 -2
  55. data/app/controllers/spree/admin/promotions_controller.rb +6 -0
  56. data/app/controllers/spree/admin/properties_controller.rb +15 -0
  57. data/app/controllers/spree/admin/refund_reasons_controller.rb +7 -0
  58. data/app/controllers/spree/admin/refunds_controller.rb +4 -0
  59. data/app/controllers/spree/admin/reimbursement_types_controller.rb +7 -0
  60. data/app/controllers/spree/admin/reimbursements_controller.rb +4 -0
  61. data/app/controllers/spree/admin/reports_controller.rb +12 -2
  62. data/app/controllers/spree/admin/resource_controller.rb +1 -1
  63. data/app/controllers/spree/admin/return_authorization_reasons_controller.rb +7 -0
  64. data/app/controllers/spree/admin/return_authorizations_controller.rb +4 -0
  65. data/app/controllers/spree/admin/return_items_controller.rb +6 -0
  66. data/app/controllers/spree/admin/role_users_controller.rb +36 -0
  67. data/app/controllers/spree/admin/roles_controller.rb +8 -0
  68. data/app/controllers/spree/admin/shipments_controller.rb +2 -2
  69. data/app/controllers/spree/admin/shipping_categories_controller.rb +7 -0
  70. data/app/controllers/spree/admin/shipping_methods_controller.rb +6 -0
  71. data/app/controllers/spree/admin/stock_items_controller.rb +13 -0
  72. data/app/controllers/spree/admin/stock_locations_controller.rb +7 -0
  73. data/app/controllers/spree/admin/stock_transfers_controller.rb +14 -2
  74. data/app/controllers/spree/admin/store_credit_categories_controller.rb +5 -0
  75. data/app/controllers/spree/admin/store_credits_controller.rb +4 -0
  76. data/app/controllers/spree/admin/storefront_controller.rb +3 -0
  77. data/app/controllers/spree/admin/stores_controller.rb +17 -2
  78. data/app/controllers/spree/admin/tax_categories_controller.rb +7 -0
  79. data/app/controllers/spree/admin/tax_rates_controller.rb +6 -0
  80. data/app/controllers/spree/admin/taxonomies_controller.rb +15 -0
  81. data/app/controllers/spree/admin/taxons_controller.rb +24 -1
  82. data/app/controllers/spree/admin/themes_controller.rb +7 -0
  83. data/app/controllers/spree/admin/translations_controller.rb +9 -1
  84. data/app/controllers/spree/admin/user_passwords_controller.rb +22 -0
  85. data/app/controllers/spree/admin/user_sessions_controller.rb +23 -0
  86. data/app/controllers/spree/admin/users_controller.rb +11 -2
  87. data/app/controllers/spree/admin/variants_controller.rb +13 -0
  88. data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +34 -12
  89. data/app/controllers/spree/admin/zones_controller.rb +5 -0
  90. data/app/helpers/spree/admin/base_helper.rb +33 -32
  91. data/app/helpers/spree/admin/bulk_operations_helper.rb +8 -2
  92. data/app/helpers/spree/admin/modal_helper.rb +1 -1
  93. data/app/helpers/spree/admin/navigation_helper.rb +12 -6
  94. data/app/helpers/spree/admin/posts_helper.rb +1 -1
  95. data/app/helpers/spree/admin/session_assets_helper.rb +1 -1
  96. data/app/helpers/spree/admin/stores_helper.rb +1 -18
  97. data/app/helpers/spree/admin/tags_helper.rb +2 -2
  98. data/app/javascript/spree/admin/application.js +2 -2
  99. data/app/javascript/spree/admin/controllers/asset_uploader_controller.js +3 -2
  100. data/app/javascript/spree/admin/controllers/variants_form_controller.js +3 -2
  101. data/app/javascript/spree/admin/helpers/bootstrap.js +3 -3
  102. data/app/javascript/spree/admin/helpers/trix/video_embed.js +2 -2
  103. data/app/views/active_storage/_upload_form.html.erb +1 -1
  104. data/app/views/layouts/spree/minimal.html.erb +22 -0
  105. data/app/views/spree/admin/admin_users/_admin_user.html.erb +19 -0
  106. data/app/views/spree/admin/admin_users/_audit_log.html.erb +5 -0
  107. data/app/views/spree/admin/admin_users/_form.html.erb +12 -0
  108. data/app/views/spree/admin/admin_users/edit.html.erb +35 -0
  109. data/app/views/spree/admin/admin_users/index.html.erb +18 -0
  110. data/app/views/spree/admin/admin_users/new.html.erb +21 -0
  111. data/app/views/spree/admin/admin_users/show.html.erb +113 -0
  112. data/app/views/spree/admin/coupon_codes/index.html.erb +6 -6
  113. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +1 -1
  114. data/app/views/spree/admin/customer_returns/index.html.erb +1 -1
  115. data/app/views/spree/admin/dashboard/_store_preview.html.erb +1 -1
  116. data/app/views/spree/admin/dashboard/_top_products.html.erb +5 -3
  117. data/app/views/spree/admin/digital_assets/_table.html.erb +1 -1
  118. data/app/views/spree/admin/digital_assets/index.html.erb +0 -1
  119. data/app/views/spree/admin/exports/index.html.erb +1 -1
  120. data/app/views/spree/admin/integrations/_integration.html.erb +36 -0
  121. data/app/views/spree/admin/integrations/edit.html.erb +11 -0
  122. data/app/views/spree/admin/integrations/index.html.erb +23 -0
  123. data/app/views/spree/admin/integrations/new.html.erb +14 -0
  124. data/app/views/spree/admin/invitations/_invitation.html.erb +52 -0
  125. data/app/views/spree/admin/invitations/create.turbo_stream.erb +4 -0
  126. data/app/views/spree/admin/invitations/index.html.erb +21 -0
  127. data/app/views/spree/admin/invitations/new.html.erb +32 -0
  128. data/app/views/spree/admin/invitations/show.html.erb +9 -0
  129. data/app/views/spree/admin/line_items/new.html.erb +2 -2
  130. data/app/views/spree/admin/oauth_applications/index.html.erb +1 -1
  131. data/app/views/spree/admin/option_types/edit.html.erb +1 -1
  132. data/app/views/spree/admin/option_types/index.html.erb +1 -1
  133. data/app/views/spree/admin/orders/_customer.html.erb +1 -2
  134. data/app/views/spree/admin/orders/_filters.html.erb +28 -22
  135. data/app/views/spree/admin/orders/_list.html.erb +1 -1
  136. data/app/views/spree/admin/orders/_refunds.html.erb +1 -1
  137. data/app/views/spree/admin/orders/_shipment.html.erb +1 -1
  138. data/app/views/spree/admin/orders/_summary.html.erb +1 -1
  139. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +2 -2
  140. data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +1 -1
  141. data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +1 -1
  142. data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +1 -1
  143. data/app/views/spree/admin/orders/return_authorizations/show.html.erb +2 -2
  144. data/app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb +5 -7
  145. data/app/views/spree/admin/page_blocks/edit.html.erb +3 -5
  146. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +9 -0
  147. data/app/views/spree/admin/page_builder/_add_block.html.erb +1 -1
  148. data/app/views/spree/admin/page_builder/_header.html.erb +35 -28
  149. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +15 -21
  150. data/app/views/spree/admin/page_builder/_sidebar.html.erb +1 -1
  151. data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +11 -10
  152. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +152 -39
  153. data/app/views/spree/admin/page_links/_list.html.erb +2 -2
  154. data/app/views/spree/admin/page_links/edit.html.erb +2 -4
  155. data/app/views/spree/admin/page_sections/_form_tab_buttons.html.erb +6 -10
  156. data/app/views/spree/admin/page_sections/new.html.erb +1 -1
  157. data/app/views/spree/admin/pages/edit.html.erb +2 -2
  158. data/app/views/spree/admin/payment_methods/_form.html.erb +1 -1
  159. data/app/views/spree/admin/payment_methods/index.html.erb +16 -15
  160. data/app/views/spree/admin/payments/_payment.html.erb +1 -1
  161. data/app/views/spree/admin/post_categories/index.html.erb +1 -1
  162. data/app/views/spree/admin/posts/index.html.erb +1 -1
  163. data/app/views/spree/admin/products/_bulk_operations.html.erb +1 -1
  164. data/app/views/spree/admin/products/_filters.html.erb +2 -5
  165. data/app/views/spree/admin/products/_list.html.erb +1 -1
  166. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +2 -2
  167. data/app/views/spree/admin/products/form/_categorization.html.erb +34 -30
  168. data/app/views/spree/admin/products/form/_variants.html.erb +1 -0
  169. data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +1 -1
  170. data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +1 -1
  171. data/app/views/spree/admin/promotions/_filters.html.erb +2 -6
  172. data/app/views/spree/admin/promotions/_header.html.erb +1 -3
  173. data/app/views/spree/admin/promotions/_sidebar.html.erb +18 -0
  174. data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +2 -2
  175. data/app/views/spree/admin/promotions/index.html.erb +1 -1
  176. data/app/views/spree/admin/properties/edit.html.erb +1 -1
  177. data/app/views/spree/admin/properties/index.html.erb +1 -1
  178. data/app/views/spree/admin/refund_reasons/index.html.erb +1 -1
  179. data/app/views/spree/admin/reimbursement_types/index.html.erb +1 -1
  180. data/app/views/spree/admin/reimbursements/edit.html.erb +2 -2
  181. data/app/views/spree/admin/reimbursements/show.html.erb +1 -1
  182. data/app/views/spree/admin/reports/_report.html.erb +1 -1
  183. data/app/views/spree/admin/return_authorization_reasons/index.html.erb +1 -1
  184. data/app/views/spree/admin/return_authorizations/_filters.html.erb +2 -2
  185. data/app/views/spree/admin/return_authorizations/_list.html.erb +1 -1
  186. data/app/views/spree/admin/roles/edit.html.erb +6 -4
  187. data/app/views/spree/admin/roles/index.html.erb +11 -7
  188. data/app/views/spree/admin/shared/_alerts.html.erb +1 -1
  189. data/app/views/spree/admin/shared/_breadcrumbs.html.erb +13 -0
  190. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +1 -1
  191. data/app/views/spree/admin/shared/_content_header.html.erb +3 -3
  192. data/app/views/spree/admin/shared/_filters_button.html.erb +1 -1
  193. data/app/views/spree/admin/shared/_filters_search_bar.html.erb +1 -1
  194. data/app/views/spree/admin/shared/_head.html.erb +10 -1
  195. data/app/views/spree/admin/shared/_header.html.erb +26 -17
  196. data/app/views/spree/admin/shared/_index_table_options.html.erb +1 -1
  197. data/app/views/spree/admin/shared/_multi_product_picker.html.erb +1 -1
  198. data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +32 -0
  199. data/app/views/spree/admin/shared/_no_resource_found.html.erb +6 -3
  200. data/app/views/spree/admin/shared/_offcanvas_nav.html.erb +1 -14
  201. data/app/views/spree/admin/shared/_refunds.html.erb +1 -1
  202. data/app/views/spree/admin/shared/_sidebar.html.erb +0 -8
  203. data/app/views/spree/admin/shared/_tax_nav.html.erb +1 -0
  204. data/app/views/spree/admin/shared/_team_nav.html.erb +13 -0
  205. data/app/views/spree/admin/shared/_user_dropdown.html.erb +25 -20
  206. data/app/views/spree/admin/shared/devise/_links.html.erb +18 -0
  207. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +7 -5
  208. data/app/views/spree/admin/shared/sidebar/_integrations_nav.html.erb +5 -7
  209. data/app/views/spree/admin/shared/sidebar/_orders_nav.html.erb +2 -2
  210. data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +2 -2
  211. data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +17 -0
  212. data/app/views/spree/admin/shared/sidebar/_returns_nav.html.erb +1 -1
  213. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +33 -75
  214. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +17 -36
  215. data/app/views/spree/admin/shared/sidebar/_storefront_nav.html.erb +6 -2
  216. data/app/views/spree/admin/shared/sidebar/_vendors_nav.html.erb +9 -7
  217. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +1 -1
  218. data/app/views/spree/admin/shipping_categories/index.html.erb +1 -1
  219. data/app/views/spree/admin/shipping_methods/_form.html.erb +7 -134
  220. data/app/views/spree/admin/shipping_methods/form/_display.html.erb +25 -0
  221. data/app/views/spree/admin/shipping_methods/form/_estimated_transit_business_days.html.erb +23 -0
  222. data/app/views/spree/admin/shipping_methods/form/_shipping_categories.html.erb +21 -0
  223. data/app/views/spree/admin/shipping_methods/form/_tax_category.html.erb +16 -0
  224. data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +18 -0
  225. data/app/views/spree/admin/shipping_methods/form/_zones.html.erb +26 -0
  226. data/app/views/spree/admin/shipping_methods/index.html.erb +1 -1
  227. data/app/views/spree/admin/stock_items/index.html.erb +1 -1
  228. data/app/views/spree/admin/stock_locations/_stock_location.html.erb +5 -3
  229. data/app/views/spree/admin/stock_locations/index.html.erb +4 -2
  230. data/app/views/spree/admin/stock_transfers/index.html.erb +1 -1
  231. data/app/views/spree/admin/store_credit_categories/index.html.erb +1 -1
  232. data/app/views/spree/admin/store_credits/_list.html.erb +1 -1
  233. data/app/views/spree/admin/stores/edit_emails.html.erb +1 -1
  234. data/app/views/spree/admin/stores/form/_basic.html.erb +1 -1
  235. data/app/views/spree/admin/stores/form/_emails.html.erb +1 -1
  236. data/app/views/spree/admin/tax_categories/index.html.erb +1 -1
  237. data/app/views/spree/admin/tax_rates/index.html.erb +1 -1
  238. data/app/views/spree/admin/taxonomies/index.html.erb +1 -1
  239. data/app/views/spree/admin/themes/_theme.html.erb +6 -4
  240. data/app/views/spree/admin/themes/_theme_preview_image.html.erb +6 -4
  241. data/app/views/spree/admin/themes/index.html.erb +1 -1
  242. data/app/views/spree/admin/translations/edit.html.erb +1 -1
  243. data/app/views/spree/admin/user_passwords/edit.html.erb +21 -0
  244. data/app/views/spree/admin/user_passwords/new.html.erb +12 -0
  245. data/app/views/spree/admin/user_sessions/new.html.erb +16 -0
  246. data/app/views/spree/admin/users/_form.html.erb +10 -8
  247. data/app/views/spree/admin/users/_user.html.erb +4 -4
  248. data/app/views/spree/admin/users/index.html.erb +4 -4
  249. data/app/views/spree/admin/users/new.html.erb +1 -1
  250. data/app/views/spree/admin/variants/_search_result.html.erb +1 -1
  251. data/app/views/spree/admin/variants/form/_media.html.erb +1 -0
  252. data/app/views/spree/admin/variants/form/_media_asset.html.erb +1 -1
  253. data/app/views/spree/admin/webhooks_subscribers/_form.html.erb +37 -19
  254. data/app/views/spree/admin/webhooks_subscribers/_webhooks_subscriber.html.erb +12 -6
  255. data/app/views/spree/admin/webhooks_subscribers/edit.html.erb +2 -2
  256. data/app/views/spree/admin/webhooks_subscribers/index.html.erb +1 -1
  257. data/app/views/spree/admin/webhooks_subscribers/show.html.erb +58 -47
  258. data/app/views/spree/admin/zones/_form.html.erb +11 -15
  259. data/app/views/spree/admin/zones/index.html.erb +1 -1
  260. data/config/importmap.rb +2 -2
  261. data/config/locales/en.yml +3 -0
  262. data/config/routes.rb +13 -1
  263. data/lib/spree/admin/engine.rb +11 -1
  264. data/lib/spree/admin.rb +1 -0
  265. data/vendor/javascript/bootstrap--dist--js--bootstrap.bundle.min.js.js +4 -4
  266. data/vendor/javascript/dompurify.js +24 -24
  267. metadata +65 -9
  268. data/app/javascript/spree/admin/controllers/webhook_subscriber_events_controller.js +0 -19
@@ -1,6 +1,9 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class PostCategoriesController < ResourceController
4
+ include StorefrontBreadcrumbConcern
5
+ add_breadcrumb Spree.t(:posts), :admin_posts_path
6
+ add_breadcrumb Spree.t(:categories), :admin_post_categories_path
4
7
  end
5
8
  end
6
9
  end
@@ -3,6 +3,11 @@ module Spree
3
3
  class PostsController < ResourceController
4
4
  before_action :load_post_categories
5
5
 
6
+ include StorefrontBreadcrumbConcern
7
+ add_breadcrumb Spree.t(:posts), :admin_posts_path
8
+
9
+ before_action :add_breadcrumb_for_post, only: [:edit, :update]
10
+
6
11
  def select_options
7
12
  render json: current_store.posts.published.to_tom_select_json
8
13
  end
@@ -24,6 +29,12 @@ module Spree
24
29
  def load_post_categories
25
30
  @post_categories = current_store.post_categories.accessible_by(current_ability).order(:title)
26
31
  end
32
+
33
+ def add_breadcrumb_for_post
34
+ return unless @post.present?
35
+
36
+ add_breadcrumb @post.title, spree.edit_admin_post_path(@post)
37
+ end
27
38
  end
28
39
  end
29
40
  end
@@ -4,6 +4,7 @@ module Spree
4
4
  include Spree::Admin::StockLocationsHelper
5
5
  include Spree::Admin::BulkOperationsConcern
6
6
  include Spree::Admin::SessionAssetsHelper
7
+ include Spree::Admin::ProductsBreadcrumbConcern
7
8
 
8
9
  helper 'spree/admin/products'
9
10
  helper 'spree/admin/taxons'
@@ -282,14 +283,6 @@ module Spree
282
283
  clone_admin_product_url resource
283
284
  end
284
285
 
285
- def permitted_resource_params
286
- if cannot?(:activate, @product) && @new_status&.to_sym == :active
287
- super.except(:status, :make_active_at).permit!
288
- else
289
- super
290
- end
291
- end
292
-
293
286
  private
294
287
 
295
288
  def variant_stock_includes
@@ -360,6 +353,16 @@ module Spree
360
353
  new_slug = permitted_resource_params[:slug]
361
354
  permitted_resource_params[:slug] = @product.ensure_slug_is_unique(new_slug)
362
355
  end
356
+
357
+ def permitted_resource_params
358
+ @permitted_resource_params ||= begin
359
+ if cannot?(:activate, @product) && @new_status&.to_sym == :active
360
+ params.require(:product).permit(permitted_product_attributes).except(:status, :make_active_at)
361
+ else
362
+ params.require(:product).permit(permitted_product_attributes)
363
+ end
364
+ end
365
+ end
363
366
  end
364
367
  end
365
368
  end
@@ -11,8 +11,12 @@ module Spree
11
11
 
12
12
  def model_class
13
13
  @model_class = if params.dig(:promotion_action, :type).present?
14
- if allowed_action_types.map(&:to_s).include?(params.dig(:promotion_action, :type))
15
- params.dig(:promotion_action, :type).safe_constantize
14
+ # Find the actual class from allowed types rather than using constantize
15
+ action_type = params.dig(:promotion_action, :type)
16
+ action_class = allowed_action_types.find { |type| type.to_s == action_type }
17
+
18
+ if action_class
19
+ action_class
16
20
  else
17
21
  raise 'Unknown promotion action type'
18
22
  end
@@ -42,6 +46,10 @@ module Spree
42
46
  @promotion_action.calculator_type = @promotion_action.class.calculators.first.name
43
47
  end
44
48
  end
49
+
50
+ def permitted_resource_params
51
+ params.require(:promotion_action).permit(permitted_promotion_action_attributes)
52
+ end
45
53
  end
46
54
  end
47
55
  end
@@ -9,8 +9,12 @@ module Spree
9
9
 
10
10
  def model_class
11
11
  @model_class = if params.dig(:promotion_rule, :type).present?
12
- if allowed_rule_types.map(&:to_s).include?(params.dig(:promotion_rule, :type))
13
- params.dig(:promotion_rule, :type).safe_constantize
12
+ # Find the actual class from allowed types rather than using constantize
13
+ rule_type = params.dig(:promotion_rule, :type)
14
+ rule_class = allowed_rule_types.find { |type| type.to_s == rule_type }
15
+
16
+ if rule_class
17
+ rule_class
14
18
  else
15
19
  raise 'Unknown promotion rule type'
16
20
  end
@@ -34,6 +38,10 @@ module Spree
34
38
  def collection_url
35
39
  spree.admin_promotion_path(parent)
36
40
  end
41
+
42
+ def permitted_resource_params
43
+ params.require(:promotion_rule).permit(*permitted_promotion_rule_attributes + @object.preferences.keys.map { |key| "preferred_#{key}" })
44
+ end
37
45
  end
38
46
  end
39
47
  end
@@ -1,6 +1,8 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class PromotionsController < ResourceController
4
+ include PromotionsBreadcrumbConcern
5
+
4
6
  before_action :load_form_data, except: :index
5
7
 
6
8
  # POST /admin/promotions/:id/clone
@@ -56,6 +58,10 @@ module Spree
56
58
 
57
59
  @collection
58
60
  end
61
+
62
+ def permitted_resource_params
63
+ params.require(:promotion).permit(permitted_promotion_attributes)
64
+ end
59
65
  end
60
66
  end
61
67
  end
@@ -1,6 +1,11 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class PropertiesController < ResourceController
4
+ include ProductsBreadcrumbConcern
5
+ add_breadcrumb Spree.t(:properties), :admin_properties_path
6
+
7
+ before_action :add_breadcrumbs
8
+
4
9
  protected
5
10
 
6
11
  def update_turbo_stream_enabled?
@@ -18,6 +23,16 @@ module Spree
18
23
  @collection = @search.result.
19
24
  page(params[:page])
20
25
  end
26
+
27
+ def add_breadcrumbs
28
+ if @property.present? && @property.persisted?
29
+ add_breadcrumb @property.presentation, spree.edit_admin_property_path(@property)
30
+ end
31
+ end
32
+
33
+ def permitted_resource_params
34
+ params.require(:property).permit(permitted_property_attributes)
35
+ end
21
36
  end
22
37
  end
23
38
  end
@@ -1,6 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class RefundReasonsController < ResourceController
4
+ add_breadcrumb Spree.t(:refund_reasons), :admin_refund_reasons_path
5
+
6
+ private
7
+
8
+ def permitted_resource_params
9
+ params.require(:refund_reason).permit(permitted_refund_reason_attributes)
10
+ end
4
11
  end
5
12
  end
6
13
  end
@@ -38,6 +38,10 @@ module Spree
38
38
  def assign_refunder
39
39
  @refund.refunder = try_spree_current_user
40
40
  end
41
+
42
+ def permitted_resource_params
43
+ params.require(:refund).permit(permitted_refund_attributes)
44
+ end
41
45
  end
42
46
  end
43
47
  end
@@ -1,6 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ReimbursementTypesController < ResourceController
4
+ add_breadcrumb Spree.t(:reimbursement_types), :admin_reimbursement_types_path
5
+
6
+ private
7
+
8
+ def permitted_resource_params
9
+ params.require(:reimbursement_type).permit(permitted_reimbursement_type_attributes)
10
+ end
4
11
  end
5
12
  end
6
13
  end
@@ -42,6 +42,10 @@ module Spree
42
42
  flash[:error] = error.message
43
43
  redirect_to spree.edit_admin_order_reimbursement_path(parent, @reimbursement)
44
44
  end
45
+
46
+ def permitted_resource_params
47
+ params.require(:reimbursement).permit(permitted_reimbursement_attributes)
48
+ end
45
49
  end
46
50
  end
47
51
  end
@@ -3,6 +3,9 @@ module Spree
3
3
  class ReportsController < ResourceController
4
4
  include ActiveStorage::SetCurrent
5
5
 
6
+ add_breadcrumb_icon 'chart-bar'
7
+ add_breadcrumb Spree.t(:reports), :admin_reports_path
8
+
6
9
  before_action :set_user, only: [:new, :create]
7
10
 
8
11
  def show
@@ -33,9 +36,12 @@ module Spree
33
36
 
34
37
  def model_class
35
38
  @model_class = if params[:type].present?
39
+ # Find the actual class from allowed types rather than using constantize
36
40
  report_type = "Spree::Reports::#{params[:type].classify}"
37
- if allowed_report_types.include?(report_type)
38
- report_type.constantize
41
+ report_class = allowed_report_types.find { |type| type == report_type }
42
+
43
+ if report_class
44
+ Object.const_get(report_class)
39
45
  else
40
46
  raise 'Unknown report type'
41
47
  end
@@ -47,6 +53,10 @@ module Spree
47
53
  def allowed_report_types
48
54
  Rails.application.config.spree.reports.map(&:to_s)
49
55
  end
56
+
57
+ def permitted_resource_params
58
+ params.require(:report).permit(permitted_report_attributes)
59
+ end
50
60
  end
51
61
  end
52
62
  end
@@ -294,7 +294,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
294
294
  #
295
295
  # Other controllers can, should, override it to set custom logic
296
296
  def permitted_resource_params
297
- params[resource.object_name].present? ? params.require(resource.object_name).permit! : ActionController::Parameters.new
297
+ raise NotImplementedError, "You must implement the permitted_resource_params method"
298
298
  end
299
299
 
300
300
  def collection_actions
@@ -1,6 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ReturnAuthorizationReasonsController < ResourceController
4
+ add_breadcrumb Spree.t(:return_authorization_reasons), :admin_return_authorization_reasons_path
5
+
6
+ private
7
+
8
+ def permitted_resource_params
9
+ params.require(:return_authorization_reason).permit(permitted_return_authorization_reason_attributes)
10
+ end
4
11
  end
5
12
  end
6
13
  end
@@ -11,6 +11,10 @@ module Spree
11
11
 
12
12
  private
13
13
 
14
+ def permitted_resource_params
15
+ params.require(:return_authorization).permit(permitted_return_authorization_attributes)
16
+ end
17
+
14
18
  def location_after_destroy
15
19
  spree.edit_admin_order_path(@return_authorization.order)
16
20
  end
@@ -1,9 +1,15 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ReturnItemsController < ResourceController
4
+ private
5
+
4
6
  def location_after_save
5
7
  spree.edit_admin_order_customer_return_path(@return_item.customer_return.order, @return_item.customer_return)
6
8
  end
9
+
10
+ def permitted_resource_params
11
+ params.require(:return_item).permit(permitted_return_item_attributes)
12
+ end
7
13
  end
8
14
  end
9
15
  end
@@ -0,0 +1,36 @@
1
+ module Spree
2
+ module Admin
3
+ class RoleUsersController < BaseController
4
+ before_action :load_parent
5
+ before_action :load_role_user, only: [:edit, :update, :destroy]
6
+
7
+ # DELETE /admin/store/role_users/:id
8
+ def destroy
9
+ authorize! :destroy, @role_user
10
+
11
+ @role_user.destroy
12
+ redirect_back fallback_location: spree.admin_admin_users_path, status: :see_other, notice: flash_message_for(@role_user, :successfully_removed)
13
+ end
14
+
15
+ private
16
+
17
+ # load the resource to be used for authorization
18
+ # this can be extended to load different resources, eg vendor users
19
+ def load_parent
20
+ @parent = current_store
21
+ end
22
+
23
+ def scope
24
+ @parent.role_users.accessible_by(current_ability, :manage)
25
+ end
26
+
27
+ def load_role_user
28
+ @role_user = scope.find(params[:id])
29
+ end
30
+
31
+ def model_class
32
+ Spree::RoleUser
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,6 +1,14 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class RolesController < ResourceController
4
+ add_breadcrumb Spree.t(:users), :admin_admin_users_path
5
+ add_breadcrumb Spree.t(:roles), :admin_roles_path
6
+
7
+ private
8
+
9
+ def permitted_resource_params
10
+ params.require(:role).permit(permitted_role_attributes)
11
+ end
4
12
  end
5
13
  end
6
14
  end
@@ -55,7 +55,7 @@ module Spree
55
55
 
56
56
  if errors.any?
57
57
  flash[:error] = errors.to_sentence
58
- return redirect_back_or_default(spree.edit_admin_order_path(@order))
58
+ return redirect_back(fallback_location: spree.edit_admin_order_path(@order))
59
59
  end
60
60
 
61
61
  if transfer.valid? && transfer.run!
@@ -64,7 +64,7 @@ module Spree
64
64
  flash[:error] = transfer.errors.full_messages.to_sentence
65
65
  end
66
66
 
67
- redirect_back_or_default(spree.edit_admin_order_path(@order))
67
+ redirect_back(fallback_location: spree.edit_admin_order_path(@order))
68
68
  end
69
69
 
70
70
  private
@@ -1,6 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ShippingCategoriesController < ResourceController
4
+ add_breadcrumb Spree.t(:shipping_categories), :admin_shipping_categories_path
5
+
6
+ private
7
+
8
+ def permitted_resource_params
9
+ params.require(:shipping_category).permit(permitted_shipping_category_attributes)
10
+ end
4
11
  end
5
12
  end
6
13
  end
@@ -4,6 +4,8 @@ module Spree
4
4
  before_action :load_data, except: :index
5
5
  before_action :set_default_values, only: :new
6
6
 
7
+ add_breadcrumb Spree.t(:shipping_methods), :admin_shipping_methods_path
8
+
7
9
  private
8
10
 
9
11
  def set_default_values
@@ -24,6 +26,10 @@ module Spree
24
26
  def update_turbo_stream_enabled?
25
27
  true
26
28
  end
29
+
30
+ def permitted_resource_params
31
+ params.require(:shipping_method).permit(permitted_shipping_method_attributes)
32
+ end
27
33
  end
28
34
  end
29
35
  end
@@ -1,6 +1,10 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class StockItemsController < ResourceController
4
+ include ProductsBreadcrumbConcern
5
+
6
+ before_action :add_breadcrumbs
7
+
4
8
  private
5
9
 
6
10
  def update_turbo_stream_enabled?
@@ -20,6 +24,15 @@ module Spree
20
24
  page(params[:page]).
21
25
  per(params[:per_page])
22
26
  end
27
+
28
+ def add_breadcrumbs
29
+ add_breadcrumb Spree.t(:stock), spree.admin_stock_items_path
30
+ add_breadcrumb Spree.t(:stock_items), spree.admin_stock_items_path
31
+ end
32
+
33
+ def permitted_resource_params
34
+ params.require(:stock_item).permit(permitted_stock_item_attributes)
35
+ end
23
36
  end
24
37
  end
25
38
  end
@@ -3,6 +3,9 @@ module Spree
3
3
  class StockLocationsController < ResourceController
4
4
  before_action :set_country, only: :new
5
5
 
6
+ add_breadcrumb Spree.t(:stock_locations), :admin_stock_locations_path
7
+
8
+ # PUT /admin/stock_locations/:id/mark_as_default
6
9
  def mark_as_default
7
10
  @stock_location.update(default: true)
8
11
 
@@ -19,6 +22,10 @@ module Spree
19
22
  def set_country
20
23
  @stock_location.country = current_store.default_country
21
24
  end
25
+
26
+ def permitted_resource_params
27
+ params.require(:stock_location).permit(permitted_stock_location_attributes)
28
+ end
22
29
  end
23
30
  end
24
31
  end
@@ -3,8 +3,12 @@ module Spree
3
3
  class StockTransfersController < ResourceController
4
4
  before_action :prepare_params, only: :create
5
5
 
6
+ include ProductsBreadcrumbConcern
7
+
6
8
  create.fails :load_variant_omit_ids
7
9
 
10
+ before_action :add_breadcrumbs
11
+
8
12
  private
9
13
 
10
14
  def location_after_save
@@ -22,8 +26,7 @@ module Spree
22
26
  end
23
27
 
24
28
  def permitted_resource_params
25
- params.require(:stock_transfer).permit(:source_location_id, :destination_location_id, :reference,
26
- stock_movements_attributes: [:variant_id, :quantity, :originator_id, :stock_item_id])
29
+ params.require(:stock_transfer).permit(permitted_stock_transfer_attributes)
27
30
  end
28
31
 
29
32
  def prepare_params
@@ -43,6 +46,15 @@ module Spree
43
46
  def load_variant_omit_ids
44
47
  @variant_omit_ids = @stock_transfer.stock_movements.map(&:variant_id)
45
48
  end
49
+
50
+ def add_breadcrumbs
51
+ add_breadcrumb Spree.t(:stock), spree.admin_stock_items_path
52
+ add_breadcrumb Spree.t(:stock_transfers), spree.admin_stock_transfers_path
53
+
54
+ if @stock_transfer.present? && @stock_transfer.persisted?
55
+ add_breadcrumb @stock_transfer.number, spree.admin_stock_transfer_path(@stock_transfer)
56
+ end
57
+ end
46
58
  end
47
59
  end
48
60
  end
@@ -1,6 +1,11 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class StoreCreditCategoriesController < ResourceController
4
+ private
5
+
6
+ def permitted_resource_params
7
+ params.require(:store_credit_category).permit(permitted_store_credit_category_attributes)
8
+ end
4
9
  end
5
10
  end
6
11
  end
@@ -73,6 +73,10 @@ module Spree
73
73
  flash[:error] = Spree.t(:user_not_found)
74
74
  redirect_to spree.admin_path
75
75
  end
76
+
77
+ @breadcrumb_icon = 'users'
78
+ add_breadcrumb Spree.t(:customers), :admin_users_path
79
+ add_breadcrumb @user.name, spree.admin_user_path(@user)
76
80
  end
77
81
 
78
82
  def load_store_credit
@@ -1,6 +1,9 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class StorefrontController < BaseController
4
+ include StorefrontBreadcrumbConcern
5
+ add_breadcrumb Spree.t(:settings), :edit_admin_storefront_path
6
+
4
7
  def edit
5
8
  @store = current_store
6
9
  end
@@ -19,6 +19,11 @@ module Spree
19
19
  @store.mail_from_address = current_store.mail_from_address
20
20
 
21
21
  if @store.save
22
+ # Move/copy all existing users (staff) to the new store
23
+ current_store.role_users.each do |role_user|
24
+ @store.add_user(role_user.user, role_user.role)
25
+ end
26
+
22
27
  flash[:success] = flash_message_for(@store, :successfully_created)
23
28
  # redirect in view, Turbo doesn't support redirecting to a different host
24
29
  else
@@ -26,7 +31,17 @@ module Spree
26
31
  end
27
32
  end
28
33
 
29
- def edit; end
34
+ def edit
35
+ if params[:section] == 'emails'
36
+ add_breadcrumb Spree.t(:emails), spree.edit_admin_store_path(section: params[:section])
37
+ elsif params[:section] == 'policies'
38
+ add_breadcrumb Spree.t(:policies), spree.edit_admin_store_path(section: params[:section])
39
+ elsif params[:section] == 'checkout'
40
+ add_breadcrumb Spree.t(:checkout), spree.edit_admin_store_path(section: params[:section])
41
+ else
42
+ add_breadcrumb Spree.t(:store_details), spree.edit_admin_store_path(section: params[:section])
43
+ end
44
+ end
30
45
 
31
46
  def edit_emails; end
32
47
 
@@ -53,7 +68,7 @@ module Spree
53
68
  protected
54
69
 
55
70
  def permitted_store_params
56
- params.require(:store).permit(permitted_store_attributes)
71
+ params.require(:store).permit(permitted_store_attributes + current_store.preferences.keys.map { |key| "preferred_#{key}" })
57
72
  end
58
73
 
59
74
  private
@@ -1,6 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TaxCategoriesController < ResourceController
4
+ add_breadcrumb Spree.t(:tax_categories), :admin_tax_categories_path
5
+
6
+ private
7
+
8
+ def permitted_resource_params
9
+ params.require(:tax_category).permit(permitted_tax_category_attributes)
10
+ end
4
11
  end
5
12
  end
6
13
  end
@@ -4,6 +4,8 @@ module Spree
4
4
  before_action :load_data
5
5
  before_action :set_defaults, only: :new
6
6
 
7
+ add_breadcrumb Spree.t(:tax_rates), :admin_tax_rates_path
8
+
7
9
  private
8
10
 
9
11
  def set_defaults
@@ -15,6 +17,10 @@ module Spree
15
17
  @available_categories = Spree::TaxCategory.order(:name)
16
18
  @calculators = Spree::TaxRate.calculators.sort_by(&:name)
17
19
  end
20
+
21
+ def permitted_resource_params
22
+ params.require(:tax_rate).permit(permitted_tax_rate_attributes)
23
+ end
18
24
  end
19
25
  end
20
26
  end
@@ -1,6 +1,11 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TaxonomiesController < ResourceController
4
+ include ProductsBreadcrumbConcern
5
+ add_breadcrumb Spree.t(:taxonomies), :admin_taxonomies_path
6
+
7
+ before_action :add_breadcrumbs
8
+
4
9
  private
5
10
 
6
11
  def collection
@@ -16,6 +21,16 @@ module Spree
16
21
  def location_after_save
17
22
  spree.admin_taxonomy_path(@taxonomy)
18
23
  end
24
+
25
+ def add_breadcrumbs
26
+ if @taxonomy.present? && @taxonomy.persisted?
27
+ add_breadcrumb @taxonomy.name, spree.admin_taxonomy_path(@taxonomy)
28
+ end
29
+ end
30
+
31
+ def permitted_resource_params
32
+ params.require(:taxonomy).permit(permitted_taxonomy_attributes)
33
+ end
19
34
  end
20
35
  end
21
36
  end