spree_admin 5.1.7 → 5.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/spree/admin/application.scss +5 -2
  3. data/app/assets/stylesheets/spree/admin/components/_alerts.scss +26 -8
  4. data/app/assets/stylesheets/spree/admin/components/_badges.scss +4 -3
  5. data/app/assets/stylesheets/spree/admin/components/_bulk_panel.scss +11 -26
  6. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +9 -18
  7. data/app/assets/stylesheets/spree/admin/components/_cards.scss +45 -24
  8. data/app/assets/stylesheets/spree/admin/components/_dialogs.scss +204 -0
  9. data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +39 -13
  10. data/app/assets/stylesheets/spree/admin/components/_filters.scss +28 -10
  11. data/app/assets/stylesheets/spree/admin/components/_main.scss +36 -17
  12. data/app/assets/stylesheets/spree/admin/components/_media_form.scss +11 -3
  13. data/app/assets/stylesheets/spree/admin/components/_modals.scss +1 -1
  14. data/app/assets/stylesheets/spree/admin/components/_navigation.scss +0 -1
  15. data/app/assets/stylesheets/spree/admin/components/_search_picker.scss +0 -8
  16. data/app/assets/stylesheets/spree/admin/components/_sortable_tree.scss +2 -1
  17. data/app/assets/stylesheets/spree/admin/components/_tables.scss +20 -26
  18. data/app/assets/stylesheets/spree/admin/components/_tooltips.scss +20 -0
  19. data/app/assets/stylesheets/spree/admin/components/_variants_form.scss +3 -3
  20. data/app/assets/stylesheets/spree/admin/components/_wizard.scss +27 -0
  21. data/app/assets/stylesheets/spree/admin/global/_variables.scss +61 -43
  22. data/app/assets/stylesheets/spree/admin/plugins/_trix_custom.scss +5 -0
  23. data/app/assets/stylesheets/spree/admin/plugins/tom-select.scss +1 -1
  24. data/app/assets/stylesheets/spree/admin/plugins/uppy_fixes.scss +52 -3
  25. data/app/assets/stylesheets/spree/admin/shared/_base.scss +18 -17
  26. data/app/assets/stylesheets/spree/admin/shared/_forms.scss +7 -4
  27. data/app/assets/stylesheets/spree/admin/views/_page_builder.scss +12 -12
  28. data/app/controllers/concerns/spree/admin/page_builder_concern.rb +4 -4
  29. data/app/controllers/concerns/spree/admin/settings_concern.rb +23 -0
  30. data/app/controllers/spree/admin/admin_users_controller.rb +21 -6
  31. data/app/controllers/spree/admin/assets_controller.rb +3 -5
  32. data/app/controllers/spree/admin/base_controller.rb +2 -1
  33. data/app/controllers/spree/admin/custom_domains_controller.rb +1 -1
  34. data/app/controllers/spree/admin/errors_controller.rb +17 -3
  35. data/app/controllers/spree/admin/exports_controller.rb +7 -1
  36. data/app/controllers/spree/admin/gift_cards_controller.rb +5 -11
  37. data/app/controllers/spree/admin/import_mappings_controller.rb +15 -0
  38. data/app/controllers/spree/admin/import_rows_controller.rb +7 -0
  39. data/app/controllers/spree/admin/imports_controller.rb +66 -0
  40. data/app/controllers/spree/admin/invitations_controller.rb +3 -4
  41. data/app/controllers/spree/admin/json_previews_controller.rb +24 -0
  42. data/app/controllers/spree/admin/metafield_definitions_controller.rb +27 -0
  43. data/app/controllers/spree/admin/metafields_controller.rb +39 -0
  44. data/app/controllers/spree/admin/newsletter_subscribers_controller.rb +8 -0
  45. data/app/controllers/spree/admin/oauth_applications_controller.rb +2 -2
  46. data/app/controllers/spree/admin/orders/user_controller.rb +16 -10
  47. data/app/controllers/spree/admin/orders_controller.rb +17 -3
  48. data/app/controllers/spree/admin/page_blocks_controller.rb +2 -1
  49. data/app/controllers/spree/admin/page_links_controller.rb +9 -1
  50. data/app/controllers/spree/admin/pages_controller.rb +1 -9
  51. data/app/controllers/spree/admin/payment_methods_controller.rb +1 -5
  52. data/app/controllers/spree/admin/policies_controller.rb +28 -0
  53. data/app/controllers/spree/admin/products_controller.rb +8 -5
  54. data/app/controllers/spree/admin/profile_controller.rb +2 -0
  55. data/app/controllers/spree/admin/refund_reasons_controller.rb +1 -1
  56. data/app/controllers/spree/admin/reimbursement_types_controller.rb +1 -1
  57. data/app/controllers/spree/admin/resource_controller.rb +60 -1
  58. data/app/controllers/spree/admin/return_authorization_reasons_controller.rb +1 -1
  59. data/app/controllers/spree/admin/return_authorizations_controller.rb +3 -0
  60. data/app/controllers/spree/admin/roles_controller.rb +1 -2
  61. data/app/controllers/spree/admin/shipping_categories_controller.rb +1 -1
  62. data/app/controllers/spree/admin/shipping_methods_controller.rb +2 -2
  63. data/app/controllers/spree/admin/stock_locations_controller.rb +2 -2
  64. data/app/controllers/spree/admin/store_credits_controller.rb +6 -0
  65. data/app/controllers/spree/admin/storefront_controller.rb +1 -1
  66. data/app/controllers/spree/admin/stores_controller.rb +8 -2
  67. data/app/controllers/spree/admin/tax_categories_controller.rb +1 -1
  68. data/app/controllers/spree/admin/tax_rates_controller.rb +2 -2
  69. data/app/controllers/spree/admin/translations_controller.rb +30 -50
  70. data/app/controllers/spree/admin/users_controller.rb +4 -0
  71. data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +2 -3
  72. data/app/controllers/spree/admin/zones_controller.rb +1 -1
  73. data/app/helpers/spree/admin/assets_helper.rb +42 -0
  74. data/app/helpers/spree/admin/base_helper.rb +58 -11
  75. data/app/helpers/spree/admin/bulk_operations_helper.rb +14 -12
  76. data/app/helpers/spree/admin/dialog_helper.rb +21 -0
  77. data/app/helpers/spree/admin/drawer_helper.rb +21 -0
  78. data/app/helpers/spree/admin/dropdown_helper.rb +32 -0
  79. data/app/helpers/spree/admin/json_preview_helper.rb +75 -0
  80. data/app/helpers/spree/admin/metafields_helper.rb +29 -0
  81. data/app/helpers/spree/admin/navigation_helper.rb +55 -23
  82. data/app/helpers/spree/admin/orders_filters_helper.rb +26 -17
  83. data/app/helpers/spree/admin/orders_helper.rb +9 -1
  84. data/app/helpers/spree/admin/page_builder_helper.rb +3 -8
  85. data/app/helpers/spree/admin/payments_helper.rb +2 -0
  86. data/app/helpers/spree/admin/products_helper.rb +0 -12
  87. data/app/helpers/spree/admin/translations_helper.rb +11 -4
  88. data/app/helpers/spree/admin/turbo_helper.rb +17 -4
  89. data/app/javascript/spree/admin/application.js +23 -5
  90. data/app/javascript/spree/admin/controllers/active_storage_upload_controller.js +41 -7
  91. data/app/javascript/spree/admin/controllers/admin_controller.js +0 -9
  92. data/app/javascript/spree/admin/controllers/auto_scroll_controller.js +33 -0
  93. data/app/javascript/spree/admin/controllers/codemirror_controller.js +45 -0
  94. data/app/javascript/spree/admin/controllers/highlight_controller.js +17 -0
  95. data/app/javascript/spree/admin/controllers/import_form_controller.js +27 -0
  96. data/app/javascript/spree/admin/controllers/sortable_auto_submit_controller.js +10 -0
  97. data/app/javascript/spree/admin/controllers/stock_transfer_controller.js +6 -5
  98. data/app/javascript/spree/admin/controllers/tabs_controller.js +21 -0
  99. data/app/javascript/spree/admin/controllers/tooltip_controller.js +136 -0
  100. data/app/javascript/spree/admin/controllers/turbo_submit_button_controller.js +14 -0
  101. data/app/javascript/spree/admin/helpers/bootstrap.js +5 -3
  102. data/app/models/spree/admin/form_builder.rb +250 -0
  103. data/app/views/layouts/spree/admin.html.erb +6 -2
  104. data/app/views/layouts/spree/admin_settings.html.erb +36 -0
  105. data/app/views/layouts/spree/admin_wizard.html.erb +34 -0
  106. data/app/views/layouts/spree/minimal.html.erb +2 -1
  107. data/app/views/layouts/spree/page_builder.html.erb +3 -2
  108. data/app/views/spree/admin/admin_users/_admin_user.html.erb +2 -2
  109. data/app/views/spree/admin/admin_users/_form.html.erb +3 -12
  110. data/app/views/spree/admin/admin_users/edit.html.erb +4 -7
  111. data/app/views/spree/admin/admin_users/index.html.erb +3 -3
  112. data/app/views/spree/admin/admin_users/show.html.erb +4 -4
  113. data/app/views/spree/admin/assets/create.turbo_stream.erb +1 -1
  114. data/app/views/spree/admin/assets/destroy.turbo_stream.erb +1 -1
  115. data/app/views/spree/admin/assets/edit.html.erb +16 -21
  116. data/app/views/spree/admin/assets/update.turbo_stream.erb +2 -2
  117. data/app/views/spree/admin/classifications/_classification.html.erb +5 -4
  118. data/app/views/spree/admin/classifications/create.turbo_stream.erb +1 -1
  119. data/app/views/spree/admin/classifications/index.html.erb +2 -2
  120. data/app/views/spree/admin/coupon_codes/_filters.html.erb +41 -0
  121. data/app/views/spree/admin/coupon_codes/_table_header.html.erb +0 -0
  122. data/app/views/spree/admin/coupon_codes/_table_row.html.erb +8 -0
  123. data/app/views/spree/admin/coupon_codes/index.html.erb +1 -58
  124. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +4 -4
  125. data/app/views/spree/admin/custom_domains/edit.html.erb +1 -14
  126. data/app/views/spree/admin/custom_domains/new.html.erb +1 -14
  127. data/app/views/spree/admin/customer_returns/_filters.html.erb +11 -0
  128. data/app/views/spree/admin/customer_returns/_table_header.html.erb +8 -0
  129. data/app/views/spree/admin/customer_returns/{_customer_return.html.erb → _table_row.html.erb} +1 -1
  130. data/app/views/spree/admin/customer_returns/index.html.erb +1 -36
  131. data/app/views/spree/admin/dashboard/_setup_progress.html.erb +1 -1
  132. data/app/views/spree/admin/dashboard/_setup_tasks.html.erb +8 -10
  133. data/app/views/spree/admin/dashboard/_store_preview.html.erb +5 -5
  134. data/app/views/spree/admin/dashboard/_top_products.html.erb +3 -3
  135. data/app/views/spree/admin/dashboard/_updater.html.erb +1 -1
  136. data/app/views/spree/admin/dashboard/analytics.html.erb +37 -39
  137. data/app/views/spree/admin/dashboard/getting_started.html.erb +1 -1
  138. data/app/views/spree/admin/dashboard/setup_tasks/_add_products.html.erb +2 -2
  139. data/app/views/spree/admin/dashboard/show.html.erb +1 -1
  140. data/app/views/spree/admin/digital_assets/_digital_asset.html.erb +9 -10
  141. data/app/views/spree/admin/digital_assets/_form.html.erb +3 -8
  142. data/app/views/spree/admin/digital_assets/_table.html.erb +12 -13
  143. data/app/views/spree/admin/digital_assets/create.turbo_stream.erb +1 -1
  144. data/app/views/spree/admin/digital_assets/edit.html.erb +8 -10
  145. data/app/views/spree/admin/digital_assets/index.html.erb +8 -9
  146. data/app/views/spree/admin/digital_assets/new.html.erb +8 -10
  147. data/app/views/spree/admin/digital_assets/update.turbo_stream.erb +1 -1
  148. data/app/views/spree/admin/errors/403.html.erb +14 -0
  149. data/app/views/spree/admin/errors/404.html.erb +14 -0
  150. data/app/views/spree/admin/errors/422.html.erb +14 -0
  151. data/app/views/spree/admin/errors/500.html.erb +14 -0
  152. data/app/views/spree/admin/errors/503.html.erb +14 -0
  153. data/app/views/spree/admin/exports/_export.html.erb +1 -1
  154. data/app/views/spree/admin/exports/create.turbo_stream.erb +4 -1
  155. data/app/views/spree/admin/exports/index.html.erb +5 -5
  156. data/app/views/spree/admin/exports/new.html.erb +33 -28
  157. data/app/views/spree/admin/gift_card_batches/_form.html.erb +5 -20
  158. data/app/views/spree/admin/gift_card_batches/new.html.erb +1 -15
  159. data/app/views/spree/admin/gift_cards/_filters.html.erb +3 -4
  160. data/app/views/spree/admin/gift_cards/_form.html.erb +16 -26
  161. data/app/views/spree/admin/gift_cards/_gift_card.html.erb +1 -1
  162. data/app/views/spree/admin/gift_cards/_list.html.erb +7 -7
  163. data/app/views/spree/admin/gift_cards/_table_filter_dropdown.html.erb +13 -13
  164. data/app/views/spree/admin/gift_cards/index.html.erb +14 -11
  165. data/app/views/spree/admin/gift_cards/new.html.erb +1 -30
  166. data/app/views/spree/admin/gift_cards/show.html.erb +6 -6
  167. data/app/views/spree/admin/import_mappings/update.turbo_stream.erb +15 -0
  168. data/app/views/spree/admin/import_rows/_variant.html.erb +1 -0
  169. data/app/views/spree/admin/import_rows/show.html.erb +32 -0
  170. data/app/views/spree/admin/imports/_footer.html.erb +15 -0
  171. data/app/views/spree/admin/imports/_loader.html.erb +14 -0
  172. data/app/views/spree/admin/imports/_mapping.html.erb +12 -0
  173. data/app/views/spree/admin/imports/_mapping_footer.html.erb +20 -0
  174. data/app/views/spree/admin/imports/_mapping_form.html.erb +11 -0
  175. data/app/views/spree/admin/imports/_mapping_icon.html.erb +6 -0
  176. data/app/views/spree/admin/imports/_row.html.erb +35 -0
  177. data/app/views/spree/admin/imports/new.html.erb +26 -0
  178. data/app/views/spree/admin/imports/show.html.erb +57 -0
  179. data/app/views/spree/admin/invitations/_invitation.html.erb +13 -13
  180. data/app/views/spree/admin/invitations/create.turbo_stream.erb +1 -1
  181. data/app/views/spree/admin/invitations/index.html.erb +15 -17
  182. data/app/views/spree/admin/invitations/new.html.erb +15 -26
  183. data/app/views/spree/admin/json_previews/show.html.erb +37 -0
  184. data/app/views/spree/admin/line_items/new.html.erb +6 -6
  185. data/app/views/spree/admin/metafield_definitions/_filters.html.erb +18 -0
  186. data/app/views/spree/admin/metafield_definitions/_form.html.erb +44 -0
  187. data/app/views/spree/admin/metafield_definitions/_table_header.html.erb +11 -0
  188. data/app/views/spree/admin/metafield_definitions/_table_row.html.erb +22 -0
  189. data/app/views/spree/admin/metafield_definitions/edit.html.erb +1 -0
  190. data/app/views/spree/admin/metafield_definitions/index.html.erb +9 -0
  191. data/app/views/spree/admin/metafield_definitions/new.html.erb +1 -0
  192. data/app/views/spree/admin/metafield_definitions/update.turbo_stream.erb +1 -0
  193. data/app/views/spree/admin/metafields/edit.html.erb +43 -0
  194. data/app/views/spree/admin/metafields/types/_boolean.html.erb +4 -0
  195. data/app/views/spree/admin/metafields/types/_json.html.erb +4 -0
  196. data/app/views/spree/admin/metafields/types/_long_text.html.erb +1 -0
  197. data/app/views/spree/admin/metafields/types/_number.html.erb +1 -0
  198. data/app/views/spree/admin/metafields/types/_rich_text.html.erb +3 -0
  199. data/app/views/spree/admin/metafields/types/_short_text.html.erb +1 -0
  200. data/app/views/spree/admin/metafields/update.turbo_stream.erb +1 -0
  201. data/app/views/spree/admin/newsletter_subscribers/_filters.html.erb +41 -0
  202. data/app/views/spree/admin/newsletter_subscribers/_table_header.html.erb +8 -0
  203. data/app/views/spree/admin/newsletter_subscribers/_table_row.html.erb +36 -0
  204. data/app/views/spree/admin/newsletter_subscribers/index.html.erb +9 -0
  205. data/app/views/spree/admin/oauth_applications/_form.html.erb +5 -10
  206. data/app/views/spree/admin/oauth_applications/_table_header.html.erb +7 -0
  207. data/app/views/spree/admin/oauth_applications/_table_row.html.erb +34 -0
  208. data/app/views/spree/admin/oauth_applications/create.turbo_stream.erb +20 -30
  209. data/app/views/spree/admin/oauth_applications/edit.html.erb +1 -18
  210. data/app/views/spree/admin/oauth_applications/index.html.erb +4 -60
  211. data/app/views/spree/admin/oauth_applications/new.html.erb +1 -24
  212. data/app/views/spree/admin/option_types/{_filter.html.erb → _filters.html.erb} +1 -1
  213. data/app/views/spree/admin/option_types/_form.html.erb +8 -30
  214. data/app/views/spree/admin/option_types/_table_header.html.erb +19 -0
  215. data/app/views/spree/admin/option_types/{_option_type.html.erb → _table_row.html.erb} +1 -1
  216. data/app/views/spree/admin/option_types/edit.html.erb +0 -3
  217. data/app/views/spree/admin/option_types/index.html.erb +3 -42
  218. data/app/views/spree/admin/orders/_customer.html.erb +17 -21
  219. data/app/views/spree/admin/orders/_customer_returns.html.erb +4 -4
  220. data/app/views/spree/admin/orders/_filters.html.erb +49 -48
  221. data/app/views/spree/admin/orders/_form.html.erb +12 -0
  222. data/app/views/spree/admin/orders/_header.html.erb +2 -7
  223. data/app/views/spree/admin/orders/_line_item.html.erb +6 -11
  224. data/app/views/spree/admin/orders/_line_items.html.erb +39 -47
  225. data/app/views/spree/admin/orders/_list.html.erb +7 -7
  226. data/app/views/spree/admin/orders/_order.html.erb +1 -1
  227. data/app/views/spree/admin/orders/_payments.html.erb +2 -2
  228. data/app/views/spree/admin/orders/_refunds.html.erb +7 -9
  229. data/app/views/spree/admin/orders/_return_authorizations.html.erb +5 -5
  230. data/app/views/spree/admin/orders/_risk_analysis.html.erb +1 -1
  231. data/app/views/spree/admin/orders/_shipment.html.erb +7 -6
  232. data/app/views/spree/admin/orders/_shipment_manifest_item.html.erb +1 -1
  233. data/app/views/spree/admin/orders/_shipments.html.erb +1 -1
  234. data/app/views/spree/admin/orders/_summary.html.erb +14 -7
  235. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +6 -6
  236. data/app/views/spree/admin/orders/_tax_lines.html.erb +1 -1
  237. data/app/views/spree/admin/orders/billing_address/_form.html.erb +4 -2
  238. data/app/views/spree/admin/orders/billing_address/create.turbo_stream.erb +22 -24
  239. data/app/views/spree/admin/orders/billing_address/edit.html.erb +29 -31
  240. data/app/views/spree/admin/orders/billing_address/new.html.erb +22 -24
  241. data/app/views/spree/admin/orders/billing_address/update.turbo_stream.erb +22 -24
  242. data/app/views/spree/admin/orders/contact_information/edit.html.erb +10 -12
  243. data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +7 -12
  244. data/app/views/spree/admin/orders/customer_returns/_reimbursements_table.html.erb +5 -5
  245. data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +6 -6
  246. data/app/views/spree/admin/orders/customer_returns/_return_item_selection.html.erb +6 -6
  247. data/app/views/spree/admin/orders/customer_returns/new.html.erb +2 -6
  248. data/app/views/spree/admin/orders/index.html.erb +7 -3
  249. data/app/views/spree/admin/orders/new.html.erb +22 -0
  250. data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +14 -28
  251. data/app/views/spree/admin/orders/return_authorizations/_return_authorization.html.erb +1 -1
  252. data/app/views/spree/admin/orders/return_authorizations/show.html.erb +14 -14
  253. data/app/views/spree/admin/orders/shipping_address/_form.html.erb +4 -2
  254. data/app/views/spree/admin/orders/shipping_address/create.turbo_stream.erb +8 -10
  255. data/app/views/spree/admin/orders/shipping_address/edit.html.erb +8 -10
  256. data/app/views/spree/admin/orders/shipping_address/new.html.erb +8 -10
  257. data/app/views/spree/admin/orders/shipping_address/update.turbo_stream.erb +8 -10
  258. data/app/views/spree/admin/orders/user/edit.html.erb +1 -1
  259. data/app/views/spree/admin/orders/user/new.html.erb +1 -1
  260. data/app/views/spree/admin/page_blocks/edit.html.erb +6 -9
  261. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +4 -1
  262. data/app/views/spree/admin/page_blocks/forms/_metafields.html.erb +35 -0
  263. data/app/views/spree/admin/page_blocks/forms/products/_description.html.erb +0 -0
  264. data/app/views/spree/admin/page_builder/_add_block.html.erb +8 -6
  265. data/app/views/spree/admin/page_builder/_header.html.erb +29 -22
  266. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +6 -6
  267. data/app/views/spree/admin/page_builder/_sidebar.html.erb +5 -5
  268. data/app/views/spree/admin/page_builder/_sidebar_colors.html.erb +71 -69
  269. data/app/views/spree/admin/page_builder/_sidebar_fonts.html.erb +62 -61
  270. data/app/views/spree/admin/page_builder/_sidebar_section.html.erb +4 -6
  271. data/app/views/spree/admin/page_builder/_sidebar_sections.html.erb +12 -2
  272. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +59 -57
  273. data/app/views/spree/admin/page_links/_form.html.erb +3 -3
  274. data/app/views/spree/admin/page_links/_linkable_type_dropdown.html.erb +3 -3
  275. data/app/views/spree/admin/page_links/create.turbo_stream.erb +10 -4
  276. data/app/views/spree/admin/page_links/destroy.turbo_stream.erb +13 -9
  277. data/app/views/spree/admin/page_links/edit.html.erb +26 -13
  278. data/app/views/spree/admin/page_links/update.turbo_stream.erb +11 -5
  279. data/app/views/spree/admin/page_sections/edit.html.erb +5 -8
  280. data/app/views/spree/admin/page_sections/forms/_breadcrumbs.html.erb +0 -0
  281. data/app/views/spree/admin/page_sections/forms/_image_with_text.html.erb +2 -5
  282. data/app/views/spree/admin/pages/_form.html.erb +1 -4
  283. data/app/views/spree/admin/pages/_table_header.html.erb +6 -0
  284. data/app/views/spree/admin/pages/_table_row.html.erb +28 -0
  285. data/app/views/spree/admin/pages/edit.html.erb +9 -11
  286. data/app/views/spree/admin/pages/{_filters.html.erb → filters.html.erb} +1 -1
  287. data/app/views/spree/admin/pages/index.html.erb +1 -24
  288. data/app/views/spree/admin/pages/new.html.erb +1 -17
  289. data/app/views/spree/admin/payment_methods/_available_payment_method.html.erb +1 -1
  290. data/app/views/spree/admin/payment_methods/_form.html.erb +4 -24
  291. data/app/views/spree/admin/payment_methods/_payment_method.html.erb +5 -2
  292. data/app/views/spree/admin/payment_methods/index.html.erb +17 -19
  293. data/app/views/spree/admin/payments/_payment.html.erb +16 -16
  294. data/app/views/spree/admin/payments/source_views/_gateway.html.erb +3 -3
  295. data/app/views/spree/admin/payments/source_views/_storecredit.html.erb +7 -7
  296. data/app/views/spree/admin/policies/_filters.html.erb +8 -0
  297. data/app/views/spree/admin/policies/_form.html.erb +7 -0
  298. data/app/views/spree/admin/policies/_table_header.html.erb +8 -0
  299. data/app/views/spree/admin/policies/_table_row.html.erb +20 -0
  300. data/app/views/spree/admin/policies/edit.html.erb +2 -0
  301. data/app/views/spree/admin/policies/index.html.erb +9 -0
  302. data/app/views/spree/admin/policies/new.html.erb +1 -0
  303. data/app/views/spree/admin/policies/update.turbo_stream.erb +1 -0
  304. data/app/views/spree/admin/post_categories/_form.html.erb +2 -11
  305. data/app/views/spree/admin/post_categories/_table_header.html.erb +5 -0
  306. data/app/views/spree/admin/post_categories/{_post_category.html.erb → _table_row.html.erb} +3 -3
  307. data/app/views/spree/admin/post_categories/edit.html.erb +1 -14
  308. data/app/views/spree/admin/post_categories/index.html.erb +1 -20
  309. data/app/views/spree/admin/post_categories/new.html.erb +1 -14
  310. data/app/views/spree/admin/posts/_form.html.erb +21 -43
  311. data/app/views/spree/admin/posts/_table_header.html.erb +7 -0
  312. data/app/views/spree/admin/posts/{_post.html.erb → _table_row.html.erb} +2 -2
  313. data/app/views/spree/admin/posts/filters.html.erb +29 -0
  314. data/app/views/spree/admin/posts/index.html.erb +1 -24
  315. data/app/views/spree/admin/products/_bulk_operations.html.erb +6 -16
  316. data/app/views/spree/admin/products/_filters.html.erb +31 -38
  317. data/app/views/spree/admin/products/_form.html.erb +3 -2
  318. data/app/views/spree/admin/products/_list.html.erb +1 -1
  319. data/app/views/spree/admin/products/_product.html.erb +1 -1
  320. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +6 -6
  321. data/app/views/spree/admin/products/bulk_modal.html.erb +13 -15
  322. data/app/views/spree/admin/products/edit.html.erb +0 -1
  323. data/app/views/spree/admin/products/form/_base.html.erb +1 -5
  324. data/app/views/spree/admin/products/form/_properties.html.erb +2 -2
  325. data/app/views/spree/admin/products/form/_shipping.html.erb +1 -5
  326. data/app/views/spree/admin/products/form/_tax.html.erb +1 -5
  327. data/app/views/spree/admin/products/form/_variants.html.erb +1 -1
  328. data/app/views/spree/admin/products/index.html.erb +7 -2
  329. data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +7 -7
  330. data/app/views/spree/admin/promotion_actions/forms/_create_line_items.html.erb +4 -4
  331. data/app/views/spree/admin/promotion_actions/new.html.erb +29 -35
  332. data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +8 -8
  333. data/app/views/spree/admin/promotion_rules/forms/_currency.html.erb +1 -4
  334. data/app/views/spree/admin/promotion_rules/forms/_item_total.html.erb +1 -1
  335. data/app/views/spree/admin/promotion_rules/new.html.erb +30 -36
  336. data/app/views/spree/admin/promotions/_actions.html.erb +4 -8
  337. data/app/views/spree/admin/promotions/_filters.html.erb +5 -9
  338. data/app/views/spree/admin/promotions/_form.html.erb +36 -0
  339. data/app/views/spree/admin/promotions/_rules.html.erb +4 -8
  340. data/app/views/spree/admin/promotions/_sidebar.html.erb +4 -4
  341. data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +7 -7
  342. data/app/views/spree/admin/promotions/_table_header.html.erb +7 -0
  343. data/app/views/spree/admin/promotions/{_promotion.html.erb → _table_row.html.erb} +2 -5
  344. data/app/views/spree/admin/promotions/edit.html.erb +1 -1
  345. data/app/views/spree/admin/promotions/form/_kind.html.erb +52 -48
  346. data/app/views/spree/admin/promotions/form/_settings.html.erb +2 -8
  347. data/app/views/spree/admin/promotions/index.html.erb +1 -26
  348. data/app/views/spree/admin/promotions/new.html.erb +1 -57
  349. data/app/views/spree/admin/properties/_filters.html.erb +5 -0
  350. data/app/views/spree/admin/properties/_form.html.erb +8 -22
  351. data/app/views/spree/admin/properties/_table_header.html.erb +9 -0
  352. data/app/views/spree/admin/properties/{_property.html.erb → _table_row.html.erb} +2 -2
  353. data/app/views/spree/admin/properties/edit.html.erb +1 -21
  354. data/app/views/spree/admin/properties/index.html.erb +3 -38
  355. data/app/views/spree/admin/properties/new.html.erb +1 -18
  356. data/app/views/spree/admin/refund_reasons/_form.html.erb +1 -0
  357. data/app/views/spree/admin/refund_reasons/_table_header.html.erb +6 -0
  358. data/app/views/spree/admin/refund_reasons/_table_row.html.erb +14 -0
  359. data/app/views/spree/admin/refund_reasons/edit.html.erb +1 -3
  360. data/app/views/spree/admin/refund_reasons/index.html.erb +1 -36
  361. data/app/views/spree/admin/refund_reasons/new.html.erb +1 -4
  362. data/app/views/spree/admin/refunds/_form.html.erb +1 -5
  363. data/app/views/spree/admin/refunds/edit.html.erb +9 -11
  364. data/app/views/spree/admin/reimbursement_types/_form.html.erb +10 -31
  365. data/app/views/spree/admin/reimbursement_types/_table_header.html.erb +7 -0
  366. data/app/views/spree/admin/reimbursement_types/_table_row.html.erb +17 -0
  367. data/app/views/spree/admin/reimbursement_types/edit.html.erb +1 -14
  368. data/app/views/spree/admin/reimbursement_types/index.html.erb +1 -40
  369. data/app/views/spree/admin/reimbursement_types/new.html.erb +1 -14
  370. data/app/views/spree/admin/reimbursements/edit.html.erb +9 -9
  371. data/app/views/spree/admin/reimbursements/show.html.erb +12 -12
  372. data/app/views/spree/admin/reports/_report.html.erb +1 -1
  373. data/app/views/spree/admin/reports/index.html.erb +2 -2
  374. data/app/views/spree/admin/reports/new.html.erb +2 -1
  375. data/app/views/spree/admin/return_authorization_reasons/_form.html.erb +1 -0
  376. data/app/views/spree/admin/return_authorization_reasons/_table_header.html.erb +5 -0
  377. data/app/views/spree/admin/return_authorization_reasons/_table_row.html.erb +18 -0
  378. data/app/views/spree/admin/return_authorization_reasons/edit.html.erb +1 -3
  379. data/app/views/spree/admin/return_authorization_reasons/index.html.erb +1 -39
  380. data/app/views/spree/admin/return_authorization_reasons/new.html.erb +1 -4
  381. data/app/views/spree/admin/return_authorizations/_list.html.erb +3 -3
  382. data/app/views/spree/admin/return_authorizations/_table_header.html.erb +6 -0
  383. data/app/views/spree/admin/return_authorizations/{_return_authorization.html.erb → _table_row.html.erb} +1 -1
  384. data/app/views/spree/admin/return_authorizations/{_filters.html.erb → filters.html.erb} +7 -12
  385. data/app/views/spree/admin/return_authorizations/index.html.erb +1 -10
  386. data/app/views/spree/admin/roles/_form.html.erb +4 -5
  387. data/app/views/spree/admin/roles/edit.html.erb +1 -15
  388. data/app/views/spree/admin/roles/index.html.erb +4 -4
  389. data/app/views/spree/admin/roles/new.html.erb +1 -18
  390. data/app/views/spree/admin/shared/_alerts.html.erb +3 -1
  391. data/app/views/spree/admin/shared/_back_to_dashboard.html.erb +1 -0
  392. data/app/views/spree/admin/shared/_breadcrumbs.html.erb +1 -1
  393. data/app/views/spree/admin/shared/_bulk_modal.html.erb +13 -19
  394. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +6 -7
  395. data/app/views/spree/admin/shared/_close_bulk_modal.turbo_stream.erb +4 -1
  396. data/app/views/spree/admin/shared/_content_header.html.erb +20 -38
  397. data/app/views/spree/admin/shared/_dialog.html.erb +4 -0
  398. data/app/views/spree/admin/shared/_drawer.html.erb +4 -0
  399. data/app/views/spree/admin/shared/_edit_resource.html.erb +17 -0
  400. data/app/views/spree/admin/shared/_export_modal.html.erb +3 -0
  401. data/app/views/spree/admin/shared/_filters_button.html.erb +2 -2
  402. data/app/views/spree/admin/shared/_head.html.erb +7 -3
  403. data/app/views/spree/admin/shared/_header.html.erb +2 -5
  404. data/app/views/spree/admin/shared/_index_table.html.erb +34 -0
  405. data/app/views/spree/admin/shared/_index_table_options.html.erb +5 -7
  406. data/app/views/spree/admin/{variants/form → shared}/_media_asset.html.erb +3 -5
  407. data/app/views/spree/admin/{variants/form/_media.html.erb → shared/_media_form.html.erb} +2 -2
  408. data/app/views/spree/admin/shared/_multi_product_picker.html.erb +7 -7
  409. data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +8 -10
  410. data/app/views/spree/admin/shared/_new_resource.html.erb +18 -0
  411. data/app/views/spree/admin/shared/_no_resource_found.html.erb +1 -1
  412. data/app/views/spree/admin/shared/_page_alerts.html.erb +5 -0
  413. data/app/views/spree/admin/shared/_page_section_image.html.erb +6 -0
  414. data/app/views/spree/admin/shared/_page_tabs.html.erb +9 -0
  415. data/app/views/spree/admin/shared/_refunds.html.erb +6 -8
  416. data/app/views/spree/admin/shared/_seo.html.erb +3 -8
  417. data/app/views/spree/admin/shared/_team_nav.html.erb +1 -3
  418. data/app/views/spree/admin/shared/_user.html.erb +2 -1
  419. data/app/views/spree/admin/shared/_user_dropdown.html.erb +7 -9
  420. data/app/views/spree/admin/shared/named_types/_edit.html.erb +1 -14
  421. data/app/views/spree/admin/shared/named_types/_form.html.erb +2 -11
  422. data/app/views/spree/admin/shared/named_types/_new.html.erb +1 -14
  423. data/app/views/spree/admin/shared/sidebar/_customers_nav.html.erb +8 -0
  424. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +1 -1
  425. data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +1 -1
  426. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +8 -9
  427. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +16 -14
  428. data/app/views/spree/admin/shared/sidebar/_vendors_nav.html.erb +5 -2
  429. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +7 -7
  430. data/app/views/spree/admin/shipping_categories/_form.html.erb +1 -5
  431. data/app/views/spree/admin/shipping_categories/_table_header.html.erb +4 -0
  432. data/app/views/spree/admin/shipping_categories/_table_row.html.erb +8 -0
  433. data/app/views/spree/admin/shipping_categories/edit.html.erb +1 -14
  434. data/app/views/spree/admin/shipping_categories/index.html.erb +3 -30
  435. data/app/views/spree/admin/shipping_categories/new.html.erb +1 -14
  436. data/app/views/spree/admin/shipping_methods/_table_header.html.erb +8 -0
  437. data/app/views/spree/admin/shipping_methods/{_shipping_method.html.erb → _table_row.html.erb} +1 -1
  438. data/app/views/spree/admin/shipping_methods/form/_display.html.erb +2 -2
  439. data/app/views/spree/admin/shipping_methods/form/_tax_category.html.erb +1 -4
  440. data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +1 -1
  441. data/app/views/spree/admin/shipping_methods/index.html.erb +3 -26
  442. data/app/views/spree/admin/stock_items/_filters.html.erb +12 -21
  443. data/app/views/spree/admin/stock_items/_table_header.html.erb +9 -0
  444. data/app/views/spree/admin/stock_items/{_stock_item.html.erb → _table_row.html.erb} +1 -1
  445. data/app/views/spree/admin/stock_items/index.html.erb +1 -27
  446. data/app/views/spree/admin/stock_locations/_form.html.erb +3 -15
  447. data/app/views/spree/admin/stock_locations/_table_header.html.erb +9 -0
  448. data/app/views/spree/admin/stock_locations/{_stock_location.html.erb → _table_row.html.erb} +7 -6
  449. data/app/views/spree/admin/stock_locations/edit.html.erb +1 -14
  450. data/app/views/spree/admin/stock_locations/index.html.erb +3 -26
  451. data/app/views/spree/admin/stock_locations/new.html.erb +1 -14
  452. data/app/views/spree/admin/stock_transfers/_filters.html.erb +25 -33
  453. data/app/views/spree/admin/stock_transfers/_new_variant_modal.html.erb +22 -26
  454. data/app/views/spree/admin/stock_transfers/_table_header.html.erb +9 -0
  455. data/app/views/spree/admin/stock_transfers/{_stock_transfer.html.erb → _table_row.html.erb} +2 -2
  456. data/app/views/spree/admin/stock_transfers/index.html.erb +1 -26
  457. data/app/views/spree/admin/stock_transfers/new.html.erb +5 -6
  458. data/app/views/spree/admin/stock_transfers/show.html.erb +3 -3
  459. data/app/views/spree/admin/store_credit_categories/_form.html.erb +1 -5
  460. data/app/views/spree/admin/store_credit_categories/index.html.erb +3 -3
  461. data/app/views/spree/admin/store_credit_events/_store_credit_event.html.erb +1 -1
  462. data/app/views/spree/admin/store_credits/_form.html.erb +3 -16
  463. data/app/views/spree/admin/store_credits/_list.html.erb +7 -7
  464. data/app/views/spree/admin/store_credits/_store_credit.html.erb +2 -2
  465. data/app/views/spree/admin/store_credits/show.html.erb +6 -6
  466. data/app/views/spree/admin/storefront/edit.html.erb +10 -53
  467. data/app/views/spree/admin/stores/edit.html.erb +10 -6
  468. data/app/views/spree/admin/stores/form/_basic.html.erb +65 -158
  469. data/app/views/spree/admin/stores/form/_checkout.html.erb +35 -51
  470. data/app/views/spree/admin/stores/form/_checkout_links.html.erb +28 -0
  471. data/app/views/spree/admin/stores/form/_emails.html.erb +33 -64
  472. data/app/views/spree/admin/stores/form/_policies.html.erb +55 -71
  473. data/app/views/spree/admin/stores/new.html.erb +119 -129
  474. data/app/views/spree/admin/tax_categories/_form.html.erb +4 -17
  475. data/app/views/spree/admin/tax_categories/_table_header.html.erb +7 -0
  476. data/app/views/spree/admin/tax_categories/{_tax_category.html.erb → _table_row.html.erb} +1 -1
  477. data/app/views/spree/admin/tax_categories/edit.html.erb +1 -14
  478. data/app/views/spree/admin/tax_categories/index.html.erb +3 -24
  479. data/app/views/spree/admin/tax_categories/new.html.erb +1 -14
  480. data/app/views/spree/admin/tax_rates/_form.html.erb +6 -26
  481. data/app/views/spree/admin/tax_rates/_table_header.html.erb +9 -0
  482. data/app/views/spree/admin/tax_rates/{_tax_rate.html.erb → _table_row.html.erb} +1 -1
  483. data/app/views/spree/admin/tax_rates/edit.html.erb +1 -14
  484. data/app/views/spree/admin/tax_rates/index.html.erb +3 -26
  485. data/app/views/spree/admin/tax_rates/new.html.erb +1 -14
  486. data/app/views/spree/admin/taxonomies/_form.html.erb +5 -0
  487. data/app/views/spree/admin/taxonomies/_table_header.html.erb +6 -0
  488. data/app/views/spree/admin/taxonomies/{_taxonomy.html.erb → _table_row.html.erb} +3 -3
  489. data/app/views/spree/admin/taxonomies/edit.html.erb +1 -25
  490. data/app/views/spree/admin/taxonomies/filters.html.erb +6 -0
  491. data/app/views/spree/admin/taxonomies/index.html.erb +3 -34
  492. data/app/views/spree/admin/taxonomies/new.html.erb +1 -23
  493. data/app/views/spree/admin/taxons/_form.html.erb +6 -30
  494. data/app/views/spree/admin/taxons/_rule_form.html.erb +2 -1
  495. data/app/views/spree/admin/taxons/_rules_form.html.erb +1 -1
  496. data/app/views/spree/admin/taxons/edit.html.erb +0 -1
  497. data/app/views/spree/admin/themes/_theme.html.erb +9 -8
  498. data/app/views/spree/admin/themes/index.html.erb +14 -16
  499. data/app/views/spree/admin/translations/edit.html.erb +34 -49
  500. data/app/views/spree/admin/translations/policies/_form.html.erb +12 -0
  501. data/app/views/spree/admin/translations/products/_form.html.erb +2 -0
  502. data/app/views/spree/admin/translations/translation_rows/_permalink_field_row.html.erb +11 -20
  503. data/app/views/spree/admin/translations/translation_rows/_rich_textarea_row.html.erb +1 -11
  504. data/app/views/spree/admin/translations/translation_rows/_text_field_row.html.erb +1 -5
  505. data/app/views/spree/admin/translations/translation_rows/_textarea_row.html.erb +2 -9
  506. data/app/views/spree/admin/translations/translation_rows/_tinymce_row.html.erb +4 -11
  507. data/app/views/spree/admin/translations/update.turbo_stream.erb +1 -0
  508. data/app/views/spree/admin/users/_filters.html.erb +50 -66
  509. data/app/views/spree/admin/users/_form.html.erb +3 -36
  510. data/app/views/spree/admin/users/_form_fields.html.erb +15 -0
  511. data/app/views/spree/admin/users/_last_order.html.erb +3 -2
  512. data/app/views/spree/admin/users/_lifetime_stats.html.erb +1 -1
  513. data/app/views/spree/admin/users/_tabs.html.erb +31 -31
  514. data/app/views/spree/admin/users/_user.html.erb +1 -1
  515. data/app/views/spree/admin/users/bulk_modal.html.erb +11 -13
  516. data/app/views/spree/admin/users/edit.html.erb +1 -1
  517. data/app/views/spree/admin/users/index.html.erb +53 -55
  518. data/app/views/spree/admin/users/new.html.erb +1 -18
  519. data/app/views/spree/admin/variants/_variant.html.erb +1 -1
  520. data/app/views/spree/admin/variants/edit.html.erb +1 -1
  521. data/app/views/spree/admin/variants/form/_basic.html.erb +4 -17
  522. data/app/views/spree/admin/variants/form/_dimensions.html.erb +4 -18
  523. data/app/views/spree/admin/variants/form/_inventory.html.erb +6 -12
  524. data/app/views/spree/admin/variants/form/_pricing.html.erb +3 -3
  525. data/app/views/spree/admin/webhook_events/_webhook_event.html.erb +1 -1
  526. data/app/views/spree/admin/webhooks_subscribers/_form.html.erb +57 -73
  527. data/app/views/spree/admin/webhooks_subscribers/_table_header.html.erb +7 -0
  528. data/app/views/spree/admin/webhooks_subscribers/{_webhooks_subscriber.html.erb → _table_row.html.erb} +3 -3
  529. data/app/views/spree/admin/webhooks_subscribers/edit.html.erb +1 -9
  530. data/app/views/spree/admin/webhooks_subscribers/index.html.erb +1 -23
  531. data/app/views/spree/admin/webhooks_subscribers/new.html.erb +1 -11
  532. data/app/views/spree/admin/webhooks_subscribers/show.html.erb +8 -8
  533. data/app/views/spree/admin/zones/_form.html.erb +8 -28
  534. data/app/views/spree/admin/zones/_table_header.html.erb +8 -0
  535. data/app/views/spree/admin/zones/_table_row.html.erb +8 -0
  536. data/app/views/spree/admin/zones/edit.html.erb +1 -14
  537. data/app/views/spree/admin/zones/index.html.erb +3 -35
  538. data/app/views/spree/admin/zones/new.html.erb +1 -14
  539. data/config/importmap.rb +32 -2
  540. data/config/initializers/assets.rb +3 -1
  541. data/config/locales/en.yml +32 -3
  542. data/config/routes.rb +27 -4
  543. data/lib/generators/spree/admin/scaffold/scaffold_generator.rb +51 -0
  544. data/lib/generators/spree/admin/scaffold/templates/controller.rb.tt +11 -0
  545. data/lib/generators/spree/admin/scaffold/templates/views/_filters.html.erb.tt +13 -0
  546. data/lib/generators/spree/admin/scaffold/templates/views/_form.html.erb.tt +5 -0
  547. data/lib/generators/spree/admin/scaffold/templates/views/_table_header.html.erb.tt +5 -0
  548. data/lib/generators/spree/admin/scaffold/templates/views/_table_row.html.erb.tt +9 -0
  549. data/lib/generators/spree/admin/scaffold/templates/views/edit.html.erb.tt +1 -0
  550. data/lib/generators/spree/admin/scaffold/templates/views/index.html.erb.tt +9 -0
  551. data/lib/generators/spree/admin/scaffold/templates/views/new.html.erb.tt +1 -0
  552. data/lib/spree/admin/engine.rb +13 -9
  553. data/lib/spree/admin/runtime_configuration.rb +5 -0
  554. data/lib/spree/admin/testing_support/capybara_utils.rb +19 -0
  555. data/lib/spree/admin.rb +1 -3
  556. data/vendor/javascript/@codemirror--autocomplete.js +4 -0
  557. data/vendor/javascript/@codemirror--commands.js +4 -0
  558. data/vendor/javascript/@codemirror--lang-json.js +4 -0
  559. data/vendor/javascript/@codemirror--language.js +4 -0
  560. data/vendor/javascript/@codemirror--lint.js +4 -0
  561. data/vendor/javascript/@codemirror--search.js +4 -0
  562. data/vendor/javascript/@codemirror--state.js +4 -0
  563. data/vendor/javascript/@codemirror--view.js +4 -0
  564. data/vendor/javascript/@floating-ui--core.js +4 -0
  565. data/vendor/javascript/@floating-ui--dom.js +12 -0
  566. data/vendor/javascript/@floating-ui--utils--dom.js +4 -0
  567. data/vendor/javascript/@floating-ui--utils.js +4 -0
  568. data/vendor/javascript/@highlightjs--cdn-assets--es--core.min.js.js +308 -0
  569. data/vendor/javascript/@highlightjs--cdn-assets--es--languages--json.min.js.js +10 -0
  570. data/vendor/javascript/@lezer--common.js +4 -0
  571. data/vendor/javascript/@lezer--highlight.js +4 -0
  572. data/vendor/javascript/@lezer--json.js +4 -0
  573. data/vendor/javascript/@lezer--lr.js +4 -0
  574. data/vendor/javascript/@marijn--find-cluster-break.js +4 -0
  575. data/vendor/javascript/@stimulus-components--dialog.js +4 -0
  576. data/vendor/javascript/@stimulus-components--dropdown.js +4 -0
  577. data/vendor/javascript/codemirror.js +4 -0
  578. data/vendor/javascript/crelt.js +4 -0
  579. data/vendor/javascript/stimulus-use.js +2 -2
  580. data/vendor/javascript/style-mod.js +4 -0
  581. data/vendor/javascript/trix@2.1.15.js +5 -0
  582. data/vendor/javascript/w3c-keyname.js +4 -0
  583. metadata +210 -71
  584. data/app/assets/stylesheets/spree/admin/plugins/flatfile.scss +0 -4
  585. data/app/helpers/spree/admin/session_assets_helper.rb +0 -24
  586. data/app/javascript/spree/admin/controllers/bootstrap_tabs_controller.js +0 -9
  587. data/app/javascript/spree/admin/controllers/enable_button_controller.js +0 -29
  588. data/app/views/spree/admin/coupon_codes/_coupon_code.html.erb +0 -8
  589. data/app/views/spree/admin/errors/forbidden.html.erb +0 -13
  590. data/app/views/spree/admin/gift_cards/index.csv.erb +0 -22
  591. data/app/views/spree/admin/orders/user/create.turbo_stream.erb +0 -12
  592. data/app/views/spree/admin/orders/user/update.turbo_stream.erb +0 -5
  593. data/app/views/spree/admin/pages/_page.html.erb +0 -26
  594. data/app/views/spree/admin/payment_methods/update.turbo_stream.erb +0 -1
  595. data/app/views/spree/admin/posts/_filters.html.erb +0 -36
  596. data/app/views/spree/admin/stores/create.turbo_stream.erb +0 -5
  597. data/app/views/spree/admin/translations/_translations_unavailable.html.erb +0 -8
  598. data/app/views/spree/admin/users/index.csv.erb +0 -43
  599. data/vendor/javascript/trix@2.1.12.js +0 -5
  600. /data/app/views/spree/admin/page_blocks/forms/{_buy_buttons.html.erb → products/_buy_buttons.html.erb} +0 -0
  601. /data/app/views/spree/admin/page_blocks/forms/{_quantity_selector.html.erb → products/_quantity_selector.html.erb} +0 -0
