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
@@ -15,6 +15,12 @@ module Spree
15
15
 
16
16
  before_action :load_form_data, only: [:new, :create, :edit, :update]
17
17
 
18
+ add_breadcrumb Spree.t(:products), :admin_products_path
19
+ add_breadcrumb Spree.t(:taxonomies), :admin_taxonomies_path
20
+
21
+ add_breadcrumb_icon 'package'
22
+ before_action :add_breadcrumb_taxonomy
23
+
18
24
  def show
19
25
  redirect_to location_after_save
20
26
  end
@@ -71,7 +77,10 @@ module Spree
71
77
  end
72
78
 
73
79
  def set_permalink_params
74
- params[:taxon][:permalink] = "#{@parent_permalink}/" + params[:permalink_part] if params.key? 'permalink_part'
80
+ return unless params[:permalink_part]
81
+
82
+ params[:taxon] ||= {}
83
+ params[:taxon][:permalink] = [@parent_permalink.presence, params[:permalink_part]].compact_blank.join('/')
75
84
  end
76
85
 
77
86
  def collection_url
@@ -93,6 +102,20 @@ module Spree
93
102
  [Spree.t("admin.taxon_rules.match_policies.#{policy}"), policy]
94
103
  end
95
104
  end
105
+
106
+ def add_breadcrumb_taxonomy
107
+ return unless @taxonomy.present?
108
+
109
+ add_breadcrumb @taxonomy.name, collection_url
110
+
111
+ if @object.present? && @object.persisted?
112
+ add_breadcrumb @object.name, spree.edit_admin_taxonomy_taxon_path(@taxonomy, @object.id)
113
+ end
114
+ end
115
+
116
+ def permitted_resource_params
117
+ params.require(:taxon).permit(permitted_taxon_attributes)
118
+ end
96
119
  end
97
120
  end
98
121
  end
@@ -3,6 +3,9 @@ module Spree
3
3
  class ThemesController < ResourceController
4
4
  layout :choose_layout
5
5
 
6
+ include StorefrontBreadcrumbConcern
7
+ add_breadcrumb Spree.t(:themes), :admin_themes_path
8
+
6
9
  def edit
7
10
  @theme_preview = params[:theme_preview_id].present? ? @theme.previews.find(params[:theme_preview_id]) : @theme.create_preview
8
11
  @page = if params[:page_id].present?
@@ -70,6 +73,10 @@ module Spree
70
73
  def collection
71
74
  super.without_previews.order(default: :desc).includes(screenshot_attachment: :blob)
72
75
  end
76
+
77
+ def permitted_resource_params
78
+ params.require(:theme).permit(permitted_theme_attributes + @object.preferences.keys.map { |key| "preferred_#{key}" })
79
+ end
73
80
  end
74
81
  end
75
82
  end
@@ -36,7 +36,15 @@ module Spree
36
36
  end
37
37
 
38
38
  def resource_class
39
- @resource_class ||= params[:resource_type].constantize
39
+ @resource_class ||= begin
40
+ klass = params[:resource_type]
41
+ allowed_resource_class.find { |allowed_class| allowed_class.to_s == klass } ||
42
+ raise(ActiveRecord::RecordNotFound, "Resource type not found")
43
+ end
44
+ end
45
+
46
+ def allowed_resource_class
47
+ Rails.application.config.spree.translatable_resources
40
48
  end
41
49
 
