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
@@ -2,67 +2,112 @@
2
2
 
3
3
  class SolidusAdmin::UI::Button::Component < SolidusAdmin::BaseComponent
4
4
  SIZES = {
5
- s: %{
5
+ s: %(
6
6
  h-7 w-7 p-1
7
7
  text-xs font-semibold leading-none
8
- },
9
- m: %{
8
+ ),
9
+ m: %(
10
10
  h-9 w-9 p-1.5
11
11
  text-sm font-semibold leading-none
12
- },
13
- l: %{
12
+ ),
13
+ l: %(
14
14
  h-12 w-12 p-2
15
15
  text-base font-semibold leading-none
16
- },
16
+ )
17
17
  }
18
18
 
19
19
  TEXT_PADDINGS = {
20
- s: %{px-1.5 w-auto},
21
- m: %{px-3 w-auto},
22
- l: %{px-4 w-auto},
20
+ s: %(px-1.5 w-auto),
21
+ m: %(px-3 w-auto),
22
+ l: %(px-4 w-auto)
23
23
  }
24
24
 
25
25
  ICON_SIZES = {
26
- s: %{w-[1.4em] h-[1.4em]},
27
- m: %{w-[1.35em] h-[1.35em]},
28
- l: %{w-[1.5em] h-[1.5em]},
26
+ s: %(w-[1.4em] h-[1.4em]),
27
+ m: %(w-[1.35em] h-[1.35em]),
28
+ l: %(w-[1.5em] h-[1.5em])
29
29
  }
30
30
 
31
31
  SCHEMES = {
32
- primary: %{
32
+ primary: %(
33
33
  text-white bg-black
34
34
  hover:text-white hover:bg-gray-600
35
35
  active:text-white active:bg-gray-800 aria-current:text-white aria-current:bg-gray-800
36
36
  focus:text-white focus:bg-gray-700
37
37
  disabled:text-gray-400 disabled:bg-gray-100
38
38
  aria-disabled:text-gray-400 aria-disabled:bg-gray-100
39
- },
40
- secondary: %{
39
+ ),
40
+ secondary: %(
41
41
  text-gray-700 bg-white border border-1 border-gray-200
42
42
  hover:bg-gray-50
43
43
  active:bg-gray-100 aria-current:bg-gray-100
44
44
  focus:bg-gray-50
45
45
  disabled:text-gray-300 disabled:bg-white
46
46
  aria-disabled:text-gray-300 aria-disabled:bg-white
47
- },
48
- danger: %{
47
+ ),
48
+ danger: %(
49
49
  text-red-500 bg-white border border-1 border-red-500
50
50
  hover:bg-red-500 hover:border-red-600 hover:text-white
51
51
  active:bg-red-600 active:border-red-700 active:text-white aria-current:bg-red-600 aria-current:border-red-700 aria-current:text-white
52
52
  focus:bg-red-50 focus:bg-red-500 focus:border-red-600 focus:text-white
53
53
  disabled:text-red-300 disabled:bg-white disabled:border-red-200
54
54
  aria-disabled:text-red-300 aria-disabled:bg-white aria-disabled:border-red-200
55
- },
56
- ghost: %{
55
+ ),
56
+ ghost: %(
57
57
  text-gray-700 bg-transparent
58
58
  hover:bg-gray-50
59
59
  active:bg-gray-100 aria-current:bg-gray-100
60
60
  focus:bg-gray-50 focus:ring-gray-300 focus:ring-2
61
61
  disabled:text-gray-300 disabled:bg-transparent disabled:border-gray-300
62
62
  aria-disabled:text-gray-300 aria-disabled:bg-transparent aria-disabled:border-gray-300
63
- },
63
+ )
64
64
  }
65
65
 
