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
@@ -0,0 +1,29 @@
1
+ <%= solidus_form_for @payment_method, as: "payment_method", url: @url, html: { id: @form_id } do |f| %>
2
+ <%= page_with_sidebar do %>
3
+ <%= page_with_sidebar_main do %>
4
+ <%= render component("ui/panel").new do %>
5
+ <%= f.text_field :name %>
6
+ <%= f.text_area :description %>
7
+ <%= f.select :auto_capture,
8
+ auto_capture_select_options,
9
+ hint: t(".hints.auto_capture_html") %>
10
+ <% end %>
11
+
12
+ <%= render component("ui/panel").new(title: t(".deployment")) do %>
13
+ <%= f.select :type, available_types.map { [_1.model_name.human, _1.to_s] } %>
14
+ <%= f.select :preference_source, available_preference_sources, include_blank: t(".preference_source_none") %>
15
+ <%= f.text_field :preferred_server %>
16
+ <%= f.switch_field :preferred_test_mode, hint: t(".hints.test_mode_html") %>
17
+ <% end %>
18
+ <% end %>
19
+
20
+ <%= page_with_sidebar_aside do %>
21
+ <%= render component("ui/panel").new(title: t(".availability")) do %>
22
+ <%= f.checkbox :active %>
23
+ <%= f.select :store_ids, store_select_values, multiple: true %>
24
+ <%= f.checkbox :available_to_admin %>
25
+ <%= f.checkbox :available_to_users %>
26
+ <% end %>
27
+ <% end %>
28
+ <% end %>
29
+ <% end %>
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::PaymentMethods::Form::Component < SolidusAdmin::BaseComponent
4
+ include SolidusAdmin::Layout::PageHelpers
5
+
6
+ def initialize(payment_method:, url:, form_id:)
7
+ @payment_method = payment_method
8
+ @url = url
9
+ @form_id = form_id
10
+ end
11
+
12
+ def auto_capture_select_options
13
+ current_app_default =
14
+ Spree::Config.auto_capture ? t(".auto_capture.yes_setting") : t(".auto_capture.no_setting")
15
+
16
+ [
17
+ [t(".auto_capture.app_default", current_app_default:), ""],
18
+ [t(".auto_capture.yes_setting"), true],
19
+ [t(".auto_capture.no_setting"), false]
20
+ ]
21
+ end
22
+
23
+ def available_preference_sources
24
+ Spree::PaymentMethod.available_preference_sources
25
+ end
26
+
27
+ def available_types
28
+ Rails.application.config.spree.payment_methods.sort_by(&:name)
29
+ end
30
+
31
+ def store_select_values
32
+ Spree::Store.pluck(:name, :id)
33
+ end
34
+ end
@@ -0,0 +1,15 @@
1
+ en:
2
+ auto_capture:
3
+ app_default: "Use App Default (%{current_app_default})"
4
+ no_setting: "No"
5
+ yes_setting: "Yes"
6
+ availability: "Availability"
7
+ deployment: "Deployment"
8
+ hints:
9
+ auto_capture_html: >-
10
+ <p>Auto-capture setting charges customer's account upon transaction authorization.</p>
11
+ <p>Enable to reduce manual intervention and streamline the payment process.</p>
12
+ test_mode_html: >-
13
+ <p>Payment methods test mode allows users to simulate transactions using dummy data, ensuring the payment gateway's functionality without real transactions.</p>
14
+ <p>In test mode, users can check if payment methods, such as credit cards or digital wallets, are functioning correctly before going live with real transactions.</p>
15
+ preference_source_none: "Custom"
@@ -13,44 +13,45 @@ class SolidusAdmin::PaymentMethods::Index::Component < SolidusAdmin::UI::Pages::
13
13
  solidus_admin.payment_methods_path
14
14
  end
15
15
 
