spree_admin 5.1.8 → 5.2.0.rc2

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 (598) 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 +37 -13
  10. data/app/assets/stylesheets/spree/admin/components/_filters.scss +30 -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 +3 -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 -1
  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 -2
  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 +13 -58
  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 +44 -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/page_builder_helper.rb +3 -8
  84. data/app/helpers/spree/admin/payments_helper.rb +2 -0
  85. data/app/helpers/spree/admin/products_helper.rb +0 -12
  86. data/app/helpers/spree/admin/translations_helper.rb +11 -4
  87. data/app/helpers/spree/admin/turbo_helper.rb +17 -4
  88. data/app/javascript/spree/admin/application.js +23 -5
  89. data/app/javascript/spree/admin/controllers/active_storage_upload_controller.js +41 -7
  90. data/app/javascript/spree/admin/controllers/admin_controller.js +0 -9
  91. data/app/javascript/spree/admin/controllers/auto_scroll_controller.js +33 -0
  92. data/app/javascript/spree/admin/controllers/codemirror_controller.js +45 -0
  93. data/app/javascript/spree/admin/controllers/dropdown_controller.js +154 -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/models/spree/admin/updater.rb +2 -2
  104. data/app/views/layouts/spree/admin.html.erb +6 -2
  105. data/app/views/layouts/spree/admin_settings.html.erb +36 -0
  106. data/app/views/layouts/spree/admin_wizard.html.erb +34 -0
  107. data/app/views/layouts/spree/minimal.html.erb +2 -1
  108. data/app/views/layouts/spree/page_builder.html.erb +3 -2
  109. data/app/views/spree/admin/admin_users/_admin_user.html.erb +2 -2
  110. data/app/views/spree/admin/admin_users/_form.html.erb +3 -12
  111. data/app/views/spree/admin/admin_users/edit.html.erb +4 -7
  112. data/app/views/spree/admin/admin_users/index.html.erb +3 -3
  113. data/app/views/spree/admin/admin_users/show.html.erb +4 -4
  114. data/app/views/spree/admin/assets/create.turbo_stream.erb +1 -1
  115. data/app/views/spree/admin/assets/destroy.turbo_stream.erb +1 -1
  116. data/app/views/spree/admin/assets/edit.html.erb +16 -21
  117. data/app/views/spree/admin/assets/update.turbo_stream.erb +2 -2
  118. data/app/views/spree/admin/classifications/_classification.html.erb +5 -4
  119. data/app/views/spree/admin/classifications/create.turbo_stream.erb +1 -1
  120. data/app/views/spree/admin/classifications/index.html.erb +2 -2
  121. data/app/views/spree/admin/coupon_codes/_filters.html.erb +41 -0
  122. data/app/views/spree/admin/coupon_codes/_table_header.html.erb +0 -0
  123. data/app/views/spree/admin/coupon_codes/_table_row.html.erb +8 -0
  124. data/app/views/spree/admin/coupon_codes/index.html.erb +1 -58
  125. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +4 -4
  126. data/app/views/spree/admin/custom_domains/edit.html.erb +1 -14
  127. data/app/views/spree/admin/custom_domains/new.html.erb +1 -14
  128. data/app/views/spree/admin/customer_returns/_filters.html.erb +11 -0
  129. data/app/views/spree/admin/customer_returns/_table_header.html.erb +8 -0
  130. data/app/views/spree/admin/customer_returns/{_customer_return.html.erb → _table_row.html.erb} +1 -1
  131. data/app/views/spree/admin/customer_returns/index.html.erb +1 -36
  132. data/app/views/spree/admin/dashboard/_setup_progress.html.erb +1 -1
  133. data/app/views/spree/admin/dashboard/_setup_tasks.html.erb +8 -10
  134. data/app/views/spree/admin/dashboard/_store_preview.html.erb +5 -5
  135. data/app/views/spree/admin/dashboard/_top_products.html.erb +3 -3
  136. data/app/views/spree/admin/dashboard/_updater.html.erb +1 -1
  137. data/app/views/spree/admin/dashboard/analytics.html.erb +37 -39
  138. data/app/views/spree/admin/dashboard/getting_started.html.erb +1 -1
  139. data/app/views/spree/admin/dashboard/setup_tasks/_add_products.html.erb +2 -2
  140. data/app/views/spree/admin/dashboard/show.html.erb +1 -1
  141. data/app/views/spree/admin/digital_assets/_digital_asset.html.erb +9 -10
  142. data/app/views/spree/admin/digital_assets/_form.html.erb +3 -8
  143. data/app/views/spree/admin/digital_assets/_table.html.erb +12 -13
  144. data/app/views/spree/admin/digital_assets/create.turbo_stream.erb +1 -1
  145. data/app/views/spree/admin/digital_assets/edit.html.erb +8 -10
  146. data/app/views/spree/admin/digital_assets/index.html.erb +8 -9
  147. data/app/views/spree/admin/digital_assets/new.html.erb +8 -10
  148. data/app/views/spree/admin/digital_assets/update.turbo_stream.erb +1 -1
  149. data/app/views/spree/admin/errors/403.html.erb +14 -0
  150. data/app/views/spree/admin/errors/404.html.erb +14 -0
  151. data/app/views/spree/admin/errors/422.html.erb +14 -0
  152. data/app/views/spree/admin/errors/500.html.erb +14 -0
  153. data/app/views/spree/admin/errors/503.html.erb +14 -0
  154. data/app/views/spree/admin/exports/_export.html.erb +1 -1
  155. data/app/views/spree/admin/exports/create.turbo_stream.erb +4 -1
  156. data/app/views/spree/admin/exports/index.html.erb +5 -5
  157. data/app/views/spree/admin/exports/new.html.erb +33 -28
  158. data/app/views/spree/admin/gift_card_batches/_form.html.erb +5 -20
  159. data/app/views/spree/admin/gift_card_batches/new.html.erb +1 -15
  160. data/app/views/spree/admin/gift_cards/_filters.html.erb +3 -4
  161. data/app/views/spree/admin/gift_cards/_form.html.erb +16 -26
  162. data/app/views/spree/admin/gift_cards/_gift_card.html.erb +1 -1
  163. data/app/views/spree/admin/gift_cards/_list.html.erb +7 -7
  164. data/app/views/spree/admin/gift_cards/_table_filter_dropdown.html.erb +13 -13
  165. data/app/views/spree/admin/gift_cards/index.html.erb +14 -11
  166. data/app/views/spree/admin/gift_cards/new.html.erb +1 -30
  167. data/app/views/spree/admin/gift_cards/show.html.erb +5 -5
  168. data/app/views/spree/admin/import_mappings/update.turbo_stream.erb +15 -0
  169. data/app/views/spree/admin/import_rows/_variant.html.erb +1 -0
  170. data/app/views/spree/admin/import_rows/show.html.erb +32 -0
  171. data/app/views/spree/admin/imports/_footer.html.erb +15 -0
  172. data/app/views/spree/admin/imports/_loader.html.erb +14 -0
  173. data/app/views/spree/admin/imports/_mapping.html.erb +12 -0
  174. data/app/views/spree/admin/imports/_mapping_footer.html.erb +20 -0
  175. data/app/views/spree/admin/imports/_mapping_form.html.erb +11 -0
  176. data/app/views/spree/admin/imports/_mapping_icon.html.erb +6 -0
  177. data/app/views/spree/admin/imports/_row.html.erb +35 -0
  178. data/app/views/spree/admin/imports/new.html.erb +26 -0
  179. data/app/views/spree/admin/imports/show.html.erb +57 -0
  180. data/app/views/spree/admin/invitations/_invitation.html.erb +13 -13
  181. data/app/views/spree/admin/invitations/create.turbo_stream.erb +1 -1
  182. data/app/views/spree/admin/invitations/index.html.erb +15 -17
  183. data/app/views/spree/admin/invitations/new.html.erb +15 -26
  184. data/app/views/spree/admin/json_previews/show.html.erb +37 -0
  185. data/app/views/spree/admin/line_items/new.html.erb +6 -6
  186. data/app/views/spree/admin/metafield_definitions/_filters.html.erb +18 -0
  187. data/app/views/spree/admin/metafield_definitions/_form.html.erb +44 -0
  188. data/app/views/spree/admin/metafield_definitions/_table_header.html.erb +11 -0
  189. data/app/views/spree/admin/metafield_definitions/_table_row.html.erb +22 -0
  190. data/app/views/spree/admin/metafield_definitions/edit.html.erb +1 -0
  191. data/app/views/spree/admin/metafield_definitions/index.html.erb +9 -0
  192. data/app/views/spree/admin/metafield_definitions/new.html.erb +1 -0
  193. data/app/views/spree/admin/metafield_definitions/update.turbo_stream.erb +1 -0
  194. data/app/views/spree/admin/metafields/edit.html.erb +43 -0
  195. data/app/views/spree/admin/metafields/types/_boolean.html.erb +4 -0
  196. data/app/views/spree/admin/metafields/types/_json.html.erb +4 -0
  197. data/app/views/spree/admin/metafields/types/_long_text.html.erb +1 -0
  198. data/app/views/spree/admin/metafields/types/_number.html.erb +1 -0
  199. data/app/views/spree/admin/metafields/types/_rich_text.html.erb +3 -0
  200. data/app/views/spree/admin/metafields/types/_short_text.html.erb +1 -0
  201. data/app/views/spree/admin/metafields/update.turbo_stream.erb +1 -0
  202. data/app/views/spree/admin/newsletter_subscribers/_filters.html.erb +41 -0
  203. data/app/views/spree/admin/newsletter_subscribers/_table_header.html.erb +8 -0
  204. data/app/views/spree/admin/newsletter_subscribers/_table_row.html.erb +36 -0
  205. data/app/views/spree/admin/newsletter_subscribers/index.html.erb +9 -0
  206. data/app/views/spree/admin/oauth_applications/_form.html.erb +5 -10
  207. data/app/views/spree/admin/oauth_applications/_table_header.html.erb +7 -0
  208. data/app/views/spree/admin/oauth_applications/_table_row.html.erb +34 -0
  209. data/app/views/spree/admin/oauth_applications/create.turbo_stream.erb +20 -30
  210. data/app/views/spree/admin/oauth_applications/edit.html.erb +1 -18
  211. data/app/views/spree/admin/oauth_applications/index.html.erb +4 -60
  212. data/app/views/spree/admin/oauth_applications/new.html.erb +1 -24
  213. data/app/views/spree/admin/option_types/{_filter.html.erb → _filters.html.erb} +1 -1
  214. data/app/views/spree/admin/option_types/_form.html.erb +8 -30
  215. data/app/views/spree/admin/option_types/_table_header.html.erb +19 -0
  216. data/app/views/spree/admin/option_types/{_option_type.html.erb → _table_row.html.erb} +1 -1
  217. data/app/views/spree/admin/option_types/edit.html.erb +0 -3
  218. data/app/views/spree/admin/option_types/index.html.erb +3 -42
  219. data/app/views/spree/admin/orders/_customer.html.erb +17 -21
  220. data/app/views/spree/admin/orders/_customer_returns.html.erb +4 -4
  221. data/app/views/spree/admin/orders/_filters.html.erb +49 -48
  222. data/app/views/spree/admin/orders/_form.html.erb +12 -0
  223. data/app/views/spree/admin/orders/_header.html.erb +2 -7
  224. data/app/views/spree/admin/orders/_line_item.html.erb +6 -11
  225. data/app/views/spree/admin/orders/_line_items.html.erb +39 -47
  226. data/app/views/spree/admin/orders/_list.html.erb +7 -7
  227. data/app/views/spree/admin/orders/_order.html.erb +1 -1
  228. data/app/views/spree/admin/orders/_payments.html.erb +2 -2
  229. data/app/views/spree/admin/orders/_refunds.html.erb +7 -9
  230. data/app/views/spree/admin/orders/_return_authorizations.html.erb +5 -5
  231. data/app/views/spree/admin/orders/_risk_analysis.html.erb +1 -1
  232. data/app/views/spree/admin/orders/_shipment.html.erb +7 -6
  233. data/app/views/spree/admin/orders/_shipment_manifest_item.html.erb +1 -1
  234. data/app/views/spree/admin/orders/_shipments.html.erb +1 -1
  235. data/app/views/spree/admin/orders/_summary.html.erb +14 -7
  236. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +6 -6
  237. data/app/views/spree/admin/orders/_tax_lines.html.erb +1 -1
  238. data/app/views/spree/admin/orders/billing_address/_form.html.erb +4 -2
  239. data/app/views/spree/admin/orders/billing_address/create.turbo_stream.erb +22 -24
  240. data/app/views/spree/admin/orders/billing_address/edit.html.erb +29 -31
  241. data/app/views/spree/admin/orders/billing_address/new.html.erb +22 -24
  242. data/app/views/spree/admin/orders/billing_address/update.turbo_stream.erb +22 -24
  243. data/app/views/spree/admin/orders/contact_information/edit.html.erb +10 -12
  244. data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +7 -12
  245. data/app/views/spree/admin/orders/customer_returns/_reimbursements_table.html.erb +5 -5
  246. data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +6 -6
  247. data/app/views/spree/admin/orders/customer_returns/_return_item_selection.html.erb +6 -6
  248. data/app/views/spree/admin/orders/customer_returns/new.html.erb +2 -6
  249. data/app/views/spree/admin/orders/index.html.erb +7 -3
  250. data/app/views/spree/admin/orders/new.html.erb +22 -0
  251. data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +14 -28
  252. data/app/views/spree/admin/orders/return_authorizations/_return_authorization.html.erb +1 -1
  253. data/app/views/spree/admin/orders/return_authorizations/show.html.erb +14 -14
  254. data/app/views/spree/admin/orders/shipping_address/_form.html.erb +4 -2
  255. data/app/views/spree/admin/orders/shipping_address/create.turbo_stream.erb +8 -10
  256. data/app/views/spree/admin/orders/shipping_address/edit.html.erb +8 -10
  257. data/app/views/spree/admin/orders/shipping_address/new.html.erb +8 -10
  258. data/app/views/spree/admin/orders/shipping_address/update.turbo_stream.erb +8 -10
  259. data/app/views/spree/admin/orders/user/edit.html.erb +1 -1
  260. data/app/views/spree/admin/orders/user/new.html.erb +1 -1
  261. data/app/views/spree/admin/page_blocks/edit.html.erb +6 -9
  262. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +4 -1
  263. data/app/views/spree/admin/page_blocks/forms/_metafields.html.erb +35 -0
  264. data/app/views/spree/admin/page_blocks/forms/products/_description.html.erb +0 -0
  265. data/app/views/spree/admin/page_builder/_add_block.html.erb +8 -6
  266. data/app/views/spree/admin/page_builder/_header.html.erb +29 -22
  267. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +6 -6
  268. data/app/views/spree/admin/page_builder/_sidebar.html.erb +5 -5
  269. data/app/views/spree/admin/page_builder/_sidebar_colors.html.erb +71 -69
  270. data/app/views/spree/admin/page_builder/_sidebar_fonts.html.erb +62 -61
  271. data/app/views/spree/admin/page_builder/_sidebar_section.html.erb +4 -6
  272. data/app/views/spree/admin/page_builder/_sidebar_sections.html.erb +12 -2
  273. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +59 -57
  274. data/app/views/spree/admin/page_links/_form.html.erb +3 -3
  275. data/app/views/spree/admin/page_links/_linkable_type_dropdown.html.erb +3 -3
  276. data/app/views/spree/admin/page_links/create.turbo_stream.erb +10 -4
  277. data/app/views/spree/admin/page_links/destroy.turbo_stream.erb +13 -9
  278. data/app/views/spree/admin/page_links/edit.html.erb +26 -13
  279. data/app/views/spree/admin/page_links/update.turbo_stream.erb +11 -5
  280. data/app/views/spree/admin/page_sections/edit.html.erb +5 -8
  281. data/app/views/spree/admin/page_sections/forms/_breadcrumbs.html.erb +0 -0
  282. data/app/views/spree/admin/page_sections/forms/_image_with_text.html.erb +2 -5
  283. data/app/views/spree/admin/pages/_form.html.erb +1 -4
  284. data/app/views/spree/admin/pages/_table_header.html.erb +6 -0
  285. data/app/views/spree/admin/pages/_table_row.html.erb +28 -0
  286. data/app/views/spree/admin/pages/edit.html.erb +9 -11
  287. data/app/views/spree/admin/pages/{_filters.html.erb → filters.html.erb} +1 -1
  288. data/app/views/spree/admin/pages/index.html.erb +1 -24
  289. data/app/views/spree/admin/pages/new.html.erb +1 -17
  290. data/app/views/spree/admin/payment_methods/_available_payment_method.html.erb +1 -1
  291. data/app/views/spree/admin/payment_methods/_form.html.erb +4 -24
  292. data/app/views/spree/admin/payment_methods/_payment_method.html.erb +5 -2
  293. data/app/views/spree/admin/payment_methods/index.html.erb +17 -19
  294. data/app/views/spree/admin/payments/_payment.html.erb +16 -16
  295. data/app/views/spree/admin/payments/source_views/_gateway.html.erb +3 -3
  296. data/app/views/spree/admin/payments/source_views/_storecredit.html.erb +7 -7
  297. data/app/views/spree/admin/policies/_filters.html.erb +8 -0
  298. data/app/views/spree/admin/policies/_form.html.erb +7 -0
  299. data/app/views/spree/admin/policies/_table_header.html.erb +8 -0
  300. data/app/views/spree/admin/policies/_table_row.html.erb +20 -0
  301. data/app/views/spree/admin/policies/edit.html.erb +2 -0
  302. data/app/views/spree/admin/policies/index.html.erb +9 -0
  303. data/app/views/spree/admin/policies/new.html.erb +1 -0
  304. data/app/views/spree/admin/policies/update.turbo_stream.erb +1 -0
  305. data/app/views/spree/admin/post_categories/_form.html.erb +2 -11
  306. data/app/views/spree/admin/post_categories/_table_header.html.erb +5 -0
  307. data/app/views/spree/admin/post_categories/{_post_category.html.erb → _table_row.html.erb} +3 -3
  308. data/app/views/spree/admin/post_categories/edit.html.erb +1 -14
  309. data/app/views/spree/admin/post_categories/index.html.erb +1 -20
  310. data/app/views/spree/admin/post_categories/new.html.erb +1 -14
  311. data/app/views/spree/admin/posts/_form.html.erb +19 -43
  312. data/app/views/spree/admin/posts/_table_header.html.erb +7 -0
  313. data/app/views/spree/admin/posts/{_post.html.erb → _table_row.html.erb} +2 -2
  314. data/app/views/spree/admin/posts/filters.html.erb +29 -0
  315. data/app/views/spree/admin/posts/index.html.erb +1 -24
  316. data/app/views/spree/admin/products/_bulk_operations.html.erb +6 -16
  317. data/app/views/spree/admin/products/_filters.html.erb +31 -38
  318. data/app/views/spree/admin/products/_form.html.erb +3 -2
  319. data/app/views/spree/admin/products/_list.html.erb +1 -1
  320. data/app/views/spree/admin/products/_product.html.erb +1 -1
  321. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +6 -6
  322. data/app/views/spree/admin/products/bulk_modal.html.erb +13 -15
  323. data/app/views/spree/admin/products/edit.html.erb +0 -1
  324. data/app/views/spree/admin/products/form/_base.html.erb +1 -5
  325. data/app/views/spree/admin/products/form/_properties.html.erb +2 -2
  326. data/app/views/spree/admin/products/form/_shipping.html.erb +1 -5
  327. data/app/views/spree/admin/products/form/_tax.html.erb +1 -5
  328. data/app/views/spree/admin/products/form/_variants.html.erb +1 -1
  329. data/app/views/spree/admin/products/index.html.erb +7 -2
  330. data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +7 -7
  331. data/app/views/spree/admin/promotion_actions/forms/_create_line_items.html.erb +4 -4
  332. data/app/views/spree/admin/promotion_actions/new.html.erb +29 -35
  333. data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +8 -8
  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 +11 -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 +1 -1
  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 +57 -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 +30 -1
  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/devise/devise_generator.rb +33 -0
  544. data/lib/generators/spree/admin/scaffold/scaffold_generator.rb +51 -0
  545. data/lib/generators/spree/admin/scaffold/templates/controller.rb.tt +11 -0
  546. data/lib/generators/spree/admin/scaffold/templates/views/_filters.html.erb.tt +13 -0
  547. data/lib/generators/spree/admin/scaffold/templates/views/_form.html.erb.tt +5 -0
  548. data/lib/generators/spree/admin/scaffold/templates/views/_table_header.html.erb.tt +5 -0
  549. data/lib/generators/spree/admin/scaffold/templates/views/_table_row.html.erb.tt +9 -0
  550. data/lib/generators/spree/admin/scaffold/templates/views/edit.html.erb.tt +1 -0
  551. data/lib/generators/spree/admin/scaffold/templates/views/index.html.erb.tt +9 -0
  552. data/lib/generators/spree/admin/scaffold/templates/views/new.html.erb.tt +1 -0
  553. data/lib/spree/admin/engine.rb +13 -9
  554. data/lib/spree/admin/runtime_configuration.rb +3 -0
  555. data/lib/spree/admin/testing_support/capybara_utils.rb +19 -0
  556. data/lib/spree/admin.rb +1 -3
  557. data/vendor/javascript/@codemirror--autocomplete.js +4 -0
  558. data/vendor/javascript/@codemirror--commands.js +4 -0
  559. data/vendor/javascript/@codemirror--lang-json.js +4 -0
  560. data/vendor/javascript/@codemirror--language.js +4 -0
  561. data/vendor/javascript/@codemirror--lint.js +4 -0
  562. data/vendor/javascript/@codemirror--search.js +4 -0
  563. data/vendor/javascript/@codemirror--state.js +4 -0
  564. data/vendor/javascript/@codemirror--view.js +4 -0
  565. data/vendor/javascript/@floating-ui--core.js +4 -0
  566. data/vendor/javascript/@floating-ui--dom.js +12 -0
  567. data/vendor/javascript/@floating-ui--utils--dom.js +4 -0
  568. data/vendor/javascript/@floating-ui--utils.js +4 -0
  569. data/vendor/javascript/@highlightjs--cdn-assets--es--core.min.js.js +308 -0
  570. data/vendor/javascript/@highlightjs--cdn-assets--es--languages--json.min.js.js +10 -0
  571. data/vendor/javascript/@lezer--common.js +4 -0
  572. data/vendor/javascript/@lezer--highlight.js +4 -0
  573. data/vendor/javascript/@lezer--json.js +4 -0
  574. data/vendor/javascript/@lezer--lr.js +4 -0
  575. data/vendor/javascript/@marijn--find-cluster-break.js +4 -0
  576. data/vendor/javascript/@stimulus-components--dialog.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/w3c-keyname.js +4 -0
  582. metadata +210 -69
  583. data/app/assets/stylesheets/spree/admin/plugins/flatfile.scss +0 -4
  584. data/app/helpers/spree/admin/session_assets_helper.rb +0 -24
  585. data/app/javascript/spree/admin/controllers/bootstrap_tabs_controller.js +0 -9
  586. data/app/javascript/spree/admin/controllers/enable_button_controller.js +0 -29
  587. data/app/views/spree/admin/coupon_codes/_coupon_code.html.erb +0 -8
  588. data/app/views/spree/admin/errors/forbidden.html.erb +0 -13
  589. data/app/views/spree/admin/gift_cards/index.csv.erb +0 -22
  590. data/app/views/spree/admin/orders/user/create.turbo_stream.erb +0 -12
  591. data/app/views/spree/admin/orders/user/update.turbo_stream.erb +0 -5
  592. data/app/views/spree/admin/pages/_page.html.erb +0 -26
  593. data/app/views/spree/admin/posts/_filters.html.erb +0 -36
  594. data/app/views/spree/admin/stores/create.turbo_stream.erb +0 -5
  595. data/app/views/spree/admin/translations/_translations_unavailable.html.erb +0 -8
  596. data/app/views/spree/admin/users/index.csv.erb +0 -43
  597. /data/app/views/spree/admin/page_blocks/forms/{_buy_buttons.html.erb → products/_buy_buttons.html.erb} +0 -0
  598. /data/app/views/spree/admin/page_blocks/forms/{_quantity_selector.html.erb → products/_quantity_selector.html.erb} +0 -0
