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
@@ -27,8 +27,8 @@ class SolidusAdmin::UI::Forms::Field::Component < SolidusAdmin::BaseComponent
27
27
  tag: :input,
28
28
  size:,
29
29
  value: object.public_send(method),
30
- error: (errors.to_sentence.capitalize if errors),
31
- **attributes,
30
+ error: errors&.to_sentence&.capitalize,
31
+ **attributes
32
32
  }
33
33
  )
34
34
  end
@@ -36,20 +36,16 @@ class SolidusAdmin::UI::Forms::Field::Component < SolidusAdmin::BaseComponent
36
36
  def self.select(form, method, choices, object: nil, hint: nil, tip: nil, size: :m, **attributes)
37
37
  object_name, object, label, errors = extract_form_details(form, object, method)
38
38
 
39
- new(
39
+ component("ui/forms/select").new(
40
40
  label:,
41
41
  hint:,
42
42
  tip:,
43
- error: errors,
44
- input_attributes: {
45
- name: "#{object_name}[#{method}]",
46
- tag: :select,
47
- choices:,
48
- size:,
49
- value: (object.public_send(method) if object.respond_to?(method)),
50
- error: (errors.to_sentence.capitalize if errors),
51
- **attributes,
52
- }
43
+ size: size,
44
+ name: "#{object_name}[#{method}]#{"[]" if attributes[:multiple].present?}",
45
+ choices:,
46
+ value: object.try(method),
47
+ error: errors&.to_sentence&.capitalize,
48
+ **attributes
53
49
  )
54
50
  end
55
51
 
@@ -66,8 +62,8 @@ class SolidusAdmin::UI::Forms::Field::Component < SolidusAdmin::BaseComponent
66
62
  size:,
67
63
  tag: :textarea,
68
64
  value: object.public_send(method),
69
- error: (errors.to_sentence.capitalize if errors),
70
- **attributes,
65
+ error: errors&.to_sentence&.capitalize,
66
+ **attributes
71
67
  }
72
68
  )
73
69
  end
@@ -79,14 +75,14 @@ class SolidusAdmin::UI::Forms::Field::Component < SolidusAdmin::BaseComponent
79
75
  label:,
80
76
  hint:,
81
77
  tip:,