@@ -1,21 +1,24 @@
1
1
  class Spree::Admin::ResourceController < Spree::Admin::BaseController
2
2
  include Spree::Admin::Callbacks
3
3
 
4
- helper_method :new_object_url, :edit_object_url, :object_url, :collection_url, :model_class
4
+ helper_method :new_object_url, :edit_object_url, :object_url, :collection_url, :model_class, :search_collection, :paginated_collection
5
5
  before_action :load_resource
6
6
  before_action :set_currency, :set_current_store, only: [:new, :create]
7
7
  after_action :set_return_to, only: [:index]
8
8
 
9
9
  rescue_from ActiveRecord::RecordNotFound, with: :resource_not_found
10
10
 
11
+ # GET /admin/<resource_name>/new
11
12
  def new
12
13
  invoke_callbacks(:new_action, :before)
13
14
  end
14
15
 
16
+ # GET /admin/<resource_name_plural>/<id>/edit
15
17
  def edit
16
18
  invoke_callbacks(:edit_action, :before)
17
19
  end
18
20
 
21
+ # PUT /admin/<resource_name_plural>/<id>
19
22
  def update
20
23
  invoke_callbacks(:update, :before)
21
24
  if @object.update(permitted_resource_params)
@@ -47,6 +50,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
47
50
  end
