spree_admin 5.2.6 → 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 (805) 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/admin_users_controller.rb +11 -2
  45. data/app/controllers/spree/admin/bulk_operations_controller.rb +34 -0
  46. data/app/controllers/spree/admin/checkouts_controller.rb +15 -3
  47. data/app/controllers/spree/admin/classifications_controller.rb +1 -2
  48. data/app/controllers/spree/admin/countries_controller.rb +13 -0
  49. data/app/controllers/spree/admin/customer_group_users_controller.rb +77 -0
  50. data/app/controllers/spree/admin/customer_groups_controller.rb +44 -0
  51. data/app/controllers/spree/admin/gift_cards_controller.rb +1 -0
  52. data/app/controllers/spree/admin/option_values_controller.rb +1 -1
  53. data/app/controllers/spree/admin/orders/adjustments_controller.rb +120 -0
  54. data/app/controllers/spree/admin/orders/order_promotions_controller.rb +59 -0
  55. data/app/controllers/spree/admin/orders_controller.rb +29 -29
  56. data/app/controllers/spree/admin/post_categories_controller.rb +7 -1
  57. data/app/controllers/spree/admin/posts_controller.rb +3 -2
  58. data/app/controllers/spree/admin/price_list_products_controller.rb +49 -0
  59. data/app/controllers/spree/admin/price_lists_controller.rb +54 -0
  60. data/app/controllers/spree/admin/price_rules_controller.rb +52 -0
  61. data/app/controllers/spree/admin/products_controller.rb +13 -72
  62. data/app/controllers/spree/admin/promotion_rules_controller.rb +9 -1
  63. data/app/controllers/spree/admin/promotions_controller.rb +11 -23
  64. data/app/controllers/spree/admin/resource_controller.rb +46 -5
  65. data/app/controllers/spree/admin/stock_items_controller.rb +2 -1
  66. data/app/controllers/spree/admin/stock_locations_controller.rb +9 -0
  67. data/app/controllers/spree/admin/table_columns_controller.rb +38 -0
  68. data/app/controllers/spree/admin/tags_controller.rb +32 -0
  69. data/app/controllers/spree/admin/users_controller.rb +57 -13
  70. data/app/controllers/spree/admin/variants_controller.rb +1 -1
  71. data/app/controllers/spree/admin/webhook_deliveries_controller.rb +20 -0
  72. data/app/controllers/spree/admin/webhook_endpoints_controller.rb +26 -0
  73. data/app/helpers/spree/admin/avatars_helper.rb +56 -0
  74. data/app/helpers/spree/admin/base_helper.rb +68 -47
  75. data/app/helpers/spree/admin/bulk_editor_helper.rb +41 -0
  76. data/app/helpers/spree/admin/bulk_operations_helper.rb +2 -2
  77. data/app/helpers/spree/admin/code_block_helper.rb +18 -0
  78. data/app/helpers/spree/admin/dialog_helper.rb +30 -0
  79. data/app/helpers/spree/admin/drawer_helper.rb +30 -0
  80. data/app/helpers/spree/admin/json_preview_helper.rb +18 -10
  81. data/app/helpers/spree/admin/modal_helper.rb +1 -1
  82. data/app/helpers/spree/admin/navigation_helper.rb +7 -7
  83. data/app/helpers/spree/admin/onboarding_helper.rb +3 -3
  84. data/app/helpers/spree/admin/orders_filters_helper.rb +18 -55
  85. data/app/helpers/spree/admin/orders_helper.rb +4 -0
  86. data/app/helpers/spree/admin/price_lists_helper.rb +20 -0
  87. data/app/helpers/spree/admin/products_helper.rb +4 -4
  88. data/app/helpers/spree/admin/promotions_helper.rb +1 -0
  89. data/app/helpers/spree/admin/stores_helper.rb +2 -2
  90. data/app/helpers/spree/admin/table_helper.rb +437 -0
  91. data/app/helpers/spree/admin/taxons_helper.rb +1 -1
  92. data/app/helpers/spree/admin/turbo_helper.rb +9 -3
  93. data/app/helpers/spree/admin/webhook_endpoints_helper.rb +95 -0
  94. data/app/helpers/tom_select_helper.rb +2 -2
  95. data/app/javascript/spree/admin/application.js +13 -1
  96. data/app/javascript/spree/admin/controllers/bulk_editor_controller.js +867 -0
  97. data/app/javascript/spree/admin/controllers/bulk_operation_controller.js +31 -5
  98. data/app/javascript/spree/admin/controllers/column_selector_controller.js +35 -0
  99. data/app/javascript/spree/admin/controllers/dropdown_controller.js +20 -2
  100. data/app/javascript/spree/admin/controllers/font_picker_controller.js +1 -1
  101. data/app/javascript/spree/admin/controllers/media_form_controller.js +3 -3
  102. data/app/javascript/spree/admin/controllers/money_field_controller.js +150 -0
  103. data/app/javascript/spree/admin/controllers/order_billing_address_controller.js +2 -2
  104. data/app/javascript/spree/admin/controllers/product_form_controller.js +6 -6
  105. data/app/javascript/spree/admin/controllers/query_builder_controller.js +618 -0
  106. data/app/javascript/spree/admin/controllers/replace_controller.js +4 -4
  107. data/app/javascript/spree/admin/controllers/search_clear_controller.js +22 -0
  108. data/app/javascript/spree/admin/controllers/select_controller.js +9 -3
  109. data/app/javascript/spree/admin/controllers/seo_form_controller.js +5 -5
  110. data/app/javascript/spree/admin/controllers/sidebar_controller.js +2 -2
  111. data/app/javascript/spree/admin/controllers/sticky_controller.js +6 -2
  112. data/app/javascript/spree/admin/controllers/table_controller.js +20 -0
  113. data/app/javascript/spree/admin/controllers/variants_form_controller.js +142 -28
  114. data/app/javascript/spree/admin/helpers/trix/video_embed.js +5 -5
  115. data/app/javascript/spree/admin/helpers/turbo_confirm.js +38 -0
  116. data/app/models/spree/admin/form_builder.rb +134 -38
  117. data/app/models/spree/admin/table/builder.rb +55 -0
  118. data/app/models/spree/admin/table/bulk_action.rb +95 -0
  119. data/app/models/spree/admin/table/column.rb +111 -0
  120. data/app/models/spree/admin/table/filter.rb +116 -0
  121. data/app/models/spree/admin/table/filter_group.rb +144 -0
  122. data/app/models/spree/admin/table/query_builder.rb +114 -0
  123. data/app/models/spree/admin/table/visibility.rb +20 -0
  124. data/app/models/spree/admin/table.rb +313 -0
  125. data/app/presenters/spree/admin/order_summary_presenter.rb +190 -0
  126. data/app/subscribers/spree/admin/import_row_subscriber.rb +68 -0
  127. data/app/subscribers/spree/admin/import_subscriber.rb +35 -0
  128. data/app/views/active_storage/_upload_form.html.erb +9 -7
  129. data/app/views/layouts/spree/admin.html.erb +5 -5
  130. data/app/views/layouts/spree/admin_settings.html.erb +5 -6
  131. data/app/views/layouts/spree/admin_wizard.html.erb +6 -6
  132. data/app/views/layouts/spree/minimal.html.erb +10 -10
  133. data/app/views/spree/admin/admin_users/_admin_user.html.erb +6 -6
  134. data/app/views/spree/admin/admin_users/_audit_log.html.erb +1 -1
  135. data/app/views/spree/admin/admin_users/edit.html.erb +1 -1
  136. data/app/views/spree/admin/admin_users/index.html.erb +2 -2
  137. data/app/views/spree/admin/admin_users/new.html.erb +3 -3
  138. data/app/views/spree/admin/admin_users/show.html.erb +16 -16
  139. data/app/views/spree/admin/bulk_operations/forms/_confirmation.html.erb +1 -0
  140. data/app/views/spree/admin/bulk_operations/forms/_tag_picker.html.erb +8 -0
  141. data/app/views/spree/admin/bulk_operations/forms/_taxon_picker.html.erb +5 -0
  142. data/app/views/spree/admin/bulk_operations/new.html.erb +16 -0
  143. data/app/views/spree/admin/checkouts/index.html.erb +9 -0
  144. data/app/views/spree/admin/classifications/_classification.html.erb +9 -9
  145. data/app/views/spree/admin/classifications/create.turbo_stream.erb +1 -1
  146. data/app/views/spree/admin/classifications/destroy.turbo_stream.erb +1 -1
  147. data/app/views/spree/admin/classifications/index.html.erb +1 -1
  148. data/app/views/spree/admin/coupon_codes/_filters.html.erb +3 -3
  149. data/app/views/spree/admin/coupon_codes/_table_row.html.erb +3 -3
  150. data/app/views/spree/admin/coupon_codes/index.html.erb +3 -3
  151. data/app/views/spree/admin/custom_domains/_custom_domains.html.erb +1 -1
  152. data/app/views/spree/admin/custom_domains/_form.html.erb +1 -1
  153. data/app/views/spree/admin/custom_domains/index.html.erb +20 -20
  154. data/app/views/spree/admin/customer_group_users/bulk_create.turbo_stream.erb +15 -0
  155. data/app/views/spree/admin/customer_group_users/bulk_destroy.turbo_stream.erb +17 -0
  156. data/app/views/spree/admin/customer_group_users/bulk_new.html.erb +27 -0
  157. data/app/views/spree/admin/customer_group_users/index.html.erb +1 -0
  158. data/app/views/spree/admin/customer_groups/_customers_header.html.erb +12 -0
  159. data/app/views/spree/admin/customer_groups/_details.html.erb +59 -0
  160. data/app/views/spree/admin/customer_groups/_form.html.erb +6 -0
  161. data/app/views/spree/admin/customer_groups/edit.html.erb +1 -0
  162. data/app/views/spree/admin/customer_groups/index.html.erb +9 -0
  163. data/app/views/spree/admin/customer_groups/show.html.erb +19 -0
  164. data/app/views/spree/admin/customer_groups/update.turbo_stream.erb +17 -0
  165. data/app/views/spree/admin/customer_returns/_table_row.html.erb +1 -1
  166. data/app/views/spree/admin/customer_returns/index.html.erb +1 -1
  167. data/app/views/spree/admin/dashboard/_setup_progress.html.erb +3 -3
  168. data/app/views/spree/admin/dashboard/_setup_tasks.html.erb +16 -10
  169. data/app/views/spree/admin/dashboard/_sidebar.html.erb +1 -2
  170. data/app/views/spree/admin/dashboard/_top_products.html.erb +10 -10
  171. data/app/views/spree/admin/dashboard/_updater.html.erb +1 -1
  172. data/app/views/spree/admin/dashboard/_visits.html.erb +22 -22
  173. data/app/views/spree/admin/dashboard/analytics.html.erb +28 -28
  174. data/app/views/spree/admin/dashboard/getting_started.html.erb +3 -3
  175. data/app/views/spree/admin/dashboard/setup_tasks/_add_products.html.erb +1 -1
  176. data/app/views/spree/admin/dashboard/setup_tasks/_set_customer_support_email.html.erb +4 -6
  177. data/app/views/spree/admin/dashboard/setup_tasks/_setup_payment_method.html.erb +7 -3
  178. data/app/views/spree/admin/dashboard/setup_tasks/_setup_taxes_collection.html.erb +4 -2
  179. data/app/views/spree/admin/dashboard/show.html.erb +8 -8
  180. data/app/views/spree/admin/digital_assets/_form.html.erb +2 -2
  181. data/app/views/spree/admin/digital_assets/_table.html.erb +2 -2
  182. data/app/views/spree/admin/errors/403.html.erb +2 -2
  183. data/app/views/spree/admin/errors/404.html.erb +2 -2
  184. data/app/views/spree/admin/errors/422.html.erb +2 -2
  185. data/app/views/spree/admin/errors/500.html.erb +2 -2
  186. data/app/views/spree/admin/errors/503.html.erb +2 -2
  187. data/app/views/spree/admin/exports/_export.html.erb +1 -1
  188. data/app/views/spree/admin/exports/new.html.erb +7 -9
  189. data/app/views/spree/admin/gift_card_batches/_form.html.erb +3 -3
  190. data/app/views/spree/admin/gift_cards/_filters.html.erb +6 -6
  191. data/app/views/spree/admin/gift_cards/_form.html.erb +3 -3
  192. data/app/views/spree/admin/gift_cards/_gift_card.html.erb +4 -4
  193. data/app/views/spree/admin/gift_cards/_list.html.erb +1 -1
  194. data/app/views/spree/admin/gift_cards/_table_filter_dropdown.html.erb +1 -1
  195. data/app/views/spree/admin/gift_cards/edit.html.erb +2 -2
  196. data/app/views/spree/admin/gift_cards/index.html.erb +21 -36
  197. data/app/views/spree/admin/gift_cards/show.html.erb +32 -32
  198. data/app/views/spree/admin/import_rows/show.html.erb +8 -8
  199. data/app/views/spree/admin/imports/_footer.html.erb +2 -2
  200. data/app/views/spree/admin/imports/_loader.html.erb +7 -7
  201. data/app/views/spree/admin/imports/_mapping.html.erb +3 -3
  202. data/app/views/spree/admin/imports/_mapping_footer.html.erb +4 -4
  203. data/app/views/spree/admin/imports/_mapping_icon.html.erb +1 -1
  204. data/app/views/spree/admin/imports/_row.html.erb +6 -6
  205. data/app/views/spree/admin/imports/new.html.erb +1 -1
  206. data/app/views/spree/admin/imports/show.html.erb +7 -7
  207. data/app/views/spree/admin/integrations/_integration.html.erb +6 -6
  208. data/app/views/spree/admin/integrations/edit.html.erb +6 -2
  209. data/app/views/spree/admin/integrations/index.html.erb +9 -9
  210. data/app/views/spree/admin/integrations/new.html.erb +2 -2
  211. data/app/views/spree/admin/invitations/_invitation.html.erb +3 -3
  212. data/app/views/spree/admin/invitations/index.html.erb +2 -2
  213. data/app/views/spree/admin/invitations/show.html.erb +2 -2
  214. data/app/views/spree/admin/json_previews/show.html.erb +8 -8
  215. data/app/views/spree/admin/line_items/edit.html.erb +4 -4
  216. data/app/views/spree/admin/line_items/new.html.erb +4 -4
  217. data/app/views/spree/admin/metafield_definitions/_filters.html.erb +2 -2
  218. data/app/views/spree/admin/metafield_definitions/_form.html.erb +6 -6
  219. data/app/views/spree/admin/metafield_definitions/_table_row.html.erb +2 -2
  220. data/app/views/spree/admin/metafield_definitions/index.html.erb +1 -1
  221. data/app/views/spree/admin/metafields/edit.html.erb +6 -6
  222. data/app/views/spree/admin/metafields/types/_boolean.html.erb +1 -1
  223. data/app/views/spree/admin/metafields/types/_json.html.erb +1 -1
  224. data/app/views/spree/admin/metafields/types/_long_text.html.erb +1 -1
  225. data/app/views/spree/admin/metafields/types/_number.html.erb +1 -1
  226. data/app/views/spree/admin/metafields/types/_short_text.html.erb +1 -1
  227. data/app/views/spree/admin/newsletter_subscribers/_filters.html.erb +2 -2
  228. data/app/views/spree/admin/newsletter_subscribers/_table_row.html.erb +3 -3
  229. data/app/views/spree/admin/newsletter_subscribers/index.html.erb +1 -1
  230. data/app/views/spree/admin/oauth_applications/_form.html.erb +1 -1
  231. data/app/views/spree/admin/oauth_applications/_table_row.html.erb +3 -3
  232. data/app/views/spree/admin/oauth_applications/create.turbo_stream.erb +8 -8
  233. data/app/views/spree/admin/oauth_applications/index.html.erb +2 -2
  234. data/app/views/spree/admin/option_types/_form.html.erb +10 -10
  235. data/app/views/spree/admin/option_types/_option_value_fields.html.erb +3 -3
  236. data/app/views/spree/admin/option_types/_table_row.html.erb +2 -2
  237. data/app/views/spree/admin/option_types/edit.html.erb +1 -12
  238. data/app/views/spree/admin/option_types/index.html.erb +1 -1
  239. data/app/views/spree/admin/option_types/new.html.erb +1 -11
  240. data/app/views/spree/admin/orders/_adjustment.html.erb +72 -0
  241. data/app/views/spree/admin/orders/_adjustments.html.erb +41 -0
  242. data/app/views/spree/admin/orders/_customer.html.erb +13 -13
  243. data/app/views/spree/admin/orders/_customer_returns.html.erb +3 -3
  244. data/app/views/spree/admin/orders/_customer_summary.html.erb +4 -4
  245. data/app/views/spree/admin/orders/_filters.html.erb +9 -9
  246. data/app/views/spree/admin/orders/_form.html.erb +1 -1
  247. data/app/views/spree/admin/orders/_header.html.erb +2 -2
  248. data/app/views/spree/admin/orders/_line_item.html.erb +2 -2
  249. data/app/views/spree/admin/orders/_line_items.html.erb +43 -36
  250. data/app/views/spree/admin/orders/_order.html.erb +2 -2
  251. data/app/views/spree/admin/orders/_order_promotion.html.erb +32 -0
  252. data/app/views/spree/admin/orders/_payments.html.erb +8 -8
  253. data/app/views/spree/admin/orders/_promotions.html.erb +37 -0
  254. data/app/views/spree/admin/orders/_refunds.html.erb +5 -5
  255. data/app/views/spree/admin/orders/_return_authorizations.html.erb +3 -3
  256. data/app/views/spree/admin/orders/_risk_analysis.html.erb +3 -3
  257. data/app/views/spree/admin/orders/_shipment.html.erb +15 -15
  258. data/app/views/spree/admin/orders/_shipment_manifest_item.html.erb +5 -5
  259. data/app/views/spree/admin/orders/_shipments.html.erb +6 -6
  260. data/app/views/spree/admin/orders/_special_instructions.html.erb +1 -1
  261. data/app/views/spree/admin/orders/_summary.html.erb +21 -95
  262. data/app/views/spree/admin/orders/_table_filter_dropdown.html.erb +2 -2
  263. data/app/views/spree/admin/orders/_tax_lines.html.erb +2 -2
  264. data/app/views/spree/admin/orders/_tax_rates.html.erb +86 -0
  265. data/app/views/spree/admin/orders/_user_overview.html.erb +2 -2
  266. data/app/views/spree/admin/orders/adjustments/_form.html.erb +6 -0
  267. data/app/views/spree/admin/orders/adjustments/create.turbo_stream.erb +10 -0
  268. data/app/views/spree/admin/orders/adjustments/destroy.turbo_stream.erb +9 -0
  269. data/app/views/spree/admin/orders/adjustments/edit.html.erb +13 -0
  270. data/app/views/spree/admin/orders/adjustments/new.html.erb +15 -0
  271. data/app/views/spree/admin/orders/adjustments/toggle_state.turbo_stream.erb +9 -0
  272. data/app/views/spree/admin/orders/adjustments/update.turbo_stream.erb +10 -0
  273. data/app/views/spree/admin/orders/billing_address/_form.html.erb +3 -3
  274. data/app/views/spree/admin/orders/billing_address/create.turbo_stream.erb +7 -7
  275. data/app/views/spree/admin/orders/billing_address/edit.html.erb +9 -9
  276. data/app/views/spree/admin/orders/billing_address/new.html.erb +7 -7
  277. data/app/views/spree/admin/orders/billing_address/update.turbo_stream.erb +7 -7
  278. data/app/views/spree/admin/orders/contact_information/edit.html.erb +1 -1
  279. data/app/views/spree/admin/orders/customer_returns/_customer_return.html.erb +1 -1
  280. data/app/views/spree/admin/orders/customer_returns/_reimbursements_table.html.erb +1 -1
  281. data/app/views/spree/admin/orders/customer_returns/_return_item_decision.html.erb +1 -1
  282. data/app/views/spree/admin/orders/customer_returns/_return_item_selection.html.erb +4 -4
  283. data/app/views/spree/admin/orders/customer_returns/edit.html.erb +12 -12
  284. data/app/views/spree/admin/orders/customer_returns/new.html.erb +6 -6
  285. data/app/views/spree/admin/orders/index.html.erb +4 -21
  286. data/app/views/spree/admin/orders/new.html.erb +3 -3
  287. data/app/views/spree/admin/orders/order_promotions/create.turbo_stream.erb +16 -0
  288. data/app/views/spree/admin/orders/order_promotions/destroy.turbo_stream.erb +15 -0
  289. data/app/views/spree/admin/orders/order_promotions/new.html.erb +15 -0
  290. data/app/views/spree/admin/orders/return_authorizations/_form.html.erb +7 -7
  291. data/app/views/spree/admin/orders/return_authorizations/_return_authorization.html.erb +1 -1
  292. data/app/views/spree/admin/orders/return_authorizations/edit.html.erb +2 -2
  293. data/app/views/spree/admin/orders/return_authorizations/show.html.erb +8 -8
  294. data/app/views/spree/admin/orders/shipping_address/_form.html.erb +2 -2
  295. data/app/views/spree/admin/orders/shipping_address/create.turbo_stream.erb +1 -1
  296. data/app/views/spree/admin/orders/shipping_address/edit.html.erb +1 -1
  297. data/app/views/spree/admin/orders/shipping_address/new.html.erb +1 -1
  298. data/app/views/spree/admin/orders/shipping_address/update.turbo_stream.erb +1 -1
  299. data/app/views/spree/admin/orders/show.html.erb +24 -0
  300. data/app/views/spree/admin/orders/update.turbo_stream.erb +5 -0
  301. data/app/views/spree/admin/orders/user/new.html.erb +7 -7
  302. data/app/views/spree/admin/payment_methods/_available_payment_method.html.erb +3 -3
  303. data/app/views/spree/admin/payment_methods/_form.html.erb +3 -3
  304. data/app/views/spree/admin/payment_methods/_payment_method.html.erb +8 -8
  305. data/app/views/spree/admin/payment_methods/edit.html.erb +2 -2
  306. data/app/views/spree/admin/payment_methods/index.html.erb +3 -3
  307. data/app/views/spree/admin/payment_methods/new.html.erb +2 -2
  308. data/app/views/spree/admin/payments/_payment.html.erb +17 -17
  309. data/app/views/spree/admin/payments/new.html.erb +13 -23
  310. data/app/views/spree/admin/payments/source_forms/_gateway.html.erb +10 -10
  311. data/app/views/spree/admin/payments/source_forms/_previous_cards.html.erb +4 -4
  312. data/app/views/spree/admin/payments/source_forms/_spree_stripe.html.erb +1 -1
  313. data/app/views/spree/admin/payments/source_forms/_store_credit.html.erb +5 -5
  314. data/app/views/spree/admin/payments/source_views/_gateway.html.erb +1 -1
  315. data/app/views/spree/admin/payments/source_views/_storecredit.html.erb +1 -1
  316. data/app/views/spree/admin/policies/_filters.html.erb +1 -1
  317. data/app/views/spree/admin/policies/_form.html.erb +1 -1
  318. data/app/views/spree/admin/policies/_table_row.html.erb +2 -2
  319. data/app/views/spree/admin/policies/index.html.erb +1 -1
  320. data/app/views/spree/admin/post_categories/_form.html.erb +1 -1
  321. data/app/views/spree/admin/post_categories/_table_row.html.erb +1 -1
  322. data/app/views/spree/admin/post_categories/index.html.erb +1 -1
  323. data/app/views/spree/admin/posts/_form.html.erb +7 -7
  324. data/app/views/spree/admin/posts/_table_row.html.erb +1 -1
  325. data/app/views/spree/admin/posts/edit.html.erb +1 -11
  326. data/app/views/spree/admin/posts/filters.html.erb +4 -4
  327. data/app/views/spree/admin/posts/index.html.erb +1 -1
  328. data/app/views/spree/admin/posts/new.html.erb +1 -11
  329. data/app/views/spree/admin/preferences/_password_field.html.erb +14 -14
  330. data/app/views/spree/admin/price_list_products/bulk_create.turbo_stream.erb +11 -0
  331. data/app/views/spree/admin/price_list_products/bulk_destroy.turbo_stream.erb +13 -0
  332. data/app/views/spree/admin/price_list_products/bulk_new.html.erb +29 -0
  333. data/app/views/spree/admin/price_list_products/index.html.erb +1 -0
  334. data/app/views/spree/admin/price_lists/_details.html.erb +75 -0
  335. data/app/views/spree/admin/price_lists/_form.html.erb +8 -0
  336. data/app/views/spree/admin/price_lists/_products_header.html.erb +18 -0
  337. data/app/views/spree/admin/price_lists/_rules.html.erb +32 -0
  338. data/app/views/spree/admin/price_lists/_table_header.html.erb +7 -0
  339. data/app/views/spree/admin/price_lists/edit.html.erb +1 -0
  340. data/app/views/spree/admin/price_lists/edit_prices.html.erb +138 -0
  341. data/app/views/spree/admin/price_lists/index.html.erb +12 -0
  342. data/app/views/spree/admin/price_lists/new.html.erb +1 -0
  343. data/app/views/spree/admin/price_lists/show.html.erb +46 -0
  344. data/app/views/spree/admin/price_lists/update.turbo_stream.erb +17 -0
  345. data/app/views/spree/admin/price_rules/_price_rule.html.erb +28 -0
  346. data/app/views/spree/admin/price_rules/edit.html.erb +20 -0
  347. data/app/views/spree/admin/price_rules/forms/_customer_group_rule.html.erb +9 -0
  348. data/app/views/spree/admin/price_rules/forms/_user_rule.html.erb +7 -0
  349. data/app/views/spree/admin/price_rules/forms/_volume_rule.html.erb +11 -0
  350. data/app/views/spree/admin/price_rules/forms/_zone_rule.html.erb +7 -0
  351. data/app/views/spree/admin/price_rules/new.html.erb +36 -0
  352. data/app/views/spree/admin/products/_filters.html.erb +5 -5
  353. data/app/views/spree/admin/products/_form.html.erb +3 -3
  354. data/app/views/spree/admin/products/_product.html.erb +5 -5
  355. data/app/views/spree/admin/products/_search_result.html.erb +2 -2
  356. data/app/views/spree/admin/products/_search_results.html.erb +1 -1
  357. data/app/views/spree/admin/products/_table_filter_dropdown.html.erb +1 -1
  358. data/app/views/spree/admin/products/form/_base.html.erb +2 -2
  359. data/app/views/spree/admin/products/form/_categorization.html.erb +3 -3
  360. data/app/views/spree/admin/products/form/_inventory.html.erb +17 -32
  361. data/app/views/spree/admin/products/form/_properties.html.erb +7 -7
  362. data/app/views/spree/admin/products/form/_shipping.html.erb +1 -1
  363. data/app/views/spree/admin/products/form/_status.html.erb +7 -7
  364. data/app/views/spree/admin/products/form/_stores.html.erb +2 -2
  365. data/app/views/spree/admin/products/form/_tax.html.erb +1 -1
  366. data/app/views/spree/admin/products/form/_variants.html.erb +31 -21
  367. data/app/views/spree/admin/products/form/variants/_option_template.html.erb +8 -8
  368. data/app/views/spree/admin/products/form/variants/_variant_template.html.erb +9 -9
  369. data/app/views/spree/admin/products/index.html.erb +1 -14
  370. data/app/views/spree/admin/profile/edit.html.erb +3 -3
  371. data/app/views/spree/admin/promotion_actions/_promotion_action.html.erb +5 -5
  372. data/app/views/spree/admin/promotion_actions/edit.html.erb +3 -3
  373. data/app/views/spree/admin/promotion_actions/forms/_create_line_items.html.erb +1 -1
  374. data/app/views/spree/admin/promotion_actions/forms/_create_line_items_row.html.erb +2 -2
  375. data/app/views/spree/admin/promotion_actions/new.html.erb +4 -5
  376. data/app/views/spree/admin/promotion_rules/_promotion_rule.html.erb +14 -14
  377. data/app/views/spree/admin/promotion_rules/edit.html.erb +6 -3
  378. data/app/views/spree/admin/promotion_rules/forms/_customer_group.html.erb +9 -0
  379. data/app/views/spree/admin/promotion_rules/forms/_item_total.html.erb +12 -12
  380. data/app/views/spree/admin/promotion_rules/forms/_option_value.html.erb +1 -1
  381. data/app/views/spree/admin/promotion_rules/new.html.erb +7 -8
  382. data/app/views/spree/admin/promotions/_actions.html.erb +6 -6
  383. data/app/views/spree/admin/promotions/_filters.html.erb +5 -5
  384. data/app/views/spree/admin/promotions/_form.html.erb +3 -3
  385. data/app/views/spree/admin/promotions/_rules.html.erb +12 -19
  386. data/app/views/spree/admin/promotions/_sidebar.html.erb +25 -25
  387. data/app/views/spree/admin/promotions/_table_filter_dropdown.html.erb +1 -1
  388. data/app/views/spree/admin/promotions/_table_row.html.erb +4 -4
  389. data/app/views/spree/admin/promotions/edit.html.erb +6 -6
  390. data/app/views/spree/admin/promotions/form/_kind.html.erb +13 -13
  391. data/app/views/spree/admin/promotions/index.html.erb +1 -1
  392. data/app/views/spree/admin/promotions/show.html.erb +3 -3
  393. data/app/views/spree/admin/properties/_form.html.erb +1 -1
  394. data/app/views/spree/admin/properties/_table_row.html.erb +3 -3
  395. data/app/views/spree/admin/refunds/_form.html.erb +1 -1
  396. data/app/views/spree/admin/refunds/new.html.erb +5 -5
  397. data/app/views/spree/admin/reimbursement_types/_form.html.erb +1 -1
  398. data/app/views/spree/admin/reimbursements/edit.html.erb +7 -7
  399. data/app/views/spree/admin/reimbursements/show.html.erb +3 -3
  400. data/app/views/spree/admin/reports/new.html.erb +5 -6
  401. data/app/views/spree/admin/return_authorizations/_table_row.html.erb +2 -2
  402. data/app/views/spree/admin/return_authorizations/filters.html.erb +2 -2
  403. data/app/views/spree/admin/roles/_form.html.erb +1 -1
  404. data/app/views/spree/admin/shared/_alerts.html.erb +5 -5
  405. data/app/views/spree/admin/shared/_analytics_loader_skeleton.html.erb +24 -28
  406. data/app/views/spree/admin/shared/_back_to_dashboard.html.erb +1 -1
  407. data/app/views/spree/admin/shared/_breadcrumbs.html.erb +2 -2
  408. data/app/views/spree/admin/shared/_bulk_modal.html.erb +8 -9
  409. data/app/views/spree/admin/shared/_calculator_fields.html.erb +2 -2
  410. data/app/views/spree/admin/shared/_calendar_range_picker.html.erb +4 -4
  411. data/app/views/spree/admin/shared/_content_header.html.erb +6 -6
  412. data/app/views/spree/admin/shared/_dialog.html.erb +2 -2
  413. data/app/views/spree/admin/shared/_drawer.html.erb +2 -2
  414. data/app/views/spree/admin/shared/_edit_resource.html.erb +2 -2
  415. data/app/views/spree/admin/shared/_edit_resource_in_drawer.html.erb +13 -0
  416. data/app/views/spree/admin/shared/_error_messages.html.erb +1 -1
  417. data/app/views/spree/admin/shared/_export_modal.html.erb +2 -2
  418. data/app/views/spree/admin/shared/_filter_badge_template.erb +1 -1
  419. data/app/views/spree/admin/shared/_filters_button.html.erb +1 -1
  420. data/app/views/spree/admin/shared/_filters_search_bar.html.erb +3 -10
  421. data/app/views/spree/admin/shared/_footer.html.erb +1 -1
  422. data/app/views/spree/admin/shared/_growth_rate_badge.html.erb +4 -4
  423. data/app/views/spree/admin/shared/_head.html.erb +5 -13
  424. data/app/views/spree/admin/shared/_header.html.erb +10 -22
  425. data/app/views/spree/admin/shared/_index_table_options.html.erb +26 -11
  426. data/app/views/spree/admin/shared/_internal_note.html.erb +41 -0
  427. data/app/views/spree/admin/shared/_map.html.erb +1 -1
  428. data/app/views/spree/admin/shared/_media_asset.html.erb +3 -3
  429. data/app/views/spree/admin/shared/_media_form.html.erb +4 -4
  430. data/app/views/spree/admin/shared/_modal.html.erb +4 -8
  431. data/app/views/spree/admin/shared/_multi_product_picker.html.erb +3 -3
  432. data/app/views/spree/admin/shared/_navigation.html.erb +2 -4
  433. data/app/views/spree/admin/shared/_navigation_item.html.erb +6 -10
  434. data/app/views/spree/admin/shared/_new_item_dropdown.html.erb +1 -1
  435. data/app/views/spree/admin/shared/_new_resource.html.erb +2 -2
  436. data/app/views/spree/admin/shared/_no_image.html.erb +2 -2
  437. data/app/views/spree/admin/shared/_no_resource_found.html.erb +3 -3
  438. data/app/views/spree/admin/shared/_page_alerts.html.erb +1 -1
  439. data/app/views/spree/admin/shared/_page_tabs.html.erb +1 -1
  440. data/app/views/spree/admin/shared/_preferences.html.erb +3 -3
  441. data/app/views/spree/admin/shared/_product_image.html.erb +2 -2
  442. data/app/views/spree/admin/shared/_refunds.html.erb +1 -1
  443. data/app/views/spree/admin/shared/_seo.html.erb +10 -10
  444. data/app/views/spree/admin/shared/_sidebar.html.erb +20 -3
  445. data/app/views/spree/admin/shared/_spinner.html.erb +3 -2
  446. data/app/views/spree/admin/shared/_turbo_confirm_dialog.html.erb +23 -0
  447. data/app/views/spree/admin/shared/_user.html.erb +5 -5
  448. data/app/views/spree/admin/shared/_user_dropdown.html.erb +5 -5
  449. data/app/views/spree/admin/shared/devise/_links.html.erb +3 -3
  450. data/app/views/spree/admin/shared/named_types/_form.html.erb +1 -1
  451. data/app/views/spree/admin/shared/sidebar/_customers_nav.html.erb +2 -2
  452. data/app/views/spree/admin/shared/sidebar/_enterprise_edition_notice.html.erb +2 -2
  453. data/app/views/spree/admin/shared/sidebar/_orders_nav.html.erb +1 -1
  454. data/app/views/spree/admin/shared/sidebar/_products_nav.html.erb +2 -2
  455. data/app/views/spree/admin/shared/sidebar/_promotions_nav.html.erb +2 -2
  456. data/app/views/spree/admin/shared/sidebar/_returns_nav.html.erb +1 -1
  457. data/app/views/spree/admin/shared/sidebar/_store_dropdown.html.erb +7 -7
  458. data/app/views/spree/admin/shared/sidebar/_store_nav.html.erb +7 -7
  459. data/app/views/spree/admin/shared/sidebar/_storefront_nav.html.erb +2 -2
  460. data/app/views/spree/admin/shared/sidebar/_vendors_nav.html.erb +2 -2
  461. data/app/views/spree/admin/shared/sortable_tree/_taxonomy.html.erb +13 -13
  462. data/app/views/spree/admin/shipments/edit.html.erb +12 -12
  463. data/app/views/spree/admin/shipments/split.html.erb +6 -6
  464. data/app/views/spree/admin/shipping_categories/_form.html.erb +1 -1
  465. data/app/views/spree/admin/shipping_categories/_table_row.html.erb +1 -1
  466. data/app/views/spree/admin/shipping_methods/_form.html.erb +3 -3
  467. data/app/views/spree/admin/shipping_methods/_table_row.html.erb +2 -2
  468. data/app/views/spree/admin/shipping_methods/form/_display.html.erb +7 -44
  469. data/app/views/spree/admin/shipping_methods/form/_estimated_transit_business_days.html.erb +4 -10
  470. data/app/views/spree/admin/shipping_methods/form/_shipping_categories.html.erb +2 -2
  471. data/app/views/spree/admin/shipping_methods/form/_tax_category.html.erb +2 -2
  472. data/app/views/spree/admin/shipping_methods/form/_tracking_url.html.erb +2 -2
  473. data/app/views/spree/admin/shipping_methods/form/_zones.html.erb +7 -7
  474. data/app/views/spree/admin/stock_items/_filters.html.erb +5 -5
  475. data/app/views/spree/admin/stock_items/_table_row.html.erb +5 -5
  476. data/app/views/spree/admin/stock_items/index.html.erb +1 -1
  477. data/app/views/spree/admin/stock_locations/_form.html.erb +2 -2
  478. data/app/views/spree/admin/stock_locations/_table_row.html.erb +2 -2
  479. data/app/views/spree/admin/stock_transfers/_destination_movement_form.html.erb +7 -7
  480. data/app/views/spree/admin/stock_transfers/_filters.html.erb +5 -5
  481. data/app/views/spree/admin/stock_transfers/_new_variant_modal.html.erb +4 -4
  482. data/app/views/spree/admin/stock_transfers/_table_row.html.erb +2 -2
  483. data/app/views/spree/admin/stock_transfers/index.html.erb +1 -1
  484. data/app/views/spree/admin/stock_transfers/new.html.erb +9 -9
  485. data/app/views/spree/admin/stock_transfers/show.html.erb +12 -12
  486. data/app/views/spree/admin/store_credit_categories/edit.html.erb +1 -1
  487. data/app/views/spree/admin/store_credit_categories/new.html.erb +1 -1
  488. data/app/views/spree/admin/store_credit_events/_store_credit_event.html.erb +1 -1
  489. data/app/views/spree/admin/store_credits/_form.html.erb +1 -1
  490. data/app/views/spree/admin/store_credits/edit.html.erb +1 -1
  491. data/app/views/spree/admin/store_credits/new.html.erb +3 -3
  492. data/app/views/spree/admin/store_credits/show.html.erb +23 -23
  493. data/app/views/spree/admin/stores/edit.html.erb +3 -3
  494. data/app/views/spree/admin/stores/edit_emails.html.erb +3 -3
  495. data/app/views/spree/admin/stores/form/_basic.html.erb +23 -14
  496. data/app/views/spree/admin/stores/form/_checkout.html.erb +16 -14
  497. data/app/views/spree/admin/stores/form/_checkout_links.html.erb +8 -8
  498. data/app/views/spree/admin/stores/form/_emails.html.erb +5 -5
  499. data/app/views/spree/admin/stores/form/_policies.html.erb +10 -10
  500. data/app/views/spree/admin/stores/new.html.erb +16 -16
  501. data/app/views/spree/admin/tables/_column_selector.html.erb +52 -0
  502. data/app/views/spree/admin/tables/_filter_group.html.erb +33 -0
  503. data/app/views/spree/admin/tables/_filter_row.html.erb +29 -0
  504. data/app/views/spree/admin/tables/_query_builder.html.erb +95 -0
  505. data/app/views/spree/admin/tables/_row_actions.html.erb +15 -0
  506. data/app/views/spree/admin/tables/_table.html.erb +69 -0
  507. data/app/views/spree/admin/tables/_table_body.html.erb +97 -0
  508. data/app/views/spree/admin/tables/_table_row.html.erb +44 -0
  509. data/app/views/spree/admin/tables/columns/_gift_card_status.html.erb +2 -0
  510. data/app/views/spree/admin/tables/columns/_metafield_definition_display_on.html.erb +4 -0
  511. data/app/views/spree/admin/tables/columns/_newsletter_subscriber_customer.html.erb +6 -0
  512. data/app/views/spree/admin/tables/columns/_order_payment_state.html.erb +2 -0
  513. data/app/views/spree/admin/tables/columns/_order_shipment_state.html.erb +2 -0
  514. data/app/views/spree/admin/tables/columns/_order_stock_locations.html.erb +4 -0
  515. data/app/views/spree/admin/tables/columns/_price_list_status.html.erb +1 -0
  516. data/app/views/spree/admin/tables/columns/_product_inventory.html.erb +3 -0
  517. data/app/views/spree/admin/tables/columns/_product_name.html.erb +8 -0
  518. data/app/views/spree/admin/tables/columns/_product_status.html.erb +4 -0
  519. data/app/views/spree/admin/tables/columns/_promotion_code.html.erb +8 -0
  520. data/app/views/spree/admin/tables/columns/_promotion_kind.html.erb +9 -0
  521. data/app/views/spree/admin/tables/columns/_stock_item_backorderable.html.erb +14 -0
  522. data/app/views/spree/admin/tables/columns/_stock_item_count_on_hand.html.erb +14 -0
  523. data/app/views/spree/admin/tables/columns/_stock_item_location.html.erb +6 -0
  524. data/app/views/spree/admin/tables/columns/_user_location.html.erb +2 -0
  525. data/app/views/spree/admin/tables/columns/_webhook_deliveries_stats.html.erb +3 -0
  526. data/app/views/spree/admin/tables/columns/_webhook_delivery_actions.html.erb +5 -0
  527. data/app/views/spree/admin/tables/columns/_webhook_delivery_status.html.erb +2 -0
  528. data/app/views/spree/admin/tax_categories/_form.html.erb +1 -1
  529. data/app/views/spree/admin/tax_rates/_form.html.erb +2 -2
  530. data/app/views/spree/admin/tax_rates/_table_row.html.erb +1 -1
  531. data/app/views/spree/admin/taxonomies/_form.html.erb +1 -1
  532. data/app/views/spree/admin/taxonomies/_table_row.html.erb +3 -3
  533. data/app/views/spree/admin/taxons/_form.html.erb +24 -23
  534. data/app/views/spree/admin/taxons/_rule_form.html.erb +9 -9
  535. data/app/views/spree/admin/taxons/_rules_form.html.erb +7 -7
  536. data/app/views/spree/admin/taxons/rule_forms/_available_on.html.erb +3 -3
  537. data/app/views/spree/admin/taxons/rule_forms/_sale.html.erb +1 -1
  538. data/app/views/spree/admin/translations/edit.html.erb +3 -3
  539. data/app/views/spree/admin/translations/option_types/_form.html.erb +2 -2
  540. data/app/views/spree/admin/translations/products/_form.html.erb +1 -1
  541. data/app/views/spree/admin/user_passwords/edit.html.erb +6 -6
  542. data/app/views/spree/admin/user_passwords/new.html.erb +4 -4
  543. data/app/views/spree/admin/user_sessions/new.html.erb +6 -6
  544. data/app/views/spree/admin/users/_billing.html.erb +4 -4
  545. data/app/views/spree/admin/users/_details.html.erb +34 -25
  546. data/app/views/spree/admin/users/_filters.html.erb +10 -10
  547. data/app/views/spree/admin/users/_form.html.erb +23 -3
  548. data/app/views/spree/admin/users/_form_fields.html.erb +1 -1
  549. data/app/views/spree/admin/users/_last_order.html.erb +6 -6
  550. data/app/views/spree/admin/users/_last_order_line_item.html.erb +7 -7
  551. data/app/views/spree/admin/users/_lifetime_stats.html.erb +31 -40
  552. data/app/views/spree/admin/users/_search_result.html.erb +13 -0
  553. data/app/views/spree/admin/users/_search_results.html.erb +9 -0
  554. data/app/views/spree/admin/users/_shipping.html.erb +4 -4
  555. data/app/views/spree/admin/users/_tabs.html.erb +15 -21
  556. data/app/views/spree/admin/users/_user.html.erb +5 -5
  557. data/app/views/spree/admin/users/edit.html.erb +1 -17
  558. data/app/views/spree/admin/users/index.html.erb +1 -59
  559. data/app/views/spree/admin/users/new.html.erb +1 -1
  560. data/app/views/spree/admin/users/show.html.erb +5 -4
  561. data/app/views/spree/admin/users/update.turbo_stream.erb +24 -0
  562. data/app/views/spree/admin/variants/_search_result.html.erb +4 -4
  563. data/app/views/spree/admin/variants/_search_results.html.erb +1 -1
  564. data/app/views/spree/admin/variants/_variant.html.erb +3 -3
  565. data/app/views/spree/admin/variants/edit.html.erb +2 -2
  566. data/app/views/spree/admin/variants/form/_basic.html.erb +1 -1
  567. data/app/views/spree/admin/variants/form/_dimensions.html.erb +8 -13
  568. data/app/views/spree/admin/variants/form/_inventory.html.erb +7 -10
  569. data/app/views/spree/admin/variants/form/_pricing.html.erb +12 -12
  570. data/app/views/spree/admin/webhook_deliveries/_table_header.html.erb +8 -0
  571. data/app/views/spree/admin/webhook_deliveries/_table_row.html.erb +22 -0
  572. data/app/views/spree/admin/webhook_deliveries/index.html.erb +1 -0
  573. data/app/views/spree/admin/webhook_deliveries/show.html.erb +61 -0
  574. data/app/views/spree/admin/webhook_endpoints/_details.html.erb +50 -0
  575. data/app/views/spree/admin/webhook_endpoints/_form.html.erb +28 -0
  576. data/app/views/spree/admin/webhook_endpoints/_secret_key.html.erb +23 -0
  577. data/app/views/spree/admin/webhook_endpoints/_summary.html.erb +26 -0
  578. data/app/views/spree/admin/webhook_endpoints/_table_header.html.erb +7 -0
  579. data/app/views/spree/admin/webhook_endpoints/_table_row.html.erb +24 -0
  580. data/app/views/spree/admin/webhook_endpoints/edit.html.erb +1 -0
  581. data/app/views/spree/admin/webhook_endpoints/index.html.erb +9 -0
  582. data/app/views/spree/admin/webhook_endpoints/new.html.erb +1 -0
  583. data/app/views/spree/admin/webhook_endpoints/show.html.erb +18 -0
  584. data/app/views/spree/admin/webhook_endpoints/update.turbo_stream.erb +5 -0
  585. data/app/views/spree/admin/zones/_country_members.html.erb +2 -2
  586. data/app/views/spree/admin/zones/_form.html.erb +2 -2
  587. data/app/views/spree/admin/zones/_state_members.html.erb +3 -3
  588. data/app/views/spree/admin/zones/_table_row.html.erb +2 -2
  589. data/config/importmap.rb +0 -2
  590. data/config/initializers/spree_admin_navigation.rb +47 -60
  591. data/config/initializers/spree_admin_tables.rb +1622 -0
  592. data/config/locales/en.yml +89 -8
  593. data/config/routes.rb +61 -45
  594. data/config/tailwind.config.js +14 -0
  595. data/lib/generators/spree/admin/install/install_generator.rb +34 -2
  596. data/lib/generators/spree/admin/install/templates/app/assets/tailwind/spree_admin.css.tt +46 -0
  597. data/lib/generators/spree/admin/scaffold/scaffold_generator.rb +4 -3
  598. data/lib/generators/spree/admin/scaffold/templates/navigation_initializer.rb.tt +9 -0
  599. data/lib/generators/spree/admin/scaffold/templates/table_initializer.rb.tt +27 -0
  600. data/lib/generators/spree/admin/scaffold/templates/views/_form.html.erb.tt +1 -1
  601. data/lib/generators/spree/admin/scaffold/templates/views/index.html.erb.tt +1 -1
  602. data/lib/spree/admin/engine.rb +101 -11
  603. data/lib/spree/admin/runtime_configuration.rb +5 -4
  604. data/lib/spree/admin/tailwind_helper.rb +33 -0
  605. data/lib/spree/admin/testing_support/capybara_utils.rb +41 -0
  606. data/lib/spree/admin.rb +7 -4
  607. data/lib/tasks/tailwind.rake +95 -0
  608. metadata +225 -241
  609. data/app/assets/stylesheets/spree/admin/actiontext.css +0 -36
  610. data/app/assets/stylesheets/spree/admin/application.scss +0 -46
  611. data/app/assets/stylesheets/spree/admin/components/_alerts.scss +0 -69
  612. data/app/assets/stylesheets/spree/admin/components/_badges.scss +0 -122
  613. data/app/assets/stylesheets/spree/admin/components/_bulk_panel.scss +0 -81
  614. data/app/assets/stylesheets/spree/admin/components/_buttons.scss +0 -178
  615. data/app/assets/stylesheets/spree/admin/components/_cards.scss +0 -146
  616. data/app/assets/stylesheets/spree/admin/components/_dialogs.scss +0 -210
  617. data/app/assets/stylesheets/spree/admin/components/_dropdowns.scss +0 -151
  618. data/app/assets/stylesheets/spree/admin/components/_filters.scss +0 -97
  619. data/app/assets/stylesheets/spree/admin/components/_line_items_form.scss +0 -32
  620. data/app/assets/stylesheets/spree/admin/components/_main.scss +0 -87
  621. data/app/assets/stylesheets/spree/admin/components/_media_form.scss +0 -111
  622. data/app/assets/stylesheets/spree/admin/components/_modals.scss +0 -45
  623. data/app/assets/stylesheets/spree/admin/components/_navbar.scss +0 -6
  624. data/app/assets/stylesheets/spree/admin/components/_navigation.scss +0 -51
  625. data/app/assets/stylesheets/spree/admin/components/_search_picker.scss +0 -47
  626. data/app/assets/stylesheets/spree/admin/components/_seo_form.scss +0 -16
  627. data/app/assets/stylesheets/spree/admin/components/_sidebar.scss +0 -693
  628. data/app/assets/stylesheets/spree/admin/components/_sortable_tree.scss +0 -63
  629. data/app/assets/stylesheets/spree/admin/components/_tables.scss +0 -230
  630. data/app/assets/stylesheets/spree/admin/components/_tooltips.scss +0 -20
  631. data/app/assets/stylesheets/spree/admin/components/_variants_form.scss +0 -206
  632. data/app/assets/stylesheets/spree/admin/components/_wizard.scss +0 -27
  633. data/app/assets/stylesheets/spree/admin/global/_variables.scss +0 -242
  634. data/app/assets/stylesheets/spree/admin/plugins/_dropdown.scss +0 -102
  635. data/app/assets/stylesheets/spree/admin/plugins/_items.scss +0 -115
  636. data/app/assets/stylesheets/spree/admin/plugins/_tinymce_custom.scss +0 -74
  637. data/app/assets/stylesheets/spree/admin/plugins/_trix_custom.scss +0 -115
  638. data/app/assets/stylesheets/spree/admin/plugins/plugins/checkbox_options.scss +0 -5
  639. data/app/assets/stylesheets/spree/admin/plugins/plugins/clear_button.scss +0 -30
  640. data/app/assets/stylesheets/spree/admin/plugins/plugins/drag_drop.scss +0 -16
  641. data/app/assets/stylesheets/spree/admin/plugins/plugins/dropdown_header.scss +0 -23
  642. data/app/assets/stylesheets/spree/admin/plugins/plugins/dropdown_input.scss +0 -47
  643. data/app/assets/stylesheets/spree/admin/plugins/plugins/input_autogrow.scss +0 -18
  644. data/app/assets/stylesheets/spree/admin/plugins/plugins/optgroup_columns.scss +0 -23
  645. data/app/assets/stylesheets/spree/admin/plugins/plugins/remove_button.scss +0 -44
  646. data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap4.scss +0 -220
  647. data/app/assets/stylesheets/spree/admin/plugins/tom-select.bootstrap5.scss +0 -274
  648. data/app/assets/stylesheets/spree/admin/plugins/tom-select.default.scss +0 -87
  649. data/app/assets/stylesheets/spree/admin/plugins/tom-select.scss +0 -175
  650. data/app/assets/stylesheets/spree/admin/plugins/uppy_fixes.scss +0 -74
  651. data/app/assets/stylesheets/spree/admin/shared/_base.scss +0 -737
  652. data/app/assets/stylesheets/spree/admin/shared/_forms.scss +0 -194
  653. data/app/assets/stylesheets/spree/admin/views/_dashboard.scss +0 -48
  654. data/app/assets/stylesheets/spree/admin/views/_page_builder.scss +0 -246
  655. data/app/controllers/concerns/spree/admin/page_builder_concern.rb +0 -44
  656. data/app/controllers/concerns/spree/admin/storefront_breadcrumb_concern.rb +0 -12
  657. data/app/controllers/spree/admin/page_blocks_controller.rb +0 -58
  658. data/app/controllers/spree/admin/page_links_controller.rb +0 -60
  659. data/app/controllers/spree/admin/page_sections_controller.rb +0 -82
  660. data/app/controllers/spree/admin/pages_controller.rb +0 -39
  661. data/app/controllers/spree/admin/storefront_controller.rb +0 -41
  662. data/app/controllers/spree/admin/themes_controller.rb +0 -86
  663. data/app/controllers/spree/admin/webhooks_subscribers_controller.rb +0 -59
  664. data/app/helpers/spree/admin/page_builder_helper.rb +0 -125
  665. data/app/helpers/spree/admin/themes_helper.rb +0 -9
  666. data/app/helpers/spree/admin/webhooks_subscribers_helper.rb +0 -31
  667. data/app/javascript/spree/admin/helpers/bootstrap.js +0 -51
  668. data/app/views/kaminari/admin-twitter-bootstrap-4/_first_page.html.erb +0 -11
  669. data/app/views/kaminari/admin-twitter-bootstrap-4/_gap.html.erb +0 -12
  670. data/app/views/kaminari/admin-twitter-bootstrap-4/_last_page.html.erb +0 -11
  671. data/app/views/kaminari/admin-twitter-bootstrap-4/_next_page.html.erb +0 -12
  672. data/app/views/kaminari/admin-twitter-bootstrap-4/_page.html.erb +0 -18
  673. data/app/views/kaminari/admin-twitter-bootstrap-4/_paginator.html.erb +0 -17
  674. data/app/views/kaminari/admin-twitter-bootstrap-4/_prev_page.html.erb +0 -12
  675. data/app/views/layouts/spree/page_builder.html.erb +0 -46
  676. data/app/views/spree/admin/dashboard/_store_preview.html.erb +0 -39
  677. data/app/views/spree/admin/orders/edit.html.erb +0 -22
  678. data/app/views/spree/admin/page_blocks/_form_tab_buttons.html.erb +0 -5
  679. data/app/views/spree/admin/page_blocks/create.turbo_stream.erb +0 -4
  680. data/app/views/spree/admin/page_blocks/destroy.turbo_stream.erb +0 -9
  681. data/app/views/spree/admin/page_blocks/edit.html.erb +0 -43
  682. data/app/views/spree/admin/page_blocks/forms/_brand.html.erb +0 -15
  683. data/app/views/spree/admin/page_blocks/forms/_brand_logo.html.erb +0 -4
  684. data/app/views/spree/admin/page_blocks/forms/_buttons.html.erb +0 -13
  685. data/app/views/spree/admin/page_blocks/forms/_heading.html.erb +0 -28
  686. data/app/views/spree/admin/page_blocks/forms/_image.html.erb +0 -10
  687. data/app/views/spree/admin/page_blocks/forms/_link.html.erb +0 -19
  688. data/app/views/spree/admin/page_blocks/forms/_mega_nav.html.erb +0 -14
  689. data/app/views/spree/admin/page_blocks/forms/_mega_nav_with_subcategories.html.erb +0 -9
  690. data/app/views/spree/admin/page_blocks/forms/_metafields.html.erb +0 -35
  691. data/app/views/spree/admin/page_blocks/forms/_nav.html.erb +0 -6
  692. data/app/views/spree/admin/page_blocks/forms/_newsletter_form.html.erb +0 -20
  693. data/app/views/spree/admin/page_blocks/forms/_price.html.erb +0 -15
  694. data/app/views/spree/admin/page_blocks/forms/_share.html.erb +0 -5
  695. data/app/views/spree/admin/page_blocks/forms/_subheading.html.erb +0 -26
  696. data/app/views/spree/admin/page_blocks/forms/_text.html.erb +0 -21
  697. data/app/views/spree/admin/page_blocks/forms/_title.html.erb +0 -20
  698. data/app/views/spree/admin/page_blocks/forms/_variant_picker.html.erb +0 -10
  699. data/app/views/spree/admin/page_blocks/forms/products/_buy_buttons.html.erb +0 -10
  700. data/app/views/spree/admin/page_blocks/forms/products/_description.html.erb +0 -0
  701. data/app/views/spree/admin/page_blocks/forms/products/_quantity_selector.html.erb +0 -10
  702. data/app/views/spree/admin/page_blocks/move_higher.turbo_stream.erb +0 -4
  703. data/app/views/spree/admin/page_blocks/move_lower.turbo_stream.erb +0 -4
  704. data/app/views/spree/admin/page_blocks/show.html.erb +0 -1
  705. data/app/views/spree/admin/page_blocks/update.turbo_stream.erb +0 -6
  706. data/app/views/spree/admin/page_builder/_add_block.html.erb +0 -22
  707. data/app/views/spree/admin/page_builder/_color_palette.html.erb +0 -17
  708. data/app/views/spree/admin/page_builder/_color_picker.html.erb +0 -26
  709. data/app/views/spree/admin/page_builder/_header.html.erb +0 -113
  710. data/app/views/spree/admin/page_builder/_labeled_range_input.html.erb +0 -10
  711. data/app/views/spree/admin/page_builder/_pages_dropdown.html.erb +0 -17
  712. data/app/views/spree/admin/page_builder/_range_input.html.erb +0 -12
  713. data/app/views/spree/admin/page_builder/_sidebar.html.erb +0 -14
  714. data/app/views/spree/admin/page_builder/_sidebar_block.html.erb +0 -30
  715. data/app/views/spree/admin/page_builder/_sidebar_colors.html.erb +0 -86
  716. data/app/views/spree/admin/page_builder/_sidebar_fonts.html.erb +0 -86
  717. data/app/views/spree/admin/page_builder/_sidebar_section.html.erb +0 -44
  718. data/app/views/spree/admin/page_builder/_sidebar_sections.html.erb +0 -43
  719. data/app/views/spree/admin/page_builder/_sidebar_sections_toolbar.html.erb +0 -180
  720. data/app/views/spree/admin/page_links/_form.html.erb +0 -10
  721. data/app/views/spree/admin/page_links/_linkable_type_dropdown.html.erb +0 -15
  722. data/app/views/spree/admin/page_links/_list.html.erb +0 -36
  723. data/app/views/spree/admin/page_links/_refresh_theme_preview.turbo_stream.erb +0 -5
  724. data/app/views/spree/admin/page_links/create.turbo_stream.erb +0 -10
  725. data/app/views/spree/admin/page_links/destroy.turbo_stream.erb +0 -15
  726. data/app/views/spree/admin/page_links/edit.html.erb +0 -29
  727. data/app/views/spree/admin/page_links/update.turbo_stream.erb +0 -12
  728. data/app/views/spree/admin/page_sections/_form_tab_buttons.html.erb +0 -8
  729. data/app/views/spree/admin/page_sections/create.turbo_stream.erb +0 -11
  730. data/app/views/spree/admin/page_sections/destroy.turbo_stream.erb +0 -16
  731. data/app/views/spree/admin/page_sections/edit.html.erb +0 -39
  732. data/app/views/spree/admin/page_sections/fields/_background_color.html.erb +0 -6
  733. data/app/views/spree/admin/page_sections/fields/_border_bottom_width.html.erb +0 -5
  734. data/app/views/spree/admin/page_sections/fields/_border_color.html.erb +0 -7
  735. data/app/views/spree/admin/page_sections/fields/_border_top_width.html.erb +0 -6
  736. data/app/views/spree/admin/page_sections/fields/_bottom_padding.html.erb +0 -5
  737. data/app/views/spree/admin/page_sections/fields/_button.html.erb +0 -15
  738. data/app/views/spree/admin/page_sections/fields/_header_layout.html.erb +0 -26
  739. data/app/views/spree/admin/page_sections/fields/_height.html.erb +0 -6
  740. data/app/views/spree/admin/page_sections/fields/_text_color.html.erb +0 -7
  741. data/app/views/spree/admin/page_sections/fields/_top_padding.html.erb +0 -6
  742. data/app/views/spree/admin/page_sections/forms/_announcement_bar.html.erb +0 -5
  743. data/app/views/spree/admin/page_sections/forms/_brand_story.html.erb +0 -0
  744. data/app/views/spree/admin/page_sections/forms/_breadcrumbs.html.erb +0 -0
  745. data/app/views/spree/admin/page_sections/forms/_collection_banner.html.erb +0 -0
  746. data/app/views/spree/admin/page_sections/forms/_custom_code.html.erb +0 -4
  747. data/app/views/spree/admin/page_sections/forms/_featured_posts.html.erb +0 -33
  748. data/app/views/spree/admin/page_sections/forms/_featured_product.html.erb +0 -4
  749. data/app/views/spree/admin/page_sections/forms/_featured_taxon.html.erb +0 -59
  750. data/app/views/spree/admin/page_sections/forms/_featured_taxons.html.erb +0 -13
  751. data/app/views/spree/admin/page_sections/forms/_footer.html.erb +0 -20
  752. data/app/views/spree/admin/page_sections/forms/_header.html.erb +0 -12
  753. data/app/views/spree/admin/page_sections/forms/_image_banner.html.erb +0 -13
  754. data/app/views/spree/admin/page_sections/forms/_image_with_text.html.erb +0 -28
  755. data/app/views/spree/admin/page_sections/forms/_main_password_footer.html.erb +0 -9
  756. data/app/views/spree/admin/page_sections/forms/_main_password_header.erb +0 -13
  757. data/app/views/spree/admin/page_sections/forms/_newsletter.html.erb +0 -15
  758. data/app/views/spree/admin/page_sections/forms/_page_title.html.erb +0 -4
  759. data/app/views/spree/admin/page_sections/forms/_post_details.html.erb +0 -0
  760. data/app/views/spree/admin/page_sections/forms/_post_grid.html.erb +0 -0
  761. data/app/views/spree/admin/page_sections/forms/_product_details.html.erb +0 -1
  762. data/app/views/spree/admin/page_sections/forms/_product_grid.html.erb +0 -1
  763. data/app/views/spree/admin/page_sections/forms/_related_products.html.erb +0 -32
  764. data/app/views/spree/admin/page_sections/forms/_rich_text.html.erb +0 -0
  765. data/app/views/spree/admin/page_sections/forms/_taxon_banner.html.erb +0 -0
  766. data/app/views/spree/admin/page_sections/forms/_taxon_grid.html.erb +0 -5
  767. data/app/views/spree/admin/page_sections/forms/_video.html.erb +0 -15
  768. data/app/views/spree/admin/page_sections/move_higher.turbo_stream.erb +0 -7
  769. data/app/views/spree/admin/page_sections/move_lower.turbo_stream.erb +0 -7
  770. data/app/views/spree/admin/page_sections/new.html.erb +0 -28
  771. data/app/views/spree/admin/page_sections/remove_attachment.turbo_stream.erb +0 -4
  772. data/app/views/spree/admin/page_sections/restore_design_settings_to_defaults.turbo_stream.erb +0 -4
  773. data/app/views/spree/admin/page_sections/show.html.erb +0 -1
  774. data/app/views/spree/admin/page_sections/update.turbo_stream.erb +0 -10
  775. data/app/views/spree/admin/pages/_form.html.erb +0 -20
  776. data/app/views/spree/admin/pages/_table_header.html.erb +0 -6
  777. data/app/views/spree/admin/pages/_table_row.html.erb +0 -28
  778. data/app/views/spree/admin/pages/edit.html.erb +0 -13
  779. data/app/views/spree/admin/pages/filters.html.erb +0 -7
  780. data/app/views/spree/admin/pages/index.html.erb +0 -11
  781. data/app/views/spree/admin/pages/new.html.erb +0 -1
  782. data/app/views/spree/admin/products/_bulk_operations.html.erb +0 -78
  783. data/app/views/spree/admin/products/bulk_modal.html.erb +0 -16
  784. data/app/views/spree/admin/storefront/edit.html.erb +0 -89
  785. data/app/views/spree/admin/themes/_theme.html.erb +0 -56
  786. data/app/views/spree/admin/themes/_theme_preview_image.html.erb +0 -17
  787. data/app/views/spree/admin/themes/edit.html.erb +0 -14
  788. data/app/views/spree/admin/themes/index.html.erb +0 -80
  789. data/app/views/spree/admin/themes/update.turbo_stream.erb +0 -1
  790. data/app/views/spree/admin/users/bulk_modal.html.erb +0 -14
  791. data/app/views/spree/admin/webhook_events/_webhook_event.html.erb +0 -17
  792. data/app/views/spree/admin/webhooks_subscribers/_form.html.erb +0 -68
  793. data/app/views/spree/admin/webhooks_subscribers/_table_header.html.erb +0 -7
  794. data/app/views/spree/admin/webhooks_subscribers/_table_row.html.erb +0 -22
  795. data/app/views/spree/admin/webhooks_subscribers/edit.html.erb +0 -1
  796. data/app/views/spree/admin/webhooks_subscribers/index.html.erb +0 -10
  797. data/app/views/spree/admin/webhooks_subscribers/show.html.erb +0 -65
  798. data/config/initializers/dartsass.rb +0 -3
  799. data/config/initializers/form_builder.rb +0 -10
  800. data/lib/generators/spree/admin/scaffold/templates/views/_filters.html.erb.tt +0 -13
  801. data/lib/generators/spree/admin/scaffold/templates/views/_table_header.html.erb.tt +0 -5
  802. data/lib/generators/spree/admin/scaffold/templates/views/_table_row.html.erb.tt +0 -11
  803. data/vendor/javascript/bootstrap--dist--js--bootstrap.bundle.min.js.js +0 -8
  804. data/vendor/javascript/jquery.min.js +0 -2
  805. /data/app/views/spree/admin/{webhooks_subscribers → customer_groups}/new.html.erb +0 -0