42
50
  def set_resource
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ module Admin
3
+ class UserPasswordsController < defined?(Devise::PasswordsController) ? Devise::PasswordsController : Spree::Admin::BaseController
4
+ layout 'spree/minimal'
5
+
6
+ def create
7
+ self.resource = resource_class.send_reset_password_instructions(resource_params)
8
+ yield resource if block_given?
9
+
10
+ set_flash_message(:notice, :send_instructions) if is_navigational_format?
11
+ # Don't not show error message that the email was not found
12
+ respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name))
13
+ end
14
+
15
+ protected
16
+
17
+ def translation_scope
18
+ 'devise.user_passwords'
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ module Admin
3
+ class UserSessionsController < defined?(Devise::SessionsController) ? Devise::SessionsController : Spree::Admin::BaseController
4
+ layout 'spree/minimal'
5
+
6
+ # We need to overwrite this action because `return_to` url may be in a different domain
7
+ # So we need to pass `allow_other_host` option to `redirect_to` method
8
+ def create
9
+ self.resource = warden.authenticate!(auth_options)
10
+ set_flash_message!(:notice, :signed_in)
11
+ sign_in(resource_name, resource)
12
+ yield resource if block_given?
13
+ redirect_to after_sign_in_path_for(resource), allow_other_host: true
14
+ end
15
+
16
+ protected
17
+
18
+ def translation_scope
19
+ 'devise.user_sessions'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -10,7 +10,12 @@ module Spree
10
10
  before_action :load_last_order_data, only: :show
11
11
  before_action :remove_empty_params, only: :update
12
12
 
13
- def show; end
13
+ add_breadcrumb_icon 'users'
14
+ add_breadcrumb Spree.t(:customers), :admin_users_path
15
+
16
+ def show
17
+ add_breadcrumb @user.name, spree.admin_user_path(@user)
18
+ end
14
19
 
15
20
  def create
16
21
  @user = Spree.user_class.new(user_params)
@@ -52,7 +57,7 @@ module Spree
52
57
  params[:q][:s] ||= 'created_at desc'
53
58
  params[:q][:created_at_not_null] ||= 1
54
59
 
55
- @collection = super
60
+ @collection = model_class.accessible_by(current_ability, :index)
56
61
  @search = @collection.ransack(params[:q])
57
62
  @collection = @search.result(distinct: true).