66
+ def self.add(path:, **options)
67
+ new(
68
+ tag: :a,
69
+ text: t(".add"),
70
+ icon: "add-line",
71
+ scheme: :primary,
72
+ href: path,
73
+ **options
74
+ )
75
+ end
76
+
77
+ def self.back(path:, **options)
78
+ new(
79
+ tag: :a,
80
+ title: t(".back"),
81
+ icon: "arrow-left-line",
82
+ scheme: :secondary,
83
+ href: path,
84
+ **options
85
+ )
86
+ end
87
+
88
+ def self.delete(**options)
89
+ new(
90
+ tag: :button,
91
+ text: t(".delete"),
92
+ scheme: :danger,
93
+ **options
94
+ )
95
+ end
96
+
97
+ def self.discard(path:, **options)
98
+ new(
99
+ tag: :a,
100
+ text: t(".discard"),
101
+ scheme: :secondary,
102
+ href: path,
103
+ **options
104
+ )
105
+ end
106
+
107
+ def self.save(**options)
108
+ new(text: t(".save"), **options)
109
+ end
110
+
66
111
  def initialize(
67
112
  tag: :button,
68
113
  text: nil,
@@ -77,23 +122,35 @@ class SolidusAdmin::UI::Button::Component < SolidusAdmin::BaseComponent
77
122
  @attributes = attributes
78
123
 
79
124
  @attributes[:class] = [
80
- 'justify-start items-center justify-center gap-1 inline-flex rounded',
81
- 'focus:ring focus:ring-gray-300 focus:ring-0.5 focus:ring-offset-0 [&:focus-visible]:outline-none',
125
+ "justify-start items-center justify-center gap-1 inline-flex rounded",
126
+ "focus:ring focus:ring-gray-300 focus:ring-0.5 focus:ring-offset-0 [&:focus-visible]:outline-none",
82
127
  SIZES.fetch(size.to_sym),
83
128
  (TEXT_PADDINGS.fetch(size.to_sym) if @text),
84
129
  SCHEMES.fetch(scheme.to_sym),
85
- @attributes[:class],
86
- ].join(' ')
130
+ @attributes[:class]
131
+ ].join(" ")
87
132
 
88
133
  @icon_classes = [
89
- 'fill-current',
90
- ICON_SIZES.fetch(size.to_sym),
134
+ "fill-current",
135
+ ICON_SIZES.fetch(size.to_sym)
91
136
  ]
92
137
  end
93
138
 
139
+ def self.submit(resource:, **attrs)
140
+ unless (text = attrs.delete(:text))
141
+ resource_name = resource.model_name.human
142
+ text = resource.new_record? ? t(".submit.create", resource_name:) : t(".submit.update", resource_name:)
143
+ end
144
+ new(text:, type: :submit, **attrs)
145
+ end
146
+
147
+ def self.cancel
148
+ new(scheme: :secondary, text: t(".cancel"))
149
+ end
150
+
94
151
  def call
95
152
  content = []
96
- content << render(component('ui/icon').new(name: @icon, class: @icon_classes)) if @icon
153
+ content << render(component("ui/icon").new(name: @icon, class: @icon_classes)) if @icon
97
154
  content << @text if @text
98
155
 
99
156
  content_tag(@tag, safe_join(content), **@attributes)
