solidus_admin 0.4.1 → 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 +721 -44
  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 +17 -47
  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 +172 -28
  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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class StateBlueprint < Blueprinter::Base
5
+ identifier :id
6
+
7
+ field :name
8
+
9
+ view :state_with_country do
10
+ field :state_with_country, name: :name
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ViewComponent v3 provided experimental functionality to define default content for slots
4
+ # https://viewcomponent.org/guide/slots.html#default_slot_name, but unfortunately
5
+ # it did not quite work: https://github.com/ViewComponent/view_component/issues/2169.
6
+ # Good news the issue has been resolved, not so good news - it's targeted to be released in v4,
7
+ # so we have to patch the functionality until we upgrade.
8
+ # The solution has been copied from here https://github.com/ViewComponent/view_component/pull/2291/files.
9
+
10
+ require "view_component/version"
11
+ if Gem::Version.new(ViewComponent::VERSION::STRING) >= Gem::Version.new("4")
12
+ raise "The fix is included in ViewComponent v4, please remove this patch #{__FILE__}"
13
+ end
14
+
15
+ module SolidusAdmin
16
+ module SlotableDefault
17
+ def get_slot(slot_name)
18
+ @__vc_set_slots ||= {}
19
+ content unless content_evaluated? # ensure content is loaded so slots will be defined
20
+
21
+ # If the slot is set, return it
22
+ return @__vc_set_slots[slot_name] if @__vc_set_slots[slot_name]
23
+
24
+ # If there is a default method for the slot, call it
25
+ if (default_method = registered_slots[slot_name][:default_method])
26
+ renderable_value = send(default_method)
27
+ slot = ViewComponent::Slot.new(self)
28
+
29
+ if renderable_value.respond_to?(:render_in)
30
+ slot.__vc_component_instance = renderable_value
31
+ else
32
+ slot.__vc_content = renderable_value
33
+ end
34
+
35
+ slot
36
+ elsif self.class.registered_slots[slot_name][:collection]
37
+ # If empty slot is a collection, return an empty array
38
+ []
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,25 +1,16 @@
1
- <%= turbo_frame_tag :resource_modal, target: "_top" do %>
1
+ <%= turbo_frame_tag :resource_form, target: "_top" do %>
2
2
  <%= render component("ui/modal").new(title: t(".title")) do |modal| %>
3
- <%= form_for @adjustment_reason, url: form_url, html: { id: form_id } do |f| %>
3
+ <%= solidus_form_for @adjustment_reason, url: form_url, html: { id: form_id } do |f| %>
4
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").text_field(f, :code, class: "required") %>
7
- <label class="flex gap-2 items-center">
8
- <%= hidden_field_tag "#{f.object_name}[active]", "0" %>
9
- <%= render component("ui/forms/checkbox").new(
10
- name: "#{f.object_name}[active]",
11
- value: "1",
12
- checked: f.object.active
13
- ) %>
14
- <span class="font-semibold text-xs ml-2"><%= Spree::AdjustmentReason.human_attribute_name :active %></span>
15
- <%= render component("ui/toggletip").new(text: t(".hints.active")) %>
16
- </label>
5
+ <%= f.text_field(:name, class: "required") %>
6
+ <%= f.text_field(:code, class: "required") %>
7
+ <%= f.checkbox(:active, hint: t(".hints.active")) %>
17
8
  </div>
18
9
  <% modal.with_actions do %>
19
10
  <form method="dialog">
20
11
  <%= render component("ui/button").new(scheme: :secondary, text: t('.cancel')) %>
21
12
  </form>
22
- <%= render component("ui/button").new(form: form_id, type: :submit, text: t('.submit')) %>
13
+ <%= f.submit %>
23
14
  <% end %>
24
15
  <% end %>
25
16
  <% end %>
@@ -3,6 +3,5 @@
3
3
  en:
4
4
  title: "Edit Adjustment Reason"
5
5
  cancel: "Cancel"
6
- submit: "Update Adjustment Reason"
7
6
  hints:
8
7
  active: "When checked, this adjustment reason will be available for selection when adding adjustments to orders."
@@ -16,17 +16,17 @@ class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::RefundsA
16
16
  def page_actions