@@ -0,0 +1,1622 @@
1
+ # Default column configurations for Spree Admin Tables
2
+ #
3
+ # This initializer registers the default tables and their columns.
4
+ # Developers can extend these in their own initializers by:
5
+ #
6
+ # Rails.application.config.after_initialize do
7
+ # Spree.admin.tables.products.add :custom_column, type: :string, default: true
8
+ # Spree.admin.tables.products.remove :sku
9
+ # Spree.admin.tables.products.update :name, position: 5
10
+ # Spree.admin.tables.products.insert_after :name, :vendor, type: :string
11
+ # end
12
+
13
+ Rails.application.config.after_initialize do
14
+ # Register Products table
15
+ Spree.admin.tables.register(:products, model_class: Spree::Product, search_param: :multi_search)
16
+
17
+ # Product name with image (custom partial)
18
+ Spree.admin.tables.products.add :name,
19
+ label: :name,
20
+ type: :custom,
21
+ sortable: true,
22
+ filterable: true,
23
+ default: true,
24
+ position: 10,
25
+ partial: 'spree/admin/tables/columns/product_name'
26
+
27
+ # Product status with help bubble (custom partial)
28
+ Spree.admin.tables.products.add :status,
29
+ label: :status,
30
+ type: :custom,
31
+ filter_type: :status,
32
+ sortable: true,
33
+ filterable: true,
34
+ default: true,
35
+ position: 20,
36
+ partial: 'spree/admin/tables/columns/product_status',
37
+ value_options: [
38
+ { value: 'draft', label: 'Draft' },
39
+ { value: 'active', label: 'Active' },
40
+ { value: 'archived', label: 'Archived' }
41
+ ]
42
+
43
+ # Inventory display (custom partial)
44
+ Spree.admin.tables.products.add :inventory,
45
+ label: :inventory,
46
+ type: :custom,
47
+ sortable: false,
48
+ filterable: false,
49
+ default: true,
50
+ position: 25,
51
+ partial: 'spree/admin/tables/columns/product_inventory'
52
+
53
+ Spree.admin.tables.products.add :sku,
54
+ label: :sku,
55
+ type: :string,
56
+ sortable: false,
57
+ filterable: true,
58
+ default: false,
59
+ position: 30,
60
+ ransack_attribute: 'master_sku',
61
+ method: ->(product) { product.sku }
62
+
63
+ Spree.admin.tables.products.add :price,
64
+ label: :price,
65
+ type: :money,
66
+ sortable: true,
67
+ filterable: true,
68
+ default: true,
69
+ position: 40,
70
+ ransack_attribute: 'master_price',
71
+ sort_scope_asc: :ascend_by_price,
72
+ sort_scope_desc: :descend_by_price,
73
+ method: ->(product) { product.price_in(Spree::Current.currency) }
74
+
75
+ Spree.admin.tables.products.add :created_at,
76
+ label: :created_at,
77
+ type: :datetime,
78
+ sortable: true,
79
+ filterable: true,
80
+ default: false,
81
+ position: 50
82
+
83
+ Spree.admin.tables.products.add :updated_at,
84
+ label: :updated_at,
85
+ type: :datetime,
86
+ sortable: true,
87
+ filterable: true,
88
+ default: false,
89
+ position: 60
90
+
91
+ # Stock filter (filter-only, not displayed as column)
92
+ Spree.admin.tables.products.add :in_stock,
93
+ label: 'In Stock',
94
+ type: :boolean,
95
+ filter_type: :boolean,
96
+ sortable: false,
97
+ filterable: true,
98
+ displayable: false,
99
+ default: false,
100
+ position: 70,
101
+ ransack_attribute: 'in_stock_items'
102
+
103
+ # Taxons - displayed as comma-separated list, filtered via autocomplete
104
+ Spree.admin.tables.products.add :taxons,
105
+ label: :taxons,
106
+ type: :association,
107
+ filter_type: :autocomplete,
108
+ sortable: false,
109
+ filterable: true,
110
+ default: false,
111
+ position: 80,
112
+ ransack_attribute: 'taxons_id',
113
+ operators: %i[in],
114
+ search_url: '/admin/taxons/select_options.json',
115
+ method: ->(product) { product.taxons.pluck(:pretty_name).to_sentence if product.classification_count.positive? }
116
+
117
+ # Tags - displayed as comma-separated list, filtered via autocomplete
118
+ Spree.admin.tables.products.add :tags,
119
+ label: :tags,
120
+ type: :association,
121
+ filter_type: :autocomplete,
122
+ sortable: false,
123
+ filterable: true,
124
+ default: false,
125
+ position: 85,
126
+ ransack_attribute: 'tags_name',
127
+ operators: %i[in],
128
+ search_url: '/admin/tags/select_options.json?taggable_type=Spree::Product',
129
+ method: ->(product) { product.tag_list.to_sentence }
130
+
131
+ # Products bulk actions
132
+ Spree.admin.tables.products.add_bulk_action :set_active,
133
+ label: 'admin.bulk_ops.products.title.set_active',
134
+ icon: 'circle-check',
135
+ action_path: '/admin/products/bulk_status_update?status=active',
136
+ body: 'admin.bulk_ops.products.body.set_active',
137
+ position: 10,
138
+ condition: -> { can?(:activate, Spree::Product) }
139
+
140
+ Spree.admin.tables.products.add_bulk_action :set_draft,
141
+ label: 'admin.bulk_ops.products.title.set_draft',
142
+ icon: 'circle-dotted',
143
+ action_path: '/admin/products/bulk_status_update?status=draft',
144
+ body: 'admin.bulk_ops.products.body.set_draft',
145
+ position: 20
146
+
147
+ Spree.admin.tables.products.add_bulk_action :set_archived,
148
+ label: 'admin.bulk_ops.products.title.set_archived',
149
+ icon: 'archive',
150
+ action_path: '/admin/products/bulk_status_update?status=archived',
151
+ body: 'admin.bulk_ops.products.body.set_archived',
152
+ position: 30
153
+
154
+ Spree.admin.tables.products.add_bulk_action :add_to_taxons,
155
+ label: 'admin.bulk_ops.products.title.add_to_taxons',
156
+ icon: 'category-plus',
157
+ action_path: '/admin/products/bulk_add_to_taxons',
158
+ body: 'admin.bulk_ops.products.body.add_to_taxons',
159
+ form_partial: 'spree/admin/bulk_operations/forms/taxon_picker',
160
+ position: 40,
161
+ condition: -> { can?(:manage, Spree::Classification) }
162
+
163
+ Spree.admin.tables.products.add_bulk_action :remove_from_taxons,
164
+ label: 'admin.bulk_ops.products.title.remove_from_taxons',
165
+ icon: 'category-minus',
166
+ action_path: '/admin/products/bulk_remove_from_taxons',
167
+ body: 'admin.bulk_ops.products.body.remove_from_taxons',
168
+ form_partial: 'spree/admin/bulk_operations/forms/taxon_picker',
169
+ position: 50,
170
+ condition: -> { can?(:manage, Spree::Classification) }
171
+
172
+ Spree.admin.tables.products.add_bulk_action :add_tags,
173
+ label: 'admin.bulk_ops.products.title.add_tags',
174
+ icon: 'tag-plus',
175
+ action_path: '/admin/products/bulk_add_tags',
176
+ body: 'admin.bulk_ops.products.body.add_tags',
177
+ form_partial: 'spree/admin/bulk_operations/forms/tag_picker',
178
+ form_partial_locals: { allow_create: true },
179
+ position: 60,
180
+ condition: -> { can?(:manage_tags, Spree::Product) }
181
+
182
+ Spree.admin.tables.products.add_bulk_action :remove_tags,
183
+ label: 'admin.bulk_ops.products.title.remove_tags',
184
+ icon: 'tag-minus',
185
+ action_path: '/admin/products/bulk_remove_tags',
186
+ body: 'admin.bulk_ops.products.body.remove_tags',
187
+ form_partial: 'spree/admin/bulk_operations/forms/tag_picker',
188
+ form_partial_locals: { allow_create: false },
189
+ position: 70,
190
+ condition: -> { can?(:manage_tags, Spree::Product) }
191
+
192
+ # Register Orders table
193
+ Spree.admin.tables.register(:orders, model_class: Spree::Order, search_param: :multi_search, date_range_param: :completed_at)
194
+
195
+ Spree.admin.tables.orders.add :number,
196
+ label: :number,
197
+ type: :link,
198
+ sortable: true,
199
+ filterable: true,
200
+ default: true,
201
+ position: 10
202
+
203
+ Spree.admin.tables.orders.add :completed_at,
204
+ label: :completed_at,
205
+ type: :datetime,
206
+ sortable: true,
207
+ filterable: false,
208
+ default: true,
209
+ position: 20
210
+
211
+ Spree.admin.tables.orders.add :customer,
212
+ label: :customer,
213
+ type: :custom,
214
+ sortable: false,
215
+ filterable: false,
216
+ default: true,
217
+ position: 30,
218
+ partial: 'spree/admin/orders/customer_summary',
219
+ partial_locals: ->(record) { { order: record } }
220
+
221
+ Spree.admin.tables.orders.add :stock_location,
222
+ label: :package_from,
223
+ type: :custom,
224
+ sortable: false,
225
+ filterable: false,
226
+ default: true,
227
+ position: 40,
228
+ partial: 'spree/admin/tables/columns/order_stock_locations'
229
+
230
+ Spree.admin.tables.orders.add :payment_state,
231
+ label: :payment_state,
232
+ type: :custom,
233
+ filter_type: :select,
234
+ sortable: true,
235
+ filterable: true,
236
+ default: true,
237
+ position: 50,
238
+ partial: 'spree/admin/tables/columns/order_payment_state',
239
+ operators: %i[eq not_eq in not_in],
240
+ value_options: -> { Spree::Order::PAYMENT_STATES.map { |s| { value: s, label: I18n.t("spree.payment_states.#{s}", default: s.humanize) } } }
241
+
242
+ Spree.admin.tables.orders.add :shipment_state,
243
+ label: :shipment_state,
244
+ type: :custom,
245
+ filter_type: :select,
246
+ sortable: true,
247
+ filterable: true,
248
+ default: true,
249
+ position: 60,
250
+ partial: 'spree/admin/tables/columns/order_shipment_state',
251
+ operators: %i[eq not_eq in not_in],
252
+ value_options: -> { Spree::Order::SHIPMENT_STATES.map { |s| { value: s, label: I18n.t("spree.shipment_states.#{s}", default: s.humanize) } } }
253
+
254
+ Spree.admin.tables.orders.add :item_count,
255
+ label: :item_count,
256
+ type: :number,
257
+ sortable: true,
258
+ filterable: false,
259
+ default: true,
260
+ position: 70,
261
+ align: :right,
262
+ method: ->(order) { pluralize(order.item_count, 'item') }
263
+
264
+ Spree.admin.tables.orders.add :total,
265
+ label: :total,
266
+ type: :money,
267
+ sortable: true,
268
+ filterable: true,
269
+ default: true,
270
+ position: 80,
271
+ align: :right,
272
+ method: ->(order) { order.display_total }
273
+
274
+ Spree.admin.tables.orders.add :state,
275
+ label: :state,
276
+ type: :status,
277
+ filter_type: :select,
278
+ sortable: true,
279
+ filterable: true,
280
+ default: false,
281
+ position: 90,
282
+ operators: %i[eq not_eq in not_in],
283
+ value_options: -> { Spree::Order.state_machine(:state).states.map { |s| { value: s.name.to_s, label: s.name.to_s.humanize } } }
284
+
285
+ Spree.admin.tables.orders.add :email,
286
+ label: :email,
287
+ type: :string,
288
+ sortable: true,
289
+ filterable: true,
290
+ default: false,
291
+ position: 100
292
+
293
+ Spree.admin.tables.orders.add :created_at,
294
+ label: :created_at,
295
+ type: :datetime,
296
+ sortable: true,
297
+ filterable: false,
298
+ default: false,
299
+ position: 110
300
+
301
+ Spree.admin.tables.orders.add :updated_at,
302
+ label: :updated_at,
303
+ type: :datetime,
304
+ sortable: true,
305
+ filterable: false,
306
+ default: false,
307
+ position: 115
308
+
309
+ # Filter-only fields (not displayed as columns)
310
+ Spree.admin.tables.orders.add :first_name,
311
+ label: :first_name,
312
+ type: :string,
313
+ sortable: false,
314
+ filterable: true,
315
+ displayable: false,
316
+ default: false,
317
+ position: 120,
318
+ ransack_attribute: 'bill_address_firstname_i'
319
+
320
+ Spree.admin.tables.orders.add :last_name,
321
+ label: :last_name,
322
+ type: :string,
323
+ sortable: false,
324
+ filterable: true,
325
+ displayable: false,
326
+ default: false,
327
+ position: 130,
328
+ ransack_attribute: 'bill_address_lastname'
329
+
330
+ Spree.admin.tables.orders.add :sku,
331
+ label: :sku,
332
+ type: :string,
333
+ sortable: false,
334
+ filterable: true,
335
+ displayable: false,
336
+ default: false,
337
+ position: 140,
338
+ ransack_attribute: 'line_items_variant_sku'
339
+
340
+ Spree.admin.tables.orders.add :promotion,
341
+ label: :promotion,
342
+ type: :association,
343
+ filter_type: :autocomplete,
344
+ sortable: false,
345
+ filterable: true,
346
+ displayable: false,
347
+ default: false,
348
+ position: 150,
349
+ ransack_attribute: 'promotions_id',
350
+ operators: %i[in],
351
+ search_url: '/admin/promotions/select_options.json'
352
+
353
+ # Register Checkouts table (draft orders)
354
+ Spree.admin.tables.register(:checkouts, model_class: Spree::Order, search_param: :multi_search, date_range_param: :created_at, new_resource: false)
355
+
356
+ Spree.admin.tables.checkouts.add :number,
357
+ label: :number,
358
+ type: :link,
359
+ sortable: true,
360
+ filterable: true,
361
+ default: true,
362
+ position: 10
363
+
364
+ Spree.admin.tables.checkouts.add :created_at,
365
+ label: :created_at,
366
+ type: :datetime,
367
+ sortable: true,
368
+ filterable: false,
369
+ default: true,
370
+ position: 20
371
+
372
+ Spree.admin.tables.checkouts.add :customer,
373
+ label: :customer,
374
+ type: :custom,
375
+ sortable: false,
376
+ filterable: false,
377
+ default: true,
378
+ position: 30,
379
+ partial: 'spree/admin/orders/customer_summary',
380
+ partial_locals: ->(record) { { order: record } }
381
+
382
+ Spree.admin.tables.checkouts.add :state,
383
+ label: :state,
384
+ type: :status,
385
+ filter_type: :select,
386
+ sortable: true,
387
+ filterable: true,
388
+ default: true,
389
+ position: 40,
390
+ operators: %i[eq not_eq in not_in],
391
+ value_options: -> { Spree::Order.state_machine(:state).states.map { |s| { value: s.name.to_s, label: s.name.to_s.humanize } } }
392
+
393
+ Spree.admin.tables.checkouts.add :item_count,
394
+ label: :item_count,
395
+ type: :number,
396
+ sortable: true,
397
+ filterable: false,
398
+ default: true,
399
+ position: 50,
400
+ align: :right,
401
+ method: ->(order) { pluralize(order.item_count, 'item') }
402
+
403
+ Spree.admin.tables.checkouts.add :total,
404
+ label: :total,
405
+ type: :money,
406
+ sortable: true,
407
+ filterable: true,
408
+ default: true,
409
+ position: 60,
410
+ align: :right,
411
+ method: ->(order) { order.display_total }
412
+
413
+ Spree.admin.tables.checkouts.add :email,
414
+ label: :email,
415
+ type: :string,
416
+ sortable: true,
417
+ filterable: true,
418
+ default: false,
419
+ position: 70
420
+
421
+ Spree.admin.tables.checkouts.add :updated_at,
422
+ label: :updated_at,
423
+ type: :datetime,
424
+ sortable: true,
425
+ filterable: false,
426
+ default: false,
427
+ position: 80
428
+
429
+ # Register Users table
430
+ Spree.admin.tables.register(:users, model_class: Spree.user_class, search_param: :multi_search, row_actions: false, link_to_action: :show)
431
+
432
+ # User name with avatar
433
+ Spree.admin.tables.users.add :name,
434
+ label: :name,
435
+ type: :custom,
436
+ sortable: true,
437
+ filterable: false,
438
+ default: true,
439
+ position: 10,
440
+ ransack_attribute: 'first_name',
441
+ partial: 'spree/admin/shared/user',
442
+ partial_locals: ->(record) { { user: record } }
443
+
444
+ # Email marketing status
445
+ Spree.admin.tables.users.add :accepts_email_marketing,
446
+ label: :email_marketing,
447
+ type: :boolean,
448
+ sortable: true,
449
+ filterable: true,
450
+ default: true,
451
+ position: 20,
452
+ method: ->(user) { user.accepts_email_marketing? }
453
+
454
+ # Location (custom partial with flag)
455
+ Spree.admin.tables.users.add :location,
456
+ label: :location,
457
+ type: :custom,
458
+ filter_type: :autocomplete,
459
+ sortable: false,
460
+ filterable: true,
461
+ default: true,
462
+ position: 30,
463
+ ransack_attribute: 'addresses_country_name',
464
+ operators: %i[eq],
465
+ search_url: '/admin/countries/select_options.json',
466
+ partial: 'spree/admin/tables/columns/user_location'
467
+
468
+ # Number of orders
469
+ Spree.admin.tables.users.add :orders_count,
470
+ label: 'admin.num_orders',
471
+ type: :number,
472
+ sortable: false,
473
+ filterable: false,
474
+ default: true,
475
+ position: 40,
476
+ method: ->(user) { user.completed_orders_for_store(Spree::Current.store).count }
477
+
478
+ # Amount spent
479
+ Spree.admin.tables.users.add :amount_spent,
480
+ label: 'admin.amount_spent',
481
+ type: :money,
482
+ sortable: false,
483
+ filterable: false,
484
+ default: true,
485
+ position: 50,
486
+ method: ->(user) { user.display_amount_spent_in(Spree::Current.currency) }
487
+
488
+ Spree.admin.tables.users.add :created_at,
489
+ label: :created_at,
490
+ type: :datetime,
491
+ sortable: true,
492
+ filterable: true,
493
+ default: true,
494
+ position: 60
495
+
496
+ Spree.admin.tables.users.add :updated_at,
497
+ label: :updated_at,
498
+ type: :datetime,
499
+ sortable: true,
500
+ filterable: true,
501
+ default: false,
502
+ position: 65
503
+
504
+ # Filter-only fields (not displayed as columns)
505
+ Spree.admin.tables.users.add :first_name,
506
+ label: :first_name,
507
+ type: :string,
508
+ sortable: true,
509
+ filterable: true,
510
+ displayable: false,
511
+ default: false,
512
+ position: 70,
513
+ ransack_attribute: 'bill_address_firstname'
514
+
515
+ Spree.admin.tables.users.add :last_name,
516
+ label: :last_name,
517
+ type: :string,
518
+ sortable: true,
519
+ filterable: true,
520
+ displayable: false,
521
+ default: false,
522
+ position: 80,
523
+ ransack_attribute: 'bill_address_lastname'
524
+
525
+ Spree.admin.tables.users.add :tags,
526
+ label: :tags,
527
+ type: :association,
528
+ filter_type: :autocomplete,
529
+ sortable: false,
530
+ filterable: true,
531
+ displayable: false,
532
+ default: false,
533
+ position: 90,
534
+ ransack_attribute: 'tags_name',
535
+ operators: %i[in],
536
+ search_url: '/admin/tags/select_options.json?taggable_type=Spree::User'
537
+
538
+ # Users bulk actions
539
+ Spree.admin.tables.users.add_bulk_action :add_tags,
540
+ label: 'admin.bulk_ops.users.title.add_tags',
541
+ icon: 'tag-plus',
542
+ action_path: '/admin/users/bulk_add_tags',
543
+ body: 'admin.bulk_ops.users.body.add_tags',
544
+ form_partial: 'spree/admin/bulk_operations/forms/tag_picker',
545
+ form_partial_locals: { allow_create: true },
546
+ method: :post,
547
+ position: 10,
548
+ condition: -> { can?(:manage_tags, Spree.user_class) }
549
+
550
+ Spree.admin.tables.users.add_bulk_action :remove_tags,
551
+ label: 'admin.bulk_ops.users.title.remove_tags',
552
+ icon: 'tag-minus',
553
+ action_path: '/admin/users/bulk_remove_tags',
554
+ body: 'admin.bulk_ops.users.body.remove_tags',
555
+ form_partial: 'spree/admin/bulk_operations/forms/tag_picker',
556
+ form_partial_locals: { allow_create: false },
557
+ method: :post,
558
+ position: 20,
559
+ condition: -> { can?(:manage_tags, Spree.user_class) }
560
+
561
+ # Register Promotions table
562
+ Spree.admin.tables.register(:promotions, model_class: Spree::Promotion, search_param: :name_cont, link_to_action: :show)
563
+
564
+ Spree.admin.tables.promotions.add :name,
565
+ label: :name,
566
+ type: :link,
567
+ sortable: true,
568
+ filterable: true,
569
+ default: true,
570
+ position: 10
571
+
572
+ Spree.admin.tables.promotions.add :code,
573
+ label: :code,
574
+ type: :custom,
575
+ sortable: true,
576
+ filterable: true,
577
+ default: true,
578
+ position: 20,
579
+ partial: 'spree/admin/tables/columns/promotion_code'
580
+
581
+ Spree.admin.tables.promotions.add :kind,
582
+ label: :kind,
583
+ type: :custom,
584
+ sortable: false,
585
+ filterable: false,
586
+ default: true,
587
+ position: 25,
588
+ partial: 'spree/admin/tables/columns/promotion_kind'
589
+
590
+ Spree.admin.tables.promotions.add :usage_limit,
591
+ label: :usage_limit,
592
+ type: :custom,
593
+ sortable: false,
594
+ filterable: false,
595
+ default: true,
596
+ position: 30,
597
+ partial: 'spree/admin/promotions/usage_limit',
598
+ partial_locals: ->(record) { { promotion: record } }
599
+
600
+ Spree.admin.tables.promotions.add :status,
601
+ label: :status,
602
+ type: :custom,
603
+ sortable: false,
604
+ filterable: false,
605
+ default: true,
606
+ position: 35,
607
+ partial: 'spree/admin/promotions/status',
608
+ partial_locals: ->(record) { { promotion: record } }
609
+
610
+ Spree.admin.tables.promotions.add :starts_at,
611
+ label: :starts_at,
612
+ type: :datetime,
613
+ sortable: true,
614
+ filterable: true,
615
+ default: false,
616
+ position: 40
617
+
618
+ Spree.admin.tables.promotions.add :expires_at,
619
+ label: :expires_at,
620
+ type: :datetime,
621
+ sortable: true,
622
+ filterable: true,
623
+ default: false,
624
+ position: 50
625
+
626
+ Spree.admin.tables.promotions.add :created_at,
627
+ label: :created_at,
628
+ type: :datetime,
629
+ sortable: true,
630
+ filterable: true,
631
+ default: false,
632
+ position: 60
633
+
634
+ Spree.admin.tables.promotions.add :updated_at,
635
+ label: :updated_at,
636
+ type: :datetime,
637
+ sortable: true,
638
+ filterable: true,
639
+ default: false,
640
+ position: 70
641
+
642
+ # Register Customer Returns table
643
+ Spree.admin.tables.register(:customer_returns, model_class: Spree::CustomerReturn, search_param: :number_cont, row_actions: false, new_resource: false)
644
+
645
+ Spree.admin.tables.customer_returns.add :number,
646
+ label: :number,
647
+ type: :link,
648
+ sortable: true,
649
+ filterable: true,
650
+ default: true,
651
+ position: 10
652
+
653
+ Spree.admin.tables.customer_returns.add :created_at,
654
+ label: :created_at,
655
+ type: :datetime,
656
+ sortable: true,
657
+ filterable: true,
658
+ default: true,
659
+ position: 20
660
+
661
+ Spree.admin.tables.customer_returns.add :customer,
662
+ label: :customer,
663
+ type: :custom,
664
+ sortable: false,
665
+ filterable: false,
666
+ default: true,
667
+ position: 30,
668
+ partial: 'spree/admin/orders/customer_summary',
669
+ partial_locals: ->(record) { { order: record.order } }
670
+
671
+ Spree.admin.tables.customer_returns.add :order,
672
+ label: :order,
673
+ type: :string,
674
+ sortable: false,
675
+ filterable: false,
676
+ default: true,
677
+ position: 40,
678
+ method: ->(cr) { cr.order&.number }
679
+
680
+ Spree.admin.tables.customer_returns.add :reimbursement_status,
681
+ label: :reimbursement_status,
682
+ type: :status,
683
+ sortable: false,
684
+ filterable: false,
685
+ default: true,
686
+ position: 50,
687
+ method: ->(cr) { cr.fully_reimbursed? ? 'reimbursed' : 'incomplete' }
688
+
689
+ Spree.admin.tables.customer_returns.add :pre_tax_total,
690
+ label: :pre_tax_total,
691
+ type: :money,
692
+ sortable: false,
693
+ filterable: false,
694
+ default: true,
695
+ position: 60,
696
+ method: ->(cr) { cr.display_pre_tax_total }
697
+
698
+ Spree.admin.tables.customer_returns.add :updated_at,
699
+ label: :updated_at,
700
+ type: :datetime,
701
+ sortable: true,
702
+ filterable: true,
703
+ default: false,
704
+ position: 70
705
+
706
+ # Register Option Types table
707
+ Spree.admin.tables.register(:option_types, model_class: Spree::OptionType, search_param: :name_cont, row_actions: true)
708
+
709
+ Spree.admin.tables.option_types.add :name,
710
+ label: :internal_name,
711
+ type: :string,
712
+ sortable: true,
713
+ filterable: true,
714
+ default: true,
715
+ position: 10,
716
+ method: ->(ot) { ot.name }
717
+
718
+ Spree.admin.tables.option_types.add :presentation,
719
+ label: :presentation,
720
+ type: :link,
721
+ sortable: true,
722
+ filterable: true,
723
+ default: true,
724
+ position: 20
725
+
726
+ Spree.admin.tables.option_types.add :filterable,
727
+ label: :filterable,
728
+ type: :boolean,
729
+ sortable: true,
730
+ filterable: true,
731
+ default: true,
732
+ position: 30
733
+
734
+ Spree.admin.tables.option_types.add :option_values_count,
735
+ label: :option_values,
736
+ type: :number,
737
+ sortable: false,
738
+ filterable: false,
739
+ default: true,
740
+ position: 40,
741
+ method: ->(ot) { ot.option_values.count }
742
+
743
+ Spree.admin.tables.option_types.add :products_count,
744
+ label: :products,
745
+ type: :number,
746
+ sortable: false,
747
+ filterable: false,
748
+ default: true,
749
+ position: 50,
750
+ method: ->(ot) { ot.products.count }
751
+
752
+ Spree.admin.tables.option_types.add :created_at,
753
+ label: :created_at,
754
+ type: :datetime,
755
+ sortable: true,
756
+ filterable: true,
757
+ default: false,
758
+ position: 60
759
+
760
+ Spree.admin.tables.option_types.add :updated_at,
761
+ label: :updated_at,
762
+ type: :datetime,
763
+ sortable: true,
764
+ filterable: true,
765
+ default: false,
766
+ position: 70
767
+
768
+ # Register Newsletter Subscribers table
769
+ Spree.admin.tables.register(:newsletter_subscribers, model_class: Spree::NewsletterSubscriber, search_param: :email_cont, row_actions: false, new_resource: false)
770
+
771
+ Spree.admin.tables.newsletter_subscribers.add :email,
772
+ label: :email,
773
+ type: :string,
774
+ sortable: true,
775
+ filterable: true,
776
+ default: true,
777
+ position: 10
778
+
779
+ Spree.admin.tables.newsletter_subscribers.add :customer,
780
+ label: :customer,
781
+ type: :custom,
782
+ sortable: false,
783
+ filterable: false,
784
+ default: true,
785
+ position: 20,
786
+ partial: 'spree/admin/tables/columns/newsletter_subscriber_customer'
787
+
788
+ Spree.admin.tables.newsletter_subscribers.add :verified,
789
+ label: :verified,
790
+ type: :boolean,
791
+ sortable: false,
792
+ filterable: true,
793
+ default: true,
794
+ position: 30,
795
+ method: ->(ns) { ns.verified? }
796
+
797
+ Spree.admin.tables.newsletter_subscribers.add :verified_at,
798
+ label: :verified_at,
799
+ type: :date,
800
+ sortable: true,
801
+ filterable: true,
802
+ default: true,
803
+ position: 40
804
+
805
+ Spree.admin.tables.newsletter_subscribers.add :created_at,
806
+ label: :created_at,
807
+ type: :datetime,
808
+ sortable: true,
809
+ filterable: true,
810
+ default: true,
811
+ position: 50
812
+
813
+ Spree.admin.tables.newsletter_subscribers.add :updated_at,
814
+ label: :updated_at,
815
+ type: :datetime,
816
+ sortable: true,
817
+ filterable: true,
818
+ default: false,
819
+ position: 60
820
+
821
+ # Register Policies table
822
+ Spree.admin.tables.register(:policies, model_class: Spree::Policy, search_param: :name_cont, row_actions: true)
823
+
824
+ Spree.admin.tables.policies.add :name,
825
+ label: :name,
826
+ type: :link,
827
+ sortable: true,
828
+ filterable: true,
829
+ default: true,
830
+ position: 10
831
+
832
+ Spree.admin.tables.policies.add :slug,
833
+ label: :slug,
834
+ type: :string,
835
+ sortable: true,
836
+ filterable: true,
837
+ default: true,
838
+ position: 20
839
+
840
+ Spree.admin.tables.policies.add :filled,
841
+ label: :filled,
842
+ type: :boolean,
843
+ sortable: false,
844
+ filterable: false,
845
+ default: true,
846
+ position: 30,
847
+ method: ->(policy) { policy.with_body? }
848
+
849
+ Spree.admin.tables.policies.add :created_at,
850
+ label: :created_at,
851
+ type: :datetime,
852
+ sortable: true,
853
+ filterable: true,
854
+ default: false,
855
+ position: 35
856
+
857
+ Spree.admin.tables.policies.add :updated_at,
858
+ label: :updated_at,
859
+ type: :datetime,
860
+ sortable: true,
861
+ filterable: true,
862
+ default: true,
863
+ position: 40
864
+
865
+ Spree.admin.tables.policies.add :owner,
866
+ label: 'activerecord.attributes.spree/policy.owner',
867
+ type: :string,
868
+ sortable: false,
869
+ filterable: false,
870
+ default: true,
871
+ position: 50,
872
+ method: ->(policy) { policy.owner.name }
873
+
874
+ # Register Stock Transfers table
875
+ Spree.admin.tables.register(:stock_transfers, model_class: Spree::StockTransfer, search_param: :number_or_reference_cont, link_to_action: :show)
876
+
877
+ Spree.admin.tables.stock_transfers.add :number,
878
+ label: :number,
879
+ type: :link,
880
+ sortable: true,
881
+ filterable: true,
882
+ default: true,
883
+ position: 10
884
+
885
+ Spree.admin.tables.stock_transfers.add :reference,
886
+ label: :reference,
887
+ type: :string,
888
+ sortable: true,
889
+ filterable: true,
890
+ default: true,
891
+ position: 20
892
+
893
+ Spree.admin.tables.stock_transfers.add :source,
894
+ label: :source,
895
+ type: :string,
896
+ sortable: false,
897
+ filterable: false,
898
+ default: true,
899
+ position: 30,
900
+ method: ->(st) { st.source_location&.display_name.presence || Spree.t(:none) }
901
+
902
+ Spree.admin.tables.stock_transfers.add :destination,
903
+ label: :destination,
904
+ type: :string,
905
+ sortable: false,
906
+ filterable: false,
907
+ default: true,
908
+ position: 40,
909
+ method: ->(st) { st.destination_location.display_name }
910
+
911
+ Spree.admin.tables.stock_transfers.add :variants_count,
912
+ label: :variants_count,
913
+ type: :number,
914
+ sortable: false,
915
+ filterable: false,
916
+ default: true,
917
+ position: 50,
918
+ method: ->(st) { st.destination_movements.size }
919
+
920
+ Spree.admin.tables.stock_transfers.add :created_at,
921
+ label: :created_at,
922
+ type: :datetime,
923
+ sortable: true,
924
+ filterable: true,
925
+ default: true,
926
+ position: 60
927
+
928
+ Spree.admin.tables.stock_transfers.add :updated_at,
929
+ label: :updated_at,
930
+ type: :datetime,
931
+ sortable: true,
932
+ filterable: true,
933
+ default: false,
934
+ position: 70
935
+
936
+ # Register Metafield Definitions table
937
+ Spree.admin.tables.register(:metafield_definitions, model_class: Spree::MetafieldDefinition, search_param: :multi_search, row_actions: true)
938
+
939
+ Spree.admin.tables.metafield_definitions.add :key,
940
+ label: :key,
941
+ type: :string,
942
+ sortable: true,
943
+ filterable: true,
944
+ default: true,
945
+ position: 10,
946
+ method: ->(md) { md.full_key }
947
+
948
+ Spree.admin.tables.metafield_definitions.add :name,
949
+ label: :name,
950
+ type: :link,
951
+ sortable: true,
952
+ filterable: true,
953
+ default: true,
954
+ position: 20
955
+
956
+ Spree.admin.tables.metafield_definitions.add :resource,
957
+ label: :resource,
958
+ type: :string,
959
+ sortable: true,
960
+ filterable: true,
961
+ default: true,
962
+ position: 30,
963
+ ransack_attribute: 'resource_type',
964
+ method: ->(md) { md.resource_type.demodulize.titleize }
965
+
966
+ Spree.admin.tables.metafield_definitions.add :type,
967
+ label: :type,
968
+ type: :status,
969
+ sortable: false,
970
+ filterable: false,
971
+ default: true,
972
+ position: 40,
973
+ method: ->(md) { md.metafield_type.demodulize.titleize }
974
+
975
+ Spree.admin.tables.metafield_definitions.add :display_on,
976
+ label: :display_on,
977
+ type: :custom,
978
+ sortable: true,
979
+ filterable: true,
980
+ default: true,
981
+ position: 50,
982
+ partial: 'spree/admin/tables/columns/metafield_definition_display_on'
983
+
984
+ Spree.admin.tables.metafield_definitions.add :used_in,
985
+ label: 'admin.metafield_definitions.used_in',
986
+ type: :string,
987
+ sortable: false,
988
+ filterable: false,
989
+ default: true,
990
+ position: 60,
991
+ method: ->(md) {
992
+ count = md.metafields.count
993
+ if count.positive?
994
+ "#{count} #{Spree.t(md.resource_type.demodulize.downcase.pluralize.to_sym)}"
995
+ else
996
+ Spree.t(:not_available)
997
+ end
998
+ }
999
+
1000
+ Spree.admin.tables.metafield_definitions.add :created_at,
1001
+ label: :created_at,
1002
+ type: :datetime,
1003
+ sortable: true,
1004
+ filterable: true,
1005
+ default: false,
1006
+ position: 70
1007
+
1008
+ Spree.admin.tables.metafield_definitions.add :updated_at,
1009
+ label: :updated_at,
1010
+ type: :datetime,
1011
+ sortable: true,
1012
+ filterable: true,
1013
+ default: false,
1014
+ position: 80
1015
+
1016
+ # Register Gift Cards table
1017
+ Spree.admin.tables.register(:gift_cards, model_class: Spree::GiftCard, search_param: :code_i_cont, row_actions: false, link_to_action: :show)
1018
+
1019
+ Spree.admin.tables.gift_cards.add :code,
1020
+ label: :code,
1021
+ type: :link,
1022
+ sortable: true,
1023
+ filterable: true,
1024
+ default: true,
1025
+ position: 10,
1026
+ method: ->(gc) { gc.code.upcase }
1027
+
1028
+ Spree.admin.tables.gift_cards.add :amount,
1029
+ label: :amount,
1030
+ type: :money,
1031
+ sortable: true,
1032
+ filterable: true,
1033
+ default: true,
1034
+ position: 20,
1035
+ method: ->(gc) { gc.display_amount }
1036
+
1037
+ Spree.admin.tables.gift_cards.add :used,
1038
+ label: :used,
1039
+ type: :money,
1040
+ sortable: false,
1041
+ filterable: false,
1042
+ default: true,
1043
+ position: 30,
1044
+ method: ->(gc) { gc.display_amount_used }
1045
+
1046
+ Spree.admin.tables.gift_cards.add :currency,
1047
+ label: :currency,
1048
+ type: :string,
1049
+ sortable: true,
1050
+ filterable: false,
1051
+ default: true,
1052
+ position: 40,
1053
+ method: ->(gc) { gc.currency.upcase }
1054
+
1055
+ Spree.admin.tables.gift_cards.add :status,
1056
+ label: :status,
1057
+ type: :custom,
1058
+ sortable: false,
1059
+ filterable: true,
1060
+ default: true,
1061
+ position: 50,
1062
+ ransack_attribute: 'state',
1063
+ partial: 'spree/admin/tables/columns/gift_card_status'
1064
+
1065
+ Spree.admin.tables.gift_cards.add :expires_at,
1066
+ label: :expires_at,
1067
+ type: :date,
1068
+ sortable: true,
1069
+ filterable: true,
1070
+ default: true,
1071
+ position: 60
1072
+
1073
+ Spree.admin.tables.gift_cards.add :customer,
1074
+ label: :customer,
1075
+ type: :string,
1076
+ filter_type: :autocomplete,
1077
+ sortable: false,
1078
+ filterable: true,
1079
+ default: true,
1080
+ position: 70,
1081
+ ransack_attribute: 'user_id',
1082
+ operators: %i[eq],
1083
+ search_url: '/admin/users/select_options.json',
1084
+ method: ->(gc) { gc.user&.email }
1085
+
1086
+ Spree.admin.tables.gift_cards.add :created_at,
1087
+ label: :created_at,
1088
+ type: :datetime,
1089
+ sortable: true,
1090
+ filterable: true,
1091
+ default: false,
1092
+ position: 80
1093
+
1094
+ Spree.admin.tables.gift_cards.add :updated_at,
1095
+ label: :updated_at,
1096
+ type: :datetime,
1097
+ sortable: true,
1098
+ filterable: true,
1099
+ default: false,
1100
+ position: 90
1101
+
1102
+ # Register Stock Items table
1103
+ Spree.admin.tables.register(:stock_items, model_class: Spree::StockItem, search_param: :variant_product_name_cont, row_actions: false, new_resource: false)
1104
+
1105
+ # Variant with image (custom partial)
1106
+ Spree.admin.tables.stock_items.add :variant,
1107
+ label: :variant,
1108
+ type: :custom,
1109
+ sortable: false,
1110
+ filterable: true,
1111
+ default: true,
1112
+ position: 10,
1113
+ ransack_attribute: 'variant_product_name',
1114
+ partial: 'spree/admin/variants/variant',
1115
+ partial_locals: ->(record) { { variant: record.variant } }
1116
+
1117
+ # Stock location
1118
+ Spree.admin.tables.stock_items.add :stock_location,
1119
+ label: :stock_location,
1120
+ type: :custom,
1121
+ filter_type: :autocomplete,
1122
+ sortable: false,
1123
+ filterable: true,
1124
+ default: true,
1125
+ position: 20,
1126
+ ransack_attribute: 'stock_location_id',
1127
+ operators: %i[eq],
1128
+ search_url: '/admin/stock_locations/select_options.json',
1129
+ partial: 'spree/admin/tables/columns/stock_item_location'
1130
+
1131
+ # Backorderable (inline editable checkbox)
1132
+ Spree.admin.tables.stock_items.add :backorderable,
1133
+ label: :backorderable,
1134
+ type: :custom,
1135
+ sortable: false,
1136
+ filterable: false,
1137
+ default: true,
1138
+ position: 30,
1139
+ partial: 'spree/admin/tables/columns/stock_item_backorderable'
1140
+
1141
+ # Count on hand (inline editable number field)
1142
+ Spree.admin.tables.stock_items.add :count_on_hand,
1143
+ label: :count_on_hand,
1144
+ type: :custom,
1145
+ sortable: true,
1146
+ filterable: true,
1147
+ default: true,
1148
+ position: 40,
1149
+ partial: 'spree/admin/tables/columns/stock_item_count_on_hand'
1150
+
1151
+ # SKU (filter-only)
1152
+ Spree.admin.tables.stock_items.add :sku,
1153
+ label: :sku,
1154
+ type: :string,
1155
+ sortable: false,
1156
+ filterable: true,
1157
+ displayable: false,
1158
+ default: false,
1159
+ position: 50,
1160
+ ransack_attribute: 'variant_sku'
1161
+
1162
+ Spree.admin.tables.stock_items.add :created_at,
1163
+ label: :created_at,
1164
+ type: :datetime,
1165
+ sortable: true,
1166
+ filterable: true,
1167
+ default: false,
1168
+ position: 60
1169
+
1170
+ Spree.admin.tables.stock_items.add :updated_at,
1171
+ label: :updated_at,
1172
+ type: :datetime,
1173
+ sortable: true,
1174
+ filterable: true,
1175
+ default: false,
1176
+ position: 70
1177
+
1178
+ # ==========================================
1179
+ # Posts Table
1180
+ # ==========================================
1181
+ Spree.admin.tables.register(:posts, model_class: Spree::Post, search_param: :title_cont)
1182
+
1183
+ Spree.admin.tables.posts.add :title,
1184
+ label: :title,
1185
+ type: :link,
1186
+ sortable: true,
1187
+ filterable: true,
1188
+ default: true,
1189
+ position: 10
1190
+
1191
+ Spree.admin.tables.posts.add :post_category,
1192
+ label: :category,
1193
+ type: :string,
1194
+ filter_type: :autocomplete,
1195
+ sortable: false,
1196
+ filterable: true,
1197
+ default: true,
1198
+ position: 20,
1199
+ method: ->(post) { post.post_category_title },
1200
+ ransack_attribute: 'post_category_id',
1201
+ search_url: '/admin/post_categories/select_options.json'
1202
+
1203
+ Spree.admin.tables.posts.add :author,
1204
+ label: :author,
1205
+ type: :string,
1206
+ filter_type: :autocomplete,
1207
+ sortable: false,
1208
+ filterable: true,
1209
+ default: true,
1210
+ position: 30,
1211
+ method: ->(post) { post.author_name },
1212
+ ransack_attribute: 'author_id',
1213
+ search_url: '/admin/admin_users/select_options.json'
1214
+
1215
+ Spree.admin.tables.posts.add :published_at,
1216
+ label: :published_at,
1217
+ type: :date,
1218
+ sortable: true,
1219
+ filterable: true,
1220
+ default: true,
1221
+ position: 40
1222
+
1223
+ Spree.admin.tables.posts.add :created_at,
1224
+ label: :created_at,
1225
+ type: :datetime,
1226
+ sortable: true,
1227
+ filterable: true,
1228
+ default: false,
1229
+ position: 50
1230
+
1231
+ Spree.admin.tables.posts.add :updated_at,
1232
+ label: :updated_at,
1233
+ type: :datetime,
1234
+ sortable: true,
1235
+ filterable: true,
1236
+ default: false,
1237
+ position: 60
1238
+
1239
+ # ==========================================
1240
+ # Post Categories Table
1241
+ # ==========================================
1242
+ Spree.admin.tables.register(:post_categories, model_class: Spree::PostCategory, search_param: :title_cont)
1243
+
1244
+ Spree.admin.tables.post_categories.add :title,
1245
+ label: :title,
1246
+ type: :link,
1247
+ sortable: true,
1248
+ filterable: true,
1249
+ default: true,
1250
+ position: 10
1251
+
1252
+ Spree.admin.tables.post_categories.add :posts_count,
1253
+ label: :posts,
1254
+ type: :number,
1255
+ sortable: false,
1256
+ filterable: false,
1257
+ default: true,
1258
+ position: 20,
1259
+ method: ->(post_category) { post_category.posts.count }
1260
+
1261
+ Spree.admin.tables.post_categories.add :created_at,
1262
+ label: :created_at,
1263
+ type: :datetime,
1264
+ sortable: true,
1265
+ filterable: true,
1266
+ default: false,
1267
+ position: 30
1268
+
1269
+ Spree.admin.tables.post_categories.add :updated_at,
1270
+ label: :updated_at,
1271
+ type: :datetime,
1272
+ sortable: true,
1273
+ filterable: true,
1274
+ default: false,
1275
+ position: 40
1276
+
1277
+ # ==========================================
1278
+ # Webhook Endpoints Table
1279
+ # ==========================================
1280
+ Spree.admin.tables.register(:webhook_endpoints, model_class: Spree::WebhookEndpoint, search_param: :url_cont, row_actions: false, link_to_action: :show)
1281
+
1282
+ Spree.admin.tables.webhook_endpoints.add :url,
1283
+ label: :url,
1284
+ type: :link,
1285
+ sortable: true,
1286
+ filterable: true,
1287
+ default: true,
1288
+ position: 10
1289
+
1290
+ Spree.admin.tables.webhook_endpoints.add :active,
1291
+ label: :active,
1292
+ type: :boolean,
1293
+ sortable: true,
1294
+ filterable: true,
1295
+ default: true,
1296
+ position: 20,
1297
+ filter_type: :select,
1298
+ value_options: [
1299
+ { value: 'true', label: 'Active' },
1300
+ { value: 'false', label: 'Inactive' }
1301
+ ]
1302
+
1303
+ Spree.admin.tables.webhook_endpoints.add :subscriptions_count,
1304
+ label: 'admin.webhook_endpoints.events',
1305
+ type: :string,
1306
+ sortable: false,
1307
+ filterable: false,
1308
+ default: true,
1309
+ position: 30,
1310
+ method: ->(endpoint) { "#{endpoint.subscriptions.size} #{I18n.t('spree.admin.webhook_endpoints.events')}" }
1311
+
1312
+ Spree.admin.tables.webhook_endpoints.add :deliveries_stats,
1313
+ label: :deliveries,
1314
+ type: :custom,
1315
+ sortable: false,
1316
+ filterable: false,
1317
+ default: true,
1318
+ position: 40,
1319
+ partial: 'spree/admin/tables/columns/webhook_deliveries_stats'
1320
+
1321
+ Spree.admin.tables.webhook_endpoints.add :created_at,
1322
+ label: :created_at,
1323
+ type: :datetime,
1324
+ sortable: true,
1325
+ filterable: true,
1326
+ default: true,
1327
+ position: 50
1328
+
1329
+ Spree.admin.tables.webhook_endpoints.add :updated_at,
1330
+ label: :updated_at,
1331
+ type: :datetime,
1332
+ sortable: true,
1333
+ filterable: true,
1334
+ default: false,
1335
+ position: 60
1336
+
1337
+ # ==========================================
1338
+ # Webhook Deliveries Table
1339
+ # ==========================================
1340
+ Spree.admin.tables.register(:webhook_deliveries, model_class: Spree::WebhookDelivery, search_param: :event_name_cont, row_actions: false, new_resource: false)
1341
+
1342
+ Spree.admin.tables.webhook_deliveries.add :event_name,
1343
+ label: :event,
1344
+ type: :string,
1345
+ sortable: true,
1346
+ filterable: true,
1347
+ default: true,
1348
+ position: 10,
1349
+ method: ->(delivery) { delivery.event_name }
1350
+
1351
+ Spree.admin.tables.webhook_deliveries.add :status,
1352
+ label: :status,
1353
+ type: :custom,
1354
+ sortable: false,
1355
+ filterable: false,
1356
+ default: true,
1357
+ position: 20,
1358
+ partial: 'spree/admin/tables/columns/webhook_delivery_status'
1359
+
1360
+ Spree.admin.tables.webhook_deliveries.add :delivered_at,
1361
+ label: :delivered_at,
1362
+ type: :datetime,
1363
+ sortable: true,
1364
+ filterable: true,
1365
+ default: true,
1366
+ position: 30
1367
+
1368
+ Spree.admin.tables.webhook_deliveries.add :execution_time,
1369
+ label: :execution_time,
1370
+ type: :string,
1371
+ sortable: true,
1372
+ filterable: false,
1373
+ default: true,
1374
+ position: 40,
1375
+ method: ->(delivery) { delivery.execution_time ? "#{delivery.execution_time}ms" : '-' }
1376
+
1377
+ Spree.admin.tables.webhook_deliveries.add :response_code,
1378
+ label: :response_code,
1379
+ type: :string,
1380
+ sortable: true,
1381
+ filterable: false,
1382
+ default: true,
1383
+ position: 50,
1384
+ method: ->(delivery) { delivery.response_code || '-' }
1385
+
1386
+ Spree.admin.tables.webhook_deliveries.add :actions,
1387
+ label: :details,
1388
+ type: :custom,
1389
+ sortable: false,
1390
+ filterable: false,
1391
+ default: true,
1392
+ position: 60,
1393
+ partial: 'spree/admin/tables/columns/webhook_delivery_actions'
1394
+
1395
+ Spree.admin.tables.webhook_deliveries.add :created_at,
1396
+ label: :created_at,
1397
+ type: :datetime,
1398
+ sortable: true,
1399
+ filterable: true,
1400
+ default: false,
1401
+ position: 70
1402
+
1403
+ Spree.admin.tables.webhook_deliveries.add :updated_at,
1404
+ label: :updated_at,
1405
+ type: :datetime,
1406
+ sortable: true,
1407
+ filterable: true,
1408
+ default: false,
1409
+ position: 80
1410
+
1411
+ # ==========================================
1412
+ # Price Lists Table
1413
+ # ==========================================
1414
+ Spree.admin.tables.register(:price_lists, model_class: Spree::PriceList, search_param: :name_cont, link_to_action: :show)
1415
+
1416
+ Spree.admin.tables.price_lists.add :name,
1417
+ label: :name,
1418
+ type: :link,
1419
+ sortable: true,
1420
+ filterable: true,
1421
+ default: true,
1422
+ position: 10
1423
+
1424
+ Spree.admin.tables.price_lists.add :status,
1425
+ label: :status,
1426
+ type: :custom,
1427
+ filter_type: :select,
1428
+ sortable: true,
1429
+ filterable: true,
1430
+ default: true,
1431
+ position: 20,
1432
+ partial: 'spree/admin/tables/columns/price_list_status',
1433
+ value_options: [
1434
+ { value: 'draft', label: 'Draft' },
1435
+ { value: 'active', label: 'Active' },
1436
+ { value: 'scheduled', label: 'Scheduled' },
1437
+ { value: 'inactive', label: 'Inactive' }
1438
+ ]
1439
+
1440
+ Spree.admin.tables.price_lists.add :starts_at,
1441
+ label: :starts_at,
1442
+ type: :datetime,
1443
+ sortable: true,
1444
+ filterable: true,
1445
+ default: true,
1446
+ position: 30
1447
+
1448
+ Spree.admin.tables.price_lists.add :ends_at,
1449
+ label: :ends_at,
1450
+ type: :datetime,
1451
+ sortable: true,
1452
+ filterable: true,
1453
+ default: true,
1454
+ position: 40
1455
+
1456
+ Spree.admin.tables.price_lists.add :created_at,
1457
+ label: :created_at,
1458
+ type: :datetime,
1459
+ sortable: true,
1460
+ filterable: true,
1461
+ default: false,
1462
+ position: 50
1463
+
1464
+ Spree.admin.tables.price_lists.add :updated_at,
1465
+ label: :updated_at,
1466
+ type: :datetime,
1467
+ sortable: true,
1468
+ filterable: true,
1469
+ default: false,
1470
+ position: 60
1471
+
1472
+ # ==========================================
1473
+ # Price List Products Table
1474
+ # ==========================================
1475
+ Spree.admin.tables.register(:price_list_products, model_class: Spree::Product, search_param: :multi_search, row_actions: false, new_resource: false)
1476
+
1477
+ Spree.admin.tables.price_list_products.add :name,
1478
+ label: :name,
1479
+ type: :custom,
1480
+ sortable: true,
1481
+ filterable: true,
1482
+ default: true,
1483
+ position: 10,
1484
+ partial: 'spree/admin/tables/columns/product_name'
1485
+
1486
+ Spree.admin.tables.price_list_products.add :status,
1487
+ label: :status,
1488
+ type: :custom,
1489
+ filter_type: :status,
1490
+ sortable: true,
1491
+ filterable: true,
1492
+ default: true,
1493
+ position: 20,
1494
+ partial: 'spree/admin/tables/columns/product_status',
1495
+ ransack_attribute: 'status',
1496
+ value_options: -> { Spree::Product::STATUSES.map { |s| { value: s, label: s.humanize } } }
1497
+
1498
+ Spree.admin.tables.price_list_products.add :inventory,
1499
+ label: :inventory,
1500
+ type: :custom,
1501
+ sortable: false,
1502
+ filterable: false,
1503
+ default: true,
1504
+ position: 30,
1505
+ partial: 'spree/admin/tables/columns/product_inventory'
1506
+
1507
+ Spree.admin.tables.price_list_products.add :created_at,
1508
+ label: :created_at,
1509
+ type: :datetime,
1510
+ sortable: true,
1511
+ filterable: true,
1512
+ default: false,
1513
+ position: 50
1514
+
1515
+ Spree.admin.tables.price_list_products.add :updated_at,
1516
+ label: :updated_at,
1517
+ type: :datetime,
1518
+ sortable: true,
1519
+ filterable: true,
1520
+ default: false,
1521
+ position: 60
1522
+
1523
+ Spree.admin.tables.price_list_products.add_bulk_action :remove_from_price_list,
1524
+ label: 'admin.bulk_ops.price_list_products.title.remove',
1525
+ icon: 'trash',
1526
+ action_path: ->(view_context) { view_context.spree.bulk_destroy_admin_price_list_products_path(view_context.instance_variable_get(:@price_list)) },
1527
+ body: 'admin.bulk_ops.price_list_products.body.remove',
1528
+ button_text: :remove,
1529
+ button_class: 'btn-danger',
1530
+ method: :delete,
1531
+ position: 10
1532
+
1533
+ # ==========================================
1534
+ # Customer Groups Table
1535
+ # ==========================================
1536
+ Spree.admin.tables.register(:customer_groups, model_class: Spree::CustomerGroup, search_param: :name_cont, link_to_action: :show)
1537
+
1538
+ Spree.admin.tables.customer_groups.add :name,
1539
+ label: :name,
1540
+ type: :link,
1541
+ sortable: true,
1542
+ filterable: true,
1543
+ default: true,
1544
+ position: 10
1545
+
1546
+ Spree.admin.tables.customer_groups.add :description,
1547
+ label: :description,
1548
+ type: :string,
1549
+ sortable: false,
1550
+ filterable: false,
1551
+ default: true,
1552
+ position: 20,
1553
+ method: ->(cg) { cg.description.to_s.truncate(50) }
1554
+
1555
+ Spree.admin.tables.customer_groups.add :users_count,
1556
+ label: :customers,
1557
+ type: :number,
1558
+ sortable: false,
1559
+ filterable: false,
1560
+ default: true,
1561
+ position: 30,
1562
+ method: ->(cg) { cg.users_count }
1563
+
1564
+ Spree.admin.tables.customer_groups.add :created_at,
1565
+ label: :created_at,
1566
+ type: :datetime,
1567
+ sortable: true,
1568
+ filterable: true,
1569
+ default: false,
1570
+ position: 40
1571
+
1572
+ Spree.admin.tables.customer_groups.add :updated_at,
1573
+ label: :updated_at,
1574
+ type: :datetime,
1575
+ sortable: true,
1576
+ filterable: true,
1577
+ default: true,
1578
+ position: 50
1579
+
1580
+ # ==========================================
1581
+ # Customer Group Users Table (users within a customer group)
1582
+ # ==========================================
1583
+ Spree.admin.tables.register(:customer_group_users, model_class: Spree.user_class, search_param: :multi_search, row_actions: false, new_resource: false)
1584
+
1585
+ Spree.admin.tables.customer_group_users.add :name,
1586
+ label: :name,
1587
+ type: :custom,
1588
+ sortable: true,
1589
+ filterable: false,
1590
+ default: true,
1591
+ position: 10,
1592
+ ransack_attribute: 'first_name',
1593
+ partial: 'spree/admin/shared/user',
1594
+ partial_locals: ->(record) { { user: record } }
1595
+
1596
+ Spree.admin.tables.customer_group_users.add :location,
1597
+ label: :location,
1598
+ type: :custom,
1599
+ sortable: false,
1600
+ filterable: false,
1601
+ default: false,
1602
+ position: 20,
1603
+ partial: 'spree/admin/tables/columns/user_location'
1604
+
1605
+ Spree.admin.tables.customer_group_users.add :created_at,
1606
+ label: :added_at,
1607
+ type: :datetime,
1608
+ sortable: true,
1609
+ filterable: false,
1610
+ default: true,
1611
+ position: 30
1612
+
1613
+ Spree.admin.tables.customer_group_users.add_bulk_action :remove_from_customer_group,
1614
+ label: 'admin.bulk_ops.customer_group_users.title.remove',
1615
+ icon: 'trash',
1616
+ action_path: ->(view_context) { view_context.spree.bulk_destroy_admin_customer_group_customer_group_users_path(view_context.instance_variable_get(:@customer_group)) },
1617
+ body: 'admin.bulk_ops.customer_group_users.body.remove',
1618
+ button_text: :remove,
1619
+ button_class: 'btn-danger',
1620
+ method: :delete,
1621
+ position: 10
1622
+ end