58
63
  includes(
@@ -64,6 +69,10 @@ module Spree
64
69
  page(params[:page]).per(params[:per_page])
65
70
  end
66
71
 
72
+ def find_resource
73
+ model_class.accessible_by(current_ability, :show).find(params[:id])
74
+ end
75
+
67
76
  private
68
77
 
69
78
  def user_params
@@ -3,9 +3,12 @@ module Spree
3
3
  class VariantsController < ResourceController
4
4
  include StockLocationsHelper
5
5
 
6
+ include ProductsBreadcrumbConcern
7
+
6
8
  belongs_to 'spree/product', find_by: :slug
7
9
  before_action :load_data, only: [:edit, :update]
8
10
  before_action :strip_attributes, only: [:update]
11
+ before_action :add_breadcrumbs
9
12
 
10
13
  edit_action.before :build_prices
11
14
  edit_action.before :build_stock_items
@@ -85,6 +88,16 @@ module Spree
85
88
  params[:variant].delete(:prices_attributes) unless can?(:manage, @variant.prices.first)
86
89
  params[:variant].delete(:stock_items_attributes) unless can?(:manage, @variant.stock_items.first)
87
90
  end
91
+
92
+ def add_breadcrumbs
93
+ if @variant.present? && @variant.persisted?
94
+ add_breadcrumb @variant.human_name, spree.edit_admin_product_variant_path(@product, @variant)
95
+ end
96
+ end
97
+
98
+ def permitted_resource_params
99
+ params.require(:variant).permit(permitted_variant_attributes)
100
+ end
88
101
  end
89
102
  end
90
103
  end
@@ -1,19 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class WebhooksSubscribersController < ResourceController
4
+ before_action :set_supported_events, except: [:index, :show]
5
+
4
6
  create.before :process_subscriptions
5
7
  update.before :process_subscriptions
6
8
 
7
- def index
8
- params[:q] ||= {}
9
- params[:q][:s] ||= 'created_at desc'
10
-
11
- search = Webhooks::Subscriber.accessible_by(current_ability).ransack(params[:q])
12
- @webhooks_subscribers = search.result.
13
- includes(:events).
14
- page(params[:page]).
15
- per(params[:per_page])
16
- end
9
+ add_breadcrumb Spree.t(:developers), :admin_oauth_applications_path
10
+ add_breadcrumb Spree.t(:webhooks), :admin_webhooks_subscribers_path
17
11
 
18
12
  def show
19
13
  @webhooks_subscriber = Webhooks::Subscriber.find(params[:id])
@@ -26,7 +20,19 @@ module Spree
26
20
  @resource ||= Spree::Admin::Resource.new 'spree/admin/webhooks/subscribers', 'subscribers', nil
27
21
  end
28
22
 
23
+ def collection
24
+ params[:q] ||= {}
25
+ params[:q][:s] ||= 'created_at desc'
26
+
27
+ @search = Webhooks::Subscriber.accessible_by(current_ability).ransack(params[:q])
28
+ @collection = @search.result.
29
+ page(params[:page]).
30
+ per(params[:per_page])
31
+ end
32
+
29
33
  def process_subscriptions
34
+ return if params[:webhooks_subscriber].blank?
35
+
30
36
  params[:webhooks_subscriber][:subscriptions] = if params[:subscribe_to_all_events] == 'true'
31
37
  ['*']
32
38
  else
@@ -37,12 +43,28 @@ module Spree
37
43
  end
38
44
 
39
45
  def selected_events
40
- supported_events.select { |resource, _events| params[:webhooks_subscriber][resource] == 'true' }.values.flatten
46
+ @supported_events.select { |resource, _events| params[:webhooks_subscriber][resource] == 'true' }.values.flatten
41
47
  end
42
48
 
43
- def supported_events
49
+ def set_supported_events
44
50
  @supported_events ||= Spree::Webhooks::Subscriber.supported_events
45
51
  end
52
+
53
+ def supported_events
54
+ @supported_events
55
+ end
56
+
57
+ def permitted_resource_params
58
+ params.require(:webhooks_subscriber).permit(:url, :active, subscriptions: [])
59
+ end
60
+
61
+ def location_after_create
62
+ location_after_save
63
+ end
64
+
65
+ def location_after_save
66
+ spree.admin_webhooks_subscriber_path(@object)
67
+ end
46
68
  end
47
69
  end
48
70
  end
@@ -1,6 +1,7 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ZonesController < ResourceController
4
+ add_breadcrumb Spree.t(:zones), :admin_zones_path
4
5
  before_action :load_data, except: :index
5
6
 
6
7
  def new
@@ -32,6 +33,10 @@ module Spree
32
33
  @states = @selected_country&.states&.order(:name) || Spree::State.none
33
34
  @zones = Zone.order(:name)
34
35
  end
36
+
37
+ def permitted_resource_params
38
+ params.require(:zone).permit(permitted_zone_attributes)
39
+ end
35
40
  end
36
41
  end
37
42
  end
@@ -10,7 +10,7 @@ module Spree
10
10
  end
11
11
 
12
12
  def enterprise_edition?
13
- defined?(Vendo)
13
+ defined?(SpreeEnterprise)
14
14
  end
15
15
 
16
16
  def spree_updater
@@ -25,12 +25,10 @@ module Spree
25
25
  # this is used to display different sidebar navigation for settings pages
26
26
  # @return [Boolean]
27
27
  def settings_active?
28
- @settings_active || %w[stores zones shipping_methods oauth_applications
29
- payment_methods refund_reasons reimbursement_types
30
- shipping_categories store_credit_categories
31
- syncs tax_categories tax_rates webhooks accounts
32
- custom_domains audits exports imports return_authorization_reasons
33
- documents stripe_tax_registrations members subscriptions stock_locations webhooks_subscribers].include?(controller_name)
28
+ @settings_active || %w[admin_users audits custom_domains exports imports invitations oauth_applications
29
+ payment_methods refund_reasons reimbursement_types return_authorization_reasons roles
30
+ shipping_categories shipping_methods stock_locations store_credit_categories
31
+ stores tax_categories tax_rates webhooks webhooks_subscribers zones].include?(controller_name)
34
32
  end
35
33
 
36
34
  # @return [Array<String>] the available countries for checkout
@@ -199,37 +197,40 @@ module Spree
199
197
  # renders all the preference fields for an object
200
198
  # @param object [Spree::TaxRate, Spree::Calculator, Spree::PaymentMethod, Spree::ShippingMethod, Spree::Store] the object to render the preference fields for
201
199
  # @param form [ActionView::Helpers::FormBuilder] the form builder
200
+ # @param i18n_scope [String] the i18n scope for the preference fields
202
201
  # @return [String] the preference fields
203
- def preference_fields(object, form)
202
+ def preference_fields(object, form, i18n_scope: '')
204
203
  return unless object.respond_to?(:preferences)
205
204
 
206
- fields = object.preferences.keys.map do |key|
207
- if object.has_preference?(key)
208
- case key
209
- when :currency
210
- content_tag(:div, form.label("preferred_#{key}", Spree.t(key)) +
211
- form.currency_select("preferred_#{key}", current_store.supported_currencies.split(','), {}, { class: 'custom-select', disabled: current_store.supported_currencies.split(',').count == 1 }),
212
- class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
213
- else
214
- if object.preference_type(key).to_sym == :boolean
215
- content_tag(:div, class: 'form-group custom-control custom-checkbox') do
216
- preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)) +
217
- form.label(
218
- "preferred_#{key}",
219
- Spree.t(key),
220
- class: 'custom-control-label',
221
- id: [object.class.to_s.parameterize, 'preference', key].join('-')
222
- )
223
- end
224
- else
225
- content_tag(:div, form.label("preferred_#{key}", Spree.t(key)) +
226
- preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)),
227
- class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
228
- end
205
+ fields = object.preferences.keys.map { |key| preference_field(object, form, key, i18n_scope: i18n_scope) }
206
+ safe_join(fields)
207
+ end
208
+
209
+ def preference_field(object, form, key, i18n_scope: '')
210
+ return unless object.has_preference?(key)
211
+
212
+ case key
213
+ when :currency
214
+ content_tag(:div, form.label("preferred_#{key}", Spree.t(key, scope: i18n_scope)) +
215
+ form.currency_select("preferred_#{key}", current_store.supported_currencies.split(','), {}, { class: 'custom-select', disabled: current_store.supported_currencies.split(',').count == 1 }),
216
+ class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
217
+ else
218
+ if object.preference_type(key).to_sym == :boolean
219
+ content_tag(:div, class: 'form-group custom-control custom-checkbox') do
220
+ preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)) +
221
+ form.label(
222
+ "preferred_#{key}",
223
+ Spree.t(key, scope: i18n_scope),
224
+ class: 'custom-control-label',
225
+ id: [object.class.to_s.parameterize, 'preference', key].join('-')
226
+ )
229
227
  end