@@ -1,21 +1,23 @@
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
- after_action :set_return_to, only: [:index]
8
7
 
9
8
  rescue_from ActiveRecord::RecordNotFound, with: :resource_not_found
10
9
 
10
+ # GET /admin/<resource_name>/new
11
11
  def new
12
12
  invoke_callbacks(:new_action, :before)
13
13
  end
14
14
 
15
+ # GET /admin/<resource_name_plural>/<id>/edit
15
16
  def edit
16
17
  invoke_callbacks(:edit_action, :before)
17
18
  end
18
19
 
20
+ # PUT /admin/<resource_name_plural>/<id>
19
21
  def update
20
22
  invoke_callbacks(:update, :before)
21
23
  if @object.update(permitted_resource_params)
@@ -47,6 +49,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
47
49
  end
48
50
  end
49
51
 
52
+ # POST /admin/<resource_name_plural>
50
53
  def create
51
54
  invoke_callbacks(:create, :before)
52
55
  set_created_by
@@ -77,6 +80,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
77
80
  end
78
81
  end
79
82
 
83
+ # DELETE /admin/<resource_name_plural>/<id>
80
84
  def destroy
81
85
  invoke_callbacks(:destroy, :before)
82
86
  if @object.destroy
@@ -131,6 +135,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
131
135
  redirect_to collection_url, status: :see_other