16
- def row_url(payment_method)
17
- spree.edit_admin_payment_method_path(payment_method)
16
+ def edit_path(payment_method)
17
+ solidus_admin.edit_payment_method_path(payment_method)
18
18
  end
19
19
 
20
20
  def sortable_options
21
21
  {
22
22
  url: ->(payment_method) { solidus_admin.move_payment_method_path(payment_method) },
23
- param: 'position',
23
+ param: "position"
24
24
  }
25
25
  end
26
26
 
27
27
  def page_actions
28
28
  render component("ui/button").new(
29
29
  tag: :a,
30
- text: t('.add'),
31
- href: spree.new_admin_payment_method_path,
32
- icon: "add-line",
30
+ text: t(".add"),
31
+ href: solidus_admin.new_payment_method_path,
32
+ icon: "add-line"
33
33
  )
34
34
  end
35
35
 
36
36
  def batch_actions
37
37
  [
38
38
  {
39
- label: t('.batch_actions.delete'),
39
+ label: t(".batch_actions.delete"),
40
40
  action: solidus_admin.payment_methods_path,
41
41
  method: :delete,
42
- icon: 'delete-bin-7-line',
43
- },
42
+ icon: "delete-bin-7-line",
43
+ require_confirmation: true
44
+ }
44
45
  ]
45
46
  end
46
47
 
47
48
  def scopes
48
49
  [
49
- { name: :all, label: t('.scopes.all'), default: true },
50
- { name: :active, label: t('.scopes.active') },
51
- { name: :inactive, label: t('.scopes.inactive') },
52
- { name: :storefront, label: t('.scopes.storefront') },
53
- { name: :admin, label: t('.scopes.admin') },
50
+ {name: :all, label: t(".scopes.all"), default: true},
51
+ {name: :active, label: t(".scopes.active")},
52
+ {name: :inactive, label: t(".scopes.inactive")},
53
+ {name: :storefront, label: t(".scopes.storefront")},
54
+ {name: :admin, label: t(".scopes.admin")}
54
55
  ]
55
56
  end
56
57
 
@@ -59,22 +60,22 @@ class SolidusAdmin::PaymentMethods::Index::Component < SolidusAdmin::UI::Pages::
59
60
  {
60
61
  header: :name,
61
62
  data: ->(payment_method) do
62
- content_tag :div, payment_method.name
63
+ link_to payment_method.name, edit_path(payment_method), class: "body-link"
63
64
  end
64
65
  },
65
66
  {
66
67
  header: :type,
67
68
  data: ->(payment_method) do
68
- content_tag :div, payment_method.model_name.human
69
+ link_to payment_method.model_name.human, edit_path(payment_method), class: "body-link"
69
70
  end
70
71
  },
71
72
  {
72
73
  header: :available_to_users,
73
74
  data: ->(payment_method) do
74
75
  if payment_method.available_to_users?
75
- component('ui/badge').yes
76
+ component("ui/badge").yes
76
77
  else
77
- component('ui/badge').no
78
+ component("ui/badge").no
78
79
  end
79
80
  end
80
81
  },
@@ -82,9 +83,9 @@ class SolidusAdmin::PaymentMethods::Index::Component < SolidusAdmin::UI::Pages::
82
83
  header: :available_to_admin,
83
84
  data: ->(payment_method) do
84
85
  if payment_method.available_to_admin?
85
- component('ui/badge').yes
86
+ component("ui/badge").yes
86
87
  else
87
- component('ui/badge').no
88
+ component("ui/badge").no
88
89
  end
89
90
  end
90
91
  },
@@ -92,12 +93,12 @@ class SolidusAdmin::PaymentMethods::Index::Component < SolidusAdmin::UI::Pages::
92
93
  header: :status,
93
94
  data: ->(payment_method) do
94
95
  if payment_method.active?
95
- render component('ui/badge').new(name: t('.status.active'), color: :green)
96
+ render component("ui/badge").new(name: t(".status.active"), color: :green)
96
97
  else