228
+ else
229
+ content_tag(:div, form.label("preferred_#{key}", Spree.t(key, scope: i18n_scope)) +
230
+ preference_field_for(form, "preferred_#{key}", type: object.preference_type(key)),
231
+ class: 'form-group', id: [object.class.to_s.parameterize, 'preference', key].join('-'))
230
232
  end
231
233
  end
232
- safe_join(fields)
233
234
  end
234
235
 
235
236
  def spree_dom_id(record)
@@ -51,7 +51,13 @@ module Spree
51
51
  options[:class] ||= 'btn btn-light'
52
52
 
53
53
  if options[:icon]
54
- text = icon(options[:icon]) + ' ' + text
54
+ if options[:only_icon]
55
+ options[:title] = text
56
+ text = icon(options[:icon], class: 'mr-0')
57
+ options[:class] += ' with-tip'
58
+ else
59
+ text = icon(options[:icon]) + ' ' + text
60
+ end
55
61
  end
56
62
 
57
63
  content_tag :span, data: { toggle: 'modal', target: '#bulk-modal' } do
@@ -76,7 +82,7 @@ module Spree
76
82
  # render a counter for the bulk operations
77
83
  # @return [String]
78
84
  def bulk_operations_counter
79
- content_tag(:span, class: 'bulk-operations-counter ml-1') do
85
+ content_tag(:span, class: 'bulk-operations-counter') do
80
86
  content_tag(:strong, '', data: { bulk_operation_target: 'counter' }) +