@@ -0,0 +1,10 @@
1
+ en:
2
+ add: "Add"
3
+ back: "Back"
4
+ cancel: "Cancel"
5
+ delete: "Delete"
6
+ discard: "Discard"
7
+ save: "Save"
8
+ submit:
9
+ create: "Add %{resource_name}"
10
+ update: "Update %{resource_name}"
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Checkbox::Component < SolidusAdmin::BaseComponent
4
+ SIZES = {
5
+ s: "w-4 h-4",
6
+ m: "w-5 h-5"
7
+ }.freeze
8
+
9
+ def initialize(size: :m, **attributes)
10
+ @size = size
11
+ @attributes = attributes
12
+ end
13
+
14
+ def call
15
+ tag.input(
16
+ type: "checkbox",
17
+ class: "
18
+ #{SIZES.fetch(@size)}
19
+ form-checkbox
20
+ cursor-pointer
21
+ disabled:cursor-not-allowed
22
+
23
+ bg-white rounded border border-2 border-gray-300
24
+ hover:border-gray-700
25
+ focus:ring focus:ring-gray-300 focus:ring-0.5 focus:bg-white focus:ring-offset-0
26
+ active:ring active:ring-gray-300 active:ring-0.5
27
+ disabled:border-gray-300
28
+
29
+ indeterminate:border-gray-700 indeterminate:bg-gray-700 indeterminate:text-white
30
+ indeterminate:hover:border-gray-500 indeterminate:hover:bg-gray-500
31
+ indeterminate:focus:bg-gray-700
32
+ indeterminate:disabled:border-gray-300 indeterminate:disabled:bg-gray-300
33
+
34
+ checked:border-gray-700 checked:bg-gray-700 checked:text-white
35
+ checked:hover:border-gray-500 checked:hover:bg-gray-500
36
+ checked:focus:bg-gray-700
37
+ checked:disabled:border-gray-300 checked:disabled:bg-gray-300
38
+ ",
39
+ **@attributes
40
+ )
41
+ end
42
+ end
@@ -3,12 +3,12 @@
3
3
  class SolidusAdmin::UI::Dropdown::Component < SolidusAdmin::BaseComponent
4
4
  DIRECTIONS = {
5
5
  left: "right-0",
6
- right: "left-0",
6
+ right: "left-0"
7
7
  }
8
8
 
9
9
  SIZES = {
10
10
  s: "w-5 h-5",
11
- m: "w-[22px] h-[22px]",
11
+ m: "w-[22px] h-[22px]"
12
12
  }
13
13
 
14
14
  def initialize(text: nil, size: :m, direction: :left, **attributes)
@@ -21,7 +21,7 @@ class SolidusAdmin::UI::Dropdown::Component < SolidusAdmin::BaseComponent
21
21
  @attributes[:"data-action"] = "turbo:before-cache@window->#{stimulus_id}#close #{attributes[:"data-action"]}"
22
22
  @attributes[:class] = "
23
23
  font-normal
24
- #{@size == :m ? 'text-base' : 'text-sm'}
24
+ #{(@size == :m) ? "text-base" : "text-sm"}
25
25
  #{@attributes[:class]}
26
26
  "
27
27
  end
@@ -1,54 +1,7 @@
1
1
  <fieldset class="<%= stimulus_id %>"
2
- data-controller="<%= stimulus_id %>"
3
2
  <%= :disabled if @disabled %>
4
3
  >
5
4
  <div class="<%= stimulus_id %>--address-form flex flex-wrap gap-4 pb-4">
6
- <%= render component("ui/forms/field").text_field(@name, :name, object: @address) %>
7
- <%= render component("ui/forms/field").text_field(@name, :address1, object: @address) %>
8
- <%= render component("ui/forms/field").text_field(@name, :address2, object: @address) %>
9
- <div class="flex gap-4 w-full">
10
- <%= render component("ui/forms/field").text_field(@name, :city, object: @address) %>
11
- <%= render component("ui/forms/field").text_field(@name, :zipcode, object: @address) %>
12
- </div>
13
-
14
- <%= render component("ui/forms/field").select(
15
- @name,
16
- :country_id,
17
- Spree::Country.all.map { |c| [c.name, c.id] },
18
- object: @address,
19
- value: @address.try(:country_id),
20
- "data-#{stimulus_id}-target": "country",
21
- "data-action": "change->#{stimulus_id}#loadStates"
22
- ) %>
23
-
24
- <%= content_tag(:div,
25
- data: { "#{stimulus_id}-target": "stateNameWrapper" },
26
- class: (@address.country&.states&.empty? ? "flex flex-col gap-2 w-full" : "hidden flex flex-col gap-2 w-full")
27
- ) do %>
28
- <%= render component("ui/forms/field").text_field(
29
- @name,
30
- :state_name,
31
- object: @address,
32
- value: @address.try(:state_name),
33
- "data-#{stimulus_id}-target": "stateName"
34
- ) %>
35
- <% end %>
36
- <input autocomplete="off" type="hidden" name=<%= "#{@name}[state_id]" %>>
37
-
38
- <%= content_tag(:div,
39
- data: { "#{stimulus_id}-target": "stateWrapper" },
40
- class: (@address.country&.states&.empty? ? "hidden flex flex-col gap-2 w-full" : "flex flex-col gap-2 w-full")
41
- ) do %>
42
- <%= render component("ui/forms/field").select(
43
- @name,
44
- :state_id,
45
- state_options,
46
- object: @address,
47
- value: @address.try(:state_id),
48
- "data-#{stimulus_id}-target": "state"
49
- ) %>
50
- <% end %>
51
-
52
- <%= render component("ui/forms/field").text_field(@name, :phone, object: @address) %>
5
+ <%= fieldset %>
53
6
  </div>