48
51
  end
49
52
 
53
+ # POST /admin/<resource_name_plural>
50
54
  def create
51
55
  invoke_callbacks(:create, :before)
52
56
  set_created_by
@@ -77,6 +81,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
77
81
  end
78
82
  end
79
83
 
84
+ # DELETE /admin/<resource_name_plural>/<id>
80
85
  def destroy
81
86
  invoke_callbacks(:destroy, :before)
82
87
  if @object.destroy
@@ -131,6 +136,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
131
136
  redirect_to collection_url, status: :see_other
132
137
  end
133
138
 
139
+ # Returns the resource for the current controller
140
+ # @return [Spree::Admin::Resource]
134
141
  def resource
135
142
  return @resource if @resource
136
143
 
@@ -138,6 +145,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
138
145
  @resource = Spree::Admin::Resource.new controller_path, controller_name, parent_model_name, object_name
139
146
  end
140
147
 
148
+ # Loads the resource for the current controller
149
+ # @return [Spree::Admin::Resource]
141
150
  def load_resource
142
151
  if member_action?
143
152
  @object ||= load_resource_instance
@@ -207,6 +216,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
207
216
  end
208
217
  end
209
218
 
219
+ # Returns the collection of resources (as a scope)
220
+ # @return [ActiveRecord::Relation]
210
221
  def collection