17
17
  render component("ui/button").new(
18
18
  tag: :a,
19
- text: t('.add'),
19
+ text: t(".add"),
20
20
  href: solidus_admin.new_adjustment_reason_path(**search_filter_params),
21
- data: { turbo_frame: :resource_modal },
21
+ data: {turbo_frame: :resource_form},
22
22
  icon: "add-line",
23
- class: "align-self-end w-full",
23
+ class: "align-self-end w-full"
24
24
  )
25
25
  end
26
26
 
27
27
  def turbo_frames
28
28
  %w[
29
- resource_modal
29
+ resource_form
30
30
  ]
31
31
  end
32
32
 
@@ -37,11 +37,11 @@ class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::RefundsA
37
37
  def batch_actions
38
38
  [
39
39
  {
40
- label: t('.batch_actions.delete'),
40
+ label: t(".batch_actions.delete"),
41
41
  action: solidus_admin.adjustment_reasons_path(**search_filter_params),
42
42
  method: :delete,
43
- icon: 'delete-bin-7-line',
44
- },
43
+ icon: "delete-bin-7-line"
44
+ }
45
45
  ]
46
46
  end
47
47
 
@@ -51,24 +51,24 @@ class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::RefundsA
51
51
  header: :name,
52
52
  data: ->(adjustment_reason) do
53
53
  link_to adjustment_reason.name, edit_path(adjustment_reason),
54
- class: 'body-link',
55
- data: { turbo_frame: :resource_modal }
54
+ class: "body-link",
55
+ data: {turbo_frame: :resource_form}
56
56
  end
57
57
  },
58
58
  {
59
59
  header: :code,
60
60
  data: ->(adjustment_reason) do
61
61
  link_to adjustment_reason.code, edit_path(adjustment_reason),
62
- class: 'body-link',
63
- data: { turbo_frame: :resource_modal }
62
+ class: "body-link",
63
+ data: {turbo_frame: :resource_form}
64
64
  end
65
65
  },
66
66
  {
67
67
  header: :active,
68
68
  data: ->(adjustment_reason) do
69
- adjustment_reason.active? ? component('ui/badge').yes : component('ui/badge').no
69
+ adjustment_reason.active? ? component("ui/badge").yes : component("ui/badge").no
70
70
  end
71
- },
71
+ }
72
72
  ]
73
73
  end
74
74
  end
@@ -1,25 +1,16 @@
1
- <%= turbo_frame_tag :resource_modal, target: "_top" do %>
1
+ <%= turbo_frame_tag :resource_form, target: "_top" do %>
2
2
  <%= render component("ui/modal").new(title: t(".title")) do |modal| %>
3
- <%= form_for @adjustment_reason, url: form_url, html: { id: form_id } do |f| %>
3
+ <%= solidus_form_for @adjustment_reason, url: form_url, html: { id: form_id } do |f| %>
4
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").text_field(f, :code, class: "required") %>
7
- <label class="flex gap-2 items-center">
8
- <%= hidden_field_tag "#{f.object_name}[active]", "0" %>
9
- <%= render component("ui/forms/checkbox").new(
10
- name: "#{f.object_name}[active]",
11
- value: "1",
12
- checked: f.object.active
13
- ) %>
14
- <span class="font-semibold text-xs ml-2"><%= Spree::AdjustmentReason.human_attribute_name :active %></span>
15
- <%= render component("ui/toggletip").new(text: t(".hints.active")) %>
16
- </label>
5
+ <%= f.text_field(:name, class: "required") %>
6
+ <%= f.text_field(:code, class: "required") %>
7
+ <%= f.checkbox(:active, hint: t(".hints.active")) %>
17
8
  </div>
18
9
  <% modal.with_actions do %>
19
10
  <form method="dialog">
20
11
  <%= render component("ui/button").new(scheme: :secondary, text: t('.cancel')) %>
21
12
  </form>
22
- <%= render component("ui/button").new(form: form_id, type: :submit, text: t('.submit')) %>
13
+ <%= f.submit %>
23
14
  <% end %>
24
15
  <% end %>
25
16
  <% end %>
@@ -3,6 +3,5 @@
3
3
  en:
4
4
  title: "New Adjustment Reason"
5
5
  cancel: "Cancel"
6
- submit: "Add Adjustment Reason"
7
6
  hints:
8
7
  active: "When checked, this adjustment reason will be available for selection when adding adjustments to orders."
@@ -7,8 +7,12 @@ module SolidusAdmin
7
7
  # BaseComponent is the base class for all components in Solidus Admin.