81
87
  Spree.t("admin.selected")
82
88
  end
@@ -20,7 +20,7 @@ module Spree
20
20
  # render a discard button for the modal
21
21
  # @return [String]
22
22
  def modal_discard_button
23
- button_tag(type: 'button', class: 'btn btn-light', data: { dismiss: 'modal' }) do
23
+ button_tag(type: 'button', class: 'btn btn-light mr-auto', data: { dismiss: 'modal' }) do
24
24
  Spree.t('actions.discard')
25
25
  end.html_safe
26
26
  end
@@ -52,11 +52,9 @@ module Spree
52
52
  # @param per_page [Integer] the number of items per page
53
53
  # @return [Hash] the params to apply per page
54
54
  def per_page_dropdown_params(per_page)
55
- args = params.permit!.to_h.clone
56
- args.delete(:page)
57
- args.delete(:per_page)
58
- args.merge!(per_page: per_page)
59
- args
55
+ # Keep only safe query params that should survive pagination changes
56
+ safe_params = request.query_parameters.slice(:q)
57
+ safe_params.merge(per_page: per_page, page: nil)
60
58
  end
61
59
 
62
60
  # render a button link to edit a resource
@@ -190,7 +188,7 @@ module Spree
190
188
  # @return [String] the badge with the icon
191
189
  def active_badge(condition, options = {})
192
190
  label = options[:label]
193
- label ||= condition ? Spree.t(:say_yes) : Spree.t(:say_no)
191
+ label ||= condition ? Spree.t(:say_yes).to_s : Spree.t(:say_no).to_s
194
192
  label = icon('check') + label if condition
195
193
 
196
194
  css_class = condition ? 'badge-active' : 'badge-inactive'
@@ -268,6 +266,14 @@ module Spree
268
266
  css ||= 'text-muted'
269
267
  content_tag :small, icon('info-square-rounded', class: css), data: { placement: placement }, class: "with-tip #{css}", title: text
270
268
  end
269
+
270
+ def render_breadcrumb_icon
271
+ if settings_active?
272
+ icon('settings')
273
+ elsif @breadcrumb_icon
274
+ icon(@breadcrumb_icon)
275
+ end
276
+ end
271
277
  end
272
278
  end
273
279
  end
@@ -2,7 +2,7 @@ module Spree
2
2
  module Admin
3
3
  module PostsHelper
4
4
  def post_authors_select_options
5
- current_store.admin_users.map { |user| [user.name, user.id] }
5
+ current_store.users.map { |user| [user.name, user.id] }
6
6
  end
7
7
  end
8
8
  end
@@ -7,7 +7,7 @@ module Spree
7
7
 
8
8
  def store_uploaded_asset_in_session(asset)
9
9
  ensure_session_uploaded_assets_uuid
10
- asset.update(session_uploaded_assets_uuid: session['spree.admin.uploaded_assets.uuid'])
10
+ asset.update(session_id: session['spree.admin.uploaded_assets.uuid'])
11
11
  end
12
12
 
13
13
  def session_uploaded_assets
@@ -4,7 +4,7 @@ module Spree
4
4
  include Spree::ImagesHelper
5
5
 
6
6
  def available_stores
7
- @available_stores ||= Spree::Store.accessible_by(current_ability)
7
+ @available_stores ||= Spree::Store.accessible_by(current_ability).includes(:logo_attachment, :favicon_image_attachment, :default_custom_domain)
8
8
  end
9
9
 
10
10
  DEFAULT_ICON_SIZE = 40
@@ -36,23 +36,6 @@ module Spree
36
36
  opts[:class] += ' rounded text-dark d-flex align-items-center justify-content-center bg-gray-200'
37
37
  content_tag(:span, name[0].upcase, class: opts[:class], style: "height: #{opts[:height]}px; width: #{opts[:width]}px;")
38
38
  end