54
7
  </fieldset>
@@ -1,14 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class SolidusAdmin::UI::Forms::Address::Component < SolidusAdmin::BaseComponent
4
- def initialize(address:, name:, disabled: false)
5
- @address = address
6
- @name = name
4
+ DefaultNamedFieldsetNotFound = Class.new(NameError)
5
+
6
+ include SolidusAdmin::SlotableDefault
7
+
8
+ renders_one :fieldset
9
+
10
+ # @param fieldset [Symbol] use a default named fieldset, component of the same name must be defined
11
+ # in "ui/forms/address/fieldsets"
12
+ # @param extends [Array<Symbol, Hash{Symbol => #call}>] extend default fieldset,
13
+ # see +SolidusAdmin::UI::Forms::Address::Fieldsets::Base+
14
+ # @param excludes [Array<Symbol>, Symbol] optionally exclude fields that are present in a default fieldset
15
+ # @raise [DefaultNamedFieldsetNotFound] if the provided +:fieldset+ option does not correspond to a defined component
16
+ # in "ui/forms/address/fieldsets"
17
+ def initialize(addressable:, form_field_name:, disabled: false, fieldset: :contact, extends: [], excludes: [])
7
18
  @disabled = disabled
19
+ @default_fieldset = fieldset_component(fieldset).new(
20
+ addressable:,
21
+ form_field_name:,
22
+ extends:,
23
+ excludes:
24
+ )
8
25
  end
9
26
 
10
- def state_options
11
- return [] unless @address.country
12
- @address.country.states.map { |s| [s.name, s.id] }
27
+ attr_reader :default_fieldset
28
+
29
+ private
30
+
31
+ def fieldset_component(fieldset)
32
+ component("ui/forms/address/fieldsets/#{fieldset}")
33
+ rescue SolidusAdmin::ComponentRegistry::ComponentNotFoundError
34
+ raise DefaultNamedFieldsetNotFound,
35
+ "to use a default named fieldset `#{fieldset}` you must implement a component in 'ui/forms/address/fieldsets/#{fieldset}'"
13
36
  end
14
37
  end