211
222
  return parent.send(controller_name) if parent_data.present?
212
223
 
@@ -223,32 +234,66 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
223
234
  end
224
235
  end
225
236
 
237
+ # Returns the filtered and paginated ransack results
238
+ # @return [ActiveRecord::Relation]
239
+ def paginated_collection
240
+ @paginated_collection ||= begin
241
+ # Check if collection is already a ransack collection and return it
242
+ return collection if collection.respond_to?(:current_page)
243
+
244
+ search_collection.result(distinct: true).page(params[:page]).per(params[:per_page])
245
+ end
246
+ end
247
+
248
+ # Returns the ransack search collection
249
+ # @return [Ransack::Search]
250
+ def search_collection
251
+ @search_collection ||= begin
252
+ params[:q] ||= {}
253
+ collection.ransack(params[:q])
254
+ end
255
+ end
256
+
257
+ # Returns the URL to redirect to after destroying a resource
258
+ # @return [String]
226
259
  def location_after_destroy
227
260
  collection_url
228
261
  end
229
262
 
263
+ # Returns the URL to redirect to after creating a resource
264
+ # @return [String]
230
265
  def location_after_create
231
266
  location_after_save
232
267
  end
233
268
 
269
+ # Returns the URL to redirect to after saving a resource (update or create)
270
+ # @return [String]
234
271
  def location_after_save