132
136
  end
133
137
 
138
+ # Returns the resource for the current controller
139
+ # @return [Spree::Admin::Resource]
134
140
  def resource
135
141
  return @resource if @resource
136
142
 
@@ -138,6 +144,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
138
144
  @resource = Spree::Admin::Resource.new controller_path, controller_name, parent_model_name, object_name
139
145
  end
140
146
 
147
+ # Loads the resource for the current controller
148
+ # @return [Spree::Admin::Resource]
141
149
  def load_resource
142
150
  if member_action?
143
151
  @object ||= load_resource_instance
@@ -207,6 +215,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
207
215
  end
208
216
  end
209
217
 
218
+ # Returns the collection of resources (as a scope)
219
+ # @return [ActiveRecord::Relation]
210
220
  def collection
211
221
  return parent.send(controller_name) if parent_data.present?
212
222
 
@@ -223,32 +233,66 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
223
233
  end
224
234
  end
225
235
 
236
+ # Returns the filtered and paginated ransack results
237
+ # @return [ActiveRecord::Relation]
238
+ def paginated_collection
239
+ @paginated_collection ||= begin
240
+ # Check if collection is already a ransack collection and return it
241
+ return collection if collection.respond_to?(:current_page)
242
+
243
+ search_collection.result(distinct: true).page(params[:page]).per(params[:per_page])
244
+ end
245
+ end
246
+
247
+ # Returns the ransack search collection
248
+ # @return [Ransack::Search]
249
+ def search_collection
250
+ @search_collection ||= begin
251
+ params[:q] ||= {}
252
+ collection.ransack(params[:q])
253
+ end
254
+ end
255
+
256
+ # Returns the URL to redirect to after destroying a resource
257
+ # @return [String]
226
258
  def location_after_destroy