8
8
  class BaseComponent < ViewComponent::Base
9
9
  include SolidusAdmin::ComponentsHelper
10
+ include SolidusAdmin::StimulusHelper
10
11
  include SolidusAdmin::VoidElementsHelper
11
- include Turbo::FramesHelper
12
+ include SolidusAdmin::SolidusFormHelper
13
+ include SolidusAdmin::FlashHelper
14
+ include ::Turbo::FramesHelper
15
+ include ::Turbo::StreamsHelper
12
16
 
13
17
  def icon_tag(name, **attrs)
14
18
  render component("ui/icon").new(name:, **attrs)
@@ -17,12 +21,12 @@ module SolidusAdmin
17
21
  def missing_translation(key, options)
18
22
  keys = I18n.normalize_keys(options[:locale] || I18n.locale, key, options[:scope])
19
23
 
20
- logger.debug " [#{self.class}] Missing translation: #{keys.join('.')}"
24
+ logger.debug " [#{self.class}] Missing translation: #{keys.join(".")}"
21
25
 
22
26
  if (options[:locale] || I18n.default_locale) != :en
23
27
  t(key, **options, locale: :en)
24
28
  else
25
- "translation missing: #{keys.join('.')}"
29
+ "translation missing: #{keys.join(".")}"
26
30
  end
27
31
  end
28
32
 
@@ -0,0 +1,18 @@
1
+ <div id="confirm" data-controller="<%= stimulus_id %>">
2
+ <%= render component("ui/modal").new(
3
+ title: t(".title"),
4
+ open: false
5
+ ) do |modal| %>
6
+ <% modal.with_actions do %>
7
+ <form method="dialog">
8
+ <%= render component("ui/button").new(scheme: :secondary, text: t(".cancel")) %>
9
+ </form>
10
+ <%= render component("ui/button").new(
11
+ text: t(".confirm"),
12
+ id: "confirm-accept",
13
+ scheme: :danger,
14
+ data: { "#{stimulus_id}-target": "accept" }
15
+ ) %>
16
+ <% end %>
17
+ <% end %>
18
+ </div>
@@ -0,0 +1,21 @@
1
+ import { Controller } from "@hotwired/stimulus"
2
+
3
+ export default class extends Controller {
4
+ static targets = ["accept"]
5
+
6
+ open(message, { details = "", buttonText } = {}) {
7
+ const dialog = this.element.querySelector("dialog")
8
+
9
+ dialog.querySelector(".modal-title").textContent = message
10
+ dialog.querySelector(".modal-body").textContent = details
11
+ if (buttonText) this.acceptTarget.textContent = buttonText
12
+
13
+ dialog.showModal()
14
+
15
+ return new Promise((resolve) => {
16
+ const controller = new AbortController()
17
+ this.acceptTarget.addEventListener("click", () => { resolve(true); controller.abort(); dialog.close() }, { signal: controller.signal })
18
+ dialog.addEventListener("close", () => { resolve(false); controller.abort() }, { signal: controller.signal })
19
+ })
20
+ }
21
+ }
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Component wrapper for confirmation dialog. This component uses a modal which
4
+ # is rendered in the layout initially hidden. To have it open to confirm a
5
+ # user's action, place the "data-turbo-confirm" on the submitter (or any other
6
+ # element that supports "data-turbo-confirm" attribute: form, link with
7
+ # "data-turbo-method") with the text you want to have in the modal title:
8
+ #
9
+ # <form>
10
+ # <button type=submit data-turbo-confirm="Are you sure?">Submit</button>
11
+ # </form>
12
+ #
13
+ # <form data-turbo-confirm="Confirm saving">
14
+ # </form>
15
+ #
16
+ # You can add more details in the body of the modal using "data-confirm-details"
17
+ # attribute:
18
+ #
19
+ # <button data-turbo-confirm="Are you sure?" data-confirm-details="This cannot be undone.">Submit</button>
20
+ #
21
+ # To customize "Confirm" button text use "data-confirm-button" attribute:
22
+ #
23
+ # <button data-turbo-confirm="This action is not reversible" data-confirm-button="Proceed">Submit</button>
24
+ #
25
+ class SolidusAdmin::Layout::Confirm::Component < SolidusAdmin::BaseComponent
26
+ end
@@ -0,0 +1,4 @@
1
+ en:
2
+ cancel: "Cancel"
3
+ confirm: "Confirm"
4
+ title: "Are you sure?"
@@ -0,0 +1,7 @@
1
+ <div id="flash_alerts" class="flex items-center justify-center">
2
+ <div class="fixed w-2/3 top-3 flex flex-col gap-3 pointer-events-none" role="alert">
3
+ <% alerts.each do |key, text| %>
4
+ <%= render component("ui/alert").new(title: text[:title], message: text[:message], scheme: key.to_sym) %>
5
+ <% end %>
6
+ </div>
7
+ </div>
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Layout::Flashes::Alerts::Component < SolidusAdmin::BaseComponent
4
+ attr_reader :alerts
5
+
6
+ # Construct alert flashes like:
7
+ # flash[:alert] = { <alert_type>: { title: "", message: "" } }
8
+ # See +SolidusAdmin::UI::Alert::Component::SCHEMES+ for available alert types.
9
+ #
10
+ # If a string is passed to flash[:alert], we treat it is a body of the alert message and fall back to +danger+ type
11
+ # and default title (see +SolidusAdmin::UI::Alert::Component+).
12
+ def initialize(alerts:)
13
+ if alerts.is_a?(String)
14
+ alerts = {danger: {message: alerts}}
15
+ end
16
+
17
+ @alerts = alerts.slice(*SolidusAdmin::UI::Alert::Component::SCHEMES.keys)
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ <div id="flash_toasts" class="fixed inset-x-0 bottom-3 flex items-center justify-center flex-col gap-3 pointer-events-none" role="alert">
2
+ <% flash.each do |key, message| %>
3
+ <%= render component("ui/toast").new(text: message, scheme: key.to_sym == :error ? :error : :default) %>
4
+ <% end %>
5
+ </div>
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Layout::Flashes::Component < SolidusAdmin::BaseComponent
4
+ end
@@ -0,0 +1,5 @@
1
+ <div id="flash_toasts" class="fixed inset-x-0 bottom-3 flex items-center justify-center flex-col gap-3 pointer-events-none" role="alert">
2
+ <% toasts.each do |key, message| %>
3
+ <%= render component("ui/toast").new(text: message, scheme: key.to_sym == :error ? :error : :default) %>
4
+ <% end %>
5
+ </div>
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Layout::Flashes::Toasts::Component < SolidusAdmin::BaseComponent
4
+ attr_reader :toasts
5
+
6
+ def initialize(toasts:)
7
+ @toasts = toasts
8
+ end
9
+ end
@@ -27,12 +27,23 @@
27
27
  shadow-base