235
272
  edit_object_url(@object)
236
273
  end
237
274
 
275
+ # Returns the flash message after creating a resource
276
+ # @return [String]
238
277
  def message_after_create
239
278
  flash_message_for(@object, :successfully_created)
240
279
  end
241
280
 
281
+ # Returns the flash message after updating a resource
282
+ # @return [String]
242
283
  def message_after_update
243
284
  flash_message_for(@object, :successfully_updated)
244
285
  end
245
286
 
287
+ # Sets the current store for the resource, if resource is store related
288
+ # @return [void]
246
289
  def set_current_store
247
290
  return if @object.nil?
248
291
 
249
292
  ensure_current_store(@object)
250
293
  end
251
294
 
295
+ # Sets the created_by with the current admin user for the resource, if resource is created_by related
296
+ # @return [void]
252
297
  def set_created_by
253
298
  return if @object.nil?
254
299
 
@@ -264,6 +309,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
264
309
 
265
310
  # URL helpers
266
311
 
312
+ # Returns the URL to redirect to after creating a resource
313
+ # @return [String]
267
314
  def new_object_url(options = {})
268
315
  if parent_data.present?
269
316
  spree.new_polymorphic_url([:admin, parent, model_class], options)
@@ -272,6 +319,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
272
319
  end
273
320
  end