227
259
  collection_url
228
260
  end
229
261
 
262
+ # Returns the URL to redirect to after creating a resource
263
+ # @return [String]
230
264
  def location_after_create
231
265
  location_after_save
232
266
  end
233
267
 
268
+ # Returns the URL to redirect to after saving a resource (update or create)
269
+ # @return [String]
234
270
  def location_after_save
235
271
  edit_object_url(@object)
236
272
  end
237
273
 
274
+ # Returns the flash message after creating a resource
275
+ # @return [String]
238
276
  def message_after_create
239
277
  flash_message_for(@object, :successfully_created)
240
278
  end
241
279
 
280
+ # Returns the flash message after updating a resource
281
+ # @return [String]
242
282
  def message_after_update
243
283
  flash_message_for(@object, :successfully_updated)
244
284
  end
245
285
 
286
+ # Sets the current store for the resource, if resource is store related
287
+ # @return [void]
246
288
  def set_current_store
247
289
  return if @object.nil?
248
290
 
249
291
  ensure_current_store(@object)
250
292
  end
251
293
 
294
+ # Sets the created_by with the current admin user for the resource, if resource is created_by related
295
+ # @return [void]
252
296
  def set_created_by
253
297
  return if @object.nil?
254
298
 
@@ -264,6 +308,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
264
308
 
