spree_admin 5.2.5 → 5.3.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 (813) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -1
  3. data/app/assets/config/spree_admin_manifest.js +0 -1
  4. data/app/assets/tailwind/spree/admin/base/_animations.css +151 -0
  5. data/app/assets/tailwind/spree/admin/base/_base.css +69 -0
  6. data/app/assets/tailwind/spree/admin/base/_theme.css +62 -0
  7. data/app/assets/tailwind/spree/admin/base/_utilities.css +26 -0
  8. data/app/assets/tailwind/spree/admin/components/_alerts.css +53 -0
  9. data/app/assets/tailwind/spree/admin/components/_badges.css +124 -0
  10. data/app/assets/tailwind/spree/admin/components/_breadcrumbs.css +22 -0
  11. data/app/assets/tailwind/spree/admin/components/_bulk-editor.css +53 -0
  12. data/app/assets/tailwind/spree/admin/components/_bulk-panel.css +97 -0
  13. data/app/assets/tailwind/spree/admin/components/_buttons.css +114 -0
  14. data/app/assets/tailwind/spree/admin/components/_cards.css +240 -0
  15. data/app/assets/tailwind/spree/admin/components/_dialogs.css +279 -0
  16. data/app/assets/tailwind/spree/admin/components/_dropdowns.css +128 -0
  17. data/app/assets/tailwind/spree/admin/components/_filters.css +83 -0
  18. data/app/assets/tailwind/spree/admin/components/_forms.css +258 -0
  19. data/app/assets/tailwind/spree/admin/components/_layout.css +580 -0
  20. data/app/assets/tailwind/spree/admin/components/_line-items.css +28 -0
  21. data/app/assets/tailwind/spree/admin/components/_list-groups.css +57 -0
  22. data/app/assets/tailwind/spree/admin/components/_media-form.css +69 -0
  23. data/app/assets/tailwind/spree/admin/components/_misc.css +35 -0
  24. data/app/assets/tailwind/spree/admin/components/_navigation.css +41 -0
  25. data/app/assets/tailwind/spree/admin/components/_progress.css +14 -0
  26. data/app/assets/tailwind/spree/admin/components/_search-picker.css +36 -0
  27. data/app/assets/tailwind/spree/admin/components/_seo-form.css +21 -0
  28. data/app/assets/tailwind/spree/admin/components/_sortable-tree.css +61 -0
  29. data/app/assets/tailwind/spree/admin/components/_tables.css +195 -0
  30. data/app/assets/tailwind/spree/admin/components/_tooltips.css +15 -0
  31. data/app/assets/tailwind/spree/admin/components/_variants-form.css +150 -0
  32. data/app/assets/tailwind/spree/admin/index.css +73 -0
  33. data/app/assets/tailwind/spree/admin/plugins/_actiontext.css +35 -0
  34. data/app/assets/tailwind/spree/admin/plugins/_tinymce.css +79 -0
  35. data/app/assets/tailwind/spree/admin/plugins/_tom-select.css +299 -0
  36. data/app/assets/tailwind/spree/admin/plugins/_trix.css +100 -0
  37. data/app/assets/tailwind/spree/admin/plugins/_uppy.css +117 -0
  38. data/app/assets/tailwind/spree/admin/utilities/_bootstrap.css +158 -0
  39. data/app/assets/tailwind/spree/admin/views/_dashboard.css +30 -0
  40. data/app/assets/tailwind/spree/admin/views/_page-builder.css +214 -0
  41. data/app/controllers/concerns/spree/admin/bulk_operations_concern.rb +7 -0
  42. data/app/controllers/concerns/spree/admin/order_concern.rb +14 -0
  43. data/app/controllers/concerns/spree/admin/table_concern.rb +82 -0
  44. data/app/controllers/spree/admin/addresses_controller.rb +2 -2
  45. data/app/controllers/spree/admin/admin_users_controller.rb +11 -2
  46. data/app/controllers/spree/admin/bulk_operations_controller.rb +34 -0
  47. data/app/controllers/spree/admin/checkouts_controller.rb +15 -3
  48. data/app/controllers/spree/admin/classifications_controller.rb +1 -2
  49. data/app/controllers/spree/admin/countries_controller.rb +13 -0
  50. data/app/controllers/spree/admin/customer_group_users_controller.rb +77 -0
  51. data/app/controllers/spree/admin/customer_groups_controller.rb +44 -0
  52. data/app/controllers/spree/admin/gift_cards_controller.rb +1 -0
  53. data/app/controllers/spree/admin/line_items_controller.rb +5 -5
  54. data/app/controllers/spree/admin/option_values_controller.rb +1 -1
  55. data/app/controllers/spree/admin/orders/adjustments_controller.rb +120 -0
  56. data/app/controllers/spree/admin/orders/billing_address_controller.rb +2 -2
  57. data/app/controllers/spree/admin/orders/contact_information_controller.rb +1 -1
  58. data/app/controllers/spree/admin/orders/order_promotions_controller.rb +59 -0
  59. data/app/controllers/spree/admin/orders/shipping_address_controller.rb +2 -2
  60. data/app/controllers/spree/admin/orders/user_controller.rb +2 -2
  61. data/app/controllers/spree/admin/orders_controller.rb +29 -29
  62. data/app/controllers/spree/admin/post_categories_controller.rb +7 -1
  63. data/app/controllers/spree/admin/posts_controller.rb +3 -2
  64. data/app/controllers/spree/admin/price_list_products_controller.rb +49 -0
  65. data/app/controllers/spree/admin/price_lists_controller.rb +54 -0
  66. data/app/controllers/spree/admin/price_rules_controller.rb +52 -0
  67. data/app/controllers/spree/admin/products_controller.rb +13 -72
  68. data/app/controllers/spree/admin/promotion_rules_controller.rb +9 -1
  69. data/app/controllers/spree/admin/promotions_controller.rb +11 -23
  70. data/app/controllers/spree/admin/reports_controller.rb +2 -2
  71. data/app/controllers/spree/admin/resource_controller.rb +46 -5
  72. data/app/controllers/spree/admin/shipments_controller.rb +1 -1
  73. data/app/controllers/spree/admin/stock_items_controller.rb +2 -1
  74. data/app/controllers/spree/admin/stock_locations_controller.rb +9 -0
  75. data/app/controllers/spree/admin/table_columns_controller.rb +38 -0
  76. data/app/controllers/spree/admin/tags_controller.rb +32 -0
  77. data/app/controllers/spree/admin/users_controller.rb +57 -13
  78. data/app/controllers/spree/admin/variants_controller.rb +1 -1
  79. data/app/controllers/spree/admin/webhook_deliveries_controller.rb +20 -0
  80. data/app/controllers/spree/admin/webhook_endpoints_controller.rb +26 -0
  81. data/app/helpers/spree/admin/avatars_helper.rb +56 -0
  82. data/app/helpers/spree/admin/base_helper.rb +68 -47
  83. data/app/helpers/spree/admin/bulk_editor_helper.rb +41 -0
  84. data/app/helpers/spree/admin/bulk_operations_helper.rb +2 -2
  85. data/app/helpers/spree/admin/code_block_helper.rb +18 -0
  86. data/app/helpers/spree/admin/dialog_helper.rb +30 -0
  87. data/app/helpers/spree/admin/drawer_helper.rb +30 -0
  88. data/app/helpers/spree/admin/json_preview_helper.rb +18 -10
  89. data/app/helpers/spree/admin/modal_helper.rb +1 -1
  90. data/app/helpers/spree/admin/navigation_helper.rb +7 -7
  91. data/app/helpers/spree/admin/onboarding_helper.rb +3 -3
  92. data/app/helpers/spree/admin/orders_filters_helper.rb +18 -55
  93. data/app/helpers/spree/admin/orders_helper.rb +4 -0
  94. data/app/helpers/spree/admin/price_lists_helper.rb +20 -0
  95. data/app/helpers/spree/admin/products_helper.rb +4 -4
  96. data/app/helpers/spree/admin/promotions_helper.rb +1 -0
  97. data/app/helpers/spree/admin/stores_helper.rb +2 -2
  98. data/app/helpers/spree/admin/table_helper.rb +437 -0
  99. data/app/helpers/spree/admin/taxons_helper.rb +1 -1
  100. data/app/helpers/spree/admin/turbo_helper.rb +9 -3
  101. data/app/helpers/spree/admin/webhook_endpoints_helper.rb +95 -0
  102. data/app/helpers/tom_select_helper.rb +2 -2
  103. data/app/javascript/spree/admin/application.js +13 -1
  104. data/app/javascript/spree/admin/controllers/bulk_editor_controller.js +867 -0
  105. data/app/javascript/spree/admin/controllers/bulk_operation_controller.js +31 -5
  106. data/app/javascript/spree/admin/controllers/column_selector_controller.js +35 -0
  107. data/app/javascript/spree/admin/controllers/dropdown_controller.js +20 -2
  108. data/app/javascript/spree/admin/controllers/font_picker_controller.js +1 -1
  109. data/app/javascript/spree/admin/controllers/media_form_controller.js +3 -3
  110. data/app/javascript/spree/admin/controllers/money_field_controller.js +150 -0
  111. data/app/javascript/spree/admin/controllers/order_billing_address_controller.js +2 -2
  112. data/app/javascript/spree/admin/controllers/product_form_controller.js +6 -6
  113. data/app/javascript/spree/admin/controllers/query_builder_controller.js +618 -0
  114. data/app/javascript/spree/admin/controllers/replace_controller.js +4 -4
  115. data/app/javascript/spree/admin/controllers/search_clear_controller.js +22 -0
  116. data/app/javascript/spree/admin/controllers/select_controller.js +9 -3
  117. data/app/javascript/spree/admin/controllers/seo_form_controller.js +5 -5
  118. data/app/javascript/spree/admin/controllers/sidebar_controller.js +2 -2
  119. data/app/javascript/spree/admin/controllers/sticky_controller.js +6 -2
  120. data/app/javascript/spree/admin/controllers/table_controller.js +20 -0
  121. data/app/javascript/spree/admin/controllers/variants_form_controller.js +142 -28
  122. data/app/javascript/spree/admin/helpers/trix/video_embed.js +5 -5
  123. data/app/javascript/spree/admin/helpers/turbo_confirm.js +38 -0
  124. data/app/models/spree/admin/form_builder.rb +141 -45
  125. data/app/models/spree/admin/table/builder.rb +55 -0
  126. data/app/models/spree/admin/table/bulk_action.rb +95 -0
  127. data/app/models/spree/admin/table/column.rb +111 -0
  128. data/app/models/spree/admin/table/filter.rb +116 -0
  129. data/app/models/spree/admin/table/filter_group.rb +144 -0
  130. data/app/models/spree/admin/table/query_builder.rb +114 -0
  131. data/app/models/spree/admin/table/visibility.rb +20 -0
  132. data/app/models/spree/admin/table.rb +313 -0
  133. data/app/presenters/spree/admin/order_summary_presenter.rb +190 -0
  134. data/app/subscribers/spree/admin/import_row_subscriber.rb +68 -0
  135. data/app/subscribers/spree/admin/import_subscriber.rb +35 -0
  136. data/app/views/active_storage/_upload_form.html.erb +11 -8
  137. data/app/views/layouts/spree/admin.html.erb +5 -5
  138. data/app/views/layouts/spree/admin_settings.html.erb +5 -6
  139. data/app/views/layouts/spree/admin_wizard.html.erb +6 -6
  140. data/app/views/layouts/spree/minimal.html.erb +10 -10
  141. data/app/views/spree/admin/admin_users/_admin_user.html.erb +6 -6
  142. data/app/views/spree/admin/admin_users/_audit_log.html.erb +1 -1
  143. data/app/views/spree/admin/admin_users/edit.html.erb +1 -1
  144. data/app/views/spree/admin/admin_users/index.html.erb +2 -2
  145. data/app/views/spree/admin/admin_users/new.html.erb +3 -3
  146. data/app/views/spree/admin/admin_users/show.html.erb +16 -16
  147. data/app/views/spree/admin/bulk_operations/forms/_confirmation.html.erb +1 -0
  148. data/app/views/spree/admin/bulk_operations/forms/_tag_picker.html.erb +8 -0
  149. data/app/views/spree/admin/bulk_operations/forms/_taxon_picker.html.erb +5 -0
  150. data/app/views/spree/admin/bulk_operations/new.html.erb +16 -0
  151. data/app/views/spree/admin/checkouts/index.html.erb +9 -0
  152. data/app/views/spree/admin/classifications/_classification.html.erb +9 -9
  153. data/app/views/spree/admin/classifications/create.turbo_stream.erb +1 -1
  154. data/app/views/spree/admin/classifications/destroy.turbo_stream.erb +1 -1
  155. data/app/views/spree/admin/classifications/index.html.erb +1 -1
  156. data/app/views/spree/admin/coupon_codes/_filters.html.erb +3 -3
  157. data/app/views/spree/admin/coupon_codes/_table_row.html.erb +3 -3
  158. data/app/views/spree/admin/coupon_codes/index.html.erb +3 -3
  159. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +1 -1
  160. data/app/views/spree/admin/custom_domains/_form.html.erb +1 -1
  161. data/app/views/spree/admin/custom_domains/index.html.erb +20 -20
  162. data/app/views/spree/admin/customer_group_users/bulk_create.turbo_stream.erb +15 -0
  163. data/app/views/spree/admin/customer_group_users/bulk_destroy.turbo_stream.erb +17 -0
  164. data/app/views/spree/admin/customer_group_users/bulk_new.html.erb +27 -0
  165. data/app/views/spree/admin/customer_group_users/index.html.erb +1 -0
  166. data/app/views/spree/admin/customer_groups/_customers_header.html.erb +12 -0
  167. data/app/views/spree/admin/customer_groups/_details.html.erb +59 -0
  168. data/app/views/spree/admin/customer_groups/_form.html.erb +6 -0
  169. data/app/views/spree/admin/customer_groups/edit.html.erb +1 -0
  170. data/app/views/spree/admin/customer_groups/index.html.erb +9 -0
  171. data/app/views/spree/admin/customer_groups/show.html.erb +19 -0
  172. data/app/views/spree/admin/customer_groups/update.turbo_stream.erb +17 -0
  173. data/app/views/spree/admin/customer_returns/_table_row.html.erb +1 -1
  174. data/app/views/spree/admin/customer_returns/index.html.erb +1 -1
  175. data/app/views/spree/admin/dashboard/_setup_progress.html.erb +3 -3
  176. data/app/views/spree/admin/dashboard/_setup_tasks.html.erb +16 -10
  177. data/app/views/spree/admin/dashboard/_sidebar.html.erb +1 -2
  178. data/app/views/spree/admin/dashboard/_top_products.html.erb +10 -10
  179. data/app/views/spree/admin/dashboard/_updater.html.erb +1 -1
  180. data/app/views/spree/admin/dashboard/_visits.html.erb +22 -22
  181. data/app/views/spree/admin/dashboard/analytics.html.erb +28 -28
  182. data/app/views/spree/admin/dashboard/getting_started.html.erb +3 -3
  183. data/app/views/spree/admin/dashboard/setup_tasks/_add_products.html.erb +1 -1
  184. data/app/views/spree/admin/dashboard/setup_tasks/_set_customer_support_email.html.erb +4 -6
  185. data/app/views/spree/admin/dashboard/setup_tasks/_setup_payment_method.html.erb +7 -3
  186. data/app/views/spree/admin/dashboard/setup_tasks/_setup_taxes_collection.html.erb +4 -2
  187. data/app/views/spree/admin/dashboard/show.html.erb +8 -8
  188. data/app/views/spree/admin/digital_assets/_form.html.erb +2 -2
  189. data/app/views/spree/admin/digital_assets/_table.html.erb +2 -2
  190. data/app/views/spree/admin/errors/403.html.erb +2 -2
  191. data/app/views/spree/admin/errors/404.html.erb +2 -2
  192. data/app/views/spree/admin/errors/422.html.erb +2 -2
  193. data/app/views/spree/admin/errors/500.html.erb +2 -2
  194. data/app/views/spree/admin/errors/503.html.erb +2 -2
  195. data/app/views/spree/admin/exports/_export.html.erb +1 -1
  196. data/app/views/spree/admin/exports/new.html.erb +7 -9
  197. data/app/views/spree/admin/gift_card_batches/_form.html.erb +3 -3
  198. data/app/views/spree/admin/gift_cards/_filters.html.erb +6 -6
  199. data/app/views/spree/admin/gift_cards/_form.html.erb +3 -3
  200. data/app/views/spree/admin/gift_cards/_gift_card.html.erb +4 -4
  201. data/app/views/spree/admin/gift_cards/_list.html.erb +1 -1
  202. data/app/views/spree/admin/gift_cards/_table_filter_dropdown.html.erb +1 -1
  203. data/app/views/spree/admin/gift_cards/edit.html.erb +2 -2
  204. data/app/views/spree/admin/gift_cards/index.html.erb +21 -36
  205. data/app/views/spree/admin/gift_cards/show.html.erb +32 -32
  206. data/app/views/spree/admin/import_rows/show.html.erb +8 -8
  207. data/app/views/spree/admin/imports/_footer.html.erb +2 -2
  208. data/app/views/spree/admin/imports/_loader.html.erb +7 -7
  209. data/app/views/spree/admin/imports/_mapping.html.erb +3 -3
  210. data/app/views/spree/admin/imports/_mapping_footer.html.erb +4 -4
  211. data/app/views/spree/admin/imports/_mapping_icon.html.erb +1 -1
  212. data/app/views/spree/admin/imports/_row.html.erb +6 -6
  213. data/app/views/spree/admin/imports/new.html.erb +1 -1
  214. data/app/views/spree/admin/imports/show.html.erb +7 -7
  215. data/app/views/spree/admin/integrations/_integration.html.erb +6 -6
  216. data/app/views/spree/admin/integrations/edit.html.erb +6 -2
  217. data/app/views/spree/admin/integrations/index.html.erb +9 -9
  218. data/app/views/spree/admin/integrations/new.html.erb +2 -2
  219. data/app/views/spree/admin/invitations/_invitation.html.erb +3 -3
  220. data/app/views/spree/admin/invitations/index.html.erb +2 -2
  221. data/app/views/spree/admin/invitations/show.html.erb +2 -2
  222. data/app/views/spree/admin/json_previews/show.html.erb +8 -8
  223. data/app/views/spree/admin/line_items/edit.html.erb +4 -4
  224. data/app/views/spree/admin/line_items/new.html.erb +4 -4
  225. data/app/views/spree/admin/metafield_definitions/_filters.html.erb +2 -2
  226. data/app/views/spree/admin/metafield_definitions/_form.html.erb +6 -6
  227. data/app/views/spree/admin/metafield_definitions/_table_row.html.erb +2 -2
  228. data/app/views/spree/admin/metafield_definitions/index.html.erb +1 -1
  229. data/app/views/spree/admin/metafields/edit.html.erb +6 -6
  230. data/app/views/spree/admin/metafields/types/_boolean.html.erb +1 -1
  231. data/app/views/spree/admin/metafields/types/_json.html.erb +1 -1
  232. data/app/views/spree/admin/metafields/types/_long_text.html.erb +1 -1
  233. data/app/views/spree/admin/metafields/types/_number.html.erb +1 -1
  234. data/app/views/spree/admin/metafields/types/_short_text.html.erb +1 -1
  235. data/app/views/spree/admin/newsletter_subscribers/_filters.html.erb +2 -2
  236. data/app/views/spree/admin/newsletter_subscribers/_table_row.html.erb +3 -3
  237. data/app/views/spree/admin/newsletter_subscribers/index.html.erb +1 -1
  238. data/app/views/spree/admin/oauth_applications/_form.html.erb +1 -1
  239. data/app/views/spree/admin/oauth_applications/_table_row.html.erb +3 -3
  240. data/app/views/spree/admin/oauth_applications/create.turbo_stream.erb +8 -8
  241. data/app/views/spree/admin/oauth_applications/index.html.erb +2 -2
  242. data/app/views/spree/admin/option_types/_form.html.erb +10 -10
  243. data/app/views/spree/admin/option_types/_option_value_fields.html.erb +3 -3
  244. data/app/views/spree/admin/option_types/_table_row.html.erb +2 -2
  245. data/app/views/spree/admin/option_types/edit.html.erb +1 -12
  246. data/app/views/spree/admin/option_types/index.html.erb +1 -1
  247. data/app/views/spree/admin/option_types/new.html.erb +1 -11
  248. data/app/views/spree/admin/orders/_adjustment.html.erb +72 -0
  249. data/app/views/spree/admin/orders/_adjustments.html.erb +41 -0
  250. data/app/views/spree/admin/orders/_customer.html.erb +13 -13
  251. data/app/views/spree/admin/orders/_customer_returns.html.erb +3 -3
  252. data/app/views/spree/admin/orders/_customer_summary.html.erb +4 -4
  253. data/app/views/spree/admin/orders/_filters.html.erb +9 -9
  254. data/app/views/spree/admin/orders/_form.html.erb +1 -1
  255. data/app/views/spree/admin/orders/_header.html.erb +2 -2
  256. data/app/views/spree/admin/orders/_line_item.html.erb +2 -2
  257. data/app/views/spree/admin/orders/_line_items.html.erb +43 -36
  258. data/app/views/spree/admin/orders/_order.html.erb +2 -2
  259. data/app/views/spree/admin/orders/_order_promotion.html.erb +32 -0
  260. data/app/views/spree/admin/orders/_payments.html.erb +8 -8
  261. data/app/views/spree/admin/orders/_promotions.html.erb +37 -0
  262. data/app/views/spree/admin/orders/_refunds.html.erb +5 -5
  263. data/app/views/spree/admin/orders/_return_authorizations.html.erb +3 -3
  264. data/app/views/spree/admin/orders/_risk_analysis.html.erb +3 -3
  265. data/app/views/spree/admin/orders/_shipment.html.erb +15 -15
  266. data/app/views/spree/admin/orders/_shipment_manifest_item.html.erb +5 -5
  267. data/app/views/spree/admin/orders/_shipments.html.erb +6 -6
  268. data/app/views/spree/admin/orders/_special_instructions.html.erb +1 -1
  269. data/app/views/spree/admin/orders/_summary.html.erb +21 -95
  270. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +2 -2
  271. data/app/views/spree/admin/orders/_tax_lines.html.erb +2 -2
  272. data/app/views/spree/admin/orders/_tax_rates.html.erb +86 -0
  273. data/app/views/spree/admin/orders/_user_overview.html.erb +2 -2
  274. data/app/views/spree/admin/orders/adjustments/_form.html.erb +6 -0
  275. data/app/views/spree/admin/orders/adjustments/create.turbo_stream.erb +10 -0
  276. data/app/views/spree/admin/orders/adjustments/destroy.turbo_stream.erb +9 -0
  277. data/app/views/spree/admin/orders/adjustments/edit.html.erb +13 -0
  278. data/app/views/spree/admin/orders/adjustments/new.html.erb +15 -0
  279. data/app/views/spree/admin/orders/adjustments/toggle_state.turbo_stream.erb +9 -0
  280. data/app/views/spree/admin/orders/adjustments/update.turbo_stream.erb +10 -0
  281. data/app/views/spree/admin/orders/billing_address/_form.html.erb +3 -3
  282. data/app/views/spree/admin/orders/billing_address/create.turbo_stream.erb +7 -7
  283. data/app/views/spree/admin/orders/billing_address/edit.html.erb +9 -9
  284. data/app/views/spree/admin/orders/billing_address/new.html.erb +7 -7
  285. data/app/views/spree/admin/orders/billing_address/update.turbo_stream.erb +7 -7
  286. data/app/views/spree/admin/orders/contact_information/edit.html.erb +1 -1
  287. data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +1 -1
  288. data/app/views/spree/admin/orders/customer_returns/_reimbursements_table.html.erb +1 -1
  289. data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +1 -1
  290. data/app/views/spree/admin/orders/customer_returns/_return_item_selection.html.erb +4 -4
  291. data/app/views/spree/admin/orders/customer_returns/edit.html.erb +12 -12
  292. data/app/views/spree/admin/orders/customer_returns/new.html.erb +6 -6
  293. data/app/views/spree/admin/orders/index.html.erb +4 -21
  294. data/app/views/spree/admin/orders/new.html.erb +3 -3
  295. data/app/views/spree/admin/orders/order_promotions/create.turbo_stream.erb +16 -0
  296. data/app/views/spree/admin/orders/order_promotions/destroy.turbo_stream.erb +15 -0
  297. data/app/views/spree/admin/orders/order_promotions/new.html.erb +15 -0
  298. data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +7 -7
  299. data/app/views/spree/admin/orders/return_authorizations/_return_authorization.html.erb +1 -1
  300. data/app/views/spree/admin/orders/return_authorizations/edit.html.erb +2 -2
  301. data/app/views/spree/admin/orders/return_authorizations/show.html.erb +8 -8
  302. data/app/views/spree/admin/orders/shipping_address/_form.html.erb +2 -2
  303. data/app/views/spree/admin/orders/shipping_address/create.turbo_stream.erb +1 -1
  304. data/app/views/spree/admin/orders/shipping_address/edit.html.erb +1 -1
  305. data/app/views/spree/admin/orders/shipping_address/new.html.erb +1 -1
  306. data/app/views/spree/admin/orders/shipping_address/update.turbo_stream.erb +1 -1
  307. data/app/views/spree/admin/orders/show.html.erb +24 -0
  308. data/app/views/spree/admin/orders/update.turbo_stream.erb +5 -0
  309. data/app/views/spree/admin/orders/user/new.html.erb +7 -7
  310. data/app/views/spree/admin/payment_methods/_available_payment_method.html.erb +3 -3
  311. data/app/views/spree/admin/payment_methods/_form.html.erb +3 -3
  312. data/app/views/spree/admin/payment_methods/_payment_method.html.erb +8 -8
  313. data/app/views/spree/admin/payment_methods/edit.html.erb +2 -2
  314. data/app/views/spree/admin/payment_methods/index.html.erb +3 -3
  315. data/app/views/spree/admin/payment_methods/new.html.erb +2 -2
  316. data/app/views/spree/admin/payments/_payment.html.erb +17 -17
  317. data/app/views/spree/admin/payments/new.html.erb +13 -23
  318. data/app/views/spree/admin/payments/source_forms/_gateway.html.erb +10 -10
  319. data/app/views/spree/admin/payments/source_forms/_previous_cards.html.erb +4 -4
  320. data/app/views/spree/admin/payments/source_forms/_spree_stripe.html.erb +1 -1
  321. data/app/views/spree/admin/payments/source_forms/_store_credit.html.erb +5 -5
  322. data/app/views/spree/admin/payments/source_views/_gateway.html.erb +1 -1
  323. data/app/views/spree/admin/payments/source_views/_storecredit.html.erb +1 -1
  324. data/app/views/spree/admin/policies/_filters.html.erb +1 -1
  325. data/app/views/spree/admin/policies/_form.html.erb +1 -1
  326. data/app/views/spree/admin/policies/_table_row.html.erb +2 -2
  327. data/app/views/spree/admin/policies/index.html.erb +1 -1
  328. data/app/views/spree/admin/post_categories/_form.html.erb +1 -1
  329. data/app/views/spree/admin/post_categories/_table_row.html.erb +1 -1
  330. data/app/views/spree/admin/post_categories/index.html.erb +1 -1
  331. data/app/views/spree/admin/posts/_form.html.erb +7 -7
  332. data/app/views/spree/admin/posts/_table_row.html.erb +1 -1
  333. data/app/views/spree/admin/posts/edit.html.erb +1 -11
  334. data/app/views/spree/admin/posts/filters.html.erb +4 -4
  335. data/app/views/spree/admin/posts/index.html.erb +1 -1
  336. data/app/views/spree/admin/posts/new.html.erb +1 -11
  337. data/app/views/spree/admin/preferences/_password_field.html.erb +14 -14
  338. data/app/views/spree/admin/price_list_products/bulk_create.turbo_stream.erb +11 -0
  339. data/app/views/spree/admin/price_list_products/bulk_destroy.turbo_stream.erb +13 -0
  340. data/app/views/spree/admin/price_list_products/bulk_new.html.erb +29 -0
  341. data/app/views/spree/admin/price_list_products/index.html.erb +1 -0
  342. data/app/views/spree/admin/price_lists/_details.html.erb +75 -0
  343. data/app/views/spree/admin/price_lists/_form.html.erb +8 -0
  344. data/app/views/spree/admin/price_lists/_products_header.html.erb +18 -0
  345. data/app/views/spree/admin/price_lists/_rules.html.erb +32 -0
  346. data/app/views/spree/admin/price_lists/_table_header.html.erb +7 -0
  347. data/app/views/spree/admin/price_lists/edit.html.erb +1 -0
  348. data/app/views/spree/admin/price_lists/edit_prices.html.erb +138 -0
  349. data/app/views/spree/admin/price_lists/index.html.erb +12 -0
  350. data/app/views/spree/admin/price_lists/new.html.erb +1 -0
  351. data/app/views/spree/admin/price_lists/show.html.erb +46 -0
  352. data/app/views/spree/admin/price_lists/update.turbo_stream.erb +17 -0
  353. data/app/views/spree/admin/price_rules/_price_rule.html.erb +28 -0
  354. data/app/views/spree/admin/price_rules/edit.html.erb +20 -0
  355. data/app/views/spree/admin/price_rules/forms/_customer_group_rule.html.erb +9 -0
  356. data/app/views/spree/admin/price_rules/forms/_user_rule.html.erb +7 -0
  357. data/app/views/spree/admin/price_rules/forms/_volume_rule.html.erb +11 -0
  358. data/app/views/spree/admin/price_rules/forms/_zone_rule.html.erb +7 -0
  359. data/app/views/spree/admin/price_rules/new.html.erb +36 -0
  360. data/app/views/spree/admin/products/_filters.html.erb +5 -5
  361. data/app/views/spree/admin/products/_form.html.erb +3 -3
  362. data/app/views/spree/admin/products/_product.html.erb +5 -5
  363. data/app/views/spree/admin/products/_search_result.html.erb +2 -2
  364. data/app/views/spree/admin/products/_search_results.html.erb +1 -1
  365. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +1 -1
  366. data/app/views/spree/admin/products/form/_base.html.erb +2 -2
  367. data/app/views/spree/admin/products/form/_categorization.html.erb +3 -3
  368. data/app/views/spree/admin/products/form/_inventory.html.erb +17 -32
  369. data/app/views/spree/admin/products/form/_properties.html.erb +7 -7
  370. data/app/views/spree/admin/products/form/_shipping.html.erb +1 -1
  371. data/app/views/spree/admin/products/form/_status.html.erb +7 -7
  372. data/app/views/spree/admin/products/form/_stores.html.erb +2 -2
  373. data/app/views/spree/admin/products/form/_tax.html.erb +1 -1
  374. data/app/views/spree/admin/products/form/_variants.html.erb +31 -21
  375. data/app/views/spree/admin/products/form/variants/_option_template.html.erb +8 -8
  376. data/app/views/spree/admin/products/form/variants/_variant_template.html.erb +9 -9
  377. data/app/views/spree/admin/products/index.html.erb +1 -14
  378. data/app/views/spree/admin/profile/edit.html.erb +3 -3
  379. data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +5 -5
  380. data/app/views/spree/admin/promotion_actions/edit.html.erb +3 -3
  381. data/app/views/spree/admin/promotion_actions/forms/_create_line_items.html.erb +1 -1
  382. data/app/views/spree/admin/promotion_actions/forms/_create_line_items_row.html.erb +2 -2
  383. data/app/views/spree/admin/promotion_actions/new.html.erb +4 -5
  384. data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +14 -14
  385. data/app/views/spree/admin/promotion_rules/edit.html.erb +6 -3
  386. data/app/views/spree/admin/promotion_rules/forms/_customer_group.html.erb +9 -0
  387. data/app/views/spree/admin/promotion_rules/forms/_item_total.html.erb +12 -12
  388. data/app/views/spree/admin/promotion_rules/forms/_option_value.html.erb +1 -1
  389. data/app/views/spree/admin/promotion_rules/new.html.erb +7 -8
  390. data/app/views/spree/admin/promotions/_actions.html.erb +6 -6
  391. data/app/views/spree/admin/promotions/_filters.html.erb +5 -5
  392. data/app/views/spree/admin/promotions/_form.html.erb +3 -3
  393. data/app/views/spree/admin/promotions/_rules.html.erb +12 -19
  394. data/app/views/spree/admin/promotions/_sidebar.html.erb +25 -25
  395. data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +1 -1
  396. data/app/views/spree/admin/promotions/_table_row.html.erb +4 -4
  397. data/app/views/spree/admin/promotions/edit.html.erb +6 -6
  398. data/app/views/spree/admin/promotions/form/_kind.html.erb +13 -13
  399. data/app/views/spree/admin/promotions/index.html.erb +1 -1
  400. data/app/views/spree/admin/promotions/show.html.erb +3 -3
  401. data/app/views/spree/admin/properties/_form.html.erb +1 -1
  402. data/app/views/spree/admin/properties/_table_row.html.erb +3 -3
  403. data/app/views/spree/admin/refunds/_form.html.erb +1 -1
  404. data/app/views/spree/admin/refunds/new.html.erb +5 -5
  405. data/app/views/spree/admin/reimbursement_types/_form.html.erb +1 -1
  406. data/app/views/spree/admin/reimbursements/edit.html.erb +7 -7
  407. data/app/views/spree/admin/reimbursements/show.html.erb +3 -3
  408. data/app/views/spree/admin/reports/new.html.erb +5 -6
  409. data/app/views/spree/admin/return_authorizations/_table_row.html.erb +2 -2
  410. data/app/views/spree/admin/return_authorizations/filters.html.erb +2 -2
  411. data/app/views/spree/admin/roles/_form.html.erb +1 -1
  412. data/app/views/spree/admin/shared/_alerts.html.erb +5 -5
  413. data/app/views/spree/admin/shared/_analytics_loader_skeleton.html.erb +24 -28
  414. data/app/views/spree/admin/shared/_back_to_dashboard.html.erb +1 -1
  415. data/app/views/spree/admin/shared/_breadcrumbs.html.erb +2 -2
  416. data/app/views/spree/admin/shared/_bulk_modal.html.erb +8 -9
  417. data/app/views/spree/admin/shared/_calculator_fields.html.erb +2 -2
  418. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +4 -4
  419. data/app/views/spree/admin/shared/_content_header.html.erb +6 -6
  420. data/app/views/spree/admin/shared/_dialog.html.erb +2 -2
  421. data/app/views/spree/admin/shared/_drawer.html.erb +2 -2
  422. data/app/views/spree/admin/shared/_edit_resource.html.erb +2 -2
  423. data/app/views/spree/admin/shared/_edit_resource_in_drawer.html.erb +13 -0
  424. data/app/views/spree/admin/shared/_error_messages.html.erb +1 -1
  425. data/app/views/spree/admin/shared/_export_modal.html.erb +2 -2
  426. data/app/views/spree/admin/shared/_filter_badge_template.erb +1 -1
  427. data/app/views/spree/admin/shared/_filters_button.html.erb +1 -1
  428. data/app/views/spree/admin/shared/_filters_search_bar.html.erb +3 -10
  429. data/app/views/spree/admin/shared/_footer.html.erb +1 -1
  430. data/app/views/spree/admin/shared/_growth_rate_badge.html.erb +4 -4
  431. data/app/views/spree/admin/shared/_head.html.erb +5 -13
  432. data/app/views/spree/admin/shared/_header.html.erb +10 -22
  433. data/app/views/spree/admin/shared/_index_table_options.html.erb +26 -11
  434. data/app/views/spree/admin/shared/_internal_note.html.erb +41 -0
  435. data/app/views/spree/admin/shared/_map.html.erb +1 -1
  436. data/app/views/spree/admin/shared/_media_asset.html.erb +3 -3
  437. data/app/views/spree/admin/shared/_media_form.html.erb +4 -4
  438. data/app/views/spree/admin/shared/_modal.html.erb +4 -8
  439. data/app/views/spree/admin/shared/_multi_product_picker.html.erb +3 -3
  440. data/app/views/spree/admin/shared/_navigation.html.erb +2 -4
  441. data/app/views/spree/admin/shared/_navigation_item.html.erb +6 -10
  442. data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +1 -1
  443. data/app/views/spree/admin/shared/_new_resource.html.erb +2 -2
  444. data/app/views/spree/admin/shared/_no_image.html.erb +2 -2
  445. data/app/views/spree/admin/shared/_no_resource_found.html.erb +3 -3
  446. data/app/views/spree/admin/shared/_page_alerts.html.erb +1 -1
  447. data/app/views/spree/admin/shared/_page_tabs.html.erb +1 -1
  448. data/app/views/spree/admin/shared/_preferences.html.erb +3 -3
  449. data/app/views/spree/admin/shared/_product_image.html.erb +2 -2
  450. data/app/views/spree/admin/shared/_refunds.html.erb +1 -1
  451. data/app/views/spree/admin/shared/_seo.html.erb +10 -10
  452. data/app/views/spree/admin/shared/_sidebar.html.erb +20 -3
  453. data/app/views/spree/admin/shared/_spinner.html.erb +3 -2
  454. data/app/views/spree/admin/shared/_turbo_confirm_dialog.html.erb +23 -0
  455. data/app/views/spree/admin/shared/_user.html.erb +5 -5
  456. data/app/views/spree/admin/shared/_user_dropdown.html.erb +5 -5
  457. data/app/views/spree/admin/shared/devise/_links.html.erb +3 -3
  458. data/app/views/spree/admin/shared/named_types/_form.html.erb +1 -1
  459. data/app/views/spree/admin/shared/sidebar/_customers_nav.html.erb +2 -2
  460. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +2 -2
  461. data/app/views/spree/admin/shared/sidebar/_orders_nav.html.erb +1 -1
  462. data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +2 -2
  463. data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +2 -2
  464. data/app/views/spree/admin/shared/sidebar/_returns_nav.html.erb +1 -1
  465. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +7 -7
  466. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +7 -7
  467. data/app/views/spree/admin/shared/sidebar/_storefront_nav.html.erb +2 -2
  468. data/app/views/spree/admin/shared/sidebar/_vendors_nav.html.erb +2 -2
  469. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +13 -13
  470. data/app/views/spree/admin/shipments/edit.html.erb +12 -12
  471. data/app/views/spree/admin/shipments/split.html.erb +6 -6
  472. data/app/views/spree/admin/shipping_categories/_form.html.erb +1 -1
  473. data/app/views/spree/admin/shipping_categories/_table_row.html.erb +1 -1
  474. data/app/views/spree/admin/shipping_methods/_form.html.erb +3 -3
  475. data/app/views/spree/admin/shipping_methods/_table_row.html.erb +2 -2
  476. data/app/views/spree/admin/shipping_methods/form/_display.html.erb +7 -44
  477. data/app/views/spree/admin/shipping_methods/form/_estimated_transit_business_days.html.erb +4 -10
  478. data/app/views/spree/admin/shipping_methods/form/_shipping_categories.html.erb +2 -2
  479. data/app/views/spree/admin/shipping_methods/form/_tax_category.html.erb +2 -2
  480. data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +2 -2
  481. data/app/views/spree/admin/shipping_methods/form/_zones.html.erb +7 -7
  482. data/app/views/spree/admin/stock_items/_filters.html.erb +5 -5
  483. data/app/views/spree/admin/stock_items/_table_row.html.erb +5 -5
  484. data/app/views/spree/admin/stock_items/index.html.erb +1 -1
  485. data/app/views/spree/admin/stock_locations/_form.html.erb +2 -2
  486. data/app/views/spree/admin/stock_locations/_table_row.html.erb +2 -2
  487. data/app/views/spree/admin/stock_transfers/_destination_movement_form.html.erb +7 -7
  488. data/app/views/spree/admin/stock_transfers/_filters.html.erb +5 -5
  489. data/app/views/spree/admin/stock_transfers/_new_variant_modal.html.erb +4 -4
  490. data/app/views/spree/admin/stock_transfers/_table_row.html.erb +2 -2
  491. data/app/views/spree/admin/stock_transfers/index.html.erb +1 -1
  492. data/app/views/spree/admin/stock_transfers/new.html.erb +9 -9
  493. data/app/views/spree/admin/stock_transfers/show.html.erb +12 -12
  494. data/app/views/spree/admin/store_credit_categories/edit.html.erb +1 -1
  495. data/app/views/spree/admin/store_credit_categories/new.html.erb +1 -1
  496. data/app/views/spree/admin/store_credit_events/_store_credit_event.html.erb +1 -1
  497. data/app/views/spree/admin/store_credits/_form.html.erb +1 -1
  498. data/app/views/spree/admin/store_credits/edit.html.erb +1 -1
  499. data/app/views/spree/admin/store_credits/new.html.erb +3 -3
  500. data/app/views/spree/admin/store_credits/show.html.erb +23 -23
  501. data/app/views/spree/admin/stores/edit.html.erb +3 -3
  502. data/app/views/spree/admin/stores/edit_emails.html.erb +3 -3
  503. data/app/views/spree/admin/stores/form/_basic.html.erb +23 -14
  504. data/app/views/spree/admin/stores/form/_checkout.html.erb +16 -14
  505. data/app/views/spree/admin/stores/form/_checkout_links.html.erb +8 -8
  506. data/app/views/spree/admin/stores/form/_emails.html.erb +5 -5
  507. data/app/views/spree/admin/stores/form/_policies.html.erb +10 -10
  508. data/app/views/spree/admin/stores/new.html.erb +16 -16
  509. data/app/views/spree/admin/tables/_column_selector.html.erb +52 -0
  510. data/app/views/spree/admin/tables/_filter_group.html.erb +33 -0
  511. data/app/views/spree/admin/tables/_filter_row.html.erb +29 -0
  512. data/app/views/spree/admin/tables/_query_builder.html.erb +95 -0
  513. data/app/views/spree/admin/tables/_row_actions.html.erb +15 -0
  514. data/app/views/spree/admin/tables/_table.html.erb +69 -0
  515. data/app/views/spree/admin/tables/_table_body.html.erb +97 -0
  516. data/app/views/spree/admin/tables/_table_row.html.erb +44 -0
  517. data/app/views/spree/admin/tables/columns/_gift_card_status.html.erb +2 -0
  518. data/app/views/spree/admin/tables/columns/_metafield_definition_display_on.html.erb +4 -0
  519. data/app/views/spree/admin/tables/columns/_newsletter_subscriber_customer.html.erb +6 -0
  520. data/app/views/spree/admin/tables/columns/_order_payment_state.html.erb +2 -0
  521. data/app/views/spree/admin/tables/columns/_order_shipment_state.html.erb +2 -0
  522. data/app/views/spree/admin/tables/columns/_order_stock_locations.html.erb +4 -0
  523. data/app/views/spree/admin/tables/columns/_price_list_status.html.erb +1 -0
  524. data/app/views/spree/admin/tables/columns/_product_inventory.html.erb +3 -0
  525. data/app/views/spree/admin/tables/columns/_product_name.html.erb +8 -0
  526. data/app/views/spree/admin/tables/columns/_product_status.html.erb +4 -0
  527. data/app/views/spree/admin/tables/columns/_promotion_code.html.erb +8 -0
  528. data/app/views/spree/admin/tables/columns/_promotion_kind.html.erb +9 -0
  529. data/app/views/spree/admin/tables/columns/_stock_item_backorderable.html.erb +14 -0
  530. data/app/views/spree/admin/tables/columns/_stock_item_count_on_hand.html.erb +14 -0
  531. data/app/views/spree/admin/tables/columns/_stock_item_location.html.erb +6 -0
  532. data/app/views/spree/admin/tables/columns/_user_location.html.erb +2 -0
  533. data/app/views/spree/admin/tables/columns/_webhook_deliveries_stats.html.erb +3 -0
  534. data/app/views/spree/admin/tables/columns/_webhook_delivery_actions.html.erb +5 -0
  535. data/app/views/spree/admin/tables/columns/_webhook_delivery_status.html.erb +2 -0
  536. data/app/views/spree/admin/tax_categories/_form.html.erb +1 -1
  537. data/app/views/spree/admin/tax_rates/_form.html.erb +2 -2
  538. data/app/views/spree/admin/tax_rates/_table_row.html.erb +1 -1
  539. data/app/views/spree/admin/taxonomies/_form.html.erb +1 -1
  540. data/app/views/spree/admin/taxonomies/_table_row.html.erb +3 -3
  541. data/app/views/spree/admin/taxons/_form.html.erb +24 -23
  542. data/app/views/spree/admin/taxons/_rule_form.html.erb +9 -9
  543. data/app/views/spree/admin/taxons/_rules_form.html.erb +7 -7
  544. data/app/views/spree/admin/taxons/rule_forms/_available_on.html.erb +3 -3
  545. data/app/views/spree/admin/taxons/rule_forms/_sale.html.erb +1 -1
  546. data/app/views/spree/admin/translations/edit.html.erb +3 -3
  547. data/app/views/spree/admin/translations/option_types/_form.html.erb +2 -2
  548. data/app/views/spree/admin/translations/products/_form.html.erb +1 -1
  549. data/app/views/spree/admin/user_passwords/edit.html.erb +6 -6
  550. data/app/views/spree/admin/user_passwords/new.html.erb +4 -4
  551. data/app/views/spree/admin/user_sessions/new.html.erb +6 -6
  552. data/app/views/spree/admin/users/_billing.html.erb +4 -4
  553. data/app/views/spree/admin/users/_details.html.erb +34 -25
  554. data/app/views/spree/admin/users/_filters.html.erb +10 -10
  555. data/app/views/spree/admin/users/_form.html.erb +23 -3
  556. data/app/views/spree/admin/users/_form_fields.html.erb +1 -1
  557. data/app/views/spree/admin/users/_last_order.html.erb +6 -6
  558. data/app/views/spree/admin/users/_last_order_line_item.html.erb +7 -7
  559. data/app/views/spree/admin/users/_lifetime_stats.html.erb +31 -40
  560. data/app/views/spree/admin/users/_search_result.html.erb +13 -0
  561. data/app/views/spree/admin/users/_search_results.html.erb +9 -0
  562. data/app/views/spree/admin/users/_shipping.html.erb +4 -4
  563. data/app/views/spree/admin/users/_tabs.html.erb +15 -21
  564. data/app/views/spree/admin/users/_user.html.erb +5 -5
  565. data/app/views/spree/admin/users/edit.html.erb +1 -17
  566. data/app/views/spree/admin/users/index.html.erb +1 -59
  567. data/app/views/spree/admin/users/new.html.erb +1 -1
  568. data/app/views/spree/admin/users/show.html.erb +5 -4
  569. data/app/views/spree/admin/users/update.turbo_stream.erb +24 -0
  570. data/app/views/spree/admin/variants/_search_result.html.erb +4 -4
  571. data/app/views/spree/admin/variants/_search_results.html.erb +1 -1
  572. data/app/views/spree/admin/variants/_variant.html.erb +3 -3
  573. data/app/views/spree/admin/variants/edit.html.erb +2 -2
  574. data/app/views/spree/admin/variants/form/_basic.html.erb +1 -1
  575. data/app/views/spree/admin/variants/form/_dimensions.html.erb +8 -13
  576. data/app/views/spree/admin/variants/form/_inventory.html.erb +7 -10
  577. data/app/views/spree/admin/variants/form/_pricing.html.erb +12 -12
  578. data/app/views/spree/admin/webhook_deliveries/_table_header.html.erb +8 -0
  579. data/app/views/spree/admin/webhook_deliveries/_table_row.html.erb +22 -0
  580. data/app/views/spree/admin/webhook_deliveries/index.html.erb +1 -0
  581. data/app/views/spree/admin/webhook_deliveries/show.html.erb +61 -0
  582. data/app/views/spree/admin/webhook_endpoints/_details.html.erb +50 -0
  583. data/app/views/spree/admin/webhook_endpoints/_form.html.erb +28 -0
  584. data/app/views/spree/admin/webhook_endpoints/_secret_key.html.erb +23 -0
  585. data/app/views/spree/admin/webhook_endpoints/_summary.html.erb +26 -0
  586. data/app/views/spree/admin/webhook_endpoints/_table_header.html.erb +7 -0
  587. data/app/views/spree/admin/webhook_endpoints/_table_row.html.erb +24 -0
  588. data/app/views/spree/admin/webhook_endpoints/edit.html.erb +1 -0
  589. data/app/views/spree/admin/webhook_endpoints/index.html.erb +9 -0
  590. data/app/views/spree/admin/webhook_endpoints/new.html.erb +1 -0
  591. data/app/views/spree/admin/webhook_endpoints/show.html.erb +18 -0
  592. data/app/views/spree/admin/webhook_endpoints/update.turbo_stream.erb +5 -0
  593. data/app/views/spree/admin/zones/_country_members.html.erb +2 -2
  594. data/app/views/spree/admin/zones/_form.html.erb +2 -2
  595. data/app/views/spree/admin/zones/_state_members.html.erb +3 -3
  596. data/app/views/spree/admin/zones/_table_row.html.erb +2 -2
  597. data/config/importmap.rb +0 -2
  598. data/config/initializers/spree_admin_navigation.rb +47 -60
  599. data/config/initializers/spree_admin_tables.rb +1622 -0
  600. data/config/locales/en.yml +89 -8
  601. data/config/routes.rb +61 -45
  602. data/config/tailwind.config.js +14 -0
  603. data/lib/generators/spree/admin/install/install_generator.rb +34 -2
  604. data/lib/generators/spree/admin/install/templates/app/assets/tailwind/spree_admin.css.tt +46 -0
  605. data/lib/generators/spree/admin/scaffold/scaffold_generator.rb +4 -3
  606. data/lib/generators/spree/admin/scaffold/templates/navigation_initializer.rb.tt +9 -0
  607. data/lib/generators/spree/admin/scaffold/templates/table_initializer.rb.tt +27 -0
  608. data/lib/generators/spree/admin/scaffold/templates/views/_form.html.erb.tt +1 -1
  609. data/lib/generators/spree/admin/scaffold/templates/views/index.html.erb.tt +1 -1
  610. data/lib/spree/admin/engine.rb +101 -11
  611. data/lib/spree/admin/runtime_configuration.rb +7 -4
  612. data/lib/spree/admin/tailwind_helper.rb +33 -0
  613. data/lib/spree/admin/testing_support/capybara_utils.rb +41 -0
  614. data/lib/spree/admin.rb +7 -4
  615. data/lib/tasks/tailwind.rake +95 -0
  616. metadata +225 -241
  617. data/app/assets/stylesheets/spree/admin/actiontext.css +0 -36
  618. data/app/assets/stylesheets/spree/admin/application.scss +0 -46
  619. data/app/assets/stylesheets/spree/admin/components/_alerts.scss +0 -69
  620. data/app/assets/stylesheets/spree/admin/components/_badges.scss +0 -122
  621. data/app/assets/stylesheets/spree/admin/components/_bulk_panel.scss +0 -81
  622. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +0 -178
  623. data/app/assets/stylesheets/spree/admin/components/_cards.scss +0 -146
  624. data/app/assets/stylesheets/spree/admin/components/_dialogs.scss +0 -210
  625. data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +0 -151
  626. data/app/assets/stylesheets/spree/admin/components/_filters.scss +0 -97
  627. data/app/assets/stylesheets/spree/admin/components/_line_items_form.scss +0 -32
  628. data/app/assets/stylesheets/spree/admin/components/_main.scss +0 -87
  629. data/app/assets/stylesheets/spree/admin/components/_media_form.scss +0 -111
  630. data/app/assets/stylesheets/spree/admin/components/_modals.scss +0 -45
  631. data/app/assets/stylesheets/spree/admin/components/_navbar.scss +0 -6
  632. data/app/assets/stylesheets/spree/admin/components/_navigation.scss +0 -51
  633. data/app/assets/stylesheets/spree/admin/components/_search_picker.scss +0 -47
  634. data/app/assets/stylesheets/spree/admin/components/_seo_form.scss +0 -16
  635. data/app/assets/stylesheets/spree/admin/components/_sidebar.scss +0 -693
  636. data/app/assets/stylesheets/spree/admin/components/_sortable_tree.scss +0 -63
  637. data/app/assets/stylesheets/spree/admin/components/_tables.scss +0 -230
  638. data/app/assets/stylesheets/spree/admin/components/_tooltips.scss +0 -20
  639. data/app/assets/stylesheets/spree/admin/components/_variants_form.scss +0 -206
  640. data/app/assets/stylesheets/spree/admin/components/_wizard.scss +0 -27
  641. data/app/assets/stylesheets/spree/admin/global/_variables.scss +0 -242
  642. data/app/assets/stylesheets/spree/admin/plugins/_dropdown.scss +0 -102
  643. data/app/assets/stylesheets/spree/admin/plugins/_items.scss +0 -115
  644. data/app/assets/stylesheets/spree/admin/plugins/_tinymce_custom.scss +0 -74
  645. data/app/assets/stylesheets/spree/admin/plugins/_trix_custom.scss +0 -115
  646. data/app/assets/stylesheets/spree/admin/plugins/plugins/checkbox_options.scss +0 -5
  647. data/app/assets/stylesheets/spree/admin/plugins/plugins/clear_button.scss +0 -30
  648. data/app/assets/stylesheets/spree/admin/plugins/plugins/drag_drop.scss +0 -16
  649. data/app/assets/stylesheets/spree/admin/plugins/plugins/dropdown_header.scss +0 -23
  650. data/app/assets/stylesheets/spree/admin/plugins/plugins/dropdown_input.scss +0 -47
  651. data/app/assets/stylesheets/spree/admin/plugins/plugins/input_autogrow.scss +0 -18
  652. data/app/assets/stylesheets/spree/admin/plugins/plugins/optgroup_columns.scss +0 -23
  653. data/app/assets/stylesheets/spree/admin/plugins/plugins/remove_button.scss +0 -44
  654. data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap4.scss +0 -220
  655. data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap5.scss +0 -274
  656. data/app/assets/stylesheets/spree/admin/plugins/tom-select.default.scss +0 -87
  657. data/app/assets/stylesheets/spree/admin/plugins/tom-select.scss +0 -175
  658. data/app/assets/stylesheets/spree/admin/plugins/uppy_fixes.scss +0 -74
  659. data/app/assets/stylesheets/spree/admin/shared/_base.scss +0 -737
  660. data/app/assets/stylesheets/spree/admin/shared/_forms.scss +0 -194
  661. data/app/assets/stylesheets/spree/admin/views/_dashboard.scss +0 -48
  662. data/app/assets/stylesheets/spree/admin/views/_page_builder.scss +0 -246
  663. data/app/controllers/concerns/spree/admin/page_builder_concern.rb +0 -44
  664. data/app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb +0 -12
  665. data/app/controllers/spree/admin/page_blocks_controller.rb +0 -58
  666. data/app/controllers/spree/admin/page_links_controller.rb +0 -60
  667. data/app/controllers/spree/admin/page_sections_controller.rb +0 -82
  668. data/app/controllers/spree/admin/pages_controller.rb +0 -39
  669. data/app/controllers/spree/admin/storefront_controller.rb +0 -41
  670. data/app/controllers/spree/admin/themes_controller.rb +0 -86
  671. data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +0 -59
  672. data/app/helpers/spree/admin/page_builder_helper.rb +0 -125
  673. data/app/helpers/spree/admin/themes_helper.rb +0 -9
  674. data/app/helpers/spree/admin/webhooks_subscribers_helper.rb +0 -31
  675. data/app/javascript/spree/admin/helpers/bootstrap.js +0 -51
  676. data/app/views/kaminari/admin-twitter-bootstrap-4/_first_page.html.erb +0 -11
  677. data/app/views/kaminari/admin-twitter-bootstrap-4/_gap.html.erb +0 -12
  678. data/app/views/kaminari/admin-twitter-bootstrap-4/_last_page.html.erb +0 -11
  679. data/app/views/kaminari/admin-twitter-bootstrap-4/_next_page.html.erb +0 -12
  680. data/app/views/kaminari/admin-twitter-bootstrap-4/_page.html.erb +0 -18
  681. data/app/views/kaminari/admin-twitter-bootstrap-4/_paginator.html.erb +0 -17
  682. data/app/views/kaminari/admin-twitter-bootstrap-4/_prev_page.html.erb +0 -12
  683. data/app/views/layouts/spree/page_builder.html.erb +0 -46
  684. data/app/views/spree/admin/dashboard/_store_preview.html.erb +0 -39
  685. data/app/views/spree/admin/orders/edit.html.erb +0 -22
  686. data/app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb +0 -5
  687. data/app/views/spree/admin/page_blocks/create.turbo_stream.erb +0 -4
  688. data/app/views/spree/admin/page_blocks/destroy.turbo_stream.erb +0 -9
  689. data/app/views/spree/admin/page_blocks/edit.html.erb +0 -43
  690. data/app/views/spree/admin/page_blocks/forms/_brand.html.erb +0 -15
  691. data/app/views/spree/admin/page_blocks/forms/_brand_logo.html.erb +0 -4
  692. data/app/views/spree/admin/page_blocks/forms/_buttons.html.erb +0 -13
  693. data/app/views/spree/admin/page_blocks/forms/_heading.html.erb +0 -28
  694. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +0 -10
  695. data/app/views/spree/admin/page_blocks/forms/_link.html.erb +0 -19
  696. data/app/views/spree/admin/page_blocks/forms/_mega_nav.html.erb +0 -14
  697. data/app/views/spree/admin/page_blocks/forms/_mega_nav_with_subcategories.html.erb +0 -9
  698. data/app/views/spree/admin/page_blocks/forms/_metafields.html.erb +0 -35
  699. data/app/views/spree/admin/page_blocks/forms/_nav.html.erb +0 -6
  700. data/app/views/spree/admin/page_blocks/forms/_newsletter_form.html.erb +0 -20
  701. data/app/views/spree/admin/page_blocks/forms/_price.html.erb +0 -15
  702. data/app/views/spree/admin/page_blocks/forms/_share.html.erb +0 -5
  703. data/app/views/spree/admin/page_blocks/forms/_subheading.html.erb +0 -26
  704. data/app/views/spree/admin/page_blocks/forms/_text.html.erb +0 -21
  705. data/app/views/spree/admin/page_blocks/forms/_title.html.erb +0 -20
  706. data/app/views/spree/admin/page_blocks/forms/_variant_picker.html.erb +0 -10
  707. data/app/views/spree/admin/page_blocks/forms/products/_buy_buttons.html.erb +0 -10
  708. data/app/views/spree/admin/page_blocks/forms/products/_description.html.erb +0 -0
  709. data/app/views/spree/admin/page_blocks/forms/products/_quantity_selector.html.erb +0 -10
  710. data/app/views/spree/admin/page_blocks/move_higher.turbo_stream.erb +0 -4
  711. data/app/views/spree/admin/page_blocks/move_lower.turbo_stream.erb +0 -4
  712. data/app/views/spree/admin/page_blocks/show.html.erb +0 -1
  713. data/app/views/spree/admin/page_blocks/update.turbo_stream.erb +0 -6
  714. data/app/views/spree/admin/page_builder/_add_block.html.erb +0 -22
  715. data/app/views/spree/admin/page_builder/_color_palette.html.erb +0 -17
  716. data/app/views/spree/admin/page_builder/_color_picker.html.erb +0 -26
  717. data/app/views/spree/admin/page_builder/_header.html.erb +0 -113
  718. data/app/views/spree/admin/page_builder/_labeled_range_input.html.erb +0 -10
  719. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +0 -17
  720. data/app/views/spree/admin/page_builder/_range_input.html.erb +0 -12
  721. data/app/views/spree/admin/page_builder/_sidebar.html.erb +0 -14
  722. data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +0 -30
  723. data/app/views/spree/admin/page_builder/_sidebar_colors.html.erb +0 -86
  724. data/app/views/spree/admin/page_builder/_sidebar_fonts.html.erb +0 -86
  725. data/app/views/spree/admin/page_builder/_sidebar_section.html.erb +0 -44
  726. data/app/views/spree/admin/page_builder/_sidebar_sections.html.erb +0 -43
  727. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +0 -180
  728. data/app/views/spree/admin/page_links/_form.html.erb +0 -10
  729. data/app/views/spree/admin/page_links/_linkable_type_dropdown.html.erb +0 -15
  730. data/app/views/spree/admin/page_links/_list.html.erb +0 -36
  731. data/app/views/spree/admin/page_links/_refresh_theme_preview.turbo_stream.erb +0 -5
  732. data/app/views/spree/admin/page_links/create.turbo_stream.erb +0 -10
  733. data/app/views/spree/admin/page_links/destroy.turbo_stream.erb +0 -15
  734. data/app/views/spree/admin/page_links/edit.html.erb +0 -29
  735. data/app/views/spree/admin/page_links/update.turbo_stream.erb +0 -12
  736. data/app/views/spree/admin/page_sections/_form_tab_buttons.html.erb +0 -8
  737. data/app/views/spree/admin/page_sections/create.turbo_stream.erb +0 -11
  738. data/app/views/spree/admin/page_sections/destroy.turbo_stream.erb +0 -16
  739. data/app/views/spree/admin/page_sections/edit.html.erb +0 -39
  740. data/app/views/spree/admin/page_sections/fields/_background_color.html.erb +0 -6
  741. data/app/views/spree/admin/page_sections/fields/_border_bottom_width.html.erb +0 -5
  742. data/app/views/spree/admin/page_sections/fields/_border_color.html.erb +0 -7
  743. data/app/views/spree/admin/page_sections/fields/_border_top_width.html.erb +0 -6
  744. data/app/views/spree/admin/page_sections/fields/_bottom_padding.html.erb +0 -5
  745. data/app/views/spree/admin/page_sections/fields/_button.html.erb +0 -15
  746. data/app/views/spree/admin/page_sections/fields/_header_layout.html.erb +0 -26
  747. data/app/views/spree/admin/page_sections/fields/_height.html.erb +0 -6
  748. data/app/views/spree/admin/page_sections/fields/_text_color.html.erb +0 -7
  749. data/app/views/spree/admin/page_sections/fields/_top_padding.html.erb +0 -6
  750. data/app/views/spree/admin/page_sections/forms/_announcement_bar.html.erb +0 -5
  751. data/app/views/spree/admin/page_sections/forms/_brand_story.html.erb +0 -0
  752. data/app/views/spree/admin/page_sections/forms/_breadcrumbs.html.erb +0 -0
  753. data/app/views/spree/admin/page_sections/forms/_collection_banner.html.erb +0 -0
  754. data/app/views/spree/admin/page_sections/forms/_custom_code.html.erb +0 -4
  755. data/app/views/spree/admin/page_sections/forms/_featured_posts.html.erb +0 -33
  756. data/app/views/spree/admin/page_sections/forms/_featured_product.html.erb +0 -4
  757. data/app/views/spree/admin/page_sections/forms/_featured_taxon.html.erb +0 -59
  758. data/app/views/spree/admin/page_sections/forms/_featured_taxons.html.erb +0 -13
  759. data/app/views/spree/admin/page_sections/forms/_footer.html.erb +0 -20
  760. data/app/views/spree/admin/page_sections/forms/_header.html.erb +0 -12
  761. data/app/views/spree/admin/page_sections/forms/_image_banner.html.erb +0 -13
  762. data/app/views/spree/admin/page_sections/forms/_image_with_text.html.erb +0 -28
  763. data/app/views/spree/admin/page_sections/forms/_main_password_footer.html.erb +0 -9
  764. data/app/views/spree/admin/page_sections/forms/_main_password_header.erb +0 -13
  765. data/app/views/spree/admin/page_sections/forms/_newsletter.html.erb +0 -15
  766. data/app/views/spree/admin/page_sections/forms/_page_title.html.erb +0 -4
  767. data/app/views/spree/admin/page_sections/forms/_post_details.html.erb +0 -0
  768. data/app/views/spree/admin/page_sections/forms/_post_grid.html.erb +0 -0
  769. data/app/views/spree/admin/page_sections/forms/_product_details.html.erb +0 -1
  770. data/app/views/spree/admin/page_sections/forms/_product_grid.html.erb +0 -1
  771. data/app/views/spree/admin/page_sections/forms/_related_products.html.erb +0 -32
  772. data/app/views/spree/admin/page_sections/forms/_rich_text.html.erb +0 -0
  773. data/app/views/spree/admin/page_sections/forms/_taxon_banner.html.erb +0 -0
  774. data/app/views/spree/admin/page_sections/forms/_taxon_grid.html.erb +0 -5
  775. data/app/views/spree/admin/page_sections/forms/_video.html.erb +0 -15
  776. data/app/views/spree/admin/page_sections/move_higher.turbo_stream.erb +0 -7
  777. data/app/views/spree/admin/page_sections/move_lower.turbo_stream.erb +0 -7
  778. data/app/views/spree/admin/page_sections/new.html.erb +0 -28
  779. data/app/views/spree/admin/page_sections/remove_attachment.turbo_stream.erb +0 -4
  780. data/app/views/spree/admin/page_sections/restore_design_settings_to_defaults.turbo_stream.erb +0 -4
  781. data/app/views/spree/admin/page_sections/show.html.erb +0 -1
  782. data/app/views/spree/admin/page_sections/update.turbo_stream.erb +0 -10
  783. data/app/views/spree/admin/pages/_form.html.erb +0 -20
  784. data/app/views/spree/admin/pages/_table_header.html.erb +0 -6
  785. data/app/views/spree/admin/pages/_table_row.html.erb +0 -28
  786. data/app/views/spree/admin/pages/edit.html.erb +0 -13
  787. data/app/views/spree/admin/pages/filters.html.erb +0 -7
  788. data/app/views/spree/admin/pages/index.html.erb +0 -11
  789. data/app/views/spree/admin/pages/new.html.erb +0 -1
  790. data/app/views/spree/admin/products/_bulk_operations.html.erb +0 -78
  791. data/app/views/spree/admin/products/bulk_modal.html.erb +0 -16
  792. data/app/views/spree/admin/storefront/edit.html.erb +0 -89
  793. data/app/views/spree/admin/themes/_theme.html.erb +0 -56
  794. data/app/views/spree/admin/themes/_theme_preview_image.html.erb +0 -17
  795. data/app/views/spree/admin/themes/edit.html.erb +0 -14
  796. data/app/views/spree/admin/themes/index.html.erb +0 -80
  797. data/app/views/spree/admin/themes/update.turbo_stream.erb +0 -1
  798. data/app/views/spree/admin/users/bulk_modal.html.erb +0 -14
  799. data/app/views/spree/admin/webhook_events/_webhook_event.html.erb +0 -17
  800. data/app/views/spree/admin/webhooks_subscribers/_form.html.erb +0 -68
  801. data/app/views/spree/admin/webhooks_subscribers/_table_header.html.erb +0 -7
  802. data/app/views/spree/admin/webhooks_subscribers/_table_row.html.erb +0 -22
  803. data/app/views/spree/admin/webhooks_subscribers/edit.html.erb +0 -1
  804. data/app/views/spree/admin/webhooks_subscribers/index.html.erb +0 -10
  805. data/app/views/spree/admin/webhooks_subscribers/show.html.erb +0 -65
  806. data/config/initializers/dartsass.rb +0 -3
  807. data/config/initializers/form_builder.rb +0 -10
  808. data/lib/generators/spree/admin/scaffold/templates/views/_filters.html.erb.tt +0 -13
  809. data/lib/generators/spree/admin/scaffold/templates/views/_table_header.html.erb.tt +0 -5
  810. data/lib/generators/spree/admin/scaffold/templates/views/_table_row.html.erb.tt +0 -11
  811. data/vendor/javascript/bootstrap--dist--js--bootstrap.bundle.min.js.js +0 -8
  812. data/vendor/javascript/jquery.min.js +0 -2
  813. /data/app/views/spree/admin/{webhooks_subscribers → customer_groups}/new.html.erb +0 -0