82
- error: errors,
78
+ error: errors
83
79
  ).with_content(
84
- component('ui/forms/switch').new(
80
+ component("ui/forms/switch").new(
85
81
  name: "#{object_name}[#{method}]",
86
82
  size:,
87
83
  checked: object.public_send(method),
88
84
  include_hidden: true,
89
- **attributes,
85
+ **attributes
90
86
  )
91
87
  )
92
88
  end
@@ -16,7 +16,7 @@ class SolidusAdmin::UI::Forms::Input::Component < SolidusAdmin::BaseComponent
16
16
  MULTILINE_HEIGHTS = {
17
17
  s: %w[min-h-[84px]],
18
18
  m: %w[min-h-[108px]],
19
- l: %w[min-h-[144px]],
19
+ l: %w[min-h-[144px]]
20
20
  }.freeze
21
21
 
22
22
  TYPES = Set.new(%i[
@@ -34,10 +34,11 @@ class SolidusAdmin::UI::Forms::Input::Component < SolidusAdmin::BaseComponent
34
34
  week
35
35
  search
36
36
  time
37
+ hidden
37
38
  ]).freeze
38
39
 
39
40
  def initialize(tag: :input, size: :m, error: nil, **attributes)
40
- raise ArgumentError, "unsupported tag: #{tag}" unless %i[input textarea select].include?(tag)
41
+ raise ArgumentError, "unsupported tag: #{tag}" unless %i[input textarea].include?(tag)
41
42
 
42
43
  specialized_classes = []
43
44
  readonly_classes = "read-only:bg-gray-15 focus:read-only:bg-gray-15 focus:read-only:ring-0
@@ -56,20 +57,11 @@ class SolidusAdmin::UI::Forms::Input::Component < SolidusAdmin::BaseComponent
56
57
  specialized_classes << "form-textarea"
57
58
  specialized_classes << readonly_classes
58
59
  specialized_classes << MULTILINE_HEIGHTS[size]
59
- when :select
60
- if attributes[:multiple]
61
- specialized_classes << "form-multiselect"
62
- specialized_classes << MULTILINE_HEIGHTS[size]
63
- else
64
- specialized_classes << "form-select"
65
- specialized_classes << "bg-arrow-down-s-fill-gray-700 invalid:bg-arrow-down-s-fill-red-400 aria-invalid:bg-arrow-down-s-fill-red-400"
66
- specialized_classes << HEIGHTS[size]
67
- end
68
60
  end
69
61
 
70
62
  attributes[:class] = [
71
63
  %w[
72
- w-full
64
+ peer w-full
73
65
  text-black bg-white border border-gray-300 rounded-sm placeholder:text-gray-400
74
66
  hover:border-gray-500
75
67
  focus:ring focus:ring-gray-300 focus:ring-0.5 focus:bg-white focus:ring-offset-0 [&:focus-visible]:outline-none
@@ -79,7 +71,7 @@ class SolidusAdmin::UI::Forms::Input::Component < SolidusAdmin::BaseComponent
79
71
  ],
80
72
  SIZES[size],
81
73
  specialized_classes,
82
- attributes[:class],
74
+ attributes[:class]
83
75
  ].compact.join(" ")
84
76
 
85
77
  @tag = tag
@@ -89,8 +81,8 @@ class SolidusAdmin::UI::Forms::Input::Component < SolidusAdmin::BaseComponent
89
81
  end
90
82
 
91
83
  def call
92
- if @tag == :select && @attributes[:choices]
93
- with_content options_for_select(@attributes.delete(:choices), @attributes.delete(:value))
84
+ if @tag == :textarea && @attributes[:value]
85
+ with_content @attributes.delete(:value)
94
86
  end
95
87
 
96
88
  build_tag
@@ -107,9 +99,8 @@ class SolidusAdmin::UI::Forms::Input::Component < SolidusAdmin::BaseComponent
107
99
 
108
100
  def tag_options
109
101
  @tag_options ||= {
110
- "data-controller": stimulus_id,
111
- "data-#{stimulus_id}-custom-validity-value": @error.presence,
112
- "data-action": "#{stimulus_id}#clearCustomValidity",
102
+ "data-controller": "custom-validity",
103
+ "data-custom-validity-error-message-value": @error.presence,
113
104
  **@attributes
114
105
  }
115
106
  end
@@ -5,8 +5,8 @@ class SolidusAdmin::UI::Forms::Search::Result::Component < SolidusAdmin::BaseCom
5
5
  tag.div(
6
6
  content,
7
7
  class: "rounded p-2 hover:bg-gray-25 aria-selected:bg-gray-25 cursor-pointer",
8
- "data-#{component('ui/forms/search').stimulus_id}-target": "result",
9
- "data-action": "click->#{component('ui/forms/search').stimulus_id}#clickedResult",
8
+ "data-#{component("ui/forms/search").stimulus_id}-target": "result",
9
+ "data-action": "click->#{component("ui/forms/search").stimulus_id}#clickedResult"
10
10
  )
11
11
  end
12
12
  end
@@ -0,0 +1,21 @@
1
+ <div class="flex flex-col gap-2 w-full">
2
+ <div class="flex gap-1 items-center">
3
+ <label class="text-gray-700 font-semibold" <%= tag.attributes for: @attributes[:id] %>>
4
+ <%= @label %>
5
+ </label>
6
+ <%= render component('ui/toggletip').new(text: @tip) if @tip.present? %>
7
+ </div>
8
+
9
+ <%= tag.select(@options_collection, **@attributes) %>
10
+
11
+ <% if @hint.present? || @error.present? %>
12
+ <div class="
13
+ font-normal
14
+ [:disabled~&]:text-gray-300 text-gray-500
15
+ flex gap-1 flex-col [&>.error]:hidden [&>.error]:peer-invalid:block
16
+ ">
17
+ <%= tag.span @hint if @hint.present? %>
18
+ <%= tag.span safe_join(@error, tag.br), class: "error text-red-600" %>
19
+ </div>
20
+ <% end %>
21
+ </div>
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Select::Component < SolidusAdmin::BaseComponent
4
+ FONT_SIZES = {
5
+ s: "[&>.control]:text-xs [&_.dropdown]:text-xs",
6
+ m: "[&>.control]:text-sm [&_.dropdown]:text-sm",
7
+ l: "[&>.control]:text-base [&_.dropdown]:text-base"
8
+ }.freeze
9
+
10
+ HEIGHTS = {
11
+ control: {
12
+ s: "[&>.control]:min-h-7",
13
+ m: "[&>.control]:min-h-9",
14
+ l: "[&>.control]:min-h-12"
15
+ },
16
+ option: {
17
+ s: "[&_.option]:h-7",
18
+ m: "[&_.option]:h-9",
19
+ l: "[&_.option]:h-12"
20
+ },
21
+ item: {
22
+ s: "[&_.item]:h-5",
23
+ m: "[&_.item]:h-5.5",
24
+ l: "[&_.item]:h-8"
25
+ }
26
+ }.freeze
27
+
28
+ # Render custom select component, which uses "solidus_select" custom element
29
+ # @see "admin/app/javascript/solidus_admin/web_components/solidus_select.js"
30
+ # @param choices [Array<String>, Array<Array<String>>] container with options to be rendered
31
+ # (see `ActionView::Helpers::FormOptionsHelper#options_for_select`).
32
+ # When +:src+ parameter is provided, use +:choices+ to provide the list of selected options only.
33
+ # Include a dataset hash `{ data: { item_label: <alternative_label_text> } }` to change the text displayed in select
34
+ # box when option is selected.
35
+ # @param src [nil, String] URL of a JSON resource with options data to be loaded instead of rendering options in place.
36
+ # @option attributes [nil, String, Integer, Array<String, Integer>] :value which option should be selected
37
+ # @option attributes [String] :"data-option-value-field"
38
+ # @option attributes [String] :"data-option-label-field" when +:src+ param is passed, value and label of loaded options
39
+ # will be mapped to JSON response +"id"+ and +"name"+ by default. Use these parameters to map to different keys.
40
+ # @option attributes [String] :"data-json-path" when +:src+ param is passed and options data is nested in JSON response,
41
+ # specify path to it with this parameter.
42
+ # @option attributes [String] :"data-query-param" when +:src+ param is passed, use this parameter to specify the name of
43
+ # a query parameter to be used with search, e.g.:
44
+ # ```
45
+ # src: solidus_admin.countries_url,
46
+ # "data-query-param": "q[name_cont]",
47
+ # ```
48
+ # @option attributes [String] :"data-no-preload" when +:src+ param is passed, options are preloaded when the component
49
+ # is initialized. Use this option to disable preload.
50
+ # @option attributes [String] :"data-loading-message" when +:src+ param is passed, which text to show while loading options.
51
+ # Default: "Loading".
52
+ # @option attributes [String] :"data-loading-more-message" when +:src+ param is passed, which text to show while
53
+ # loading next page of results. Default: "Loading more results".
54
+ # @option attributes [String] :"data-no-results-message" which text to show when there are no search results returned.
55
+ # Default: "No results found".
56
+ # @option attributes [true, String] :include_blank if passed, an empty option will be prepended to the list of options.
57
+ # Pass +true+ for empty option with no text, or +String+ for the text to be shown as empty option.
58
+ # @raise [ArgumentError] if +choices+ is not an array
59
+ def initialize(label:, name:, choices:, src: nil, size: :m, hint: nil, tip: nil, error: nil, **attributes)
60
+ @label = label
61
+ @hint = hint
62
+ @tip = tip
63
+ @error = Array.wrap(error)
64
+ @attributes = attributes
65
+
66
+ prepare_options(choices:, src:)
67
+ prepare_classes(size:)
68
+
69
+ @attributes[:name] = name
70
+ @attributes[:is] = "solidus-select"
71
+ @attributes[:id] ||= "#{stimulus_id}_#{name}"
72
+ @attributes[:"data-error-message"] = @error.presence
73
+ end
74
+
75
+ private
76
+
77
+ # translations are not available at initialization so need to define them here
78
+ def before_render
79
+ @attributes[:"data-loading-message"] ||= t("solidus_admin.solidus_select.loading")
80
+ @attributes[:"data-loading-more-message"] ||= t("solidus_admin.solidus_select.loading_more")
81
+ @attributes[:"data-no-results-message"] ||= t("solidus_admin.solidus_select.no_results")
82
+ end
83
+
84
+ def prepare_options(choices:, src:)
85
+ raise ArgumentError, "`choices` must be an array" unless choices.is_a?(Array)
86
+
87
+ if src.present?
88
+ @attributes[:"data-src"] = src
89
+ end
90
+
91
+ if (blank_option = @attributes.delete(:include_blank))
92
+ blank_option = "" if blank_option == true
93
+ choices.unshift([blank_option, ""])
94
+ end
95
+
96
+ @options_collection = options_for_select(choices, @attributes.delete(:value))
97
+ end
98
+
99
+ def prepare_classes(size:)
100
+ general_classes = ["w-full relative text-black font-normal #{FONT_SIZES[size]}"]
101
+ control_classes = ["[&>.control]:peer-invalid:border-red-600 [&>.control]:peer-invalid:hover:border-red-600
102
+ [&>.control]:peer-invalid:text-red-600 [&>.control]:flex [&>.control]:flex-wrap [&>.control]:items-center
103
+ [&>.control]:gap-1 [&>.control]:rounded-sm [&>.control]:w-full [&>.control]:rounded-sm [&>.control]:pl-3
104
+ [&>.control]:pr-10 [&>.control]:py-1.5 [&>.control]:bg-white [&>.control]:border [&>.control]:border-gray-300
105
+ [&>.control]:hover:border-gray-500 [&>.control]:has-[:disabled]:bg-gray-50 [&>.control]:has-[:disabled]:text-gray-500
106
+ [&>.control]:has-[:disabled]:cursor-not-allowed [&>.control]:has-[:disabled]:hover:border-gray-300
107
+ [&>.control]:has-[:focus]:ring [&>.control]:has-[:focus]:ring-gray-300 [&>.control]:has-[:focus]:ring-0.5
108
+ [&>.control]:has-[:focus]:bg-white [&>.control]:has-[:focus]:ring-offset-0 [&>.control]:has-[:focus]:outline-none
109
+ #{HEIGHTS[:control][size]}"]
110
+
111
+ unless @attributes[:multiple]
112
+ control_classes << "[&>.control]:peer-invalid:bg-arrow-down-s-fill-red-400 [&>.control]:form-select
113
+ [&>.control]:bg-arrow-down-s-fill-gray-700"
114
+ end
115
+
116
+ item_classes = []
117
+ if @attributes[:multiple]
118
+ item_classes << "[&_.item]:flex [&_.item]:gap-1 [&_.item]:items-center [&_.item]:rounded-full [&_.item]:whitespace-nowrap
119
+ [&_.item]:px-2 [&_.item]:py-0.5 [&_.item]:bg-graphite-light [&_.item]:peer-invalid:bg-red-100 #{HEIGHTS[:item][size]}
120
+ [&_.item_.remove-button]:text-xl [&_.item_.remove-button]:pb-0.5 [&_.item_.remove-button]:order-first
121
+ [&_.item_.remove-button]:has-[:disabled]:cursor-not-allowed"
122
+ end
123
+
124
+ input_classes = ["[&_input]:has-[.item]:placeholder:opacity-0 [&_input:disabled]:cursor-not-allowed [&_input:disabled]:bg-gray-50
125
+ [&_input]:peer-invalid:placeholder:text-red-400"]
126
+
127
+ unless @attributes[:multiple]
128
+ input_classes << "[&_input]:has-[.item]:opacity-0 [&_input]:has-[.item]:cursor-default"
129
+ end
130
+
131
+ dropdown_classes = ["[&_.dropdown]:w-full [&_.dropdown]:absolute [&_.dropdown]:border [&_.dropdown]:border-gray-100
132
+ [&_.dropdown]:mt-0.5 [&_.dropdown]:min-w-[10rem] [&_.dropdown]:p-2 [&_.dropdown]:rounded-sm [&_.dropdown]:z-10
133
+ [&_.dropdown]:shadow-lg [&_.dropdown]:bg-white"]
134
+
135
+ dropdown_content_classes = ["[&_.dropdown-content]:flex [&_.dropdown-content]:flex-col [&_.dropdown-content]:max-h-[200px]
136
+ [&_.dropdown-content]:overflow-x-hidden [&_.dropdown-content]:overflow-y-auto [&_.dropdown-content]:scroll-smooth
137
+ [&_.no-results]:text-gray-500 [&_.no-results]:px-2 [&_.no-results]:py-1
138
+ [&_.loading]:animate-pulse [&_.loading]:italic [&_.loading]:text-gray-500 [&_.loading]:px-2 [&_.loading]:py-1"]
139
+
140
+ option_classes = ["[&_.option]:p-2 [&_.option]:rounded-sm [&_.option]:min-w-fit [&_.option.active]:bg-gray-50
141
+ [&_.option.active]:text-gray-700 [&_.option_.highlight]:bg-yellow [&_.option_.highlight]:rounded-[1px]
142
+ [&_.option.loading-more]:animate-pulse [&_.option.loading-more]:italic [&_.option.loading-more]:text-gray-500 [&_.option.loading-more]:text-center [&_.option.loading-more]:text-xs [&_.option.loading-more]:py-0.5 [&_.option.loading-more]:pointer-events-none
143
+ #{HEIGHTS[:option][size]}"]
144
+
145
+ @attributes[:class] = [
146
+ "peer",
147
+ general_classes,
148
+ control_classes,
149
+ item_classes,
150
+ input_classes,
151
+ dropdown_classes,
152
+ dropdown_content_classes,
153
+ option_classes,
154
+ @attributes[:class]
155
+ ].compact.join(" ")
156
+ end
157
+ end
@@ -2,8 +2,8 @@
2
2
 
3
3
  class SolidusAdmin::UI::Forms::Switch::Component < SolidusAdmin::BaseComponent
4
4
  SIZES = {
5
- s: 'w-8 h-5 after:w-4 after:h-4 after:checked:translate-x-3',
6
- m: 'w-10 h-6 after:w-5 after:h-5 after:checked:translate-x-4',
5
+ s: "w-8 h-5 after:w-4 after:h-4 after:checked:translate-x-3",
6
+ m: "w-10 h-6 after:w-5 after:h-5 after:checked:translate-x-4"
7
7
  }.freeze
8
8
 
9
9
  def initialize(size: :m, include_hidden: false, **attributes)
@@ -34,8 +34,8 @@ class SolidusAdmin::UI::Forms::Switch::Component < SolidusAdmin::BaseComponent
34
34
 
35
35
  def call
36
36
  input = tag.input(
37
- type: 'checkbox',
38
- **@attributes,
37
+ type: "checkbox",
38
+ **@attributes
39
39
  )
40
40
 
41
41
  @include_hidden ? hidden_field_tag(@attributes.fetch(:name), false) + input : input
@@ -15,17 +15,17 @@ class SolidusAdmin::UI::Icon::Component < SolidusAdmin::BaseComponent
15
15
  @attrs = attrs
16
16
 
17
17
  # Hide the icon from screen readers by default.
18
- @attrs['aria-hidden'] = true unless @attrs.key?('aria-hidden')
18
+ @attrs["aria-hidden"] = true unless @attrs.key?("aria-hidden")
19
19
 
20
20
  # Default icons without style to 16x16, mostly useful in test snapshots.
21
- @attrs['width'] = '16'
22
- @attrs['height'] = '16'
21
+ @attrs["width"] = "16"
22
+ @attrs["height"] = "16"
23
23
  end
24
24
 
25
25
  def call
26
26
  # bypass the asset_host configuration to avoid CORS issues with CDNs:
27
27
  # https://github.com/solidusio/solidus/issues/5657
28
28
  href = asset_path("solidus_admin/remixicon.symbol.svg#ri-#{@name}", host: "")
29
- tag.svg(tag.use("xlink:href": href), **@attrs)
29
+ tag.svg(tag.use("xlink:href": href, href:), **@attrs)
30
30
  end
31
31
  end