solidus_admin 0.0.2 → 0.1.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 (285) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.json +7 -0
  3. data/README.md +1 -1
  4. data/Rakefile +26 -0
  5. data/app/assets/builds/.keep +0 -0
  6. data/app/assets/builds/solidus_admin/tailwind.css +2799 -0
  7. data/app/assets/config/solidus_admin_manifest.js +1 -0
  8. data/app/assets/stylesheets/solidus_admin/application.tailwind.css +4 -0
  9. data/app/assets/stylesheets/solidus_admin/dark.css +12 -0
  10. data/app/assets/stylesheets/solidus_admin/dimmed.css +11 -0
  11. data/app/components/solidus_admin/adjustment_reasons/index/component.html.erb +32 -0
  12. data/app/components/solidus_admin/adjustment_reasons/index/component.rb +53 -0
  13. data/app/components/solidus_admin/adjustment_reasons/index/component.yml +4 -0
  14. data/app/components/solidus_admin/layout/feedback/component.html.erb +15 -0
  15. data/app/components/solidus_admin/layout/feedback/component.rb +4 -0
  16. data/app/components/solidus_admin/layout/feedback/component.yml +3 -0
  17. data/app/components/solidus_admin/layout/navigation/account/component.html.erb +74 -0
  18. data/app/components/solidus_admin/layout/navigation/account/component.js +16 -0
  19. data/app/components/solidus_admin/layout/navigation/account/component.rb +36 -0
  20. data/app/components/solidus_admin/{sidebar → layout/navigation}/component.html.erb +9 -9
  21. data/app/components/solidus_admin/layout/navigation/component.rb +26 -0
  22. data/app/components/solidus_admin/{sidebar → layout/navigation}/item/component.html.erb +5 -5
  23. data/app/components/solidus_admin/{sidebar → layout/navigation}/item/component.rb +2 -2
  24. data/app/components/solidus_admin/layout/page_helpers.rb +55 -0
  25. data/app/components/solidus_admin/{skip_link → layout/skip_link}/component.rb +2 -4
  26. data/app/components/solidus_admin/option_types/index/component.html.erb +30 -0
  27. data/app/components/solidus_admin/option_types/index/component.rb +57 -0
  28. data/app/components/solidus_admin/option_types/index/component.yml +4 -0
  29. data/app/components/solidus_admin/orders/cart/component.html.erb +77 -0
  30. data/app/components/solidus_admin/orders/cart/component.js +37 -0
  31. data/app/components/solidus_admin/orders/cart/component.rb +7 -0
  32. data/app/components/solidus_admin/orders/cart/component.yml +3 -0
  33. data/app/components/solidus_admin/orders/cart/result/component.html.erb +26 -0
  34. data/app/components/solidus_admin/orders/cart/result/component.rb +11 -0
  35. data/app/components/solidus_admin/orders/index/component.html.erb +26 -22
  36. data/app/components/solidus_admin/orders/index/component.rb +80 -16
  37. data/app/components/solidus_admin/orders/index/component.yml +10 -3
  38. data/app/components/solidus_admin/orders/show/address/component.html.erb +67 -0
  39. data/app/components/solidus_admin/orders/show/address/component.js +9 -0
  40. data/app/components/solidus_admin/orders/show/address/component.rb +53 -0
  41. data/app/components/solidus_admin/orders/show/address/component.yml +14 -0
  42. data/app/components/solidus_admin/orders/show/component.html.erb +76 -0
  43. data/app/components/solidus_admin/orders/show/component.js +7 -0
  44. data/app/components/solidus_admin/orders/show/component.rb +40 -0
  45. data/app/components/solidus_admin/orders/show/component.yml +21 -0
  46. data/app/components/solidus_admin/orders/show/customer_search/component.html.erb +14 -0
  47. data/app/components/solidus_admin/orders/show/customer_search/component.js +14 -0
  48. data/app/components/solidus_admin/orders/show/customer_search/component.rb +7 -0
  49. data/app/components/solidus_admin/orders/show/customer_search/component.yml +2 -0
  50. data/app/components/solidus_admin/orders/show/customer_search/result/component.html.erb +17 -0
  51. data/app/components/solidus_admin/orders/show/customer_search/result/component.rb +11 -0
  52. data/app/components/solidus_admin/orders/show/email/component.html.erb +18 -0
  53. data/app/components/solidus_admin/orders/show/email/component.rb +15 -0
  54. data/app/components/solidus_admin/orders/show/email/component.yml +8 -0
  55. data/app/components/solidus_admin/orders/show/summary/component.html.erb +14 -0
  56. data/app/components/solidus_admin/orders/show/summary/component.rb +7 -0
  57. data/app/components/solidus_admin/orders/show/summary/component.yml +8 -0
  58. data/app/components/solidus_admin/payment_methods/index/component.html.erb +38 -0
  59. data/app/components/solidus_admin/payment_methods/index/component.rb +93 -0
  60. data/app/components/solidus_admin/payment_methods/index/component.yml +15 -0
  61. data/app/components/solidus_admin/products/index/component.html.erb +26 -22
  62. data/app/components/solidus_admin/products/index/component.rb +36 -36
  63. data/app/components/solidus_admin/products/index/component.yml +9 -6
  64. data/app/components/solidus_admin/products/show/component.html.erb +32 -38
  65. data/app/components/solidus_admin/products/show/component.rb +2 -0
  66. data/app/components/solidus_admin/products/show/component.yml +5 -5
  67. data/app/components/solidus_admin/products/status/component.rb +20 -18
  68. data/app/components/solidus_admin/products/status/component.yml +1 -0
  69. data/app/components/solidus_admin/products/stock/component.rb +38 -0
  70. data/app/components/solidus_admin/products/stock/component.yml +5 -0
  71. data/app/components/solidus_admin/promotion_categories/index/component.html.erb +26 -0
  72. data/app/components/solidus_admin/promotion_categories/index/component.rb +57 -0
  73. data/app/components/solidus_admin/promotion_categories/index/component.yml +4 -0
  74. data/app/components/solidus_admin/promotions/index/component.html.erb +34 -0
  75. data/app/components/solidus_admin/promotions/index/component.rb +97 -0
  76. data/app/components/solidus_admin/promotions/index/component.yml +14 -0
  77. data/app/components/solidus_admin/properties/index/component.html.erb +34 -0
  78. data/app/components/solidus_admin/properties/index/component.rb +65 -0
  79. data/app/components/solidus_admin/properties/index/component.yml +4 -0
  80. data/app/components/solidus_admin/refund_reasons/index/component.html.erb +31 -0
  81. data/app/components/solidus_admin/refund_reasons/index/component.rb +53 -0
  82. data/app/components/solidus_admin/refund_reasons/index/component.yml +4 -0
  83. data/app/components/solidus_admin/refunds_and_returns/component.html.erb +26 -0
  84. data/app/components/solidus_admin/refunds_and_returns/component.rb +20 -0
  85. data/app/components/solidus_admin/refunds_and_returns/component.yml +3 -0
  86. data/app/components/solidus_admin/reimbursement_types/index/component.html.erb +22 -0
  87. data/app/components/solidus_admin/reimbursement_types/index/component.rb +45 -0
  88. data/app/components/solidus_admin/reimbursement_types/index/component.yml +4 -0
  89. data/app/components/solidus_admin/return_reasons/index/component.html.erb +31 -0
  90. data/app/components/solidus_admin/return_reasons/index/component.rb +52 -0
  91. data/app/components/solidus_admin/return_reasons/index/component.yml +4 -0
  92. data/app/components/solidus_admin/shipping/component.html.erb +30 -0
  93. data/app/components/solidus_admin/shipping/component.rb +18 -0
  94. data/app/components/solidus_admin/shipping/component.yml +3 -0
  95. data/app/components/solidus_admin/shipping_categories/index/component.html.erb +32 -0
  96. data/app/components/solidus_admin/shipping_categories/index/component.rb +46 -0
  97. data/app/components/solidus_admin/shipping_categories/index/component.yml +4 -0
  98. data/app/components/solidus_admin/shipping_methods/index/component.html.erb +32 -0
  99. data/app/components/solidus_admin/shipping_methods/index/component.rb +61 -0
  100. data/app/components/solidus_admin/shipping_methods/index/component.yml +4 -0
  101. data/app/components/solidus_admin/stock_items/edit/component.html.erb +89 -0
  102. data/app/components/solidus_admin/stock_items/edit/component.js +17 -0
  103. data/app/components/solidus_admin/stock_items/edit/component.rb +23 -0
  104. data/app/components/solidus_admin/stock_items/edit/component.yml +10 -0
  105. data/app/components/solidus_admin/stock_items/index/component.html.erb +26 -0
  106. data/app/components/solidus_admin/stock_items/index/component.rb +180 -0
  107. data/app/components/solidus_admin/stock_items/index/component.yml +10 -0
  108. data/app/components/solidus_admin/stock_locations/index/component.html.erb +32 -0
  109. data/app/components/solidus_admin/stock_locations/index/component.rb +81 -0
  110. data/app/components/solidus_admin/stock_locations/index/component.yml +6 -0
  111. data/app/components/solidus_admin/store_credit_reasons/index/component.html.erb +31 -0
  112. data/app/components/solidus_admin/store_credit_reasons/index/component.rb +52 -0
  113. data/app/components/solidus_admin/store_credit_reasons/index/component.yml +4 -0
  114. data/app/components/solidus_admin/stores/index/component.html.erb +34 -0
  115. data/app/components/solidus_admin/stores/index/component.rb +59 -0
  116. data/app/components/solidus_admin/stores/index/component.yml +4 -0
  117. data/app/components/solidus_admin/tax_categories/index/component.html.erb +32 -0
  118. data/app/components/solidus_admin/tax_categories/index/component.rb +58 -0
  119. data/app/components/solidus_admin/tax_categories/index/component.yml +6 -0
  120. data/app/components/solidus_admin/tax_rates/index/component.html.erb +32 -0
  121. data/app/components/solidus_admin/tax_rates/index/component.rb +84 -0
  122. data/app/components/solidus_admin/tax_rates/index/component.yml +4 -0
  123. data/app/components/solidus_admin/taxes/component.html.erb +24 -0
  124. data/app/components/solidus_admin/taxes/component.rb +25 -0
  125. data/app/components/solidus_admin/taxes/component.yml +3 -0
  126. data/app/components/solidus_admin/taxonomies/index/component.html.erb +28 -0
  127. data/app/components/solidus_admin/taxonomies/index/component.rb +47 -0
  128. data/app/components/solidus_admin/taxonomies/index/component.yml +4 -0
  129. data/app/components/solidus_admin/ui/badge/component.rb +18 -8
  130. data/app/components/solidus_admin/ui/badge/component.yml +3 -0
  131. data/app/components/solidus_admin/ui/button/component.rb +32 -32
  132. data/app/components/solidus_admin/ui/details_list/component.html.erb +10 -0
  133. data/app/components/solidus_admin/ui/details_list/component.rb +7 -0
  134. data/app/components/solidus_admin/ui/dropdown/component.html.erb +50 -0
  135. data/app/components/solidus_admin/ui/dropdown/component.js +16 -0
  136. data/app/components/solidus_admin/ui/dropdown/component.rb +28 -0
  137. data/app/components/solidus_admin/ui/dropdown/component.yml +2 -0
  138. data/app/components/solidus_admin/ui/forms/address/component.html.erb +36 -0
  139. data/app/components/solidus_admin/ui/forms/address/component.js +34 -0
  140. data/app/components/solidus_admin/ui/forms/address/component.rb +14 -0
  141. data/app/components/solidus_admin/ui/forms/field/component.html.erb +5 -4
  142. data/app/components/solidus_admin/ui/forms/field/component.rb +53 -15
  143. data/app/components/solidus_admin/ui/forms/input/component.rb +11 -5
  144. data/app/components/solidus_admin/ui/forms/search/component.html.erb +52 -0
  145. data/app/components/solidus_admin/ui/forms/search/component.js +116 -0
  146. data/app/components/solidus_admin/ui/forms/search/component.rb +8 -0
  147. data/app/components/solidus_admin/ui/forms/search/component.yml +4 -0
  148. data/app/components/solidus_admin/ui/forms/search/result/component.rb +12 -0
  149. data/app/components/solidus_admin/ui/forms/search_field/component.html.erb +20 -0
  150. data/app/{javascript/solidus_admin/controllers/hello_controller.js → components/solidus_admin/ui/forms/search_field/component.js} +4 -2
  151. data/app/components/solidus_admin/ui/forms/search_field/component.rb +10 -0
  152. data/app/components/solidus_admin/ui/forms/search_field/component.yml +2 -0
  153. data/app/components/solidus_admin/ui/forms/switch/component.rb +27 -31
  154. data/app/components/solidus_admin/ui/forms/switch_field/component.html.erb +20 -0
  155. data/app/components/solidus_admin/ui/forms/switch_field/component.rb +11 -0
  156. data/app/components/solidus_admin/ui/icon/component.rb +4 -0
  157. data/app/components/solidus_admin/ui/modal/component.html.erb +37 -0
  158. data/app/components/solidus_admin/ui/modal/component.rb +12 -0
  159. data/app/components/solidus_admin/ui/modal/component.yml +2 -0
  160. data/app/components/solidus_admin/ui/panel/component.html.erb +26 -12
  161. data/app/components/solidus_admin/ui/panel/component.rb +17 -0
  162. data/app/components/solidus_admin/ui/panel/component.yml +1 -3
  163. data/app/components/solidus_admin/ui/resource_item/component.html.erb +10 -0
  164. data/app/components/solidus_admin/ui/resource_item/component.rb +9 -0
  165. data/app/components/solidus_admin/ui/tab/component.rb +9 -8
  166. data/app/components/solidus_admin/ui/table/component.html.erb +146 -135
  167. data/app/components/solidus_admin/ui/table/component.js +56 -17
  168. data/app/components/solidus_admin/ui/table/component.rb +94 -70
  169. data/app/components/solidus_admin/ui/table/component.yml +0 -1
  170. data/app/components/solidus_admin/ui/table/ransack_filter/component.html.erb +72 -0
  171. data/app/components/solidus_admin/ui/table/ransack_filter/component.js +73 -0
  172. data/app/components/solidus_admin/ui/table/ransack_filter/component.rb +68 -0
  173. data/app/components/solidus_admin/ui/table/ransack_filter/component.yml +3 -0
  174. data/app/components/solidus_admin/ui/table/toolbar/component.rb +21 -0
  175. data/app/components/solidus_admin/ui/thumbnail/component.rb +46 -0
  176. data/app/components/solidus_admin/ui/toast/component.html.erb +9 -5
  177. data/app/components/solidus_admin/ui/toast/component.js +9 -6
  178. data/app/components/solidus_admin/ui/toast/component.rb +2 -2
  179. data/app/components/solidus_admin/ui/toggletip/component.html.erb +14 -10
  180. data/app/components/solidus_admin/ui/toggletip/component.js +22 -4
  181. data/app/components/solidus_admin/ui/toggletip/component.rb +8 -85
  182. data/app/components/solidus_admin/users/index/component.html.erb +34 -0
  183. data/app/components/solidus_admin/users/index/component.rb +89 -0
  184. data/app/components/solidus_admin/users/index/component.yml +18 -0
  185. data/app/components/solidus_admin/zones/index/component.html.erb +35 -0
  186. data/app/components/solidus_admin/zones/index/component.rb +55 -0
  187. data/app/components/solidus_admin/zones/index/component.yml +4 -0
  188. data/app/controllers/solidus_admin/addresses_controller.rb +92 -0
  189. data/app/controllers/solidus_admin/adjustment_reasons_controller.rb +40 -0
  190. data/app/controllers/solidus_admin/base_controller.rb +1 -0
  191. data/app/controllers/solidus_admin/controller_helpers/authorization.rb +5 -1
  192. data/app/controllers/solidus_admin/controller_helpers/locale.rb +2 -2
  193. data/app/controllers/solidus_admin/controller_helpers/search.rb +48 -0
  194. data/app/controllers/solidus_admin/controller_helpers/theme.rb +30 -0
  195. data/app/controllers/solidus_admin/countries_controller.rb +12 -0
  196. data/app/controllers/solidus_admin/customers_controller.rb +29 -0
  197. data/app/controllers/solidus_admin/line_items_controller.rb +45 -0
  198. data/app/controllers/solidus_admin/option_types_controller.rb +46 -0
  199. data/app/controllers/solidus_admin/orders_controller.rb +104 -7
  200. data/app/controllers/solidus_admin/payment_methods_controller.rb +52 -0
  201. data/app/controllers/solidus_admin/products_controller.rb +26 -17
  202. data/app/controllers/solidus_admin/promotion_categories_controller.rb +38 -0
  203. data/app/controllers/solidus_admin/promotions_controller.rb +46 -0
  204. data/app/controllers/solidus_admin/properties_controller.rb +33 -0
  205. data/app/controllers/solidus_admin/refund_reasons_controller.rb +40 -0
  206. data/app/controllers/solidus_admin/reimbursement_types_controller.rb +31 -0
  207. data/app/controllers/solidus_admin/return_reasons_controller.rb +40 -0
  208. data/app/controllers/solidus_admin/shipping_categories_controller.rb +40 -0
  209. data/app/controllers/solidus_admin/shipping_methods_controller.rb +40 -0
  210. data/app/controllers/solidus_admin/stock_items_controller.rb +67 -0
  211. data/app/controllers/solidus_admin/stock_locations_controller.rb +40 -0
  212. data/app/controllers/solidus_admin/store_credit_reasons_controller.rb +40 -0
  213. data/app/controllers/solidus_admin/stores_controller.rb +40 -0
  214. data/app/controllers/solidus_admin/tax_categories_controller.rb +40 -0
  215. data/app/controllers/solidus_admin/tax_rates_controller.rb +40 -0
  216. data/app/controllers/solidus_admin/taxonomies_controller.rb +46 -0
  217. data/app/controllers/solidus_admin/users_controller.rb +50 -0
  218. data/app/controllers/solidus_admin/zones_controller.rb +40 -0
  219. data/app/javascript/solidus_admin/controllers/components.js +3 -1
  220. data/app/javascript/solidus_admin/controllers/confirm_controller.js +21 -0
  221. data/app/javascript/solidus_admin/controllers/details_click_outside_controller.js +12 -0
  222. data/app/javascript/solidus_admin/controllers/readonly_when_submitting_controller.js +17 -0
  223. data/app/javascript/solidus_admin/controllers/sortable_controller.js +33 -0
  224. data/app/views/layouts/solidus_admin/application.html.erb +16 -10
  225. data/app/views/layouts/solidus_admin/preview.html.erb +0 -1
  226. data/app/views/solidus_admin/base/unauthorized.html.erb +4 -0
  227. data/config/importmap.rb +2 -0
  228. data/config/initializers/view_component.rb +20 -0
  229. data/config/locales/adjustment_reasons.en.yml +6 -0
  230. data/config/locales/customers.en.yml +7 -0
  231. data/config/locales/errors.en.yml +7 -0
  232. data/config/locales/line_items.en.yml +9 -0
  233. data/config/locales/{main_nav.en.yml → menu_item.en.yml} +8 -2
  234. data/config/locales/option_types.en.yml +6 -0
  235. data/config/locales/orders.en.yml +9 -0
  236. data/config/locales/payment_methods.en.yml +6 -0
  237. data/config/locales/promotion_categories.en.yml +6 -0
  238. data/config/locales/promotions.en.yml +6 -0
  239. data/config/locales/properties.en.yml +6 -0
  240. data/config/locales/refund_reasons_.en.yml +6 -0
  241. data/config/locales/reimbursement_types.en.yml +4 -0
  242. data/config/locales/return_reasons.en.yml +6 -0
  243. data/config/locales/shipping_categories.en.yml +6 -0
  244. data/config/locales/shipping_methods.en.yml +6 -0
  245. data/config/locales/stock_items.en.yml +4 -0
  246. data/config/locales/stock_locations.en.yml +6 -0
  247. data/config/locales/store_credit_reasons.en.yml +6 -0
  248. data/config/locales/stores.en.yml +6 -0
  249. data/config/locales/tax_categories.en.yml +6 -0
  250. data/config/locales/tax_rates.en.yml +6 -0
  251. data/config/locales/taxonomies.en.yml +6 -0
  252. data/config/locales/users.en.yml +6 -0
  253. data/config/locales/zones.en.yml +6 -0
  254. data/config/routes.rb +50 -3
  255. data/config/tailwind.config.js +119 -0
  256. data/docs/{customizing_main_navigation.md → customizing_menu_items.md} +2 -2
  257. data/docs/customizing_tailwindcss.md +57 -0
  258. data/docs/customizing_view_components.md +17 -38
  259. data/lib/generators/solidus_admin/install/install_generator.rb +13 -4
  260. data/lib/generators/solidus_admin/install/templates/config/initializers/{solidus_admin.rb → solidus_admin.rb.tt} +10 -14
  261. data/lib/solidus_admin/admin_resources.rb +23 -0
  262. data/lib/solidus_admin/configuration.rb +93 -67
  263. data/lib/solidus_admin/install_tailwindcss.rb +102 -0
  264. data/lib/solidus_admin/{main_nav_item.rb → menu_item.rb} +2 -2
  265. data/lib/solidus_admin/version.rb +1 -1
  266. data/lib/solidus_admin.rb +1 -2
  267. data/lib/tasks/tailwind.rake +10 -0
  268. data/solidus_admin.gemspec +3 -4
  269. metadata +228 -48
  270. data/app/assets/stylesheets/solidus_admin/application.tailwind.css.erb +0 -35
  271. data/app/components/solidus_admin/feedback/component.html.erb +0 -11
  272. data/app/components/solidus_admin/feedback/component.rb +0 -4
  273. data/app/components/solidus_admin/feedback/component.yml +0 -5
  274. data/app/components/solidus_admin/sidebar/account_nav/component.html.erb +0 -67
  275. data/app/components/solidus_admin/sidebar/account_nav/component.rb +0 -15
  276. data/app/components/solidus_admin/sidebar/component.rb +0 -21
  277. data/app/components/solidus_admin/ui/panel/component.js +0 -14
  278. data/config/solidus_admin/tailwind.config.js.erb +0 -95
  279. data/docs/customizing_tailwind.md +0 -78
  280. data/lib/solidus_admin/tailwindcss.rb +0 -58
  281. data/lib/tasks/tailwindcss.rake +0 -55
  282. /data/app/components/solidus_admin/{sidebar/account_nav → layout/navigation/account}/component.yml +0 -0
  283. /data/app/components/solidus_admin/{sidebar → layout/navigation}/component.js +0 -0
  284. /data/app/components/solidus_admin/{sidebar → layout/navigation}/component.yml +0 -0
  285. /data/app/components/solidus_admin/{skip_link → layout/skip_link}/component.yml +0 -0
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Users::Index::Component < SolidusAdmin::BaseComponent
4
+ include SolidusAdmin::Layout::PageHelpers
5
+
6
+ def initialize(page:)
7
+ @page = page
8
+ end
9
+
10
+ def title
11
+ Spree.user_class.model_name.human.pluralize
12
+ end
13
+
14
+ def prev_page_path
15
+ solidus_admin.url_for(**request.params, page: @page.number - 1, only_path: true) unless @page.first?
16
+ end
17
+
18
+ def next_page_path
19
+ solidus_admin.url_for(**request.params, page: @page.next_param, only_path: true) unless @page.last?
20
+ end
21
+
22
+ def batch_actions
23
+ [
24
+ {
25
+ display_name: t('.batch_actions.delete'),
26
+ action: solidus_admin.users_path,
27
+ method: :delete,
28
+ icon: 'delete-bin-7-line',
29
+ },
30
+ ]
31
+ end
32
+
33
+ def scopes
34
+ [
35
+ { name: :customers, label: t('.scopes.customers'), default: true },
36
+ { name: :admin, label: t('.scopes.admin') },
37
+ { name: :with_orders, label: t('.scopes.with_orders') },
38
+ { name: :without_orders, label: t('.scopes.without_orders') },
39
+ { name: :all, label: t('.scopes.all') },
40
+ ]
41
+ end
42
+
43
+ def filters
44
+ [
45
+ {
46
+ presentation: Spree::Role.model_name.human.pluralize,
47
+ attribute: "spree_roles_id",
48
+ predicate: "in",
49
+ options: Spree::Role.pluck(:name, :id)
50
+ }
51
+ ]
52
+ end
53
+
54
+ def columns
55
+ [
56
+ {
57
+ header: :email,
58
+ data: :email,
59
+ },
60
+ {
61
+ header: :roles,
62
+ data: ->(user) do
63
+ roles = user.spree_roles.presence || [Spree::Role.new(name: 'customer')]
64
+ safe_join(roles.map {
65
+ color =
66
+ case _1.name
67
+ when 'admin' then :blue
68
+ when 'customer' then :green
69
+ else :graphite_light
70
+ end
71
+ render component('ui/badge').new(name: _1.name, color: color)
72
+ })
73
+ end,
74
+ },
75
+ {
76
+ header: :order_count,
77
+ data: ->(user) { user.order_count },
78
+ },
79
+ {
80
+ header: :lifetime_value,
81
+ data: -> { _1.display_lifetime_value.to_html },
82
+ },
83
+ {
84
+ header: :created_at,
85
+ data: ->(user) { l(user.created_at.to_date, format: :long) },
86
+ },
87
+ ]
88
+ end
89
+ end
@@ -0,0 +1,18 @@
1
+ en:
2
+ promotion_image: 'Image'
3
+ add: 'Add new'
4
+ batch_actions:
5
+ delete: 'Delete'
6
+ discontinue: 'Discontinue'
7
+ activate: 'Activate'
8
+ filters:
9
+ with_deleted: Include deleted
10
+ scopes:
11
+ customers: Customers
12
+ admin: Admins
13
+ with_orders: With Orders
14
+ without_orders: Without Orders
15
+ all: All
16
+ status:
17
+ active: Active
18
+ inactive: Inactive
@@ -0,0 +1,35 @@
1
+ <%= page do %>
2
+ <%= page_header do %>
3
+ <%= page_header_title title %>
4
+ <%= page_header_actions do %>
5
+ <%= render component("ui/button").new(
6
+ tag: :a,
7
+ text: t('.add'),
8
+ href: spree.new_admin_zone_path,
9
+ icon: "add-line",
10
+ class: "align-self-end w-full",
11
+ ) %>
12
+ <% end %>
13
+ <% end %>
14
+
15
+ <%= render component('ui/table').new(
16
+ id: stimulus_id,
17
+ data: {
18
+ class: Spree::Zone,
19
+ rows: @page.records,
20
+ url: ->(zone) { spree.edit_admin_zone_path(zone) },
21
+ prev: prev_page_path,
22
+ next: next_page_path,
23
+ columns: columns,
24
+ batch_actions: batch_actions,
25
+ },
26
+ search: {
27
+ name: :q,
28
+ value: params[:q],
29
+ url: solidus_admin.zones_path,
30
+ searchbar_key: :name_or_description_cont,
31
+ scopes: scopes,
32
+ filters: filters,
33
+ },
34
+ ) %>
35
+ <% end %>
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Zones::Index::Component < SolidusAdmin::BaseComponent
4
+ include SolidusAdmin::Layout::PageHelpers
5
+
6
+ def initialize(page:)
7
+ @page = page
8
+ end
9
+
10
+ def title
11
+ Spree::Zone.model_name.human.pluralize
12
+ end
13
+
14
+ def prev_page_path
15
+ solidus_admin.url_for(**request.params, page: @page.number - 1, only_path: true) unless @page.first?
16
+ end
17
+
18
+ def next_page_path
19
+ solidus_admin.url_for(**request.params, page: @page.next_param, only_path: true) unless @page.last?
20
+ end
21
+
22
+ def batch_actions
23
+ [
24
+ {
25
+ display_name: t('.batch_actions.delete'),
26
+ action: solidus_admin.zones_path,
27
+ method: :delete,
28
+ icon: 'delete-bin-7-line',
29
+ },
30
+ ]
31
+ end
32
+
33
+ def scopes
34
+ []
35
+ end
36
+
37
+ def filters
38
+ []
39
+ end
40
+
41
+ def columns
42
+ [
43
+ :name,
44
+ :description,
45
+ {
46
+ header: :kind,
47
+ data: -> { component('ui/badge').new(name: _1.kind, color: _1.kind == 'country' ? :green : :blue) },
48
+ },
49
+ {
50
+ header: :zone_members,
51
+ data: -> { _1.zone_members.map(&:zoneable).map(&:name).to_sentence },
52
+ },
53
+ ]
54
+ end
55
+ end
@@ -0,0 +1,4 @@
1
+ en:
2
+ add: 'Add new'
3
+ batch_actions:
4
+ delete: 'Delete'
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class AddressesController < BaseController
5
+ include Spree::Core::ControllerHelpers::StrongParameters
6
+
7
+ before_action :load_order, :load_address
8
+ before_action :validate_address_type
9
+
10
+ def show
11
+ respond_to do |format|
12
+ format.html do
13
+ render component('orders/show/address').new(
14
+ order: @order,
15
+ user: @order.user,
16
+ address: @address,
17
+ type: address_type,
18
+ )
19
+ end
20
+ end
21
+ end
22
+
23
+ def edit
24
+ redirect_to action: :show
25
+ end
26
+
27
+ def update
28
+ if @order.contents.update_cart(order_params)
29
+ redirect_to order_path(@order), status: :see_other, notice: t('.success')
30
+ else
31
+ flash.now[:error] = @order.errors[:base].join(", ") if @order.errors[:base].any?
32
+
33
+ respond_to do |format|
34
+ format.html do
35
+ render component('orders/show/address').new(
36
+ order: @order,
37
+ user: @order.user,
38
+ address: @order.send("#{address_type}_address"),
39
+ type: address_type,
40
+ ), status: :unprocessable_entity
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ private
47
+
48
+ def load_address
49
+ if params[:address_id].present? && @order.user
50
+ @address =
51
+ @order.user.addresses.find_by(id: params[:address_id]) ||
52
+ @order.user.addresses.build(country: default_country)
53
+ else
54
+ @address =
55
+ @order.public_send("#{address_type}_address") ||
56
+ @order.public_send("build_#{address_type}_address", country: default_country)
57
+ end
58
+ end
59
+
60
+ def address_type
61
+ params[:type].presence_in(%w[bill ship])
62
+ end
63
+
64
+ def validate_address_type
65
+ unless address_type
66
+ flash[:error] = t('.errors.address_type_invalid')
67
+ redirect_to spree.admin_order_url(@order)
68
+ end
69
+ end
70
+
71
+ def default_country
72
+ @default_country ||= begin
73
+ country = Spree::Country.default
74
+ country if Spree::Country.available.exists?(id: country.id)
75
+ end
76
+ end
77
+
78
+ def load_order
79
+ @order = Spree::Order.find_by!(number: params[:order_id])
80
+ authorize! action_name, @order
81
+ end
82
+
83
+ def order_params
84
+ params.require(:order).permit(
85
+ :use_billing,
86
+ :use_shipping,
87
+ bill_address_attributes: permitted_address_attributes,
88
+ ship_address_attributes: permitted_address_attributes
89
+ )
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class AdjustmentReasonsController < SolidusAdmin::BaseController
5
+ include SolidusAdmin::ControllerHelpers::Search
6
+
7
+ def index
8
+ adjustment_reasons = apply_search_to(
9
+ Spree::AdjustmentReason.order(id: :desc),
10
+ param: :q,
11
+ )
12
+
13
+ set_page_and_extract_portion_from(adjustment_reasons)
14
+
15
+ respond_to do |format|
16
+ format.html { render component('adjustment_reasons/index').new(page: @page) }
17
+ end
18
+ end
19
+
20
+ def destroy
21
+ @adjustment_reason = Spree::AdjustmentReason.find_by!(id: params[:id])
22
+
23
+ Spree::AdjustmentReason.transaction { @adjustment_reason.destroy }
24
+
25
+ flash[:notice] = t('.success')
26
+ redirect_back_or_to adjustment_reasons_path, status: :see_other
27
+ end
28
+
29
+ private
30
+
31
+ def load_adjustment_reason
32
+ @adjustment_reason = Spree::AdjustmentReason.find_by!(id: params[:id])
33
+ authorize! action_name, @adjustment_reason
34
+ end
35
+
36
+ def adjustment_reason_params
37
+ params.require(:adjustment_reason).permit(:adjustment_reason_id, permitted_adjustment_reason_attributes)
38
+ end
39
+ end
40
+ end
@@ -11,6 +11,7 @@ module SolidusAdmin
11
11
  include SolidusAdmin::ControllerHelpers::Authentication
