solidus_admin 0.4.0 → 0.5.0

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 (335) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +23 -4
  3. data/README.md +6 -1
  4. data/Rakefile +15 -15
  5. data/app/assets/builds/solidus_admin/tailwind.css +722 -45
  6. data/app/assets/images/solidus_admin/remixicon.license.txt +196 -0
  7. data/app/assets/images/solidus_admin/remixicon.symbol.svg +4 -4
  8. data/app/blueprints/solidus_admin/state_blueprint.rb +13 -0
  9. data/app/components/concerns/solidus_admin/slotable_default.rb +42 -0
  10. data/app/components/solidus_admin/adjustment_reasons/edit/component.html.erb +6 -15
  11. data/app/components/solidus_admin/adjustment_reasons/edit/component.yml +0 -1
  12. data/app/components/solidus_admin/adjustment_reasons/index/component.rb +13 -13
  13. data/app/components/solidus_admin/adjustment_reasons/new/component.html.erb +6 -15
  14. data/app/components/solidus_admin/adjustment_reasons/new/component.yml +0 -1
  15. data/app/components/solidus_admin/base_component.rb +7 -3
  16. data/app/components/solidus_admin/layout/confirm/component.html.erb +18 -0
  17. data/app/components/solidus_admin/layout/confirm/component.js +21 -0
  18. data/app/components/solidus_admin/layout/confirm/component.rb +26 -0
  19. data/app/components/solidus_admin/layout/confirm/component.yml +4 -0
  20. data/app/components/solidus_admin/layout/flashes/alerts/component.html.erb +7 -0
  21. data/app/components/solidus_admin/layout/flashes/alerts/component.rb +19 -0
  22. data/app/components/solidus_admin/layout/flashes/component.html.erb +5 -0
  23. data/app/components/solidus_admin/layout/flashes/component.rb +4 -0
  24. data/app/components/solidus_admin/layout/flashes/toasts/component.html.erb +5 -0
  25. data/app/components/solidus_admin/layout/flashes/toasts/component.rb +9 -0
  26. data/app/components/solidus_admin/layout/navigation/account/component.html.erb +12 -1
  27. data/app/components/solidus_admin/layout/navigation/account/component.rb +4 -4
  28. data/app/components/solidus_admin/layout/page_helpers.rb +3 -9
  29. data/app/components/solidus_admin/layout/skip_link/component.rb +3 -3
  30. data/app/components/solidus_admin/option_types/edit/component.html.erb +44 -0
  31. data/app/components/solidus_admin/option_types/edit/component.rb +5 -0
  32. data/app/components/solidus_admin/option_types/edit/component.yml +10 -0
  33. data/app/components/solidus_admin/option_types/index/component.rb +22 -22
  34. data/app/components/solidus_admin/option_types/new/component.html.erb +16 -0
  35. data/app/components/solidus_admin/option_types/new/component.rb +4 -0
  36. data/app/components/solidus_admin/option_types/new/component.yml +4 -0
  37. data/app/components/solidus_admin/option_values/edit/component.html.erb +16 -0
  38. data/app/components/solidus_admin/option_values/edit/component.rb +4 -0
  39. data/app/components/solidus_admin/option_values/edit/component.yml +4 -0
  40. data/app/components/solidus_admin/option_values/new/component.html.erb +16 -0
  41. data/app/components/solidus_admin/option_values/new/component.rb +7 -0
  42. data/app/components/solidus_admin/option_values/new/component.yml +4 -0
  43. data/app/components/solidus_admin/option_values/table/component.rb +53 -0
  44. data/app/components/solidus_admin/option_values/table/component.yml +3 -0
  45. data/app/components/solidus_admin/orders/cart/component.html.erb +5 -7
  46. data/app/components/solidus_admin/orders/cart/result/component.html.erb +2 -2
  47. data/app/components/solidus_admin/orders/index/component.rb +26 -26
  48. data/app/components/solidus_admin/orders/show/address/component.html.erb +8 -20
  49. data/app/components/solidus_admin/orders/show/address/component.rb +7 -7
  50. data/app/components/solidus_admin/orders/show/address/component.yml +0 -1
  51. data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/spree_shipment/component.rb +1 -1
  52. data/app/components/solidus_admin/orders/show/adjustments/index/component.rb +24 -21
  53. data/app/components/solidus_admin/orders/show/component.html.erb +2 -2
  54. data/app/components/solidus_admin/orders/show/component.rb +1 -1
  55. data/app/components/solidus_admin/orders/show/component.yml +0 -3
  56. data/app/components/solidus_admin/orders/show/customer_search/result/component.html.erb +2 -2
  57. data/app/components/solidus_admin/orders/show/email/component.html.erb +2 -2
  58. data/app/components/solidus_admin/payment_methods/edit/component.html.erb +13 -0
  59. data/app/components/solidus_admin/payment_methods/edit/component.rb +7 -0
  60. data/app/components/solidus_admin/payment_methods/edit/component.yml +2 -0
  61. data/app/components/solidus_admin/payment_methods/form/component.html.erb +29 -0
  62. data/app/components/solidus_admin/payment_methods/form/component.rb +34 -0
  63. data/app/components/solidus_admin/payment_methods/form/component.yml +15 -0
  64. data/app/components/solidus_admin/payment_methods/index/component.rb +24 -23
  65. data/app/components/solidus_admin/payment_methods/new/component.html.erb +12 -0
  66. data/app/components/solidus_admin/payment_methods/new/component.rb +7 -0
  67. data/app/components/solidus_admin/payment_methods/new/component.yml +2 -0
  68. data/app/components/solidus_admin/products/index/component.rb +26 -26
  69. data/app/components/solidus_admin/products/show/categories/new/component.html.erb +17 -0
  70. data/app/components/solidus_admin/products/show/categories/new/component.rb +17 -0
  71. data/app/components/solidus_admin/products/show/categories/new/component.yml +5 -0
  72. data/app/components/solidus_admin/products/show/component.html.erb +90 -66
  73. data/app/components/solidus_admin/products/show/component.rb +2 -2
  74. data/app/components/solidus_admin/products/show/component.yml +23 -11
  75. data/app/components/solidus_admin/products/status/component.rb +1 -1
  76. data/app/components/solidus_admin/products/stock/component.rb +7 -7
  77. data/app/components/solidus_admin/properties/edit/component.html.erb +5 -5
  78. data/app/components/solidus_admin/properties/index/component.rb +13 -13
  79. data/app/components/solidus_admin/properties/new/component.html.erb +5 -5
  80. data/app/components/solidus_admin/refund_reasons/edit/component.html.erb +6 -15
  81. data/app/components/solidus_admin/refund_reasons/edit/component.yml +0 -1
  82. data/app/components/solidus_admin/refund_reasons/index/component.rb +13 -13
  83. data/app/components/solidus_admin/refund_reasons/new/component.html.erb +6 -14
  84. data/app/components/solidus_admin/refund_reasons/new/component.yml +0 -1
  85. data/app/components/solidus_admin/refunds_and_returns/component.rb +7 -7
  86. data/app/components/solidus_admin/reimbursement_types/index/component.rb +2 -2
  87. data/app/components/solidus_admin/return_reasons/edit/component.html.erb +5 -14
  88. data/app/components/solidus_admin/return_reasons/index/component.rb +11 -11
  89. data/app/components/solidus_admin/return_reasons/new/component.html.erb +5 -14
  90. data/app/components/solidus_admin/roles/edit/component.html.erb +12 -12
  91. data/app/components/solidus_admin/roles/edit/component.yml +0 -1
  92. data/app/components/solidus_admin/roles/index/component.rb +12 -12
  93. data/app/components/solidus_admin/roles/new/component.html.erb +12 -12
  94. data/app/components/solidus_admin/roles/new/component.yml +0 -1
  95. data/app/components/solidus_admin/shipping/component.rb +5 -5
  96. data/app/components/solidus_admin/shipping_categories/edit/component.html.erb +4 -4
  97. data/app/components/solidus_admin/shipping_categories/edit/component.yml +0 -1
  98. data/app/components/solidus_admin/shipping_categories/index/component.rb +9 -9
  99. data/app/components/solidus_admin/shipping_categories/new/component.html.erb +4 -4
  100. data/app/components/solidus_admin/shipping_categories/new/component.yml +0 -1
  101. data/app/components/solidus_admin/shipping_methods/index/component.rb +10 -10
  102. data/app/components/solidus_admin/stock_items/edit/component.html.erb +5 -8
  103. data/app/components/solidus_admin/stock_items/edit/component.rb +2 -2
  104. data/app/components/solidus_admin/stock_items/index/component.rb +25 -25
  105. data/app/components/solidus_admin/stock_locations/edit/component.html.erb +16 -0
  106. data/app/components/solidus_admin/stock_locations/edit/component.rb +5 -0
  107. data/app/components/solidus_admin/stock_locations/edit/component.yml +2 -0
  108. data/app/components/solidus_admin/stock_locations/form/component.html.erb +65 -0
  109. data/app/components/solidus_admin/stock_locations/form/component.rb +11 -0
  110. data/app/components/solidus_admin/stock_locations/form/component.yml +19 -0
  111. data/app/components/solidus_admin/stock_locations/index/component.rb +94 -47
  112. data/app/components/solidus_admin/stock_locations/new/component.html.erb +16 -0
  113. data/app/components/solidus_admin/stock_locations/new/component.rb +16 -0
  114. data/app/components/solidus_admin/stock_locations/new/component.yml +2 -0
  115. data/app/components/solidus_admin/store_credit_reasons/edit/component.html.erb +5 -14
  116. data/app/components/solidus_admin/store_credit_reasons/edit/component.yml +0 -1
  117. data/app/components/solidus_admin/store_credit_reasons/index/component.rb +11 -11
  118. data/app/components/solidus_admin/store_credit_reasons/new/component.html.erb +5 -14
  119. data/app/components/solidus_admin/store_credit_reasons/new/component.yml +0 -1
  120. data/app/components/solidus_admin/stores/edit/component.html.erb +27 -0
  121. data/app/components/solidus_admin/stores/edit/component.rb +5 -0
  122. data/app/components/solidus_admin/stores/form/component.html.erb +102 -0
  123. data/app/components/solidus_admin/stores/form/component.rb +27 -0
  124. data/app/components/solidus_admin/stores/form/component.yml +17 -0
  125. data/app/components/solidus_admin/stores/index/component.rb +51 -22
  126. data/app/components/solidus_admin/stores/new/component.html.erb +16 -0
  127. data/app/components/solidus_admin/stores/new/component.rb +5 -0
  128. data/app/components/solidus_admin/stores/new/component.yml +2 -0
  129. data/app/components/solidus_admin/tax_categories/edit/component.html.erb +7 -15
  130. data/app/components/solidus_admin/tax_categories/edit/component.yml +0 -1
  131. data/app/components/solidus_admin/tax_categories/index/component.rb +17 -17
  132. data/app/components/solidus_admin/tax_categories/new/component.html.erb +7 -15
  133. data/app/components/solidus_admin/tax_categories/new/component.yml +0 -1
  134. data/app/components/solidus_admin/tax_rates/edit/component.html.erb +12 -0
  135. data/app/components/solidus_admin/tax_rates/edit/component.rb +5 -0
  136. data/app/components/solidus_admin/tax_rates/edit/component.yml +4 -0
  137. data/app/components/solidus_admin/tax_rates/form/component.html.erb +25 -0
  138. data/app/components/solidus_admin/tax_rates/form/component.rb +29 -0
  139. data/app/components/solidus_admin/tax_rates/form/component.yml +9 -0
  140. data/app/components/solidus_admin/tax_rates/index/component.rb +38 -20
  141. data/app/components/solidus_admin/tax_rates/new/component.html.erb +12 -0
  142. data/app/components/solidus_admin/tax_rates/new/component.rb +5 -0
  143. data/app/components/solidus_admin/tax_rates/new/component.yml +4 -0
  144. data/app/components/solidus_admin/taxes/component.rb +4 -4
  145. data/app/components/solidus_admin/taxonomies/index/component.rb +7 -7
  146. data/app/components/solidus_admin/turbo/target_frame/component.html.erb +5 -0
  147. data/app/components/solidus_admin/turbo/target_frame/component.rb +8 -0
  148. data/app/components/solidus_admin/ui/alert/component.html.erb +35 -0
  149. data/app/components/solidus_admin/ui/alert/component.rb +51 -0
  150. data/app/components/solidus_admin/ui/alert/component.yml +8 -0
  151. data/app/components/solidus_admin/ui/badge/component.rb +11 -11
  152. data/app/components/solidus_admin/ui/button/component.rb +84 -27
  153. data/app/components/solidus_admin/ui/button/component.yml +10 -0
  154. data/app/components/solidus_admin/ui/checkbox/component.rb +42 -0
  155. data/app/components/solidus_admin/ui/dropdown/component.rb +3 -3
  156. data/app/components/solidus_admin/ui/forms/address/component.html.erb +1 -48
  157. data/app/components/solidus_admin/ui/forms/address/component.rb +29 -6
  158. data/app/components/solidus_admin/ui/forms/address/fields/city_and_zipcode/component.html.erb +4 -0
  159. data/app/components/solidus_admin/ui/forms/address/fields/city_and_zipcode/component.rb +8 -0
  160. data/app/components/solidus_admin/ui/forms/address/fields/country_and_state/component.html.erb +39 -0
  161. data/app/components/solidus_admin/ui/forms/address/{component.js → fields/country_and_state/component.js} +2 -0
  162. data/app/components/solidus_admin/ui/forms/address/fields/country_and_state/component.rb +15 -0
  163. data/app/components/solidus_admin/ui/forms/address/fields/reverse_charge_fields/component.html.erb +7 -0
  164. data/app/components/solidus_admin/ui/forms/address/fields/reverse_charge_fields/component.rb +12 -0
  165. data/app/components/solidus_admin/ui/forms/address/fieldsets/base.rb +54 -0
  166. data/app/components/solidus_admin/ui/forms/address/fieldsets/contact/component.rb +16 -0
  167. data/app/components/solidus_admin/ui/forms/address/fieldsets/contact_info/component.rb +10 -0
  168. data/app/components/solidus_admin/ui/forms/address/fieldsets/location/component.rb +14 -0
  169. data/app/components/solidus_admin/ui/forms/checkbox/component.html.erb +14 -0
  170. data/app/components/solidus_admin/ui/forms/checkbox/component.rb +24 -31
  171. data/app/components/solidus_admin/ui/forms/field/component.html.erb +4 -4
  172. data/app/components/solidus_admin/ui/forms/field/component.rb +14 -18
  173. data/app/components/solidus_admin/ui/forms/input/component.rb +9 -18
  174. data/app/components/solidus_admin/ui/forms/search/result/component.rb +2 -2
  175. data/app/components/solidus_admin/ui/forms/select/component.html.erb +21 -0
  176. data/app/components/solidus_admin/ui/forms/select/component.rb +157 -0
  177. data/app/components/solidus_admin/ui/forms/switch/component.rb +4 -4
  178. data/app/components/solidus_admin/ui/icon/component.rb +4 -4
  179. data/app/components/solidus_admin/ui/icon/names.txt +973 -238
  180. data/app/components/solidus_admin/ui/modal/component.html.erb +2 -4
  181. data/app/components/solidus_admin/ui/modal/component.js +7 -1
  182. data/app/components/solidus_admin/ui/modal/component.rb +2 -2
  183. data/app/components/solidus_admin/ui/pages/index/component.rb +50 -19
  184. data/app/components/solidus_admin/ui/panel/component.rb +5 -9
  185. data/app/components/solidus_admin/ui/radio/component.rb +29 -0
  186. data/app/components/solidus_admin/ui/tab/component.rb +4 -4
  187. data/app/components/solidus_admin/ui/table/component.html.erb +11 -10
  188. data/app/components/solidus_admin/ui/table/component.js +18 -26
  189. data/app/components/solidus_admin/ui/table/component.rb +24 -18
  190. data/app/components/solidus_admin/ui/table/component.yml +1 -0
  191. data/app/components/solidus_admin/ui/table/ransack_filter/component.html.erb +1 -1
  192. data/app/components/solidus_admin/ui/table/ransack_filter/component.rb +7 -7
  193. data/app/components/solidus_admin/ui/thumbnail/component.rb +5 -5
  194. data/app/components/solidus_admin/ui/toast/component.html.erb +6 -6
  195. data/app/components/solidus_admin/ui/toast/component.rb +1 -1
  196. data/app/components/solidus_admin/ui/toggletip/component.rb +1 -1
  197. data/app/components/solidus_admin/users/addresses/component.html.erb +3 -5
  198. data/app/components/solidus_admin/users/addresses/component.rb +0 -30
  199. data/app/components/solidus_admin/users/addresses/component.yml +0 -7
  200. data/app/components/solidus_admin/users/edit/api_access/component.html.erb +6 -4
  201. data/app/components/solidus_admin/users/edit/api_access/component.yml +8 -2
  202. data/app/components/solidus_admin/users/edit/component.html.erb +15 -12
  203. data/app/components/solidus_admin/users/edit/component.rb +1 -33
  204. data/app/components/solidus_admin/users/edit/component.yml +0 -7
  205. data/app/components/solidus_admin/users/edit/tabs/component.rb +46 -0
  206. data/app/components/solidus_admin/users/edit/tabs/component.yml +6 -0
  207. data/app/components/solidus_admin/users/index/component.rb +20 -20
  208. data/app/components/solidus_admin/users/items/component.html.erb +1 -3
  209. data/app/components/solidus_admin/users/items/component.rb +18 -51
  210. data/app/components/solidus_admin/users/items/component.yml +0 -7
  211. data/app/components/solidus_admin/users/orders/component.html.erb +1 -3
  212. data/app/components/solidus_admin/users/orders/component.rb +9 -39
  213. data/app/components/solidus_admin/users/orders/component.yml +0 -6
  214. data/app/components/solidus_admin/users/store_credits/edit_amount/component.html.erb +7 -8
  215. data/app/components/solidus_admin/users/store_credits/edit_amount/component.rb +0 -5
  216. data/app/components/solidus_admin/users/store_credits/edit_amount/component.yml +0 -1
  217. data/app/components/solidus_admin/users/store_credits/edit_memo/component.html.erb +4 -4
  218. data/app/components/solidus_admin/users/store_credits/edit_memo/component.yml +0 -1
  219. data/app/components/solidus_admin/users/store_credits/edit_validity/component.html.erb +6 -7
  220. data/app/components/solidus_admin/users/store_credits/edit_validity/component.rb +0 -5
  221. data/app/components/solidus_admin/users/store_credits/index/component.html.erb +4 -6
  222. data/app/components/solidus_admin/users/store_credits/index/component.rb +10 -40
  223. data/app/components/solidus_admin/users/store_credits/index/component.yml +0 -6
  224. data/app/components/solidus_admin/users/store_credits/new/component.html.erb +12 -13
  225. data/app/components/solidus_admin/users/store_credits/new/component.rb +0 -9
  226. data/app/components/solidus_admin/users/store_credits/new/component.yml +0 -1
  227. data/app/components/solidus_admin/users/store_credits/show/component.html.erb +5 -7
  228. data/app/components/solidus_admin/users/store_credits/show/component.rb +8 -38
  229. data/app/components/solidus_admin/users/store_credits/show/component.yml +0 -6
  230. data/app/components/solidus_admin/users_and_roles/component.rb +4 -4
  231. data/app/components/solidus_admin/zones/edit/component.html.erb +1 -0
  232. data/app/components/solidus_admin/zones/edit/component.rb +4 -0
  233. data/app/components/solidus_admin/zones/form/component.html.erb +47 -0
  234. data/app/components/solidus_admin/zones/form/component.js +32 -0
  235. data/app/components/solidus_admin/zones/form/component.rb +23 -0
  236. data/app/components/solidus_admin/zones/form/component.yml +7 -0
  237. data/app/components/solidus_admin/zones/index/component.rb +57 -18
  238. data/app/components/solidus_admin/zones/new/component.html.erb +1 -0
  239. data/app/components/solidus_admin/zones/new/component.rb +4 -0
  240. data/app/controllers/concerns/solidus_admin/moveable.rb +31 -0
  241. data/app/controllers/solidus_admin/addresses_controller.rb +9 -11
  242. data/app/controllers/solidus_admin/adjustments_controller.rb +5 -6
  243. data/app/controllers/solidus_admin/base_controller.rb +8 -7
  244. data/app/controllers/solidus_admin/controller_helpers/authorization.rb +1 -1
  245. data/app/controllers/solidus_admin/controller_helpers/locale.rb +1 -1
  246. data/app/controllers/solidus_admin/controller_helpers/pagination.rb +37 -0
  247. data/app/controllers/solidus_admin/controller_helpers/search.rb +5 -5
  248. data/app/controllers/solidus_admin/controller_helpers/theme.rb +2 -2
  249. data/app/controllers/solidus_admin/customers_controller.rb +3 -3
  250. data/app/controllers/solidus_admin/line_items_controller.rb +3 -3
  251. data/app/controllers/solidus_admin/option_types_controller.rb +11 -32
  252. data/app/controllers/solidus_admin/option_values_controller.rb +54 -0
  253. data/app/controllers/solidus_admin/orders_controller.rb +25 -19
  254. data/app/controllers/solidus_admin/payment_methods_controller.rb +23 -28
  255. data/app/controllers/solidus_admin/product_option_types_controller.rb +5 -0
  256. data/app/controllers/solidus_admin/product_taxons_controller.rb +58 -0
  257. data/app/controllers/solidus_admin/products_controller.rb +24 -28
  258. data/app/controllers/solidus_admin/reimbursement_types_controller.rb +3 -3
  259. data/app/controllers/solidus_admin/resources_controller.rb +59 -20
  260. data/app/controllers/solidus_admin/shipping_methods_controller.rb +4 -4
  261. data/app/controllers/solidus_admin/states_controller.rb +30 -0
  262. data/app/controllers/solidus_admin/stock_items_controller.rb +11 -6
  263. data/app/controllers/solidus_admin/stock_locations_controller.rb +25 -26
  264. data/app/controllers/solidus_admin/store_credits_controller.rb +9 -9
  265. data/app/controllers/solidus_admin/stores_controller.rb +43 -9
  266. data/app/controllers/solidus_admin/tax_rates_controller.rb +9 -22
  267. data/app/controllers/solidus_admin/taxonomies_controller.rb +5 -21
  268. data/app/controllers/solidus_admin/users_controller.rb +16 -16
  269. data/app/controllers/solidus_admin/zones_controller.rb +6 -26
  270. data/app/helpers/solidus_admin/flash_helper.rb +14 -0
  271. data/app/helpers/solidus_admin/last_login_helper.rb +2 -2
  272. data/app/helpers/solidus_admin/permission_sets_helper.rb +3 -3
  273. data/app/helpers/solidus_admin/solidus_form_helper.rb +9 -0
  274. data/app/helpers/solidus_admin/stimulus_helper.rb +29 -0
  275. data/app/helpers/solidus_admin/void_elements_helper.rb +1 -1
  276. data/app/javascript/solidus_admin/application.js +10 -1
  277. data/app/javascript/solidus_admin/confirm_modal.js +24 -0
  278. data/app/javascript/solidus_admin/controllers/custom_validity_controller.js +12 -0
  279. data/app/javascript/solidus_admin/controllers/sortable_controller.js +9 -2
  280. data/app/javascript/solidus_admin/tom-select/plugins/patch_scroll.js +19 -0
  281. data/app/javascript/solidus_admin/tom-select/plugins/remote_with_pagination.js +67 -0
  282. data/app/javascript/solidus_admin/tom-select/plugins/stash_on_search.js +68 -0
  283. data/app/javascript/solidus_admin/tom-select/tom-select.js +11 -0
  284. data/app/javascript/solidus_admin/utils.js +40 -0
  285. data/app/javascript/solidus_admin/web_components/solidus_select.js +90 -0
  286. data/app/javascript/vendor/custom_elements.js +3 -0
  287. data/app/lib/solidus_admin/form_builder.rb +58 -0
  288. data/app/views/layouts/solidus_admin/application.html.erb +6 -8
  289. data/app/views/layouts/solidus_admin/preview.html.erb +1 -1
  290. data/app/views/solidus_admin/option_values/create.turbo_stream.erb +3 -0
  291. data/app/views/solidus_admin/option_values/destroy.turbo_stream.erb +3 -0
  292. data/app/views/solidus_admin/option_values/update.turbo_stream.erb +3 -0
  293. data/config/importmap.rb +9 -0
  294. data/config/initializers/view_component.rb +1 -1
  295. data/config/locales/option_types.en.yml +5 -1
  296. data/config/locales/option_values.en.yml +9 -0
  297. data/config/locales/payment_methods.en.yml +5 -1
  298. data/config/locales/product_taxons.en.yml +6 -0
  299. data/config/locales/products.en.yml +2 -0
  300. data/config/locales/solidus_select.yml +6 -0
  301. data/config/locales/stock_locations.en.yml +4 -0
  302. data/config/locales/stores.en.yml +22 -0
  303. data/config/locales/tax_rates.en.yml +4 -0
  304. data/config/locales/zones.en.yml +4 -0
  305. data/config/routes.rb +21 -9
  306. data/config/tailwind.config.js +6 -2
  307. data/docs/components.md +2 -2
  308. data/docs/index_pages.md +11 -5
  309. data/docs/stimulusjs.md +1 -1
  310. data/eslint.config.mjs +25 -0
  311. data/lib/generators/solidus_admin/component/component_generator.rb +10 -6
  312. data/lib/generators/solidus_admin/install/install_generator.rb +24 -5
  313. data/lib/generators/solidus_admin/install/templates/config/initializers/solidus_admin.rb.tt +6 -0
  314. data/lib/solidus_admin/admin_resources.rb +1 -1
  315. data/lib/solidus_admin/configuration.rb +14 -14
  316. data/lib/solidus_admin/engine.rb +3 -2
  317. data/lib/solidus_admin/importmap.rb +1 -1
  318. data/lib/solidus_admin/menu_item.rb +1 -1
  319. data/lib/solidus_admin/preview.rb +1 -0
  320. data/lib/solidus_admin/testing_support/admin_assets.rb +1 -1
  321. data/lib/solidus_admin/testing_support/feature_helpers.rb +77 -3
  322. data/lib/solidus_admin/testing_support/shared_examples/crud_resource_requests.rb +43 -36
  323. data/lib/solidus_admin/testing_support/shared_examples/moveable.rb +48 -0
  324. data/lib/solidus_admin/testing_support/shared_examples/promotion_categories_features.rb +5 -11
  325. data/lib/solidus_admin/version.rb +1 -1
  326. data/lib/tasks/tailwind.rake +1 -1
  327. data/solidus_admin.gemspec +24 -21
  328. metadata +173 -29
  329. data/.eslintrc.json +0 -7
  330. data/app/components/solidus_admin/products/show/component.js +0 -9
  331. data/app/components/solidus_admin/ui/forms/input/component.js +0 -15
  332. data/app/components/solidus_admin/users/edit/api_access/component.js +0 -9
  333. data/app/javascript/solidus_admin/controllers/confirm_controller.js +0 -21
  334. data/lib/solidus_admin/testing_support/shared_examples/bulk_delete_resources.rb +0 -20
  335. /data/app/{components/solidus_admin/ui/toast/component.js → javascript/solidus_admin/controllers/alert_animation_controller.js} +0 -0