274
321
 
322
+ # Returns the URL to edit a resource
323
+ # @return [String]
275
324
  def edit_object_url(object, options = {})
276
325
  if parent_data.present?
277
326
  spree.send "edit_admin_#{resource.model_name}_#{resource.object_name}_url",
@@ -281,6 +330,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
281
330
  end
282
331
  end
283
332
 
333
+ # Returns the URL to the resource
334
+ # @return [String]
284
335
  def object_url(object = nil, options = {})
285
336
  target = object || @object
286
337
  if parent_data.present?
@@ -290,6 +341,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
290
341
  end
291
342
  end
292
343
 
344
+ # Returns the URL to the collection of resources
345
+ # @return [String]
293
346
  def collection_url(options = {})
294
347
  if parent_data.present?
295
348
  spree.polymorphic_url([:admin, parent, model_class], options)
@@ -308,16 +361,22 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
308
361
  raise NotImplementedError, "You must implement the permitted_resource_params method"
309
362
  end
310
363
 
364
+ # Returns the actions that are collection actions
365
+ # @return [Array]
311
366
  def collection_actions
312
367
  [:index, :select_options, :bulk_modal, :bulk_status_update,
313
368
  :bulk_add_to_taxons, :bulk_remove_from_taxons,
314
369
  :bulk_add_tags, :bulk_remove_tags, :bulk_destroy]