39
-
40
- def store_logo(store = nil, options = {})
41
- store ||= current_store
42
- return unless store
43
-
44
- opts = { width: 30, height: 30, crop: :fit, quality: :auto, fetch_format: :auto, alt: store.name, title: store.name, class: 'with-tip' }
45
- opts.merge!(options)
46
-
47
- if store.is_a?(Spree::Store) && store.logo&.attached? && store.logo&.variable?
48
- spree_image_tag(store.logo, class: opts[:class], width: opts[:width], height: opts[:height])
49
- else
50
- initials = store.name.split.map(&:first).join.upcase
51
- content_tag(:div, initials, class: "avatar rounded with-tip bg-light",
52
- style: "width: #{opts[:height]}px; height: #{opts[:height]}px;",
53
- title: store.name)
54
- end
55
- end
56
39
  end
57
40
  end
58
41
  end
@@ -12,7 +12,7 @@ module Spree
12
12
  def post_tags_scope
13
13
  @post_tags_scope ||= ActsAsTaggableOn::Tag.
14
14
  joins(:taggings).
15
- where("#{ActsAsTaggableOn.taggings_table}.taggable_type = ?", 'Spree::Post').
15
+ where(ActsAsTaggableOn.taggings_table => { taggable_type: 'Spree::Post' }).
16
16
  for_context(:tags).for_tenant(current_store.id)
17
17
  end
18
18
 
@@ -23,7 +23,7 @@ module Spree
23
23
  def user_tags_scope
24
24
  @user_tags_scope ||= ActsAsTaggableOn::Tag.
25
25
  joins(:taggings).
26
- where("#{ActsAsTaggableOn.taggings_table}.taggable_type = ?", Spree.user_class.to_s).
26
+ where(ActsAsTaggableOn.taggings_table => { taggable_type: Spree.user_class.to_s }).
27
27
  for_context(:tags)
28
28
  end
29
29
 
@@ -78,9 +78,9 @@ import StockTransferController from 'spree/admin/controllers/stock_transfer_cont
78
78
  import StoreFormController from 'spree/admin/controllers/store_form_controller'
79
79
  import UnitSystemController from 'spree/admin/controllers/unit_system_controller'
80
80
  import VariantsFormController from 'spree/admin/controllers/variants_form_controller'
81
- import WebhooksSubscriberEventsController from 'spree/admin/controllers/webhook_subscriber_events_controller'
82
81
  import AddressAutocompleteController from 'spree/core/controllers/address_autocomplete_controller'
83
82
  import AddressFormController from 'spree/core/controllers/address_form_controller'
83
+ import DisableSubmitButtonController from 'spree/core/controllers/disable_submit_button_controller'
84
84
  import EnableButtonController from 'spree/core/controllers/enable_button_controller'
85
85
 
86
86
  application.register('active-storage-upload', ActiveStorageUpload)
@@ -99,6 +99,7 @@ application.register('checkbox-select-all', CheckboxSelectAll)
99
99
  application.register('clipboard', Clipboard)
100
100
  application.register('color-palette', ColorPaletteController)
101
101
  application.register('color-picker', ColorPickerController)
102
+ application.register('disable-submit-button', DisableSubmitButtonController)
102
103
  application.register('enable-button', EnableButtonController)
103
104
  application.register('filters', FiltersController)
104
105
  application.register('font-picker', FontPickerController)
@@ -131,7 +132,6 @@ application.register('tabs', Tabs)
131
132
  application.register('textarea-autogrow', TextareaAutogrow)
132
133
  application.register('unit-system', UnitSystemController)
133
134
  application.register('variants-form', VariantsFormController)
134
- application.register('webhooks-subscriber-events', WebhooksSubscriberEventsController)
135
135
 
136
136
  LocalTime.start()
137
137
 
@@ -11,7 +11,8 @@ export default class extends Controller {
11
11
  viewableType: String,
12
12
  multiple: { type: Boolean, default: false },
13
13
  type: { type: String, default: 'image' },
14
- allowedFileTypes: { type: Array, default: [] }
14
+ allowedFileTypes: { type: Array, default: [] },
15
+ adminAssetsPath: String
15
16
  }