@@ -5,6 +5,10 @@ class SolidusAdmin::Zones::Index::Component < SolidusAdmin::UI::Pages::Index::Co
5
5
  Spree::Zone
6
6
  end
7
7
 
8
+ def title
9
+ t("solidus_admin.zones.title")
10
+ end
11
+
8
12
  def search_key
9
13
  :name_or_description_cont
10
14
  end
@@ -13,28 +17,33 @@ class SolidusAdmin::Zones::Index::Component < SolidusAdmin::UI::Pages::Index::Co
13
17
  solidus_admin.zones_path
14
18
  end
15
19
 
16
- def row_url(zone)
17
- spree.edit_admin_zone_path(zone)
20
+ def edit_path(zone)
21
+ solidus_admin.edit_zone_path(zone, **search_filter_params)
22
+ end
23
+
24
+ def turbo_frames
25
+ %w[resource_form]
18
26
  end
19
27
 
20
28
  def page_actions
21
29
  render component("ui/button").new(
22
30
  tag: :a,
23
- text: t('.add'),
24
- href: spree.new_admin_zone_path,
31
+ text: t(".add"),
32
+ href: solidus_admin.new_zone_path(**search_filter_params),
33
+ data: {turbo_frame: :resource_form},
25
34
  icon: "add-line",
26
- class: "align-self-end w-full",
35
+ class: "align-self-end w-full"
27
36
  )