@@ -0,0 +1,4 @@
1
+ <div class="flex gap-4 w-full">
2
+ <%= render component("ui/forms/field").text_field(@form_field_name, :city, object: @addressable) %>
3
+ <%= render component("ui/forms/field").text_field(@form_field_name, :zipcode, object: @addressable) %>
4
+ </div>
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fields::CityAndZipcode::Component < SolidusAdmin::BaseComponent
4
+ def initialize(addressable:, form_field_name:)
5
+ @addressable = addressable
6
+ @form_field_name = form_field_name
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ <div class="flex flex-col gap-4 w-full" data-controller="<%= stimulus_id %>">
2
+ <%= render component("ui/forms/field").select(
3
+ @form_field_name,
4
+ :country_id,
5
+ Spree::Country.all.map { |c| [c.name, c.id] },
6
+ object: @addressable,
7
+ value: @addressable.try(:country_id),
8
+ "data-#{stimulus_id}-target": "country",
9
+ "data-action": "change->#{stimulus_id}#loadStates"
10
+ ) %>
11
+
12
+ <%= content_tag(:div,
13
+ data: { "#{stimulus_id}-target": "stateNameWrapper" },
14
+ class: (@addressable.country&.states&.empty? ? "flex flex-col gap-2 w-full" : "hidden flex flex-col gap-2 w-full")
15
+ ) do %>
16
+ <%= render component("ui/forms/field").text_field(
17
+ @form_field_name,
18
+ :state_name,
19
+ object: @addressable,
20
+ value: @addressable.try(:state_name),
21
+ "data-#{stimulus_id}-target": "stateName"
22
+ ) %>
23
+ <% end %>
24
+ <input autocomplete="off" type="hidden" name=<%= "#{@form_field_name}[state_id]" %>>
25
+
26
+ <%= content_tag(:div,
27
+ data: { "#{stimulus_id}-target": "stateWrapper" },
28
+ class: (@addressable.country&.states&.empty? ? "hidden flex flex-col gap-2 w-full" : "flex flex-col gap-2 w-full")
29
+ ) do %>
30
+ <%= render component("ui/forms/field").select(
31
+ @form_field_name,
32
+ :state_id,
33
+ state_options,
34
+ object: @addressable,
35
+ value: @addressable.try(:state_id),
36
+ "data-#{stimulus_id}-target": "state"
37
+ ) %>
38
+ <% end %>
39
+ </div>
@@ -54,5 +54,7 @@ export default class extends Controller {
54
54
  option.innerText = state.name
55
55
  stateSelect.appendChild(option)
56
56
  })
57
+
58
+ stateSelect.setAttribute("synced", "false");
57
59
  }