28
28
  ">
29
29
 
30
+ <% if defined?(Spree::Core::ControllerHelpers::Timezone) %>
31
+ <% available_timezones_for_select = ActiveSupport::TimeZone.all.map(&:name) %>
32
+ <li class="h-8 flex items-center hover:bg-gray-25 rounded">
33
+ <%= autosubmit_select_tag(
34
+ "solidus_timezone",
35
+ options_for_select(available_timezones_for_select, selected: Time.zone.name),
36
+ icon: 'time-zone-line',
37
+ ) %>
38
+ </li>
39
+ <% end %>
40
+
30
41
  <% if (available_locales = Spree.i18n_available_locales).any? %>
31
42
  <li class="h-8 flex items-center hover:bg-gray-25 rounded">
32
43
  <%= autosubmit_select_tag(
33
44
  "switch_to_locale",
34
45
  options_for_select(locale_options_for_select(available_locales), selected: I18n.locale),
35
- icon: 'global-line',
46
+ icon: 'translate-2',
36
47
  ) %>
37
48
  </li>
38
49
  <% end %>
@@ -12,7 +12,7 @@ class SolidusAdmin::Layout::Navigation::Account::Component < SolidusAdmin::BaseC
12
12
  available_locales.map do |locale|
13
13
  [
14
14
  t("spree.i18n.this_file_language", locale:, default: locale.to_s, fallback: false),
15
- locale,
15
+ locale
16
16
  ]
17
17
  end.sort
18
18
  end
@@ -22,14 +22,14 @@ class SolidusAdmin::Layout::Navigation::Account::Component < SolidusAdmin::BaseC
22
22
  end
23
23
 
24
24
  def autosubmit_select_tag(name, options, icon:, &block)