97
- render component('ui/badge').new(name: t('.status.inactive'), color: :graphite_light)
98
+ render component("ui/badge").new(name: t(".status.inactive"), color: :graphite_light)
98
99
  end
99
100
  end
100
- },
101
+ }
101
102
  ]
102
103
  end
103
104
  end
@@ -0,0 +1,12 @@
1
+ <%= page id: :resource_form do %>
2
+ <%= page_header do %>
3
+ <%= page_header_back(back_url) %>
4
+ <%= page_header_title(t(".title")) %>
5
+ <%= page_header_actions do %>
6
+ <%= render component("ui/button").discard(path: back_url) %>
7
+ <%= render component("ui/button").save(form: form_id) %>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <%= render component("payment_methods/form").new(payment_method: @resource, url: solidus_admin.payment_methods_path, form_id:) %>
12
+ <% end %>
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::PaymentMethods::New::Component < SolidusAdmin::Resources::New::Component
4
+ include SolidusAdmin::Layout::PageHelpers
5
+
6
+ def back_url = solidus_admin.payment_methods_path
7
+ end
@@ -0,0 +1,2 @@
1
+ en:
2
+ title: "New Payment Method"
@@ -20,46 +20,46 @@ class SolidusAdmin::Products::Index::Component < SolidusAdmin::UI::Pages::Index:
20
20
  def page_actions
21
21
  render component("ui/button").new(
22
22
  tag: :a,
23
- text: t('.add'),
23
+ text: t(".add"),
24
24
  href: spree.new_admin_product_path,
25
- icon: "add-line",
25
+ icon: "add-line"
26
26
  )
27
27
  end
28
28
 
29
29
  def batch_actions
30
30
  [
31
31
  {
32
- label: t('.batch_actions.delete'),
32
+ label: t(".batch_actions.delete"),
33
33
  action: solidus_admin.products_path,
34
34
  method: :delete,
35
- icon: 'delete-bin-7-line',
36
- require_confirmation: true,
35
+ icon: "delete-bin-7-line",
36
+ require_confirmation: true
37
37
  },
38
38
  {
39
- label: t('.batch_actions.discontinue'),
39
+ label: t(".batch_actions.discontinue"),
40
40
  action: solidus_admin.discontinue_products_path,
41
41
  method: :put,
42
- icon: 'pause-circle-line',
43
- require_confirmation: true,
42
+ icon: "pause-circle-line",
43
+ require_confirmation: true
44
44
  },
45
45
  {
46
- label: t('.batch_actions.activate'),
46
+ label: t(".batch_actions.activate"),
47
47
  action: solidus_admin.activate_products_path,
48
48
  method: :put,
49
- icon: 'play-circle-line',
50
- require_confirmation: true,
51
- },
49
+ icon: "play-circle-line",
50
+ require_confirmation: true
51
+ }
52
52
  ]
53
53
  end
54
54
 
55
55
  def scopes
56
56
  [
57
- { name: :all, label: t('.scopes.all'), default: true },
58
- { name: :in_stock, label: t('.scopes.in_stock') },
59
- { name: :out_of_stock, label: t('.scopes.out_of_stock') },
60
- { name: :available, label: t('.scopes.available') },
61
- { name: :discontinued, label: t('.scopes.discontinued') },
62
- { name: :deleted, label: t('.scopes.deleted') },
57
+ {name: :all, label: t(".scopes.all"), default: true},
58
+ {name: :in_stock, label: t(".scopes.in_stock")},
59
+ {name: :out_of_stock, label: t(".scopes.out_of_stock")},
60
+ {name: :available, label: t(".scopes.available")},
61
+ {name: :discontinued, label: t(".scopes.discontinued")},
62
+ {name: :deleted, label: t(".scopes.deleted")}
63
63
  ]
64
64
  end
65
65
 
@@ -67,10 +67,10 @@ class SolidusAdmin::Products::Index::Component < SolidusAdmin::UI::Pages::Index:
67
67
  Spree::OptionType.all.map do |option_type|