16
17
 
17
18
  connect() {
@@ -43,7 +44,7 @@ export default class extends Controller {
43
44
  }
44
45
 
45
46
  handleSuccessResult(response) {
46
- post('/admin/assets', {
47
+ post(this.adminAssetsPathValue, {
47
48
  body: JSON.stringify({
48
49
  asset: {
49
50
  type: this.assetClassValue,
@@ -37,7 +37,8 @@ export default class extends CheckboxSelectAll {
37
37
  currentStockLocationId: String,
38
38
  stockLocations: Array,
39
39
  optionValuesSelectOptions: Array,
40
- locale: String
40
+ locale: String,
41
+ adminPath: String
41
42
  }
42
43
 
43
44
  connect() {
@@ -724,7 +725,7 @@ export default class extends CheckboxSelectAll {
724
725
  this.lastOptionNameId = targetInput.value
725
726
 
726
727
  if (this.lastOptionNameId) {
727
- const response = await get(`/admin/option_types/${this.lastOptionNameId}/option_values/select_options`)
728
+ const response = await get(`${this.adminPathValue}/option_types/${this.lastOptionNameId}/option_values/select_options`)
728
729
 
729
730
  if (response.ok) {
730
731
  this.currentOptionValues[this.lastOptionNameId] = await response.json
@@ -4,11 +4,11 @@ import { lockScroll, unlockScroll } from 'spree/core/helpers/scroll_lock'
4
4
 
5
5
 
6
6
  const initTooltips = () => {
7
- $('.with-tip, .trix-button').each(function() {
7
+ $('.with-tip, .trix-button, .uppy-Dashboard-close, time').each(function() {
8
8
  $(this).tooltip()
9
9
  })
10
10
 
11
- $('.with-tip, .trix-button').on('show.bs.tooltip', function(event) {
11
+ $('.with-tip, .trix-button, .uppy-Dashboard-close, time').on('show.bs.tooltip', function(event) {
12
12
  if (('ontouchstart' in window)) {
13
13
  event.preventDefault()
14
14
  }
@@ -16,7 +16,7 @@ const initTooltips = () => {
16
16
  }
17
17
 
18
18
  const removeTooltips = () => {
19
- $('.with-tip, .trix-button').each(function() {
19
+ $('.with-tip, .trix-button, .uppy-Dashboard-close, time').each(function() {
20
20
  $(this).tooltip('dispose')
21
21
  })
22
22
  }
@@ -90,7 +90,7 @@ document.addEventListener("trix-attachment-remove", async function(event) {
90
90
  const { attachment } = event
91
91
  const { sgid } = attachment.attachment.attributes.values
92
92
 
93
- destroy(`/admin/action_text/video_embeds/${sgid}`, { responseKind: 'json' })
93
+ destroy(`${Spree.adminPath}/action_text/video_embeds/${sgid}`, { responseKind: 'json' })
94
94
  })
95
95
 
96
96
  function initializeTrixEditor(editor) {
@@ -129,7 +129,7 @@ function initializeTrixEditor(editor) {
129
129
 
130
130
  errorMessage.innerHTML = ''
131
131
 
132
- const response = await post('/admin/action_text/video_embeds', { body: JSON.stringify({ url: input.value }), responseKind: 'json' })
132
+ const response = await post(`${Spree.adminPath}/action_text/video_embeds`, { body: JSON.stringify({ url: input.value }), responseKind: 'json' })
133
133
 
134
134
  if (response.ok) {
135
135
  const { sgid, content } = await response.json
@@ -22,7 +22,7 @@
22
22
  form.object.send(field_name),
23
23
  width: width,
24
24
  height: height,
25
- class: 'img-fluid rounded-lg',
25
+ class: 'img-fluid rounded',
26
26
  data: { active_storage_upload_target: 'thumb' },
27
27
  loading: :lazy
28
28
  ) %>