315
370
  end
316
371
 
372
+ # Returns true if the current action is a member action
373
+ # @return [Boolean]
317
374
  def member_action?
318
375
  !collection_actions.include? action
319
376
  end
320
377
 
378
+ # Returns the actions that are new actions
379
+ # @return [Array]
321
380
  def new_actions
322
381
  [:new, :create]
323
382
  end
@@ -1,7 +1,7 @@
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
4
+ include Spree::Admin::SettingsConcern
5
5
 
6
6
  private
7
7
 
@@ -1,6 +1,9 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ReturnAuthorizationsController < ResourceController
4
+ add_breadcrumb_icon 'receipt-refund'
5
+ add_breadcrumb Spree.t(:returns), :admin_customer_returns_path
6
+
4
7
  def index; end
5
8
 
6
9
  def cancel
@@ -1,8 +1,7 @@
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
4
+ include Spree::Admin::SettingsConcern
6
5
 
7
6
  private
8
7
 
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ShippingCategoriesController < ResourceController
4
- add_breadcrumb Spree.t(:shipping_categories), :admin_shipping_categories_path
4
+ include Spree::Admin::SettingsConcern
5
5
 
6
6
  private
7
7
 
@@ -1,11 +1,11 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class ShippingMethodsController < ResourceController
4
+ include Spree::Admin::SettingsConcern
5
+
4
6
  before_action :load_data, except: :index
5
7
  before_action :set_default_values, only: :new
6
8
 
7
- add_breadcrumb Spree.t(:shipping_methods), :admin_shipping_methods_path
8
-
9
9
  private
10
10
 
11
11
  def set_default_values
@@ -1,9 +1,9 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class StockLocationsController < ResourceController
4
- before_action :set_country, only: :new
4
+ include Spree::Admin::SettingsConcern
5
5
 
6
- add_breadcrumb Spree.t(:stock_locations), :admin_stock_locations_path
6
+ before_action :set_country, only: :new
7
7
 
8
8
  # PUT /admin/stock_locations/:id/mark_as_default
9
9
  def mark_as_default
@@ -6,6 +6,7 @@ module Spree
6
6
  before_action :load_user
7
7
  before_action :load_store_credit, only: [:new, :edit, :update, :destroy]
8
8
  before_action :ensure_unused_store_credit, only: [:update]
9
+ helper_method :collection_url
9
10
 
10
11
  def index
11
12
  @store_credits = scope.includes(:created_by).order(created_at: :desc)
@@ -84,6 +85,7 @@ module Spree
84
85
 
85
86
  def load_store_credit
86
87
  @store_credit = scope.find_by(id: params[:id]) || scope.new
88
+ @object = @store_credit
87
89
  end
88
90
 
89
91
  def scope
@@ -95,6 +97,10 @@ module Spree
95
97
  raise StoreCreditError, Spree.t('store_credit.errors.cannot_change_used_store_credit')
96
98
  end
97
99
  end
100
+
101
+ def collection_url
102
+ spree.admin_user_store_credits_path(@user)
103
+ end
98
104
  end
99
105
  end
100
106
  end
@@ -26,7 +26,7 @@ module Spree
26
26
  params.require(:store).permit(
27
27
  :preferred_index_in_search_engines,
28
28
  :preferred_password_protected, :social_image, :favicon_image, :name,
29
- :meta_description, :meta_title, :meta_keywords, :seo_robots,
29
+ :meta_description, :meta_keywords, :seo_robots, :seo_title,
30
30
  :facebook, :twitter, :instagram, :linkedin, :youtube, :tiktok, :pinterest,
31
31
  :storefront_custom_code_head, :storefront_custom_code_body_start,
32
32
  :storefront_custom_code_body_end, :storefront_password, :spotify, :discord
@@ -1,6 +1,8 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class StoresController < Spree::Admin::BaseController
4
+ include Spree::Admin::SettingsConcern
5
+
4
6
  before_action :load_store, only: [:edit, :update]
5
7
  before_action :normalize_supported_currencies, only: [:update]
6
8
  before_action :normalize_supported_locales, only: [:update]
@@ -12,6 +14,7 @@ module Spree
12
14
  default_country_iso: current_store.default_country_iso,
13
15
  default_currency: current_store.default_currency
14
16
  )
17
+ render :new, layout: 'spree/admin_wizard'
15
18
  end
16
19
 
17
20
  def create
@@ -25,7 +28,7 @@ module Spree
25
28
  end
26
29
 
27
30
  flash[:success] = flash_message_for(@store, :successfully_created)
28
- # redirect in view, Turbo doesn't support redirecting to a different host
31
+ redirect_to spree.admin_getting_started_url(host: @store.url), allow_other_host: true
29
32
  else
30
33
  render :new, status: :unprocessable_entity
31
34
  end
@@ -50,7 +53,10 @@ module Spree
50
53
 
51
54
  if @store.save
52
55
  remove_assets(%w[logo mailer_logo], object: @store)
53
- flash[:success] = flash_message_for(@store, :successfully_updated)
56
+ respond_to do |format|
57
+ format.turbo_stream { flash.now[:success] = flash_message_for(@store, :successfully_updated) }
58
+ format.html { flash[:success] = flash_message_for(@store, :successfully_updated) }
59
+ end
54
60
  else
55
61
  flash[:error] = "#{Spree.t('store_errors.unable_to_update')}: #{@store.errors.full_messages.join(', ')}"
56
62
  end
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TaxCategoriesController < ResourceController
4
- add_breadcrumb Spree.t(:tax_categories), :admin_tax_categories_path
4
+ include Spree::Admin::SettingsConcern
5
5
 
6
6
  private
7
7
 
@@ -1,11 +1,11 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class TaxRatesController < ResourceController
4
+ include Spree::Admin::SettingsConcern
5
+
4
6
  before_action :load_data
5
7
  before_action :set_defaults, only: :new
6
8
 
7
- add_breadcrumb Spree.t(:tax_rates), :admin_tax_rates_path
8
-
9
9
  private
10
10
 
11
11
  def set_defaults
@@ -1,32 +1,24 @@
1
1
  module Spree
2
2
  module Admin
3
- class TranslationsController < Spree::Admin::BaseController
4
- before_action :set_resource, only: [:edit, :update]
5
- before_action :load_data, only: [:edit]
6
- before_action :set_translation_locale, only: [:edit, :update]
3
+ class TranslationsController < ResourceController
4
+ # Set the resource being translated and any related data
5
+ before_action :load_data
6
+ before_action :set_translation_locale
7
+ helper_method :normalized_locale
7
8
 
8
- def edit; end
9
-
10
- def update
11
- @resource.update!(permitted_translation_params)
12
-
13
- flash[:success] = Spree.t('notice_messages.translations_saved')
14
-
15
- redirect_to spree.edit_admin_translation_path(
16
- @resource,
17
- resource_type: @resource.class.to_s,
18
- translation_locale: @selected_translation_locale
19
- )
9
+ # Normalizes a locale string by replacing '-' with '_' and downcasing
10
+ def normalized_locale(locale)
11
+ locale.to_s.downcase.tr('-', '_')
20
12
  end
21
13
 
22
14
  private
23
15
 
24
- def permitted_translation_params
25
- params.require(@resource.model_name.param_key).permit(translation_fields(resource_class), **nested_params)
16
+ def permitted_resource_params
17
+ params.require(@object.model_name.param_key).permit(translation_fields(model_class), **nested_params)
26
18
  end
27
19
 
28
20
  def nested_params
29
- case resource_class.to_s
21
+ case model_class.to_s
30
22
  when 'Spree::OptionType'
31
23
  { option_values_attributes: [ :id, *translation_fields(Spree::OptionValue)] }
32
24
  else
@@ -34,54 +26,42 @@ module Spree
34
26
  end
35
27
  end
36
28
 
29
+ # Build translation field names with normalized locale suffix
37
30
  def translation_fields(klass)
38
- klass.translatable_fields.map { |field| "#{field}_#{@selected_translation_locale}" }
31
+ klass.translatable_fields.map { |field| "#{field}_#{normalized_locale(@selected_translation_locale)}" }
39
32
  end
40
33
 
41
- def resource_class
42
- @resource_class ||= begin
34
+ # Determine the class of the resource
35
+ def model_class
36
+ @model_class ||= begin
43
37
  klass = params[:resource_type]
44
- allowed_resource_class.find { |allowed_class| allowed_class.to_s == klass } ||
38
+ allowed_model_classes.find { |allowed_class| allowed_class.to_s == klass } ||
45
39
  raise(ActiveRecord::RecordNotFound, "Resource type not found")
46
40
  end
47
41
  end
48
42
 
49
- def allowed_resource_class
43
+ # Allowed translatable resources configured in Spree
44
+ def allowed_model_classes
50
45
  Rails.application.config.spree.translatable_resources
51
46
  end
52
47
 
53
- def set_resource
54
- @resource = if resource_class.respond_to?(:friendly)
55
- resource_class.friendly.find(params[:id])
56
- else
57
- resource_class.find(params[:id])
58
- end
59
- end
60
-
48
+ # Determine the translation locale to use
61
49
  def set_translation_locale