25
- form_tag(request.fullpath, method: :get, 'data-turbo': false, class: "w-full") do
25
+ form_tag(request.fullpath, method: :get, "data-turbo": false, class: "w-full") do
26
26
  safe_join([
27
27
  block_given? ? capture(&block) : nil,
28
28
  tag.label(safe_join([
29
29
  icon_tag(icon, class: "w-full max-w-[20px] h-5 fill-current shrink"),
30
30
  tag.select(options, name:, onchange: "this.form.requestSubmit()", class: "w-full appearance-none grow bg-transparent outline-none"),
31
- icon_tag("expand-up-down-line", class: "w-full max-w-[20px] h-5 fill-current shrink"),
32
- ]), class: "flex gap-2 items-center px-2"),
31
+ icon_tag("expand-up-down-line", class: "w-full max-w-[20px] h-5 fill-current shrink")
32
+ ]), class: "flex gap-2 items-center px-2")
33
33
  ])
34
34
  end
35
35
  end
@@ -8,24 +8,18 @@ module SolidusAdmin::Layout::PageHelpers
8
8
 
9
9
  def page_header_actions(&block)
10
10
  tag.div(safe_join([
11
- capture(&block),
11
+ capture(&block)
12
12
  ]), class: "flex gap-2 items-center")
13
13
  end
14
14
 
15
15
  def page_header_back(back_path)
16
- render component("ui/button").new(
17
- tag: :a,
18
- title: t(".back"),
19
- icon: "arrow-left-line",
20
- scheme: :secondary,
21
- href: back_path
22
- )
16
+ render component("ui/button").back(path: back_path)
23
17
  end
24
18
 
25
19
  def page_header_title(title, &block)
26
20
  tag.h1(safe_join([
27
21
  tag.span(title, class: "font-semibold text-xl"),
28
- (capture(&block) if block_given?) || "",
22
+ (capture(&block) if block_given?) || ""
29
23
  ]), class: "flex-1 text-2xl font-bold")
30
24
  end
31
25
 
@@ -7,8 +7,8 @@ class SolidusAdmin::Layout::SkipLink::Component < SolidusAdmin::BaseComponent
7
7
 
8
8
  def call
9
9
  link_to t(".skip_link"),
10
- @href,
11
- class: %{
10
+ @href,
11
+ class: %(
12
12
  sr-only
13
13
  focus:not-sr-only
14
14
  inline-block
@@ -17,6 +17,6 @@ class SolidusAdmin::Layout::SkipLink::Component < SolidusAdmin::BaseComponent
17
17
  font-normal text-sm
18
18
  text-white
19
19
  bg-black
20
- }
20
+ )
21
21
  end
22
22
  end
@@ -0,0 +1,44 @@
1
+ <%= turbo_frame_tag :resource_form, target: "_top" do %>
2
+ <%= page do %>
3
+ <%= page_header do %>
4
+ <%= page_header_back(back_url) %>
5
+ <%= page_header_title(t('.title')) %>
6
+ <%= page_header_actions do %>
7
+ <%= render component("ui/button").new(text: t(".save"),form: form_id) %>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <div class="flex flex-col gap-4">
12
+ <%= form_for @option_type, url: form_url, html: { id: form_id } do |f| %>
13
+ <%= render component("ui/panel").new(title: t(".panels.option_type.title")) do |panel| %>
14
+ <% panel.with_section(class: "flex flex-col gap-4") do %>
15
+ <div class="flex gap-4 w-full">
16
+ <%= render component("ui/forms/field").text_field(f, :name, class: "required") %>
17
+ <%= render component("ui/forms/field").text_field(f, :presentation, class: "required") %>
18
+ </div>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
22
+
23
+ <%= render component("ui/panel").new(title: t(".panels.option_values.title")) do |panel| %>
24
+ <% panel.with_section(wide: true, high: true, class: "flex flex-col gap-4") do %>
25
+ <div id="option_values_table">
26
+ <%= render component("option_values/table").new(@option_type) %>
27
+ </div>
28
+ <% end %>
29
+
30
+ <% panel.with_action(
31
+ name: t(".panels.option_values.add"),
32
+ href: solidus_admin.new_option_type_option_value_path(@option_type),
33
+ data: { turbo_frame: :option_value_modal }
34
+ ) %>
35
+ <% end %>
36
+
37
+ <%= page_footer do %>
38
+ <%= render component("ui/button").new(text: t(".save"), form: form_id) %>
39
+ <% end %>
40
+ </div>
41
+
42
+ <%= turbo_frame_tag :option_value_modal, target: "_top" %>
43
+ <% end %>
44
+ <% end %>
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::OptionTypes::Edit::Component < SolidusAdmin::Resources::Edit::Component
4
+ include SolidusAdmin::Layout::PageHelpers
5
+ end
@@ -0,0 +1,10 @@
1
+ en:
2
+ back: "Back"
3
+ panels:
4
+ option_type:
5
+ title: "Option Type"
6
+ option_values:
7
+ title: "Option Values"
8
+ add: "Add new"
9
+ save: "Save"
10
+ title: "Edit Option Type"
@@ -5,49 +5,43 @@ class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::UI::Pages::Ind
5
5
  Spree::OptionType