265
309
  # URL helpers
266
310
 
311
+ # Returns the URL to redirect to after creating a resource
312
+ # @return [String]
267
313
  def new_object_url(options = {})
268
314
  if parent_data.present?
269
315
  spree.new_polymorphic_url([:admin, parent, model_class], options)
@@ -272,6 +318,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
272
318
  end
273
319
  end
274
320
 
321
+ # Returns the URL to edit a resource
322
+ # @return [String]
275
323
  def edit_object_url(object, options = {})
276
324
  if parent_data.present?
277
325
  spree.send "edit_admin_#{resource.model_name}_#{resource.object_name}_url",
@@ -281,6 +329,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
281
329
  end
282
330
  end
283
331
 
332
+ # Returns the URL to the resource
333
+ # @return [String]
284
334
  def object_url(object = nil, options = {})
285
335
  target = object || @object
286
336
  if parent_data.present?
@@ -290,6 +340,8 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
290
340
  end
291
341
  end
292
342
 
343
+ # Returns the URL to the collection of resources
344
+ # @return [String]
293
345
  def collection_url(options = {})
294
346
  if parent_data.present?
295
347
  spree.polymorphic_url([:admin, parent, model_class], options)
@@ -308,16 +360,22 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
308
360
  raise NotImplementedError, "You must implement the permitted_resource_params method"