12
12
  include SolidusAdmin::ControllerHelpers::Authorization
13
13
  include SolidusAdmin::ControllerHelpers::Locale
14
+ include SolidusAdmin::ControllerHelpers::Theme
14
15
  include SolidusAdmin::ComponentsHelper
15
16
  include SolidusAdmin::AuthenticationAdapters::Backend if defined?(Spree::Backend)
16
17
 
@@ -5,6 +5,10 @@ module SolidusAdmin::ControllerHelpers::Authorization
5
5
 
6
6
  included do
7
7
  before_action :authorize_solidus_admin_user!
8
+
9
+ rescue_from CanCan::AccessDenied do
10
+ render 'unauthorized', status: :forbidden
11
+ end
8
12
  end
9
13
 
10
14
  private
@@ -17,7 +21,7 @@ module SolidusAdmin::ControllerHelpers::Authorization
17
21
  subject = authorization_subject
18
22
 
19
23
  authorize! :admin, subject
20
- authorize! action_name, subject
24
+ authorize! action_name.to_sym, subject
21
25
  end
22
26
 
23
27
  def authorization_subject
@@ -18,7 +18,7 @@ module SolidusAdmin::ControllerHelpers::Locale
18
18
  session[set_user_language_locale_key] = requested_locale
19
19
 