6
6
  end
7
7
 
8
- def row_url(option_type)
9
- spree.edit_admin_option_type_path(option_type)
10
- end
11
-
12
8
  def sortable_options
13
9
  {
14
10
  url: ->(option_type) { solidus_admin.move_option_type_path(option_type) },
15
- param: 'position',
11
+ param: "position"
16
12
  }
17
13
  end
18
14
 
15
+ def turbo_frames
16
+ %w[resource_form]
17
+ end
18
+
19
19
  def page_actions
20
20
  render component("ui/button").new(
21
21
  tag: :a,
22
- text: t('.add'),
23
- href: spree.new_admin_option_type_path,
24
- icon: "add-line",
22
+ text: t(".add"),
23
+ href: solidus_admin.new_option_type_path,
24
+ data: {turbo_frame: :resource_form},
25
+ icon: "add-line"
25
26
  )
26
27
  end
27
28
 
28
- def prev_page_path
29
- solidus_admin.url_for(**request.params, page: @page.number - 1, only_path: true) unless @page.first?
30
- end
31
-
32
- def next_page_path
33
- solidus_admin.url_for(**request.params, page: @page.next_param, only_path: true) unless @page.last?
34
- end
35
-
36
29
  def batch_actions
37
30
  [
38
31
  {
39
- label: t('.batch_actions.delete'),
32
+ label: t(".batch_actions.delete"),
40
33
  action: solidus_admin.option_types_path,
41
34
  method: :delete,
42
- icon: 'delete-bin-7-line',
43
- },
35
+ icon: "delete-bin-7-line",
36
+ require_confirmation: true
37
+ }
44
38
  ]
45
39
  end
46
40
 
47
41
  def columns
48
42
  [
49
43
  name_column,
50
- presentation_column,
44
+ presentation_column
51
45
  ]
52
46
  end
53
47
 
@@ -55,7 +49,8 @@ class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::UI::Pages::Ind
55
49
  {
56
50
  header: :name,
57
51
  data: ->(option_type) do
58
- content_tag :div, option_type.name
52
+ link_to option_type.name, edit_path(option_type),
53
+ class: "body-link"
59
54
  end
60
55
  }
61
56
  end
@@ -64,8 +59,13 @@ class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::UI::Pages::Ind
64
59
  {
65
60
  header: :presentation,
66
61
  data: ->(option_type) do
67
- content_tag :div, option_type.presentation
62
+ link_to option_type.presentation, edit_path(option_type),
63
+ class: "body-link"
68
64
  end
69
65
  }
70
66
  end
67
+
68
+ def edit_path(option_type)
69
+ solidus_admin.edit_option_type_path(option_type)
70
+ end
71
71
  end
@@ -0,0 +1,16 @@
1
+ <%= turbo_frame_tag :resource_form, target: "_top" do %>
2
+ <%= render component("ui/modal").new(title: t(".title")) do |modal| %>
3
+ <%= form_for @option_type, url: form_url, html: { id: form_id } 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").text_field(f, :presentation, class: "required") %>
7
+ </div>
8
+ <% modal.with_actions do %>
9
+ <form method="dialog">
10
+ <%= render component("ui/button").new(scheme: :secondary, text: t('.cancel')) %>
11
+ </form>
12
+ <%= render component("ui/button").new(form: form_id, type: :submit, text: t('.submit')) %>
13
+ <% end %>
14
+ <% end %>
15
+ <% end %>
16
+ <% end %>
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::OptionTypes::New::Component < SolidusAdmin::Resources::New::Component
4
+ end