309
361
  end
310
362
 
363
+ # Returns the actions that are collection actions
364
+ # @return [Array]
311
365
  def collection_actions
312
366
  [:index, :select_options, :bulk_modal, :bulk_status_update,
313
367
  :bulk_add_to_taxons, :bulk_remove_from_taxons,
314
368
  :bulk_add_tags, :bulk_remove_tags, :bulk_destroy]
315
369
  end
316
370
 
371
+ # Returns true if the current action is a member action
372
+ # @return [Boolean]
317
373
  def member_action?
318
374
  !collection_actions.include? action
319
375
  end
320
376
 
377
+ # Returns the actions that are new actions
378
+ # @return [Array]
321
379
  def new_actions
322
380
  [:new, :create]
323
381
  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,46 +1,24 @@
1
1
  module Spree
2
2
  module Admin
3
- class TranslationsController < Spree::Admin::BaseController
3
+ class TranslationsController < ResourceController
4
4
  # Set the resource being translated and any related data
5
- before_action :set_resource, only: [:edit, :update]
6
- before_action :load_data, only: [:edit]
7
- before_action :set_translation_locale, only: [:edit, :update]
8
-
5
+ before_action :load_data
6
+ before_action :set_translation_locale
9
7
  helper_method :normalized_locale
10
- helper_method :resource_class
11
-
12
- # GET /admin/translations/:id/edit
13
- # Renders the edit translation page for the resource
14
- def edit; end
15
8
 