62
- @selected_translation_locale = params[:translation_locale].presence || @locales&.first || current_store.supported_locales_list.first
50
+ raw_locale = params[:translation_locale].presence ||
51
+ @locales&.first ||
52
+ current_store.default_locale ||
53
+ current_store.supported_locales_list.first
54
+
55
+ @selected_translation_locale = normalized_locale(raw_locale)
63
56
  end
64
57
 
58
+ # Load available locales for this resource, excluding default
65
59
  def load_data
66
60
  @locales = (current_store.supported_locales_list - [@default_locale]).sort
67
- @resource_name = @resource.try(:name)
61
+ end
68
62
 
69
- @back_path = case @resource.class.name
70
- when 'Spree::OptionType'
71
- spree.edit_admin_option_type_path(@resource)
72
- when 'Spree::Product'
73
- spree.edit_admin_product_path(@resource)
74
- when 'Spree::Property'
75
- spree.edit_admin_property_path(@resource)
76
- when 'Spree::Store'
77
- spree.edit_admin_store_path(section: "general-settings")
78
- when 'Spree::Taxon'
79
- spree.edit_admin_taxonomy_taxon_path(@resource.taxonomy, @resource.id)
80
- when 'Spree::Taxonomy'
81
- spree.admin_taxonomy_path(@resource)
82
- else
83
- [:edit, :admin, @resource]
84
- end
63
+ def update_turbo_stream_enabled?
64
+ true
85
65
  end
86
66
  end
87
67
  end
@@ -73,6 +73,10 @@ module Spree
73
73
  model_class.accessible_by(current_ability, :show).find(params[:id])
74
74
  end
75
75
 
76
+ def collection_url
77
+ spree.admin_users_path
78
+ end
79
+
76
80
  private
77
81
 
78
82
  def user_params
@@ -1,14 +1,13 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class WebhooksSubscribersController < ResourceController
4
+ include Spree::Admin::SettingsConcern
5
+
4
6
  before_action :set_supported_events, except: [:index, :show]
5
7
 
6
8
  create.before :process_subscriptions
7
9
  update.before :process_subscriptions
8
10
 
9
- add_breadcrumb Spree.t(:developers), :admin_oauth_applications_path
10
- add_breadcrumb Spree.t(:webhooks), :admin_webhooks_subscribers_path
11
-
12
11
  def show
13
12
  @webhooks_subscriber = Webhooks::Subscriber.find(params[:id])
14
13
  @events = @webhooks_subscriber.events.order(created_at: :desc).page(params[:page]).per(params[:per_page])
@@ -1,7 +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
+ include Spree::Admin::SettingsConcern
5
5
  before_action :load_data, except: :index
6
6
 
7
7
  def new
@@ -0,0 +1,42 @@
1
+ module Spree
2
+ module Admin
3
+ module AssetsHelper
4
+ def media_form_assets(viewable, viewable_type)
5
+ if viewable&.persisted?
6
+ viewable.images
7
+ elsif session_uploaded_assets(viewable_type).any?
8
+ Spree::Asset.accessible_by(current_ability, :manage).where(id: session_uploaded_assets(viewable_type))
9
+ else
10
+ []
11
+ end
12
+ end
13
+
14
+ def ensure_session_uploaded_assets_uuid(viewable_type)
15
+ session[session_uploaded_assets_uuid_key(viewable_type)] ||= SecureRandom.uuid
16
+ end
17
+
18
+ def store_uploaded_asset_in_session(asset, viewable_type)
19
+ ensure_session_uploaded_assets_uuid(viewable_type)
20
+ asset.update(session_id: session[session_uploaded_assets_uuid_key(viewable_type)])
21
+ end
22
+
23
+ def session_uploaded_assets(viewable_type)
24
+ return Spree::Asset.none if session[session_uploaded_assets_uuid_key(viewable_type)].blank?
25
+
26
+ Spree::Asset.with_session_uploaded_assets_uuid(session[session_uploaded_assets_uuid_key(viewable_type)]).where(viewable_id: nil)
27
+ end
28
+
29
+ def clear_session_for_uploaded_assets(viewable_type)
30
+ session.delete(session_uploaded_assets_uuid_key(viewable_type))
31
+ end
32
+
33
+ def session_uploaded_assets_uuid_key(viewable_type)
34
+ [
35
+ 'spree.admin.uploaded_assets',
36
+ viewable_type&.underscore,
37
+ 'uuid'
38
+ ].compact_blank.join('.')
39
+ end
40
+ end
41
+ end
42
+ end
@@ -34,11 +34,16 @@ module Spree
34
34
  # check if the current controller is a settings controller
35
35
  # this is used to display different sidebar navigation for settings pages
36
36
  # @return [Boolean]
37
+ def settings_area?
38
+ @settings_area.present?
39
+ end
40
+
37
41
  def settings_active?
38
- @settings_active || %w[admin_users audits custom_domains exports imports invitations oauth_applications
42
+ Spree::Deprecation.warn('settings_active? is deprecated and will be removed in Spree 6.0. Please use settings_area? instead')
43
+ @settings_active || %w[admin_users audits custom_domains exports invitations oauth_applications
39
44
  payment_methods refund_reasons reimbursement_types return_authorization_reasons roles
40
45
  shipping_categories shipping_methods stock_locations store_credit_categories
41
- stores tax_categories tax_rates webhooks webhooks_subscribers zones].include?(controller_name)
46
+ stores tax_categories tax_rates webhooks webhooks_subscribers zones policies metafield_definitions].include?(controller_name) || settings_area?
42
47
  end
43
48
 
44
49
  # @return [Array<String>] the available countries for checkout
@@ -76,8 +81,10 @@ module Spree
76
81
 
77
82
  # returns the available display on options, eg backend, frontend, both
78
83
  # @return [Array<Array<String, String>>] the available display on options
79
- def display_on_options
80
- Spree::DisplayOn::DISPLAY.map do |display_on|
84
+ def display_on_options(model = nil)
85
+ model ||= Spree::DisplayOn
86
+
87
+ model::DISPLAY.map do |display_on|
81
88
  [Spree.t("admin.display_on_options.#{display_on}"), display_on]
82
89
  end
83
90
  end
@@ -115,11 +122,12 @@ module Spree
115
122
  icon_name = 'plus' if icon_name == 'add'
116
123
  icon_name = 'x' if icon_name == 'cancel'
117
124
 
118
- styles = options[:style]
119
- styles ||= ''
120
- styles += ";font-size: #{options[:height]}px !important;line-height:#{options[:height]}px !important" if options[:height]
125
+ options[:style] ||= ''
126
+ options[:style] += ";font-size: #{options[:height]}px !important;line-height:#{options[:height]}px !important" if options[:height]
121
127
 
122
- content_tag :i, nil, class: "ti ti-#{icon_name} #{options[:class]}", style: styles
128
+ options[:class] = "ti ti-#{icon_name} #{options[:class]}"
129
+
130
+ content_tag :i, nil, options
123
131
  end
124
132
 
125
133
  # returns the flag emoji for a country
@@ -256,16 +264,16 @@ module Spree
256
264
  # @option options [String] :title the title of the button
257
265
  # @return [String] the button
258
266
  def clipboard_button(options = {})
259
- options[:class] ||= 'btn btn-clipboard with-tip'
267
+ options[:class] ||= 'btn btn-clipboard'
260
268
  options[:type] ||= 'button'
261
269
  options[:data] ||= {}
262
270
  options[:data][:action] = 'clipboard#copy'
263
271
  options[:data][:clipboard_target] = 'button'
264
- options[:data][:title] = Spree.t('admin.copy_to_clipboard')
272
+ options[:data][:controller] = 'tooltip'
265
273
  options[:aria_label] ||= Spree.t('admin.copy_to_clipboard') # screen-reader label
266
274
 
267
275
  content_tag(:button, options) do
268
- icon('copy', class: 'mr-0 font-size-sm')
276
+ icon('copy', class: 'mr-0 font-size-sm') + tooltip(Spree.t('admin.copy_to_clipboard'))
269
277
  end
270
278
  end
271
279
 
@@ -309,6 +317,45 @@ module Spree
309
317
  def allowed_file_types_for_upload
310
318
  Rails.application.config.active_storage.web_image_content_types
311
319
  end
320
+
321
+ # returns the local date for a given date
322
+ # @param date [Date] the date to format
323
+ # @return [String] the local date
324
+ def spree_date(date, options = {})
325
+ local_date(date, options)
326
+ end
327
+
328
+ # returns the local time for a given time
329
+ # @param time [Time] the time to format
330
+ # @return [String] the local time
331
+ def spree_time(time, options = {})
332
+ local_time(time, options)
333
+ end
334
+
335
+ # returns the local time ago for a given time
336
+ # @param time [Time] the time to format
337
+ # @return [String] the local time ago
338
+ def spree_time_ago(time, options = {})
339
+ return '' if time.blank?
340
+ options[:data] ||= {}
341
+ options[:data][:controller] = 'tooltip'
342
+
343
+ # Generate the time ago element with tooltip
344
+ content_tag(:span, options) do
345
+ tooltip_text = spree_time(time)
346
+ local_time_ago(time, class: '', title: nil) + tooltip(tooltip_text)
347
+ end
348
+ end
349
+
350
+ def tooltip(text = nil, &block)
351
+ content_tag(:span, role: 'tooltip', data: { tooltip_target: 'tooltip' }, class: 'tooltip-container') do
352
+ if block_given?
353
+ capture(&block)
354
+ else
355
+ text
356
+ end
357
+ end
358
+ end
312
359
  end
313
360
  end
314
361
  end