@@ -0,0 +1,52 @@
1
+ module Spree
2
+ module Admin
3
+ class PriceRulesController < ResourceController
4
+ belongs_to 'spree/price_list', find_by: :id
5
+
6
+ helper_method :allowed_rule_types
7
+
8
+ private
9
+
10
+ def model_class
11
+ @model_class = if params.dig(:price_rule, :type).present?
12
+ rule_type = params.dig(:price_rule, :type)
13
+ rule_class = allowed_rule_types.find { |klass| klass.name.to_s == rule_type }
14
+
15
+ raise 'Unknown price rule type' unless rule_class
16
+
17
+ rule_class
18
+ else
19
+ Spree::PriceRule
20
+ end
21
+ end
22
+
23
+ def build_resource
24
+ model_class.new(price_list: parent)
25
+ end
26
+
27
+ def allowed_rule_types
28
+ Spree.pricing.rules
29
+ end
30
+
31
+ def location_after_save
32
+ collection_url
33
+ end
34
+
35
+ def collection_url
36
+ spree.admin_price_list_path(parent)
37
+ end
38
+
39
+ def permitted_resource_params
40
+ permitted_preference_keys = @object.preferences.map do |key, value|
41
+ if value.is_a?(Array)
42
+ { "preferred_#{key}" => [] }
43
+ else
44
+ "preferred_#{key}"
45
+ end
46
+ end
47
+
48
+ params.require(:price_rule).permit(:type, *permitted_preference_keys)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -85,21 +85,11 @@ module Spree
85
85
  end