28
37
  end
29
38
 
30
39
  def batch_actions
31
40
  [
32
41
  {
33
- label: t('.batch_actions.delete'),
42
+ label: t(".batch_actions.delete"),
34
43
  action: solidus_admin.zones_path,
35
44
  method: :delete,
36
- icon: 'delete-bin-7-line',
37
- },
45
+ icon: "delete-bin-7-line"
46
+ }
38
47
  ]
39
48
  end
40
49
 
@@ -48,16 +57,46 @@ class SolidusAdmin::Zones::Index::Component < SolidusAdmin::UI::Pages::Index::Co
48
57
 
49
58
  def columns
50
59
  [
51
- :name,
52
- :description,
53
- {
54
- header: :kind,
55
- data: -> { component('ui/badge').new(name: _1.kind, color: _1.kind == 'country' ? :green : :blue) },
56
- },
57
- {
58
- header: :zone_members,
59
- data: -> { _1.zone_members.map(&:zoneable).map(&:name).to_sentence },
60
- },
60
+ name_column,
61
+ description_column,
62
+ kind_column,
63
+ zone_members_column
61
64
  ]
62
65
  end
66
+
67
+ def name_column
68
+ {
69
+ header: :name,
70
+ data: ->(zone) do
71
+ link_to zone.name, edit_path(zone),
72
+ data: {turbo_frame: :resource_form},
73
+ class: "body-link"
74
+ end
75
+ }
76
+ end
77
+
78
+ def description_column
79
+ {
80
+ header: :description,
81
+ data: ->(zone) do
82
+ link_to zone.description, edit_path(zone),
83
+ data: {turbo_frame: :resource_form},
84
+ class: "body-link"
85
+ end
86
+ }
87
+ end
88
+
89
+ def kind_column
90
+ {
91
+ header: :kind,
92
+ data: -> { component("ui/badge").new(name: _1.kind, color: (_1.kind == "country") ? :green : :blue) }
93
+ }
94
+ end
95
+
96
+ def zone_members_column
97
+ {
98
+ header: :zone_members,
99
+ data: -> { _1.zone_members.map(&:zoneable).map(&:name).to_sentence }
100
+ }
101
+ end
63
102
  end