16
9
  # Normalizes a locale string by replacing '-' with '_' and downcasing
17
10
  def normalized_locale(locale)
18
11
  locale.to_s.downcase.tr('-', '_')
19
12
  end
20
13
 
21
- # PUT /admin/translations/:id
22
- # Updates the translations for the resource
23
- # Sets flash messages for success or failure
24
- def update
25
- @resource.update!(permitted_translation_params)
26
-
27
- flash[:success] = Spree.t('notice_messages.translations_saved')
28
-
29
- redirect_to spree.edit_admin_translation_path(
30
- @resource,
31
- resource_type: @resource.class.to_s,
32
- translation_locale: @selected_translation_locale
33
- )
34
- end
35
-
36
14
  private
37
15
 
38
- def permitted_translation_params
39
- 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)
40
18
  end
41
19
 
42
20
  def nested_params
43
- case resource_class.to_s
21
+ case model_class.to_s
44
22
  when 'Spree::OptionType'
45
23
  { option_values_attributes: [ :id, *translation_fields(Spree::OptionValue)] }
46
24
  else
@@ -54,28 +32,19 @@ module Spree
54
32
  end
55
33
 
56
34
  # Determine the class of the resource
57
- def resource_class
58
- @resource_class ||= begin
35
+ def model_class
36
+ @model_class ||= begin
59
37
  klass = params[:resource_type]