58
60
  }
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fields::CountryAndState::Component < SolidusAdmin::BaseComponent
4
+ def initialize(addressable:, form_field_name:)
5
+ @addressable = addressable
6
+ @form_field_name = form_field_name
7
+ end
8
+
9
+ private
10
+
11
+ def state_options
12
+ return [] unless @addressable.country
13
+ @addressable.country.states.map { |s| [s.name, s.id] }
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ <%= render component("ui/forms/field").text_field(@form_field_name, :vat_id, object: @addressable) %>
2
+ <%= render component("ui/forms/field").select(
3
+ @form_field_name,
4
+ :reverse_charge_status,
5
+ Spree::Address.reverse_charge_statuses.keys.map { |key| [I18n.t("spree.reverse_charge_statuses.#{key}"), key] },
6
+ object: @addressable
7
+ ) %>
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fields::ReverseChargeFields::Component < SolidusAdmin::BaseComponent
4
+ def initialize(addressable:, form_field_name:)
5
+ @addressable = addressable
6
+ @form_field_name = form_field_name
7
+ end
8
+
9
+ def render?
10
+ Spree::Backend::Config.show_reverse_charge_fields
11
+ end
12
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fieldsets::Base < SolidusAdmin::BaseComponent
4
+ renders_many :fields
5
+
6
+ # @param extends [Array<Hash{Symbol => #call}, Symbol>] Pass an array of extensions to modify existing default
7
+ # fieldset with custom fields or override existing fields.
8
+ # If extension is a Hash, its key should be the name of the field and its value should be an object that responds
9
+ # to #call (e.g. proc or lambda) and returns a ViewComponent instance (or any object that responds to #render_in).
10
+ #
11
+ # Since text inputs are often used as form fields, pass your field name as a Symbol and the component will render
12
+ # a text input for that field.
13
+ # @example
14
+ # component("ui/forms/address/fieldsets/contact").new(
15
+ # extends: [
16
+ # title: -> { component("ui/forms/field").select(...) }, # this will add a custom :title select field
17
+ # name: -> { component("path/to/component").new }, # this will override existing default :name field
18
+ # :company, # this will add a text field for :company
19
+ # ],
20
+ # excludes: %i[phone reverse_charge], # this will exclude :phone and :reverse_charge from the fieldset
21
+ # )
22
+ def initialize(addressable:, form_field_name:, extends: [], excludes: [])
23
+ @addressable = addressable
24
+ @form_field_name = form_field_name
25
+ excludes = Array.wrap(excludes).map(&:to_sym)
26
+
27
+ extended_fields_map = extends.reduce({}) do |acc, extension|
28
+ if extension.is_a?(Hash)
29
+ acc.merge!(extension)
30
+ else
31
+ acc[extension.to_sym] = -> { text_field_component(extension) }
32
+ acc
33
+ end
34
+ end
35
+
36
+ fields_map.merge(extended_fields_map).each do |field_name, renderable|
37
+ with_field { render renderable.call } unless field_name.in?(excludes)
38
+ end
39
+ end
40
+
41
+ def fields_map
42
+ raise NotImplementedError, "fields_map must be implemented in #{self.class}"
43
+ end
44
+
45
+ def call
46
+ safe_join(fields)
47
+ end
48
+
49
+ private
50
+
51
+ def text_field_component(field_name)
52
+ component("ui/forms/field").text_field(@form_field_name, field_name.to_sym, object: @addressable)
53
+ end
54
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fieldsets::Contact::Component < SolidusAdmin::UI::Forms::Address::Fieldsets::Base
4
+ def fields_map
5
+ {
6
+ name: -> { component("ui/forms/field").text_field(@form_field_name, :name, object: @addressable) },
7
+ street: -> { component("ui/forms/field").text_field(@form_field_name, :address1, object: @addressable) },
8
+ street_contd: -> { component("ui/forms/field").text_field(@form_field_name, :address2, object: @addressable) },
9
+ city_and_zipcode: -> { component("ui/forms/address/fields/city_and_zipcode").new(form_field_name: @form_field_name, addressable: @addressable) },
10
+ country_and_state: -> { component("ui/forms/address/fields/country_and_state").new(form_field_name: @form_field_name, addressable: @addressable) },
11
+ phone: -> { component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) },
12
+ email: -> { component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) },
13
+ reverse_charge: -> { component("ui/forms/address/fields/reverse_charge_fields").new(form_field_name: @form_field_name, addressable: @addressable) }
14
+ }
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fieldsets::ContactInfo::Component < SolidusAdmin::UI::Forms::Address::Fieldsets::Base
4
+ def fields_map
5
+ {
6
+ phone: -> { component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) },
7
+ email: -> { component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) }
8
+ }
9
+ end
10
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::UI::Forms::Address::Fieldsets::Location::Component < SolidusAdmin::UI::Forms::Address::Fieldsets::Base
4
+ def fields_map
5
+ {
6
+ street: -> { component("ui/forms/field").text_field(@form_field_name, :address1, object: @addressable) },
7
+ street_contd: -> { component("ui/forms/field").text_field(@form_field_name, :address2, object: @addressable) },
8
+ city_and_zipcode: -> { component("ui/forms/address/fields/city_and_zipcode").new(form_field_name: @form_field_name, addressable: @addressable) },
9
+ country_and_state: -> { component("ui/forms/address/fields/country_and_state").new(form_field_name: @form_field_name, addressable: @addressable) },
10
+ phone: -> { component("ui/forms/field").text_field(@form_field_name, :phone, object: @addressable) },
11
+ email: -> { component("ui/forms/field").text_field(@form_field_name, :email, object: @addressable) }
12
+ }
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ <div class="flex gap-2 items-center">
2
+ <label class="flex gap-2 items-center">
3
+ <%= hidden_field_tag @name, "0" %>
4
+ <%= render component("ui/checkbox").new(
5
+ name: @name,
6
+ value: "1",
7
+ checked: @checked,
8
+ **@attributes
9
+ ) %>
10
+ <%= label %>
11
+ </label>
12
+
13
+ <%= hint if hint? %>
14
+ </div>
@@ -1,42 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class SolidusAdmin::UI::Forms::Checkbox::Component < SolidusAdmin::BaseComponent
4
- SIZES = {
5
- s: 'w-4 h-4',
6
- m: 'w-5 h-5',
4
+ FONT_WEIGHTS = {
5
+ normal: "font-normal",
6
+ semibold: "font-semibold"
7
7
  }.freeze
8
8
 
9
- def initialize(size: :m, **attributes)
10
- @size = size
11
- @attributes = attributes
12
- end
9
+ FONT_SIZES = {
10
+ xs: "text-xs",
11
+ s: "text-sm"
12
+ }.freeze
13
13
 
14
- def call
15
- tag.input(
16
- type: 'checkbox',
14
+ renders_one :label, ->(text:, weight: :normal, size: :s, **options) do
15
+ tag.span(
16
+ text,
17
17
  class: "
18
- #{SIZES.fetch(@size)}
19
- form-checkbox
20
- cursor-pointer
21
- disabled:cursor-not-allowed
22
-
23
- bg-white rounded border border-2 border-gray-300
24
- hover:border-gray-700
25
- focus:ring focus:ring-gray-300 focus:ring-0.5 focus:bg-white focus:ring-offset-0
26
- active:ring active:ring-gray-300 active:ring-0.5
27
- disabled:border-gray-300
28
-
29
- indeterminate:border-gray-700 indeterminate:bg-gray-700 indeterminate:text-white
30
- indeterminate:hover:border-gray-500 indeterminate:hover:bg-gray-500
31
- indeterminate:focus:bg-gray-700
32
- indeterminate:disabled:border-gray-300 indeterminate:disabled:bg-gray-300
33
-
34
- checked:border-gray-700 checked:bg-gray-700 checked:text-white
35
- checked:hover:border-gray-500 checked:hover:bg-gray-500
36
- checked:focus:bg-gray-700
37
- checked:disabled:border-gray-300 checked:disabled:bg-gray-300
18
+ #{FONT_WEIGHTS.fetch(weight)}
19
+ #{FONT_SIZES.fetch(size)}
20
+ #{options.delete(:classes)}
38
21
  ",
39
- **@attributes,
22
+ **options
40
23
  )
41
24
  end
25
+
26
+ renders_one :hint, ->(text:, position: :above) do
27
+ render component("ui/toggletip").new(text:, position:)
28
+ end
29
+
30
+ def initialize(object_name:, method:, checked:, **attributes)
31
+ @name = "#{object_name}[#{method}]"
32
+ @checked = !!checked
33
+ @attributes = attributes
34
+ end
42
35
  end
@@ -2,7 +2,7 @@
2
2
  <div class="flex gap-1 items-center">
3
3
  <span class="
4
4
  text-gray-700
5
- font-semibold text-xs
5
+ font-semibold
6
6
  "><%= @label %></span>
7
7
 
8
8
  <%= render component('ui/toggletip').new(text: @tip) if @tip.present? %>
@@ -18,12 +18,12 @@
18
18
 
19
19
  <% if @hint.present? || @error.present? %>
20
20
  <div class="
21
- font-normal text-xs
21
+ font-normal
22
22
  [:disabled~&]:text-gray-300 text-gray-500
23
- flex gap-1 flex-col
23
+ flex gap-1 flex-col [&>.error]:hidden [&>.error]:peer-invalid:block
24
24
  ">
25
25
  <%= tag.span @hint if @hint.present? %>
26
- <%= tag.span safe_join(@error, tag.br), class: "text-red-600" if @error.present? %>
26
+ <%= tag.span safe_join(@error, tag.br), class: "error text-red-600" if @error.present? %>
27
27
  </div>
28
28
  <% end %>
29
29
  </label>