68
68
  {
69
69
  label: option_type.presentation,
70
- combinator: 'or',
70
+ combinator: "or",
71
71
  attribute: "option_values_id",
72
72
  predicate: "in",
73
- options: option_type.option_values.pluck(:name, :id),
73
+ options: option_type.option_values.pluck(:name, :id)
74
74
  }
75
75
  end
76
76
  end
@@ -81,19 +81,19 @@ class SolidusAdmin::Products::Index::Component < SolidusAdmin::UI::Pages::Index:
81
81
  name_column,
82
82
  status_column,
83
83
  price_column,
84
- stock_column,
84
+ stock_column
85
85
  ]
86
86
  end
87
87
 
88
88
  def image_column
89
89
  {
90
- col: { class: "w-[72px]" },
91
- header: tag.span('aria-label': t('.image'), role: 'text'),
90
+ col: {class: "w-[72px]"},
91
+ header: tag.span("aria-label": t(".image"), role: "text"),
92
92
  data: ->(product) do
93
93
  image = product.gallery.images.first or return
94
94
 
95
95
  render(
96
- component('ui/thumbnail').new(
96
+ component("ui/thumbnail").new(
97
97
  src: image.url(:small),
98
98
  alt: product.name
99
99
  )
@@ -114,14 +114,14 @@ class SolidusAdmin::Products::Index::Component < SolidusAdmin::UI::Pages::Index:
114
114
  def status_column
115
115
  {
116
116
  header: :status,
117
- data: ->(product) { component('products/status').from_product(product) }
117
+ data: ->(product) { component("products/status").from_product(product) }
118
118
  }
119
119
  end
120
120
 
121
121
  def stock_column
122
122
  {
123
123
  header: :stock,
124
- data: ->(product) { component('products/stock').from_product(product) }
124
+ data: ->(product) { component("products/stock").from_product(product) }
125
125
  }
126
126
  end
127
127
 
@@ -0,0 +1,17 @@
1
+ <%= turbo_frame_tag :new_product_category, target: :product_organization_frame do %>
2
+ <%= render component("ui/modal").new(title: t(".title")) do |modal| %>
3
+ <%= form_for @taxon, url: solidus_admin.product_taxons_path(@product), method: :post, html: { id: dom_id(@taxon) } do |f| %>
4
+ <div class="flex flex-col gap-6 pb-4">
5
+ <%= render component("ui/forms/field").text_field(f, :name, class: "required") %>
6
+ <%= render component("ui/forms/field").select(f, :parent_id, parent_taxon_options, include_blank: t(".none")) %>
7
+ <%= render component("ui/forms/field").text_area(f, :description) %>
8
+ </div>
9
+ <% end %>
10
+ <% modal.with_actions do %>
11
+ <form method="dialog">
12
+ <%= render component("ui/button").new(scheme: :secondary, text: t('.cancel')) %>
13
+ </form>
14
+ <%= render component("ui/button").new(type: :submit, text: t('.submit'), form: dom_id(@taxon)) %>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Products::Show::Categories::New::Component < SolidusAdmin::BaseComponent
4
+ def initialize(product:, taxon: nil)
5
+ @product = product
6
+ @taxon = taxon || product.taxons.build
7
+ end
8
+
9
+ private
10
+
11
+ def parent_taxon_options
12
+ @parent_taxon_options ||= Spree::Taxon.order(:lft).pluck(:name, :id, :depth).map do
13
+ name, id, depth = _1
14
+ ["#{"    " * depth} → #{name}", id, {data: {item_label: name}}]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ en:
2
+ cancel: "Cancel"
3
+ none: "None"
4
+ submit: "Add Category"
5
+ title: "New Category"
@@ -19,124 +19,147 @@
19
19
  target: :_blank,
20
20
  scheme: :ghost
21
21
  ) %>
22
- <%= render component("ui/button").new(tag: :button, text: t(".save"), form: form_id) %>
22
+ <%= render component("ui/button").save(form: form_id) %>
23
23
  <% end %>
24
24
  <% end %>
25
25
 
26
- <%= form_for @product, url: solidus_admin.product_path(@product), html: { id: form_id } do |f| %>
26
+ <%= solidus_form_for @product, url: solidus_admin.product_path(@product), html: { id: form_id } do |f| %>
27
27
  <%= page_with_sidebar do %>
28
28
  <%= page_with_sidebar_main do %>
29
- <%= render component('ui/panel').new do %>
30
- <%= render component("ui/forms/field").text_field(f, :name) %>
31
- <%= render component("ui/forms/field").text_field(f, :slug) %>
32
- <%= render component("ui/forms/field").text_area(f, :description) %>
29
+ <%= render component("ui/panel").new do %>
30
+ <%= f.text_field(:name) %>
31
+ <%= f.text_field(:slug) %>
32
+ <%= f.text_area(:description) %>
33
33
  <% end %>
34
34
 
35
- <%= render component('ui/panel').new(title: 'SEO') do %>
36
- <%= render component("ui/forms/field").text_field(f, :meta_title) %>
37
- <%= render component("ui/forms/field").text_field(f, :meta_description) %>
38
- <%= render component("ui/forms/field").text_area(f, :meta_keywords) %>
39
- <%= render component("ui/forms/field").text_field(f, :gtin) %>
40
- <%= render component("ui/forms/field").select(
41
- f,
42
- :condition,
43
- condition_options,
44
- include_blank: t('spree.unset'),
45
- ) %>
35
+ <%= render component("ui/panel").new(title: t(".seo")) do %>
36
+ <%= f.text_field(:meta_title) %>
37
+ <%= f.text_field(:meta_description) %>
38
+ <%= f.text_area(:meta_keywords) %>
39
+ <%= f.text_field(:gtin) %>
40
+ <%= f.select(:condition, condition_options, include_blank: t("spree.unset")) %>
46
41
  <% end %>
47
- <%= render component('ui/panel').new(title: "Media") do |panel| %>
42
+ <%= render component("ui/panel").new(title: t(".media")) do |panel| %>
48
43
  <% panel.with_action(
49
44
  name: t(".manage_images"),
45
+ scheme: :secondary,
50
46
  href: spree.admin_product_images_path(@product)
51
47
  ) %>
52
48
  <% end %>
53
49
 
54
- <%= render component('ui/panel').new(title: 'Pricing') do %>
55
- <%= render component("ui/forms/field").text_field(f, :price) %>
50
+ <%= render component("ui/panel").new(title: t(".pricing")) do %>
51
+ <%= f.text_field(:price) %>
56
52
  <div class="flex gap-4 justify-items-stretch">
57
- <%= render component("ui/forms/field").text_field(f, :cost_price) %>
58
- <%= render component("ui/forms/field").text_field(f, :cost_currency) %>
53
+ <%= f.text_field(:cost_price) %>
54
+ <%= f.text_field(:cost_currency) %>
59
55
  </div>
60
56
  <% end %>
61
57
 
62
- <%= render component('ui/panel').new(title: 'Stock') do |panel| %>
63
- <%= render component("ui/forms/field").text_field(f, :sku) %>
58
+ <%= render component("ui/panel").new(title: t(".stock")) do |panel| %>
59
+ <%= f.text_field(:sku) %>
64
60
 
65
61
  <% panel.with_action(
66
62
  name: t(".manage_stock"),
63
+ scheme: :secondary,
67
64
  href: spree.admin_product_stock_path(@product)
68
65
  ) %>
69
66
  <% end %>
70
67
 
71
- <%= render component('ui/panel').new(title: 'Shipping') do %>
72
- <%= render component("ui/forms/field").select(
73
- f,
68
+ <%= render component("ui/panel").new(title: t(".shipping")) do %>
69
+ <%= f.select(
74
70
  :shipping_category_id,
75
71
  [[t(".none"), nil]] + Spree::ShippingCategory.order(:name).pluck(:name, :id),
76
- tip: t(".hints.shipping_category_html"),
72
+ tip: t(".hints.shipping_category_html")
77
73
  ) %>
78
- <%= render component("ui/forms/field").select(
79
- f,
74
+ <%= f.select(
80
75
  :tax_category_id,
81
76
  [[t(".none"), nil]] + Spree::TaxCategory.order(:name).pluck(:name, :id),
82
- tip: t(
83
- ".hints.tax_category_html",
84
- default_tax_category: Spree::TaxCategory.default&.name
85
- ),
77
+ tip: t(".hints.tax_category_html")
86
78
  ) %>
87
79
  <% end %>
88
80
 
89
- <%= render component('ui/panel').new(title: "Options") do %>
90
- <%= render component("ui/forms/field").select(
91
- f,
92
- :option_type_ids,
93
- option_type_options,
94
- multiple: true,
95
- "size" => option_type_options.size,
81
+ <%= render component("ui/panel").new(title: t(".options")) do |panel| %>
82
+ <% if @product.product_option_types.present? %>
83
+ <% panel.with_section do %>
84
+ <div class="flex flex-col gap-4" data-controller="sortable" data-sortable-handle-value=".handle">
85
+ <% @product.product_option_types.includes(option_type: :option_values).order(:position).each do |product_option| %>
86
+ <div class="flex gap-2 justify-between" data-sortable-url=<%= solidus_admin.move_product_option_type_path(product_option) %>>
87
+ <div class="flex gap-2">
88
+ <div class="flex items-center">
89
+ <%= render component("ui/icon").new(name: "draggable", class: "w-6 h-6 cursor-grab handle fill-gray-500") %>
90
+ </div>
91
+ <div class="flex flex-col gap-2">
92
+ <span class="font-semibold text-sm"><%= product_option.option_type.name %>:<%= product_option.option_type.presentation %></span>
93
+ <div class="flex gap-2 flex-wrap">
94
+ <% product_option.option_type.option_values.each do |value| %>
95
+ <%= render component("ui/badge").new(name: "#{value.name}:#{value.presentation}") %>
96
+ <% end %>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ <div class="flex items-center">
101
+ <%= render component("ui/button").new(tag: :a, href: spree.edit_admin_option_type_path(product_option.option_type), scheme: :secondary, text: t(".edit")) %>
102
+ </div>
103
+ </div>
104
+ <% end %>
105
+ </div>
106
+ <% end %>
107
+ <% end %>
108
+
109
+ <div class="flex gap-4 justify-between items-end">
110
+ <%= hidden_field_tag "#{f.object_name}[option_type_ids][]", nil %>
111
+ <%= f.select(:option_type_ids, option_type_options, multiple: true) %>
112
+ <%= render component("ui/button").new(type: :submit, text: t(".save")) %>
113
+ </div>
114
+
115
+ <% panel.with_action(
116
+ name: t(".manage_options"),
117
+ scheme: :secondary,
118
+ href: solidus_admin.option_types_path
96
119
  ) %>
97
120
  <% end %>
98
121
 
99
- <%= render component('ui/panel').new(title: "Specifications") do |panel| %>
122
+ <%= render component("ui/panel").new(title: t(".specifications")) do |panel| %>
100
123
  <% panel.with_action(
101
124
  name: t(".manage_properties"),
125
+ scheme: :secondary,
102
126
  href: spree.admin_product_product_properties_path(@product)
103
127
  ) %>
104
128
  <% end %>
105
129
  <% end %>
106
130
 
107
131
  <%= page_with_sidebar_aside do %>
108
- <%= render component('ui/panel').new(title: "Publishing") do %>
109
- <%= render component("ui/forms/field").text_field(
110
- f,
132
+ <%= render component("ui/panel").new(title: t(".publishing")) do %>
133
+ <%= f.text_field(
111
134
  :available_on,
112
- hint: t(".available_on_html"),
135
+ hint: t(".hints.available_on_html"),
113
136
  type: :date,
114
137
  value: f.object.available_on&.to_date
115
138
  ) %>
116
- <%= render component("ui/forms/field").text_field(
117
- f,
139
+ <%= f.text_field(
118
140
  :discontinue_on,
119
- hint: t(".discontinue_on_html"),
141
+ hint: t(".hints.discontinue_on_html"),
120
142
  type: :date,
121
143
  value: f.object.discontinue_on&.to_date
122
144
  ) %>
123
- <label class="flex gap-2 items-center">
124
- <%= render component("ui/forms/checkbox").new(
125
- name: "#{f.object_name}[promotionable]",
126
- checked: f.object.promotionable
127
- ) %>
128
- <span class="font-normal text-xs"><%= Spree::Product.human_attribute_name :promotionable %></span>
129
- <%= render component("ui/toggletip").new(text: t(".hints.promotionable_html")) %>
130
- </label>
145
+ <%= f.checkbox(:promotionable, hint: t(".hints.promotionable_html")) %>
131
146
  <% end %>
132
147
 
133
- <%= render component('ui/panel').new(title: "Product organization") do %>
134
- <%= render component("ui/forms/field").select(
135
- f,
136
- :taxon_ids,
137
- taxon_options,
138
- multiple: true,
139
- "size" => taxon_options.size, # use a string key to avoid setting the size of the component
148
+ <%= render component("ui/panel").new(title: t(".product_organization")) do |panel| %>
149
+ <%= hidden_field_tag "#{f.object_name}[taxon_ids][]", nil %>
150
+
151
+ <%= render component("turbo/target_frame").new(:product_organization_frame, source: :new_product_category) do %>
152
+ <%= render component("ui/forms/field").select(
153
+ f,
154
+ :taxon_ids,
155
+ taxon_options,
156
+ multiple: true
157
+ ) %>
158
+ <% end %>
159
+ <% panel.with_action(
160
+ name: t(".add_new_category"),
161
+ href: solidus_admin.new_product_taxon_path(@product),
162
+ data: { turbo_frame: :new_product_category }
140
163
  ) %>
141
164
  <% end %>
142
165
  <% end %>
@@ -150,11 +173,12 @@
150
173
  tag: :button,
151
174
  text: t(".delete"),
152
175
  scheme: :danger,
153
- "data-action": "click->#{stimulus_id}#confirmDelete",
154
- "data-#{stimulus_id}-message-param": t(".delete_confirmation"),
176
+ "data-turbo-confirm": t(".delete_confirmation")
155
177
  ) %>
156
178
  <% end %>
157
179
  <% end %>
158
180
  <%= render component("ui/button").new(tag: :button, text: t(".save"), form: form_id) %>
159
181
  <% end %>
160
182
  <% end %>
183
+
184
+ <%= turbo_frame_tag :new_product_category, target: :product_organization_frame %>
@@ -16,13 +16,13 @@ class SolidusAdmin::Products::Show::Component < SolidusAdmin::BaseComponent
16
16
  def taxon_options
17
17
  @taxon_options ||= Spree::Taxon.order(:lft).pluck(:name, :id, :lft, :depth).map do
18
18
  name, id, _lft, depth = _1
19
- ["#{'    ' * depth} → #{name}", id]
19
+ ["#{"    " * depth} → #{name}", id, {data: {item_label: name}}]
20
20
  end
21
21
  end
22
22
 
23
23
  def option_type_options
24
24
  @option_type_options ||= Spree::OptionType.order(:presentation).pluck(:presentation, :name, :id).map do
25
- ["#{_1} (#{_2})", _3]
25
+ ["#{_2}:#{_1}", _3]
26
26
  end
27
27
  end
28
28