60
- allowed_resource_class.find { |allowed_class| allowed_class.to_s == klass } ||
38
+ allowed_model_classes.find { |allowed_class| allowed_class.to_s == klass } ||
61
39
  raise(ActiveRecord::RecordNotFound, "Resource type not found")
62
40
  end
63
41
  end
64
42
 
65
43
  # Allowed translatable resources configured in Spree
66
- def allowed_resource_class
44
+ def allowed_model_classes
67
45
  Rails.application.config.spree.translatable_resources
68
46
  end
69
47
 
70
- # Set the resource object using friendly find if available
71
- def set_resource
72
- @resource = if resource_class.respond_to?(:friendly)
73
- resource_class.friendly.find(params[:id])
74
- else
75
- resource_class.find(params[:id])
76
- end
77
- end
78
-
79
48
  # Determine the translation locale to use
80
49
  def set_translation_locale
81
50
  raw_locale = params[:translation_locale].presence ||
@@ -89,24 +58,10 @@ module Spree
89
58
  # Load available locales for this resource, excluding default
90
59
  def load_data
91
60
  @locales = (current_store.supported_locales_list - [@default_locale]).sort
92
- @resource_name = @resource.try(:name)
61
+ end
93
62
 
94
- @back_path = case @resource.class.name
95
- when 'Spree::OptionType'
96
- spree.edit_admin_option_type_path(@resource)
97
- when 'Spree::Product'
98
- spree.edit_admin_product_path(@resource)
99
- when 'Spree::Property'
100
- spree.edit_admin_property_path(@resource)
101
- when 'Spree::Store'
102
- spree.edit_admin_store_path(section: "general-settings")
103
- when 'Spree::Taxon'
104
- spree.edit_admin_taxonomy_taxon_path(@resource.taxonomy, @resource.id)
105
- when 'Spree::Taxonomy'
106
- spree.admin_taxonomy_path(@resource)
107
- else
108
- [:edit, :admin, @resource]
109
- end
63
+ def update_turbo_stream_enabled?
64
+ true
110
65
  end
111
66
  end
112
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