86
86
  end
87
87
 
88
- def bulk_modal
89
- if params[:kind] == 'set_status'
90
- @title = Spree.t('admin.bulk_ops.products.title.set_status', status: params[:status].titleize)
91
- @body = Spree.t("admin.bulk_ops.products.body.set_status.#{params[:status]}")
92
- else
93
- @title = Spree.t("admin.bulk_ops.products.title.#{params[:kind]}")
94
- @body = Spree.t("admin.bulk_ops.products.body.#{params[:kind]}")
95
- end
96
- end
97
-
98
88
  def bulk_status_update
99
89
  if bulk_collection.update_all(status: params[:status], updated_at: Time.current)
100
90
  product_ids = bulk_collection.ids
101
91
 
102
- if Spree::Webhooks::Subscriber.any?
92
+ if defined?(Spree::Webhooks::Subscriber) && Spree::Webhooks::Subscriber.any?
103
93
  ::Spree::Products::QueueStatusChangedWebhook.call(
104
94
  ids: product_ids,
105
95
  event: Spree::Product::STATUS_TO_WEBHOOK_EVENT[params[:status]]
@@ -114,20 +104,6 @@ module Spree
114
104
  end
115
105
  end
116
106
 
117
- def bulk_add_tags
118
- Spree::Tags::BulkAdd.call(tag_names: params[:tags], records: bulk_collection)
119
- Spree::Product.bulk_auto_match_taxons(current_store, bulk_collection.ids)
120
-
121
- handle_bulk_operation_response
122
- end
123
-
124
- def bulk_remove_tags
125
- Spree::Tags::BulkRemove.call(tag_names: params[:tags], records: bulk_collection)
126
- Spree::Product.bulk_auto_match_taxons(current_store, bulk_collection.ids)
127
-
128
- handle_bulk_operation_response
129
- end
130
-
131
107
  def bulk_remove_from_taxons
132
108
  taxons = current_store.taxons.accessible_by(current_ability, :manage).where(id: params[:taxon_ids])
133
109
  Spree::Taxons::RemoveProducts.call(taxons: taxons, products: bulk_collection)
@@ -196,7 +172,7 @@ module Spree
196
172
  end
197
173
 
198
174
  @product_prices = {}
199
- @product.prices.includes(:variant).each do |price|
175
+ @product.prices.base_prices.includes(:variant).each do |price|
200
176
  @product_prices[price.variant.human_name] ||= {}
201
177
  @product_prices[price.variant.human_name][price.currency.downcase] = {
202
178
  id: price.id.to_s,
@@ -242,40 +218,13 @@ module Spree
242
218
  params[:product] = params_service.call
243
219
  end
244
220
 
245
- def collection
246
- return @collection if @collection.present?
247
-
248
- params[:q] ||= {}
249
- params[:q][:deleted_at_null] ||= '1'
250
-
251
- params[:q][:s] ||= 'name asc'
252
- params[:q][:status_eq] == 'archived' ? params[:q].delete(:status_not_eq) : params[:q][:status_not_eq] = 'archived'
253
-
254
- params[:q][:taxons_id_null] = '1' if params.dig(:q, :taxons_id_in)&.include?(' ')
255
-
256
- assign_extra_collection_params if respond_to?(:assign_extra_collection_params)
257
-
258
- @collection = super
259
-
260
- # Don't delete params[:q][:deleted_at_null] here because it is used in view to check the
261
- # checkbox for 'q[deleted_at_null]'. This also messed with pagination when deleted_at_null is checked.
262
- @collection = @collection.with_deleted if params[:q][:deleted_at_null] == '0'
263
-
264
- # The out_of_stock scope groups products - we also need to group it by name coming from product translations
265
- # That's because we sort products by name
266
- @collection = @collection.group(:name) if params.dig(:q, :out_of_stock_items) == '1'
267
-
268
- # @search needs to be defined as this is passed to search_form_for
269
- # Temporarily remove params[:q][:deleted_at_null] from params[:q] to ransack products.
270
- # This is to include all products and not just deleted products.
271
- @search = @collection.ransack(params[:q].except(:deleted_at_null))
272
- @collection = @search.result(distinct: true).
273
- for_ordering_with_translations(model_class, :name).
274
- includes(product_includes).
275
- page(params[:page]).
276
- per(params[:per_page] || Spree::Admin::RuntimeConfig.admin_products_per_page)
277
-
278
- @collection
221
+ # These includes are not picked automatically by ar_lazy_preload gem so we need to specify them manually.
222
+ def collection_includes
223
+ {
224
+ stock_items: [],
225
+ master: [:images, :prices, :stock_items],
226
+ variants: [:images, :prices, :stock_items]
227
+ }
279
228
  end
280
229
 
281
230
  def clone_object_url(resource)
@@ -284,6 +233,10 @@ module Spree
284
233
 
285
234
  private
286
235
 
236
+ def after_bulk_tags_change
237
+ Spree::Product.bulk_auto_match_taxons(current_store, bulk_collection.ids)
238
+ end
239
+
287
240
  def variant_stock_includes
288
241
  [:images, { stock_items: :stock_location, option_values: :option_type }]
289
242
  end
@@ -340,18 +293,6 @@ module Spree
340
293
  clear_session_for_uploaded_assets('Spree::Variant')
341
294
  end
342
295
 
343
- def product_includes
344
- {
345
- tax_category: [],
346
- stock_items: [:stock_location],
347
- variants_including_master: [],
348
- shipping_category: [],
349
- master: [:prices, :images, :stock_items, :stock_locations],
350
- variants: [:prices, :images, :stock_items, :stock_locations],
351
- variant_images: [],
352
- }
353
- end
354
-
355
296
  def check_slug_availability
356
297
  new_slug = permitted_resource_params[:slug]
357
298
  permitted_resource_params[:slug] = @product.ensure_slug_is_unique(new_slug)
@@ -40,7 +40,15 @@ module Spree
40
40
  end
41
41
 
42
42
  def permitted_resource_params
43
- params.require(:promotion_rule).permit(*permitted_promotion_rule_attributes + @object.preferences.keys.map { |key| "preferred_#{key}" })
43
+ permitted_preference_keys = @object.preferences.map do |key, value|
44
+ if value.is_a?(Array)
45
+ { "preferred_#{key}" => [] }
46
+ else
47
+ "preferred_#{key}"
48
+ end
49
+ end
50
+
51
+ params.require(:promotion_rule).permit(*permitted_promotion_rule_attributes, *permitted_preference_keys)
44
52
  end
45
53
  end
46
54
  end
@@ -5,6 +5,15 @@ module Spree
5
5
 
6
6
  before_action :load_form_data, except: :index
7
7
 
8
+ # GET /admin/promotions/select_options
9
+ def select_options
10
+ q = params[:q]
11
+ ransack_params = q.is_a?(String) ? { name_i_cont: q } : q
12
+ promotions = current_store.promotions.applied.accessible_by(current_ability).ransack(ransack_params).result.order(:name).limit(25)
13
+
14
+ render json: promotions.pluck(:id, :name).map { |id, name| { id: id, name: name } }
15
+ end
16
+
8
17
  # POST /admin/promotions/:id/clone
9
18
  def clone
10
19
  promotion = current_store.promotions.find(params[:id])
@@ -34,29 +43,8 @@ module Spree
34
43
  end
35
44
  end
36
45
 
37
- def collection
38
- return @collection if defined?(@collection)
39
-
40
- params[:q] ||= {}
41
-
42
- expired = params[:q].delete(:expired) == 'true'
43
- active = params[:q].delete(:active) == 'true'
44
-
45
- @collection = super
46
-
47
- @collection = @collection.active if active
48
- @collection = @collection.expired if expired
49
-
50
- @search = @collection.ransack(params[:q])
51
- @collection = @search.result(distinct: true).
52
- includes(:promotion_actions).
53
- page(params[:page]).
54
- per(params[:per_page])
55
-
56
- params[:q][:expired] = expired
57
- params[:q][:active] = active
58
-
59
- @collection
46
+ def collection_includes
47
+ [:promotion_actions]
60
48
  end
61
49
 
62
50
  def permitted_resource_params
@@ -7,7 +7,7 @@ module Spree
7
7
  add_breadcrumb Spree.t(:reports), :admin_reports_path
8
8
 
9
9
  before_action :set_user, only: [:new, :create]
10
- before_action :load_report_line_items, only: [:new, :create]
10
+ before_action :load_report_line_items, only: :new
11
11
 
12
12
  def show
13
13
  redirect_to @object.attachment.url, status: :see_other, allow_other_host: true
@@ -20,7 +20,7 @@ module Spree
20
20
  end
21
21
 
22
22
  def load_report_line_items
23
- @report_line_items = @object.line_items
23
+ @report_line_items = @object.line_items(limit: Spree::Admin::RuntimeConfig.reports_line_items_limit.to_i)
24
24
  end
25
25
 
26
26
  def create_turbo_stream_enabled?
@@ -1,5 +1,7 @@
1
1
  class Spree::Admin::ResourceController < Spree::Admin::BaseController
2
2
  include Spree::Admin::Callbacks
3
+ include Spree::Admin::TableConcern
4
+ include Pagy::Method
3
5
 
4
6
  helper_method :new_object_url, :edit_object_url, :object_url, :collection_url, :model_class
5
7
  before_action :load_resource
@@ -241,16 +243,55 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
241
243
  # @return [Ransack::Search]
242
244
  def search_collection
243
245
  @search ||= begin
244
- params[:q] ||= {}
245
- params[:q][:s] ||= collection_default_sort if collection_default_sort.present?
246
- scope.ransack(params[:q])
246
+ # Process query_state from table query builder if present
247
+ process_table_query_state if table_registered?
248
+
249
+ scope.ransack(search_params)
247
250
  end
248
251
  end
249
252
 
253
+ # Override in child controllers to set custom search params
254
+ # @return [Hash] Ransack search params
255
+ def search_params
256
+ # Initialize params[:q] as empty hash if not present, to allow setting default sort
257
+ params[:q] ||= {}
258
+
259
+ return params[:q] unless params[:q].is_a?(ActionController::Parameters) || params[:q].is_a?(Hash)
260
+
261
+ params[:q][:s] ||= collection_default_sort if collection_default_sort.present?
262
+
263
+ date_range_params = %i[created_at_gt created_at_lt updated_at_gt updated_at_lt]
264
+ date_range_params.each do |param|
265
+ if params[:q][param].present?
266
+ params[:q][param] = begin
267
+ params[:q][param].to_date&.in_time_zone(current_timezone)&.beginning_of_day
268
+ rescue StandardError
269
+ ''
270
+ end
271
+ end
272
+ end
273
+
274
+ params[:q]
275
+ end
276
+
250
277
  # Returns the filtered and paginated ransack results
278
+ # Uses countish paginator which is faster as it avoids COUNT queries on most pages
279
+ # Falls back to offset paginator for queries with HAVING or GROUP BY clauses (incompatible with countish)
251
280
  # @return [ActiveRecord::Relation]
252
281
  def collection
253
- @collection ||= search_collection.result(distinct: true).page(params[:page]).per(params[:per_page])
282
+ @collection ||= begin
283
+ result = search_collection.result(distinct: true).preload_associations_lazily
284
+
285
+ # Apply custom sort scope if configured (e.g., for price sorting)
286
+ result = apply_table_sort(result) if table_registered? && custom_sort_active?
287
+
288
+ limit = params[:per_page] || Spree::Admin::RuntimeConfig.admin_records_per_page
289
+
290
+ # Uses countish paginator which is faster as it avoids COUNT queries
291
+ @pagy, paginated = pagy(:countish, result, limit: limit)
292
+
293
+ paginated
294
+ end
254
295
  end
255
296
 
256
297
  def collection_includes
@@ -375,7 +416,7 @@ class Spree::Admin::ResourceController < Spree::Admin::BaseController
375
416
  def collection_actions
376
417
  [:index, :select_options, :bulk_modal, :bulk_status_update,
377
418
  :bulk_add_to_taxons, :bulk_remove_from_taxons,
378
- :bulk_add_tags, :bulk_remove_tags, :bulk_destroy]
419
+ :bulk_add_tags, :bulk_remove_tags, :bulk_destroy, :select_options]
379
420
  end
380
421
 
381
422
  # Returns true if the current action is a member action
@@ -11,7 +11,7 @@ module Spree
11
11
  before_action :refresh_shipping_rates, only: :edit
12
12
 
13
13
  def update
14
- @result = Spree::Dependencies.shipment_update_service.constantize.call(shipment: @shipment, shipment_attributes: permitted_resource_params)
14
+ @result = Spree.shipment_update_service.call(shipment: @shipment, shipment_attributes: permitted_resource_params)
15
15
  flash[:success] = Spree.t(:successfully_updated, resource: Spree.t(:shipment)) if @result.success?
16
16
 
17
17
  redirect_back fallback_location: spree.edit_admin_order_path(@order)
@@ -2,6 +2,7 @@ module Spree
2
2
  module Admin
3
3
  class StockItemsController < ResourceController
4
4
  include ProductsBreadcrumbConcern
5
+ include TableConcern
5
6
 
6
7
  before_action :add_breadcrumbs
7
8
 
@@ -18,7 +19,7 @@ module Spree
18
19
  def collection_includes
19
20
  {
20
21
  stock_location: [],
21
- variant: [option_values: :option_type, product: [variant_images: [], variants: [:images], master: [:images]], images: []]
22
+ variant: [option_values: :option_type, product: [variants: [:images], master: [:images]], images: []]
22
23
  }
23
24
  end
24
25
 
@@ -13,6 +13,15 @@ module Spree
13
13
  redirect_to spree.admin_stock_locations_path
14
14
  end
15
15
 
16
+ # GET /admin/stock_locations/select_options
17
+ def select_options
18
+ q = params[:q]
19
+ ransack_params = q.is_a?(String) ? { name_i_cont: q } : q
20
+ stock_locations = Spree::StockLocation.active.accessible_by(current_ability).ransack(ransack_params).result.order(:name).limit(50)
21
+
22
+ render json: stock_locations.map { |sl| { id: sl.id, name: sl.display_name } }
23
+ end
24
+
16
25
  private
17
26
 
18
27
  def scope
@@ -0,0 +1,38 @@
1
+ module Spree
2
+ module Admin
3
+ class TableColumnsController < Spree::Admin::BaseController
4
+ # POST /admin/table_columns
5
+ # Updates the selected columns for a table in the session
6
+ def update
7
+ session_key = table_session_key
8
+ columns = params[:columns]
9
+
10
+ if session_key.present?
11
+ if columns.present?
12
+ # Filter to only include valid column keys
13
+ column_keys = Array(columns).map(&:to_sym)
14
+ session[session_key] = column_keys.join(',')
15
+ else
16
+ # Clear selection to use defaults
17
+ session.delete(session_key)
18
+ end
19
+ end
20
+
21
+ # Use url_from to validate redirect URL is same-origin
22
+ redirect_url = url_from(params[:redirect_url]) || url_from(request.referer) || spree.admin_path
23
+ redirect_to redirect_url, status: :see_other
24
+ end
25
+
26
+ private
27
+
28
+ # Returns a validated session key for table columns, or nil if invalid
29
+ # Only allows registered table keys to prevent session manipulation
30
+ def table_session_key
31
+ table_key = params[:table_key].to_s.to_sym
32
+ return nil unless Spree.admin.tables.registered?(table_key)
33
+
34
+ "table_columns_#{table_key}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ module Admin
3
+ class TagsController < Spree::Admin::BaseController
4
+ def select_options
5
+ tags = tags_scope
6
+
7
+ if params[:q].present?
8
+ tags = tags.where('LOWER(name) LIKE ?', "%#{params[:q].downcase}%")
9
+ end
10
+
11
+ render json: tags.limit(100).pluck(:id, :name).map { |id, name| { id: id, name: name } }
12
+ end
13
+
14
+ private
15
+
16
+ def tags_scope
17
+ context = params[:context].presence || 'tags'
18
+ taggable_type = params[:taggable_type].presence
19
+
20
+ scope = ActsAsTaggableOn::Tag.for_context(context)
21
+
22
+ if taggable_type.present?
23
+ scope = scope.joins(:taggings)
24
+ .where(ActsAsTaggableOn.taggings_table => { taggable_type: taggable_type })
25
+ .distinct
26
+ end
27
+
28
+ scope.order(:name)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -13,6 +13,38 @@ module Spree
13
13
  add_breadcrumb_icon 'users'
14
14
  add_breadcrumb Spree.t(:customers), :admin_users_path
15
15
 
16
+ def select_options
17
+ q = params[:q]
18
+ ransack_params = q.is_a?(String) ? { email_cont: q } : q
19
+ users = model_class.accessible_by(current_ability).ransack(ransack_params).result.order(:email).limit(50)
20
+
21
+ render json: users.pluck(:id, :email).map { |id, email| { id: id, name: email } }
22
+ end
23
+
24
+ def search
25
+ query = params[:q]&.strip
26
+
27
+ head :ok and return if query.blank? || query.length < 3
28
+
29
+ scope = model_class.accessible_by(current_ability, :index)
30
+ scope = scope.where.not(id: params[:omit_ids].split(',')) if params[:omit_ids].present?
31
+ @users = scope.includes(:bill_address, :ship_address, avatar_attachment: :blob)
32
+ .multi_search(query)
33
+ .limit(params[:limit] || 10)
34
+
35
+ respond_to do |format|
36
+ format.turbo_stream do
37
+ render turbo_stream: [
38
+ turbo_stream.replace(
39
+ 'users_search_results',
40
+ partial: 'spree/admin/users/search_results',
41
+ locals: { users: @users }
42
+ )
43
+ ]
44
+ end
45
+ end
46
+ end
47
+
16
48
  def show
17
49
  add_breadcrumb @user.name, spree.admin_user_path(@user)
18
50
  end
@@ -30,22 +62,22 @@ module Spree
30
62
  end
31
63
  end
32
64
 
33
- def update
34
- if @user.update(user_params)
35
- flash[:success] = flash_message_for(@user, :successfully_updated)
36
- redirect_to spree.admin_user_path(@user)
37
- else
38
- render :edit, status: :unprocessable_entity
39
- end
40
- end
41
-
42
65
  def model_class
43
66
  Spree.user_class
44
67
  end
45
68
 
46
- def bulk_modal
47
- @title = Spree.t("admin.bulk_ops.users.title.#{params[:kind]}")
48
- @body = Spree.t("admin.bulk_ops.users.body.#{params[:kind]}")
69
+ def update_turbo_stream_enabled?
70
+ true
71
+ end
72
+
73
+ # Skip setting current store for users as they don't need store assignment
74
+ # and the stores association goes through role_users which requires a role
75
+ def set_current_store
76
+ # no-op for users
77
+ end
78
+
79
+ def location_after_save
80
+ spree.admin_user_path(@user)
49
81
  end
50
82
 
51
83
  protected
@@ -69,6 +101,10 @@ module Spree
69
101
 
70
102
  private
71
103
 
104
+ def permitted_resource_params
105
+ user_params
106
+ end
107
+
72
108
  def user_params
73
109
  params.require(:user).permit(permitted_user_attributes | [spree_role_ids: []])
74
110
  end
@@ -83,11 +119,19 @@ module Spree
83
119
  return if params[:user].blank?
84
120
 
85
121
  params[:user][:tag_list] = params.dig(:user, :tag_list).present? ? params.dig(:user, :tag_list).reject(&:empty?) : []
122
+
123
+ # Remove spree_role_ids if it only contains empty strings to avoid clearing roles
124
+ role_ids = params[:user][:spree_role_ids]
125
+ if role_ids.present? && role_ids.reject(&:empty?).empty?
126
+ params[:user].delete(:spree_role_ids)
127
+ end
86
128
  end
87
129
 
88
130
  def load_last_order_data
89
131
  @last_order = @user.completed_orders.last
90
- @last_order_line_items = @last_order.line_items.includes(variant: :product) if @last_order.present?
132
+ return unless @last_order.present?
133
+
134
+ @last_order_line_items = @last_order.line_items.includes(variant: [:images, { option_values: :option_type }, { product: [{ master: :images }, { variants: :images }] }])
91
135
  end
92
136
  end
93
137
  end
@@ -74,7 +74,7 @@ module Spree
74
74
 
75
75
  def build_prices
76
76
  current_store.supported_currencies_list.each do |currency|
77
- @variant.prices.build(currency: currency) unless @variant.prices.exists?(currency: currency.iso_code)
77
+ @variant.prices.build(currency: currency) unless @variant.prices.base_prices.exists?(currency: currency.iso_code)
78
78
  end
79
79
  end
80
80
 
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Admin
5
+ class WebhookDeliveriesController < ResourceController
6
+ include Spree::Admin::SettingsConcern
7
+ include Spree::Admin::TableConcern
8
+
9
+ helper 'spree/admin/webhook_endpoints'
10
+
11
+ belongs_to 'spree/webhook_endpoint'
12
+
13
+ private
14
+
15
+ def collection_default_sort
16
+ 'created_at desc'
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module Admin
5
+ class WebhookEndpointsController < ResourceController
6
+ include Spree::Admin::SettingsConcern
7
+ include Spree::Admin::TableConcern
8
+
9
+ helper 'spree/admin/webhook_endpoints'
10
+
11
+ private
12
+
13
+ def permitted_resource_params
14
+ params.require(:webhook_endpoint).permit(permitted_webhook_endpoint_attributes)
15
+ end
16
+
17
+ def location_after_save
18
+ spree.admin_webhook_endpoint_path(@object)
19
+ end
20
+
21
+ def update_turbo_stream_enabled?
22
+ true
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,56 @@
1
+ module Spree
2
+ module Admin
3
+ module AvatarsHelper
4
+ include Spree::ImagesHelper
5
+
6
+ AVATAR_GRADIENTS = [
7
+ 'bg-gradient-to-br from-indigo-500 to-purple-600',
8
+ 'bg-gradient-to-br from-pink-400 to-rose-500',
9
+ 'bg-gradient-to-br from-blue-400 to-cyan-400',
10
+ 'bg-gradient-to-br from-emerald-400 to-teal-400',
11
+ 'bg-gradient-to-br from-rose-400 to-yellow-300',
12
+ 'bg-gradient-to-br from-teal-200 to-pink-200',
13
+ 'bg-gradient-to-br from-rose-300 to-pink-200',
14
+ 'bg-gradient-to-br from-orange-200 to-orange-400',
15
+ 'bg-gradient-to-br from-violet-500 to-fuchsia-500',
16
+ 'bg-gradient-to-br from-amber-400 to-orange-500',
17
+ ].freeze
18
+
19
+ def avatar_gradient_class(identifier)
20
+ index = Digest::MD5.hexdigest(identifier.to_s)[0..7].to_i(16) % AVATAR_GRADIENTS.length
21
+ AVATAR_GRADIENTS[index]
22
+ end
23
+
24
+ # render an avatar for a user
25
+ # if user doesn't have an avatar, the user's initials will be displayed on a rounded-lg background
26
+ # @param user [Spree::User] the user to render the avatar for
27
+ # @param options [Hash] the options for the avatar
28
+ # @option options [Integer] :width the width of the avatar, default: 128
29
+ # @option options [Integer] :height the height of the avatar, default: 128
30
+ # @option options [String] :class the CSS class(es) of the avatar, default: 'avatar'
31
+ # @return [String] the avatar
32
+ def render_avatar(user, options = {})
33
+ return unless user.present?
34
+
35
+ options[:width] ||= 128
36
+ options[:height] ||= 128
37
+ options[:class] ||= 'avatar rounded-lg flex items-center justify-center text-white text-lg'
38
+
39
+ if user.respond_to?(:avatar) && user.avatar.attached? && user.avatar.variable?
40
+ spree_image_tag(
41
+ user.avatar,
42
+ width: options[:width],
43
+ height: options[:height],
44
+ class: options[:class],
45
+ style: "width: #{options[:width]}px; height: #{options[:height]}px;"
46
+ )
47
+ else
48
+ gradient = avatar_gradient_class(user.email)
49
+ content_tag :div, user.name&.initials,
50
+ class: "#{gradient} #{options[:class]}",
51
+ style: "width: #{options[:width]}px; height: #{options[:height]}px;"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end