20
20
  flash[:notice] = t('spree.locale_changed')
21
- redirect_to url_for(request.params.except(:switch_to_locale))
21
+ redirect_to params.except(:switch_to_locale).permit!.to_h.merge(account_menu_open: true)
22
22
  end
23
23
  end
24
24
 
@@ -27,6 +27,6 @@ module SolidusAdmin::ControllerHelpers::Locale
27
27
  end
28
28
 
29
29
  def set_locale
30
- I18n.locale = user_locale
30
+ I18n.locale = I18n.locale_available?(user_locale) ? user_locale : I18n.default_locale
31
31
  end
32
32
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin::ControllerHelpers::Search
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ def search_scope(name, default: false, &block)
8
+ search_scopes << SearchScope.new(
9
+ name: name.to_s,
10
+ block: block,
11
+ default: default,
12
+ )
13
+ end
14
+
15
+ def search_scopes
16
+ @search_scopes ||= []
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def apply_search_to(relation, param:)
23
+ relation = apply_scopes_to(relation, param: param)
24
+ apply_ransack_search_to(relation, param: param)
25
+ end
26
+
27
+ def apply_ransack_search_to(relation, param:)
28
+ relation
29
+ .ransack(params[param]&.except(:scope))
30
+ .result(distinct: true)
31
+ end
32
+
33
+ def apply_scopes_to(relation, param:)
34
+ current_scope_name = params.dig(param, :scope)
35
+
36
+ search_block = (
37
+ self.class.search_scopes.find { _1.name == current_scope_name } ||
38
+ self.class.search_scopes.find { _1.default }
39
+ )&.block
40
+
41
+ # Run the search if a block is present, fall back to the relation even if the
42
+ # block is present but returns nil.
43
+ (search_block && instance_exec(relation, &search_block)) || relation
44
+ end
45
+
46
+ SearchScope = Struct.new(:name, :block, :default, keyword_init: true)
47
+ private_constant :SearchScope
48
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin::ControllerHelpers::Theme
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_action :update_user_theme
8
+ end
9
+
10
+ private
11
+
12
+ def update_user_theme
13
+ requested_theme = params[:switch_to_theme].presence or return
14
+
15
+ # Avoid interpolating user content into the session key
16
+ system_theme = params[:system_theme].presence == "dark" ? "dark" : "light"
17
+ session_key = :"admin_#{system_theme}_theme"
18
+
19
+ if theme_is_available?(requested_theme) && requested_theme.to_sym != session[session_key]
20
+ session[session_key] = requested_theme
21
+
22
+ flash[:notice] = t('spree.theme_changed')
23
+ redirect_to params.except(:switch_to_theme, :system_theme).permit!.to_h.merge(account_menu_open: true)
24
+ end
25
+ end
26
+
27
+ def theme_is_available?(theme)
28
+ theme && SolidusAdmin::Config.themes.key?(theme.to_sym)
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class CountriesController < SolidusAdmin::BaseController
5
+ skip_before_action :authorize_solidus_admin_user!
6
+
7
+ def states
8
+ @states = Spree::State.where(country_id: params[:country_id])
9
+ render json: @states.select(:id, :name)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::CustomersController < SolidusAdmin::BaseController
4
+ before_action :load_order, only: [:show, :destroy]
5
+
6
+ def show
7
+ render component('orders/show/email').new(order: @order)
8
+ end
9
+
10
+ def destroy
11
+ if @order.update(user: nil)
12
+ flash[:success] = t('.success')
13
+ else
14
+ flash[:error] = t('.error')
15
+ end
16
+
17
+ redirect_to order_path(@order), status: :see_other
18
+ end
19
+
20
+ private
21
+
22
+ def load_order
23
+ @order = Spree::Order.find_by!(number: params[:order_id])
24
+ end
25
+
26
+ def authorization_subject
27
+ @order || Spree::Order
28
+ end
29
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class LineItemsController < SolidusAdmin::BaseController
5
+ def destroy
6
+ load_order
7
+ load_line_item
8
+
9
+ @line_item.destroy!
10
+
11
+ redirect_to order_path(@order), status: :see_other, notice: t('.success')
12
+ end
13
+
14
+ def create
15
+ load_order
16
+ variant_id = params.require(:line_item).require(:variant_id)
17
+ @variant = Spree::Variant.find(variant_id)
18
+ @line_item = @order.contents.add(@variant)
19
+
20
+ redirect_to order_path(@order), status: :see_other, notice: t('.success')
21
+ end
22
+
23
+ def update
24
+ load_order
25
+ load_line_item
26
+
27
+ desired_quantity = params[:line_item][:quantity].to_i
28
+
29
+ @line_item = @order.contents.add(@line_item.variant, desired_quantity - @line_item.quantity)
30
+
31
+ redirect_to order_path(@order), status: :see_other, notice: t('.success')
32
+ end
33
+
34
+ private
35
+
36
+ def load_order
37
+ @order = Spree::Order.find_by!(number: params[:order_id])
38
+ authorize! action_name, @order
39
+ end
40
+
41
+ def load_line_item
42
+ @line_item = @order.line_items.find(params[:id])
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ class OptionTypesController < SolidusAdmin::BaseController
5
+ include SolidusAdmin::ControllerHelpers::Search
6
+
7
+ before_action :load_option_type, only: [:move]
8
+
9
+ def index
10
+ option_types = apply_search_to(
11
+ Spree::OptionType.all,
12
+ param: :q,
13
+ )
14
+
15
+ set_page_and_extract_portion_from(option_types)
16
+
17
+ respond_to do |format|
18
+ format.html { render component('option_types/index').new(page: @page) }
19
+ end
20
+ end
21
+
22
+ def move
23
+ @option_type.insert_at(params[:position].to_i)
24
+
25
+ respond_to do |format|
26
+ format.js { head :no_content }
27
+ end
28
+ end
29
+
30
+ def destroy
31
+ @option_types = Spree::OptionType.where(id: params[:id])
32
+
33
+ Spree::OptionType.transaction { @option_types.destroy_all }
34
+
35
+ flash[:notice] = t('.success')
36
+ redirect_back_or_to option_types_path, status: :see_other
37
+ end
38
+
39
+ private
40
+
41
+ def load_option_type
42
+ @option_type = Spree::OptionType.find(params[:id])
43
+ authorize! action_name, @option_type
44
+ end
45
+ end
46
+ end