@@ -0,0 +1 @@
1
+ <%= render component("zones/form").new(zone: @zone, form_url:, form_id:) %>
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Zones::New::Component < SolidusAdmin::Resources::New::Component
4
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin::Moveable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :load_moveable, only: [:move]
8
+ end
9
+
10
+ def move
11
+ @moveable.insert_at(params.require(:position).to_i)
12
+
13
+ respond_to do |format|
14
+ format.js { head :no_content }
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def load_moveable
21
+ @moveable = moveable_class.find(params.require(:id))
22
+ authorize! action_name, @moveable
23
+ end
24
+
25
+ def moveable_class
26
+ "Spree::#{self.class.name.demodulize.remove("Controller").singularize}".constantize
27
+ rescue NameError
28
+ raise NameError,
29
+ "could not infer model class from #{self.class.name}. Please override `moveable_class` to specify it explicitly."
30
+ end
31
+ end
@@ -10,11 +10,11 @@ module SolidusAdmin
10
10
  def show
11
11
  respond_to do |format|
12
12
  format.html do
13
- render component('orders/show/address').new(
13
+ render component("orders/show/address").new(
14
14
  order: @order,
15
15
  user: @order.user,
16
16
  address: @address,
17
- type: address_type,
17
+ type: address_type
18
18
  )
19
19
  end
20
20
  end
@@ -27,7 +27,7 @@ module SolidusAdmin
27
27
  def update
28
28
  if @order.contents.update_cart(order_params)
29
29
  respond_to do |format|
30
- flash[:notice] = t('.success')
30
+ flash[:notice] = t(".success")
31
31
 
32
32
  format.html { redirect_to order_path(@order), status: :see_other }
33
33
  format.turbo_stream { render turbo_stream: '<turbo-stream action="refresh" />' }
@@ -37,11 +37,11 @@ module SolidusAdmin
37
37
 
38
38
  respond_to do |format|
39
39
  format.html do
40
- render component('orders/show/address').new(
40
+ render component("orders/show/address").new(
41
41
  order: @order,
42
42
  user: @order.user,
43
43
  address: @order.send("#{address_type}_address"),
44
- type: address_type,
44
+ type: address_type
45
45
  ), status: :unprocessable_entity
46
46
  end
47
47
  end
@@ -51,13 +51,11 @@ module SolidusAdmin
51
51
  private
52
52
 
53
53
  def load_address
54
- if params[:address_id].present? && @order.user
55
- @address =
56
- @order.user.addresses.find_by(id: params[:address_id]) ||
54
+ @address = if params[:address_id].present? && @order.user
55
+ @order.user.addresses.find_by(id: params[:address_id]) ||
57
56
  @order.user.addresses.build(country: default_country)
58
57
  else
59
- @address =
60
- @order.public_send("#{address_type}_address") ||
58
+ @order.public_send("#{address_type}_address") ||
61
59
  @order.public_send("build_#{address_type}_address", country: default_country)
62
60
  end
63
61
  end
@@ -68,7 +66,7 @@ module SolidusAdmin
68
66
 
69
67
  def validate_address_type
70
68
  unless address_type
71
- flash[:error] = t('.errors.address_type_invalid')
69
+ flash[:error] = t(".errors.address_type_invalid")
72
70
  redirect_to spree.admin_order_url(@order)
73
71
  end
74
72
  end
@@ -5,13 +5,12 @@ class SolidusAdmin::AdjustmentsController < SolidusAdmin::BaseController
5
5
 
6
6
  def index
7
7
  load_adjustments
8
- set_page_and_extract_portion_from(@adjustments)
9
8
 
10
9
  respond_to do |format|
11
10
  format.html do
12
- render component('orders/show/adjustments/index').new(
11
+ render component("orders/show/adjustments/index").new(
13
12
  order: @order,
14
- adjustments: @adjustments,
13
+ adjustments: @adjustments
15
14
  )
16
15
  end
17
16
  end
@@ -20,7 +19,7 @@ class SolidusAdmin::AdjustmentsController < SolidusAdmin::BaseController
20
19
  def lock
21
20
  @adjustments = @order.all_adjustments.not_finalized.where(id: params[:id])
22
21
  @adjustments.each(&:finalize!)
23
- flash[:success] = t('.success')
22
+ flash[:notice] = t(".success")
24
23
 
25
24
  redirect_to order_adjustments_path(@order), status: :see_other
26
25
  end
@@ -28,7 +27,7 @@ class SolidusAdmin::AdjustmentsController < SolidusAdmin::BaseController
28
27
  def unlock
29
28
  @adjustments = @order.all_adjustments.finalized.where(id: params[:id])
30
29
  @adjustments.each(&:unfinalize!)
31
- flash[:success] = t('.success')
30
+ flash[:notice] = t(".success")
32
31
 
33
32
  redirect_to order_adjustments_path(@order), status: :see_other
34
33
  end
@@ -36,7 +35,7 @@ class SolidusAdmin::AdjustmentsController < SolidusAdmin::BaseController
36
35
  def destroy
37
36
  @adjustments = @order.all_adjustments.where(id: params[:id])
38
37
  @adjustments.destroy_all
39
- flash[:success] = t('.success')
38
+ flash[:notice] = t(".success")
40
39
 
41
40
  redirect_to order_adjustments_path(@order), status: :see_other
42
41
  end
@@ -1,32 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'geared_pagination'
4
-
5
3
  module SolidusAdmin
6
4
  class BaseController < ApplicationController
7
5
  include ActiveStorage::SetCurrent
8
6
  include Spree::Core::ControllerHelpers::Store
9
- include GearedPagination::Controller
10
7
 
11
8
  include SolidusAdmin::ControllerHelpers::Authentication
12
9
  include SolidusAdmin::ControllerHelpers::Authorization
13
10
  include SolidusAdmin::ControllerHelpers::Locale
11
+ include SolidusAdmin::ControllerHelpers::Pagination
14
12
  include SolidusAdmin::ControllerHelpers::Theme
15
13
  include SolidusAdmin::ComponentsHelper
16
14
  include SolidusAdmin::AuthenticationAdapters::Backend if defined?(Spree::Backend)
15
+ # Guarded so that solidus_admin can be released ahead of solidus_core
16
+ include Spree::Core::ControllerHelpers::Timezone if defined?(Spree::Core::ControllerHelpers::Timezone)
17
17
 
18
18
  layout :set_layout
19
19
 
20
- helper 'solidus_admin/components'
21
- helper 'solidus_admin/layout'
20
+ helper "solidus_admin/components"
21
+ helper "solidus_admin/layout"
22
+ helper "solidus_admin/flash"
22
23
 
23
24
  private
24
25
 
25
26
  def set_layout
26
27
  if turbo_frame_request?
27
- 'turbo_rails/frame'
28
+ "turbo_rails/frame"
28
29
  else
29
- 'solidus_admin/application'
30
+ "solidus_admin/application"
30
31
  end
31
32
  end
32
33
  end
@@ -7,7 +7,7 @@ module SolidusAdmin::ControllerHelpers::Authorization
7
7
  before_action :authorize_solidus_admin_user!
8
8
 
9
9
  rescue_from CanCan::AccessDenied do
10
- render 'unauthorized', status: :forbidden
10
+ render "unauthorized", status: :forbidden
11
11
  end
12
12
  end
13
13
 
@@ -17,7 +17,7 @@ module SolidusAdmin::ControllerHelpers::Locale
17
17
  if requested_locale.to_sym != user_locale
18
18
  session[set_user_language_locale_key] = requested_locale
19
19
 
20
- flash[:notice] = t('spree.locale_changed')
20
+ flash[:notice] = t("spree.locale_changed")
21
21
  redirect_to params.except(:switch_to_locale).permit!.to_h.merge(account_menu_open: true)
22
22
  end
23
23
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ module ControllerHelpers
5
+ module Pagination
6
+ DEFAULT_PER_PAGE = 20
7
+
8
+ def paginate(records, ordered_by: nil, per_page: DEFAULT_PER_PAGE)
9
+ records = records.order(with_primary_key_tiebreaker(records, ordered_by)) if ordered_by
10
+ records.page(params[:page]).per(per_page)
11
+ end
12
+
13
+ def set_pagination_headers(page)
14
+ response.headers["X-Total-Count"] = page.total_count.to_s
15
+ response.headers["Link"] = %(<#{page_url(page.next_page)}>; rel="next") if page.next_page
16
+ end
17
+
18
+ private
19
+
20
+ def page_url(number)
21
+ uri = URI.parse(request.url)
22
+ uri.query = request.query_parameters.merge("page" => number).to_query
23
+ uri.to_s
24
+ end
25
+
26
+ # Offset pagination needs a unique sort, or rows with equal values (e.g. two
27
+ # products with the same name) can repeat or go missing across pages.
28
+ def with_primary_key_tiebreaker(records, ordered_by)
29
+ ordered_by = ordered_by.to_h.symbolize_keys
30
+ primary_key = records.klass.primary_key.to_sym
31
+ return ordered_by if ordered_by.key?(primary_key)
32
+
33
+ ordered_by.merge(primary_key => ordered_by.values.last)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -8,7 +8,7 @@ module SolidusAdmin::ControllerHelpers::Search
8
8
  search_scopes << SearchScope.new(
9
9
  name: name.to_s,
10
10
  block:,
11
- default:,
11
+ default:
12
12
  )
13
13
  end
14
14
 
@@ -19,15 +19,15 @@ module SolidusAdmin::ControllerHelpers::Search
19
19
 
20
20
  private
21
21
 
22
- def apply_search_to(relation, param:)
22
+ def apply_search_to(relation, param:, distinct: true)
23
23
  relation = apply_scopes_to(relation, param:)
24
- apply_ransack_search_to(relation, param:)
24
+ apply_ransack_search_to(relation, param:, distinct:)
25
25
  end
26
26
 
27
- def apply_ransack_search_to(relation, param:)
27
+ def apply_ransack_search_to(relation, param:, distinct: true)
28
28
  relation
29
29
  .ransack(params[param]&.except(:scope))
30
- .result(distinct: true)
30
+ .result(distinct:)
31
31
  end
32
32
 
33
33
  def apply_scopes_to(relation, param:)
@@ -13,13 +13,13 @@ module SolidusAdmin::ControllerHelpers::Theme
13
13
  requested_theme = params[:switch_to_theme].presence or return
14
14
 
15
15
  # Avoid interpolating user content into the session key
16
- system_theme = params[:system_theme].presence == "dark" ? "dark" : "light"
16
+ system_theme = (params[:system_theme].presence == "dark") ? "dark" : "light"
17
17
  session_key = :"admin_#{system_theme}_theme"
18
18
 
19
19
  if theme_is_available?(requested_theme) && requested_theme.to_sym != session[session_key]
20
20
  session[session_key] = requested_theme
21
21
 
22
- flash[:notice] = t('spree.theme_changed')
22
+ flash[:notice] = t("spree.theme_changed")
23
23
  redirect_to params.except(:switch_to_theme, :system_theme).permit!.to_h.merge(account_menu_open: true)
24
24
  end
25
25
  end
@@ -6,16 +6,16 @@ class SolidusAdmin::CustomersController < SolidusAdmin::BaseController
6
6
  def show
7
7
  respond_to do |format|
8
8
  format.html do
9
- render component('orders/show/email').new(order: @order)
9
+ render component("orders/show/email").new(order: @order)
10
10
  end
11
11
  end
12
12
  end
13
13
 
14
14
  def destroy
15
15
  if @order.update(user: nil)
16
- flash[:success] = t('.success')
16
+ flash[:notice] = t(".success")
17
17
  else
18
- flash[:error] = t('.error')
18
+ flash[:error] = t(".error")
19
19
  end
20
20
 
21
21
  redirect_to order_path(@order), status: :see_other
@@ -8,7 +8,7 @@ module SolidusAdmin
8
8
 
9
9
  @line_item.destroy!
10
10
 
11
- redirect_to order_path(@order), status: :see_other, notice: t('.success')
11
+ redirect_to order_path(@order), status: :see_other, notice: t(".success")
12
12
  end
13
13
 
14
14
  def create
@@ -17,7 +17,7 @@ module SolidusAdmin
17
17
  @variant = Spree::Variant.find(variant_id)
18
18
  @line_item = @order.contents.add(@variant)
19
19
 
20
- redirect_to order_path(@order), status: :see_other, notice: t('.success')
20
+ redirect_to order_path(@order), status: :see_other, notice: t(".success")
21
21
  end
22
22
 
23
23
  def update
@@ -28,7 +28,7 @@ module SolidusAdmin
28
28
 
29
29
  @line_item = @order.contents.add(@line_item.variant, desired_quantity - @line_item.quantity)
30
30
 
31
- redirect_to order_path(@order), status: :see_other, notice: t('.success')
31
+ redirect_to order_path(@order), status: :see_other, notice: t(".success")
32
32
  end
33
33
 
34
34
  private
@@ -1,46 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusAdmin
4
- class OptionTypesController < SolidusAdmin::BaseController
5
- include SolidusAdmin::ControllerHelpers::Search
4
+ class OptionTypesController < SolidusAdmin::ResourcesController
5
+ include SolidusAdmin::Moveable
6
6
 
7
- before_action :load_option_type, only: [:move]
8
-
9
- def index
10
- option_types = apply_search_to(
11
- Spree::OptionType.all,
12
- param: :q,
13
- )
14
-
15
- set_page_and_extract_portion_from(option_types)
16
-
17
- respond_to do |format|
18
- format.html { render component('option_types/index').new(page: @page) }
19
- end
20
- end
21
-
22
- def move
23
- @option_type.insert_at(params[:position].to_i)
7
+ private
24
8
 
25
- respond_to do |format|
26
- format.js { head :no_content }
27
- end
9
+ def after_create_path
10
+ solidus_admin.edit_option_type_path(@resource)
28
11
  end
29
12
 
30
- def destroy
31
- @option_types = Spree::OptionType.where(id: params[:id])
13
+ def resource_class = Spree::OptionType
32
14
 
33
- Spree::OptionType.transaction { @option_types.destroy_all }
34
-
35
- flash[:notice] = t('.success')
36
- redirect_back_or_to option_types_path, status: :see_other
15
+ def permitted_resource_params
16
+ params.require(:option_type).permit(:name, :presentation)
37
17
  end
38
18
 
39
- private
19
+ def resources_collection = Spree::OptionType.unscoped
40
20
 
41
- def load_option_type
42
- @option_type = Spree::OptionType.find(params[:id])
43
- authorize! action_name, @option_type
21
+ def resources_sorting_options
22
+ {position: :asc}
44
23
  end
45
24
  end
46
25
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class OptionValuesController < SolidusAdmin::ResourcesController
5
+ include SolidusAdmin::Moveable
6
+
7
+ before_action :set_option_type, only: [:new, :create, :destroy]
8
+
9
+ def new
10
+ @resource = @option_type.option_values.build
11
+ super
12
+ end
13
+
14
+ def create
15
+ @resource = @option_type.option_values.build(permitted_resource_params)
16
+ super
17
+ end
18
+
19
+ private
20
+
21
+ def prefer_turbo_stream?
22
+ case params[:action]
23
+ when "create", "update", "destroy" then true
24
+ else false
25
+ end
26
+ end
27
+
28
+ def resource_class = Spree::OptionValue
29
+
30
+ def permitted_resource_params
31
+ params.require(:option_value).permit(:name, :presentation)
32
+ end
33
+
34
+ def resource_form_frame
35
+ :option_value_modal
36
+ end
37
+
38
+ def after_create_path
39
+ solidus_admin.edit_option_type_path(@option_type)
40
+ end
41
+
42
+ def after_update_path
43
+ solidus_admin.edit_option_type_path(@option_value.option_type)
44
+ end
45
+
46
+ def after_destroy_path
47
+ solidus_admin.edit_option_type_path(@option_type)
48
+ end
49
+
50
+ def set_option_type
51
+ @option_type = Spree::OptionType.find(params[:option_type_id])
52
+ end
53
+ end
54
+ end
@@ -5,22 +5,23 @@ module SolidusAdmin
5
5
  include Spree::Core::ControllerHelpers::StrongParameters
6
6
  include SolidusAdmin::ControllerHelpers::Search
7
7
 
8
- search_scope(:completed, default: true) { _1.complete }
9
- search_scope(:canceled) { _1.canceled }
10
- search_scope(:returned) { _1.with_state(:returned) }
11
- search_scope(:in_progress) { _1.with_state([:cart] + _1.checkout_step_names) }
12
- search_scope(:all) { _1 }
8
+ search_scope(:completed, default: true) { _1.complete.order(completed_at: :desc) }
9
+ search_scope(:canceled) { _1.canceled.order(completed_at: :desc) }
10
+ search_scope(:returned) { _1.with_state(:returned).order(completed_at: :desc) }
11
+ search_scope(:in_progress) { _1.with_state([:cart] + _1.checkout_step_names).order(id: :desc) }
12
+ search_scope(:all) { _1.order(id: :desc) }
13
13
 
14
14
  def index
15
15
  orders = apply_search_to(
16
- Spree::Order.order(created_at: :desc, id: :desc),
16
+ Spree::Order.includes(:line_items),
17
17
  param: :q,
18
+ distinct: false
18
19
  )
19
20
 
20
- set_page_and_extract_portion_from(orders)
21
+ @page = paginate(orders)
21
22
 
22
23
  respond_to do |format|
23
- format.html { render component('orders/index').new(page: @page) }
24
+ format.html { render component("orders/index").new(page: @page) }
24
25
  end
25
26
  end
26
27
 
@@ -35,23 +36,27 @@ module SolidusAdmin
35
36
  end
36
37
 
37
38
  def show
38
- load_order
39
+ load_order(Spree::Order.includes(line_items: {variant: [:images, {product: :variant_images, option_values: :option_type}]}))
39
40
 
40
41
  respond_to do |format|
41
- format.html { render component('orders/show').new(order: @order) }
42
+ format.html { render component("orders/show").new(order: @order) }
42
43
  end
43
44
  end
44
45
 
45
46
  def update
46
47
  load_order
47
48
 
49
+ if order_params[:user_id].present? && order_params[:user_id].to_s != @order.user_id.to_s
50
+ Spree.user_class.accessible_by(current_ability, :show).find(order_params[:user_id])
51
+ end
52
+
48
53
  @order.assign_attributes(order_params)
49
- @order.email ||= @order.user.email if @order.user && @order.user.changed?
54
+ @order.email ||= @order.user.email if @order.user&.changed?
50
55
 
51
56
  if @order.save
52
- flash[:notice] = t('.success')
57
+ flash[:notice] = t(".success")
53
58
  else
54
- flash[:error] = t('.error')
59
+ flash[:error] = t(".error")
55
60
  end
56
61
 
57
62
  respond_to do |format|
@@ -71,7 +76,7 @@ module SolidusAdmin
71
76
  # We need to eager load active storage attachments when using it
72
77
  if Spree::Image.include?(Spree::Image::ActiveStorageAttachment)
73
78
  image_includes = {
74
- attachment_attachment: { blob: { variant_records: { image_attachment: :blob } } }
79
+ attachment_attachment: {blob: {variant_records: {image_attachment: :blob}}}
75
80
  }
76
81
  end
77
82
 
@@ -84,11 +89,11 @@ module SolidusAdmin
84
89
  :prices,
85
90
  images: image_includes || {},
86
91
  option_values: :option_type,
87
- stock_items: :stock_location,
92
+ stock_items: :stock_location
88
93
  )
89
94
 
90
95
  respond_to do |format|
91
- format.html { render component('orders/cart/result').with_collection(@variants, order: @order), layout: false }
96
+ format.html { render component("orders/cart/result").with_collection(@variants, order: @order), layout: false }
92
97
  end
93
98
  end
94
99
 
@@ -96,6 +101,7 @@ module SolidusAdmin
96
101
  load_order
97
102
 
98
103
  @users = Spree.user_class
104
+ .accessible_by(current_ability, :show)
99
105
  .where.not(id: @order.user_id)
100
106
  .order(created_at: :desc, id: :desc)
101
107
  .ransack(params[:q])
@@ -104,14 +110,14 @@ module SolidusAdmin
104
110
  .limit(10)
105
111
 
106
112
  respond_to do |format|
107
- format.html { render component('orders/show/customer_search/result').with_collection(@users, order: @order), layout: false }
113
+ format.html { render component("orders/show/customer_search/result").with_collection(@users, order: @order), layout: false }
108
114
  end
109
115
  end
110
116
 
111
117
  private
112
118
 
113
- def load_order
114
- @order = Spree::Order.find_by!(number: params[:id])
119
+ def load_order(scope = Spree::Order)
120
+ @order = scope.find_by!(number: params[:id])
115
121
  authorize! action_name, @order
116
122
  end
117
123