solidus_admin 0.1.0 → 0.3.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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +61 -7
  3. data/Rakefile +1 -0
  4. data/app/assets/builds/solidus_admin/tailwind.css +197 -162
  5. data/app/assets/stylesheets/solidus_admin/dark.css +1 -0
  6. data/app/assets/stylesheets/solidus_admin/dimmed.css +1 -0
  7. data/app/components/solidus_admin/adjustment_reasons/edit/component.html.erb +27 -0
  8. data/app/components/solidus_admin/adjustment_reasons/edit/component.rb +12 -0
  9. data/app/components/solidus_admin/adjustment_reasons/edit/component.yml +8 -0
  10. data/app/components/solidus_admin/adjustment_reasons/index/component.rb +26 -19
  11. data/app/components/solidus_admin/adjustment_reasons/new/component.html.erb +28 -0
  12. data/app/components/solidus_admin/adjustment_reasons/new/component.rb +12 -0
  13. data/app/components/solidus_admin/adjustment_reasons/new/component.yml +8 -0
  14. data/app/components/solidus_admin/base_component.rb +4 -1
  15. data/app/components/solidus_admin/option_types/index/component.rb +21 -7
  16. data/app/components/solidus_admin/orders/index/component.rb +28 -23
  17. data/app/components/solidus_admin/orders/index/component.yml +1 -1
  18. data/app/components/solidus_admin/orders/show/address/component.html.erb +56 -54
  19. data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/component.rb +27 -0
  20. data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/spree_line_item/component.rb +14 -0
  21. data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/spree_order/component.rb +11 -0
  22. data/app/components/solidus_admin/orders/show/adjustments/index/adjustable/spree_shipment/component.rb +15 -0
  23. data/app/components/solidus_admin/orders/show/adjustments/index/component.rb +147 -0
  24. data/app/components/solidus_admin/orders/show/adjustments/index/component.yml +21 -0
  25. data/app/components/solidus_admin/orders/show/adjustments/index/source/component.rb +26 -0
  26. data/app/components/solidus_admin/orders/show/adjustments/index/source/spree_tax_rate/component.rb +17 -0
  27. data/app/components/solidus_admin/orders/show/adjustments/index/source/spree_unit_cancel/component.rb +7 -0
  28. data/app/components/solidus_admin/orders/show/component.html.erb +7 -3
  29. data/app/components/solidus_admin/orders/show/component.rb +8 -0
  30. data/app/components/solidus_admin/orders/show/email/component.html.erb +18 -13
  31. data/app/components/solidus_admin/orders/show/email/component.rb +0 -4
  32. data/app/components/solidus_admin/orders/show/summary/component.html.erb +1 -1
  33. data/app/components/solidus_admin/payment_methods/index/component.rb +29 -19
  34. data/app/components/solidus_admin/payment_methods/index/component.yml +0 -5
  35. data/app/components/solidus_admin/products/index/component.rb +25 -15
  36. data/app/components/solidus_admin/products/index/component.yml +0 -2
  37. data/app/components/solidus_admin/products/show/component.html.erb +14 -3
  38. data/app/components/solidus_admin/products/status/component.rb +4 -1
  39. data/app/components/solidus_admin/products/status/component.yml +1 -0
  40. data/app/components/solidus_admin/properties/index/component.rb +18 -19
  41. data/app/components/solidus_admin/refund_reasons/edit/component.html.erb +27 -0
  42. data/app/components/solidus_admin/refund_reasons/edit/component.rb +12 -0
  43. data/app/components/solidus_admin/refund_reasons/edit/component.yml +8 -0
  44. data/app/components/solidus_admin/refund_reasons/index/component.rb +26 -19
  45. data/app/components/solidus_admin/refund_reasons/new/component.html.erb +27 -0
  46. data/app/components/solidus_admin/refund_reasons/new/component.rb +12 -0
  47. data/app/components/solidus_admin/refund_reasons/new/component.yml +6 -0
  48. data/app/components/solidus_admin/refunds_and_returns/component.rb +33 -13
  49. data/app/components/solidus_admin/reimbursement_types/index/component.rb +7 -25
  50. data/app/components/solidus_admin/return_reasons/edit/component.html.erb +26 -0
  51. data/app/components/solidus_admin/return_reasons/edit/component.rb +12 -0
  52. data/app/components/solidus_admin/return_reasons/edit/component.yml +8 -0
  53. data/app/components/solidus_admin/return_reasons/index/component.rb +27 -19
  54. data/app/components/solidus_admin/return_reasons/new/component.html.erb +27 -0
  55. data/app/components/solidus_admin/return_reasons/new/component.rb +12 -0
  56. data/app/components/solidus_admin/return_reasons/new/component.yml +8 -0
  57. data/app/components/solidus_admin/roles/edit/component.html.erb +33 -0
  58. data/app/components/solidus_admin/roles/edit/component.rb +20 -0
  59. data/app/components/solidus_admin/roles/edit/component.yml +19 -0
  60. data/app/components/solidus_admin/roles/index/component.rb +70 -0
  61. data/app/components/solidus_admin/roles/index/component.yml +6 -0
  62. data/app/components/solidus_admin/roles/new/component.html.erb +33 -0
  63. data/app/components/solidus_admin/roles/new/component.rb +20 -0
  64. data/app/components/solidus_admin/roles/new/component.yml +19 -0
  65. data/app/components/solidus_admin/shipping/component.rb +23 -11
  66. data/app/components/solidus_admin/shipping_categories/edit/component.html.erb +16 -0
  67. data/app/components/solidus_admin/shipping_categories/edit/component.rb +12 -0
  68. data/app/components/solidus_admin/shipping_categories/edit/component.yml +6 -0
  69. data/app/components/solidus_admin/shipping_categories/index/component.rb +37 -20
  70. data/app/components/solidus_admin/shipping_categories/new/component.html.erb +17 -0
  71. data/app/components/solidus_admin/shipping_categories/new/component.rb +12 -0
  72. data/app/components/solidus_admin/shipping_categories/new/component.yml +6 -0
  73. data/app/components/solidus_admin/shipping_methods/index/component.rb +19 -19
  74. data/app/components/solidus_admin/stock_items/edit/component.html.erb +66 -72
  75. data/app/components/solidus_admin/stock_items/edit/component.rb +0 -5
  76. data/app/components/solidus_admin/stock_items/index/component.rb +13 -20
  77. data/app/components/solidus_admin/stock_locations/index/component.rb +19 -11
  78. data/app/components/solidus_admin/stock_locations/index/component.yml +0 -3
  79. data/app/components/solidus_admin/store_credit_reasons/edit/component.html.erb +26 -0
  80. data/app/components/solidus_admin/store_credit_reasons/edit/component.rb +12 -0
  81. data/app/components/solidus_admin/store_credit_reasons/edit/component.yml +8 -0
  82. data/app/components/solidus_admin/store_credit_reasons/index/component.rb +26 -19
  83. data/app/components/solidus_admin/store_credit_reasons/new/component.html.erb +27 -0
  84. data/app/components/solidus_admin/store_credit_reasons/new/component.rb +12 -0
  85. data/app/components/solidus_admin/store_credit_reasons/new/component.yml +8 -0
  86. data/app/components/solidus_admin/stores/index/component.rb +18 -19
  87. data/app/components/solidus_admin/tax_categories/edit/component.html.erb +28 -0
  88. data/app/components/solidus_admin/tax_categories/edit/component.rb +12 -0
  89. data/app/components/solidus_admin/tax_categories/edit/component.yml +8 -0
  90. data/app/components/solidus_admin/tax_categories/index/component.rb +28 -21
  91. data/app/components/solidus_admin/tax_categories/new/component.html.erb +28 -0
  92. data/app/components/solidus_admin/tax_categories/new/component.rb +12 -0
  93. data/app/components/solidus_admin/tax_categories/new/component.yml +8 -0
  94. data/app/components/solidus_admin/tax_rates/index/component.rb +21 -17
  95. data/app/components/solidus_admin/taxes/component.rb +8 -8
  96. data/app/components/solidus_admin/taxonomies/index/component.rb +18 -12
  97. data/app/components/solidus_admin/ui/button/component.rb +1 -1
  98. data/app/components/solidus_admin/ui/checkbox_row/component.html.erb +29 -0
  99. data/app/components/solidus_admin/ui/checkbox_row/component.rb +11 -0
  100. data/app/components/solidus_admin/ui/forms/address/component.html.erb +27 -9
  101. data/app/components/solidus_admin/ui/forms/address/component.js +38 -13
  102. data/app/components/solidus_admin/ui/forms/search/component.html.erb +2 -3
  103. data/app/components/solidus_admin/ui/forms/search/component.js +3 -3
  104. data/app/components/solidus_admin/ui/modal/component.html.erb +7 -7
  105. data/app/components/solidus_admin/ui/modal/component.js +7 -0
  106. data/app/components/solidus_admin/ui/modal/component.rb +1 -1
  107. data/app/components/solidus_admin/ui/pages/index/component.html.erb +44 -0
  108. data/app/components/solidus_admin/ui/pages/index/component.rb +105 -0
  109. data/app/components/solidus_admin/ui/panel/component.html.erb +5 -16
  110. data/app/components/solidus_admin/ui/panel/component.rb +11 -7
  111. data/app/components/solidus_admin/ui/table/component.html.erb +2 -1
  112. data/app/components/solidus_admin/ui/table/component.js +31 -2
  113. data/app/components/solidus_admin/ui/table/component.rb +24 -8
  114. data/app/components/solidus_admin/ui/table/component.yml +1 -0
  115. data/app/components/solidus_admin/ui/thumbnail/component.rb +1 -1
  116. data/app/components/solidus_admin/ui/thumbnail_with_caption/component.html.erb +17 -0
  117. data/app/components/solidus_admin/ui/thumbnail_with_caption/component.rb +15 -0
  118. data/app/components/solidus_admin/users/addresses/component.html.erb +46 -0
  119. data/app/components/solidus_admin/users/addresses/component.rb +61 -0
  120. data/app/components/solidus_admin/users/addresses/component.yml +14 -0
  121. data/app/components/solidus_admin/users/edit/api_access/component.html.erb +49 -0
  122. data/app/components/solidus_admin/users/edit/api_access/component.js +9 -0
  123. data/app/components/solidus_admin/users/edit/api_access/component.rb +7 -0
  124. data/app/components/solidus_admin/users/edit/api_access/component.yml +10 -0
  125. data/app/components/solidus_admin/users/edit/component.html.erb +52 -0
  126. data/app/components/solidus_admin/users/edit/component.rb +51 -0
  127. data/app/components/solidus_admin/users/edit/component.yml +12 -0
  128. data/app/components/solidus_admin/users/index/component.rb +25 -16
  129. data/app/components/solidus_admin/users/index/component.yml +0 -3
  130. data/app/components/solidus_admin/users/items/component.html.erb +41 -0
  131. data/app/components/solidus_admin/users/items/component.rb +170 -0
  132. data/app/components/solidus_admin/users/items/component.yml +16 -0
  133. data/app/components/solidus_admin/users/orders/component.html.erb +42 -0
  134. data/app/components/solidus_admin/users/orders/component.rb +131 -0
  135. data/app/components/solidus_admin/users/orders/component.yml +12 -0
  136. data/app/components/solidus_admin/users/stats/component.html.erb +11 -0
  137. data/app/components/solidus_admin/users/stats/component.rb +9 -0
  138. data/app/components/solidus_admin/users/stats/component.yml +2 -0
  139. data/app/components/solidus_admin/users_and_roles/component.rb +24 -0
  140. data/app/components/solidus_admin/users_and_roles/component.yml +2 -0
  141. data/app/components/solidus_admin/zones/index/component.rb +19 -11
  142. data/app/controllers/solidus_admin/addresses_controller.rb +6 -1
  143. data/app/controllers/solidus_admin/adjustment_reasons_controller.rb +85 -10
  144. data/app/controllers/solidus_admin/adjustments_controller.rb +57 -0
  145. data/app/controllers/solidus_admin/customers_controller.rb +5 -1
  146. data/app/controllers/solidus_admin/orders_controller.rb +5 -1
  147. data/app/controllers/solidus_admin/products_controller.rb +11 -0
  148. data/app/controllers/solidus_admin/properties_controller.rb +1 -1
  149. data/app/controllers/solidus_admin/refund_reasons_controller.rb +85 -10
  150. data/app/controllers/solidus_admin/reimbursement_types_controller.rb +0 -5
  151. data/app/controllers/solidus_admin/return_reasons_controller.rb +85 -10
  152. data/app/controllers/solidus_admin/roles_controller.rb +118 -0
  153. data/app/controllers/solidus_admin/shipping_categories_controller.rb +87 -10
  154. data/app/controllers/solidus_admin/shipping_methods_controller.rb +0 -5
  155. data/app/controllers/solidus_admin/stock_items_controller.rb +6 -6
  156. data/app/controllers/solidus_admin/stock_locations_controller.rb +0 -5
  157. data/app/controllers/solidus_admin/store_credit_reasons_controller.rb +85 -10
  158. data/app/controllers/solidus_admin/stores_controller.rb +0 -5
  159. data/app/controllers/solidus_admin/tax_categories_controller.rb +89 -10
  160. data/app/controllers/solidus_admin/tax_rates_controller.rb +0 -5
  161. data/app/controllers/solidus_admin/users_controller.rb +85 -6
  162. data/app/controllers/solidus_admin/zones_controller.rb +0 -5
  163. data/app/helpers/solidus_admin/last_login_helper.rb +16 -0
  164. data/app/helpers/solidus_admin/permission_sets_helper.rb +32 -0
  165. data/app/views/layouts/solidus_admin/application.html.erb +2 -1
  166. data/app/views/layouts/solidus_admin/preview.html.erb +2 -0
  167. data/config/initializers/view_component.rb +1 -1
  168. data/config/locales/adjustment_reasons.en.yml +5 -1
  169. data/config/locales/adjustments.en.yml +10 -0
  170. data/config/locales/refund_reasons.en.yml +10 -0
  171. data/config/locales/return_reasons.en.yml +5 -1
  172. data/config/locales/roles.en.yml +10 -0
  173. data/config/locales/shipping_categories.en.yml +4 -0
  174. data/config/locales/store_credit_reasons.en.yml +5 -1
  175. data/config/locales/tax_categories.en.yml +4 -0
  176. data/config/locales/users.en.yml +10 -0
  177. data/config/routes.rb +24 -7
  178. data/docs/components.md +109 -0
  179. data/docs/{customizing_view_components.md → customizing_components.md} +2 -7
  180. data/docs/index_pages.md +146 -0
  181. data/docs/{customizing_menu_items.md → menu_items.md} +1 -1
  182. data/docs/stimulusjs.md +85 -0
  183. data/docs/{customizing_tailwindcss.md → tailwindcss.md} +27 -8
  184. data/lib/solidus_admin/component_registry.rb +40 -0
  185. data/lib/solidus_admin/configuration.rb +5 -27
  186. data/lib/solidus_admin/install_tailwindcss.rb +3 -1
  187. data/lib/solidus_admin/testing_support/admin_assets.rb +10 -0
  188. data/lib/solidus_admin/testing_support/component_helpers.rb +27 -0
  189. data/lib/solidus_admin/testing_support/dummy_app/rake_tasks.rb +60 -0
  190. data/lib/solidus_admin/testing_support/feature_helpers.rb +34 -0
  191. data/lib/solidus_admin/version.rb +1 -1
  192. data/solidus_admin.gemspec +7 -3
  193. metadata +111 -59
  194. data/app/components/solidus_admin/adjustment_reasons/index/component.html.erb +0 -32
  195. data/app/components/solidus_admin/adjustment_reasons/index/component.yml +0 -4
  196. data/app/components/solidus_admin/option_types/index/component.html.erb +0 -30
  197. data/app/components/solidus_admin/orders/index/component.html.erb +0 -35
  198. data/app/components/solidus_admin/payment_methods/index/component.html.erb +0 -38
  199. data/app/components/solidus_admin/products/index/component.html.erb +0 -34
  200. data/app/components/solidus_admin/promotion_categories/index/component.html.erb +0 -26
  201. data/app/components/solidus_admin/promotion_categories/index/component.rb +0 -57
  202. data/app/components/solidus_admin/promotion_categories/index/component.yml +0 -4
  203. data/app/components/solidus_admin/promotions/index/component.html.erb +0 -34
  204. data/app/components/solidus_admin/promotions/index/component.rb +0 -97
  205. data/app/components/solidus_admin/promotions/index/component.yml +0 -14
  206. data/app/components/solidus_admin/properties/index/component.html.erb +0 -34
  207. data/app/components/solidus_admin/properties/index/component.yml +0 -4
  208. data/app/components/solidus_admin/refund_reasons/index/component.html.erb +0 -31
  209. data/app/components/solidus_admin/refund_reasons/index/component.yml +0 -4
  210. data/app/components/solidus_admin/refunds_and_returns/component.html.erb +0 -26
  211. data/app/components/solidus_admin/reimbursement_types/index/component.html.erb +0 -22
  212. data/app/components/solidus_admin/reimbursement_types/index/component.yml +0 -4
  213. data/app/components/solidus_admin/return_reasons/index/component.html.erb +0 -31
  214. data/app/components/solidus_admin/return_reasons/index/component.yml +0 -4
  215. data/app/components/solidus_admin/shipping/component.html.erb +0 -30
  216. data/app/components/solidus_admin/shipping_categories/index/component.html.erb +0 -32
  217. data/app/components/solidus_admin/shipping_categories/index/component.yml +0 -4
  218. data/app/components/solidus_admin/shipping_methods/index/component.html.erb +0 -32
  219. data/app/components/solidus_admin/shipping_methods/index/component.yml +0 -4
  220. data/app/components/solidus_admin/stock_items/index/component.html.erb +0 -26
  221. data/app/components/solidus_admin/stock_locations/index/component.html.erb +0 -32
  222. data/app/components/solidus_admin/store_credit_reasons/index/component.html.erb +0 -31
  223. data/app/components/solidus_admin/store_credit_reasons/index/component.yml +0 -4
  224. data/app/components/solidus_admin/stores/index/component.html.erb +0 -34
  225. data/app/components/solidus_admin/stores/index/component.yml +0 -4
  226. data/app/components/solidus_admin/tax_categories/index/component.html.erb +0 -32
  227. data/app/components/solidus_admin/tax_categories/index/component.yml +0 -6
  228. data/app/components/solidus_admin/tax_rates/index/component.html.erb +0 -32
  229. data/app/components/solidus_admin/tax_rates/index/component.yml +0 -4
  230. data/app/components/solidus_admin/taxes/component.html.erb +0 -24
  231. data/app/components/solidus_admin/taxonomies/index/component.html.erb +0 -28
  232. data/app/components/solidus_admin/taxonomies/index/component.yml +0 -4
  233. data/app/components/solidus_admin/users/index/component.html.erb +0 -34
  234. data/app/components/solidus_admin/zones/index/component.html.erb +0 -35
  235. data/app/components/solidus_admin/zones/index/component.yml +0 -4
  236. data/app/controllers/solidus_admin/promotion_categories_controller.rb +0 -38
  237. data/app/controllers/solidus_admin/promotions_controller.rb +0 -46
  238. data/config/locales/promotion_categories.en.yml +0 -6
  239. data/config/locales/promotions.en.yml +0 -6
  240. data/config/locales/refund_reasons_.en.yml +0 -6
  241. /data/app/components/solidus_admin/{option_types → ui/pages}/index/component.yml +0 -0
@@ -4,19 +4,88 @@ module SolidusAdmin
4
4
  class ShippingCategoriesController < SolidusAdmin::BaseController
5
5
  include SolidusAdmin::ControllerHelpers::Search
6
6
 
7
- def index
8
- shipping_categories = apply_search_to(
9
- Spree::ShippingCategory.order(id: :desc),
10
- param: :q,
11
- )
7
+ before_action :set_shipping_category, only: %i[edit update]
12
8
 
13
- set_page_and_extract_portion_from(shipping_categories)
9
+ def new
10
+ @shipping_category = Spree::ShippingCategory.new
11
+
12
+ set_index_page
13
+
14
+ respond_to do |format|
15
+ format.html { render component('shipping_categories/new').new(page: @page, shipping_category: @shipping_category) }
16
+ end
17
+ end
18
+
19
+ def create
20
+ @shipping_category = Spree::ShippingCategory.new(shipping_category_params)
21
+
22
+ if @shipping_category.save
23
+ respond_to do |format|
24
+ flash[:notice] = t('.success')
25
+
26
+ format.html do
27
+ redirect_to solidus_admin.shipping_categories_path, status: :see_other
28
+ end
29
+
30
+ format.turbo_stream do
31
+ # we need to explicitly write the refresh tag for now.
32
+ # See https://github.com/hotwired/turbo-rails/issues/579
33
+ render turbo_stream: '<turbo-stream action="refresh" />'
34
+ end
35
+ end
36
+ else
37
+ set_index_page
38
+
39
+ respond_to do |format|
40
+ format.html do
41
+ page_component = component('shipping_categories/new').new(page: @page, shipping_category: @shipping_category)
42
+ render page_component, status: :unprocessable_entity
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ def index
49
+ set_index_page
14
50
 
15
51
  respond_to do |format|
16
52
  format.html { render component('shipping_categories/index').new(page: @page) }
17
53
  end
18
54
  end
19
55
 
56
+ def edit
57
+ set_index_page
58
+
59
+ respond_to do |format|
60
+ format.html { render component('shipping_categories/edit').new(page: @page, shipping_category: @shipping_category) }
61
+ end
62
+ end
63
+
64
+ def update
65
+ if @shipping_category.update(shipping_category_params)
66
+ respond_to do |format|
67
+ flash[:notice] = t('.success')
68
+
69
+ format.html do
70
+ redirect_to solidus_admin.shipping_categories_path, status: :see_other
71
+ end
72
+
73
+ format.turbo_stream do
74
+ render turbo_stream: '<turbo-stream action="refresh" />'
75
+ end
76
+ end
77
+ else
78
+ set_index_page
79
+
80
+ respond_to do |format|
81
+ format.html do
82
+ page_component = component('shipping_categories/edit').new(page: @page, shipping_category: @shipping_category)
83
+ render page_component, status: :unprocessable_entity
84
+ end
85
+ end
86
+ end
87
+ end
88
+
20
89
  def destroy
21
90
  @shipping_category = Spree::ShippingCategory.find_by!(id: params[:id])
22
91
 
@@ -28,13 +97,21 @@ module SolidusAdmin
28
97
 
29
98
  private
30
99
 
31
- def load_shipping_category
32
- @shipping_category = Spree::ShippingCategory.find_by!(id: params[:id])
33
- authorize! action_name, @shipping_category
100
+ def set_shipping_category
101
+ @shipping_category = Spree::ShippingCategory.find(params[:id])
34
102
  end
35
103
 
36
104
  def shipping_category_params
37
- params.require(:shipping_category).permit(:shipping_category_id, permitted_shipping_category_attributes)
105
+ params.require(:shipping_category).permit(:name)
106
+ end
107
+
108
+ def set_index_page
109
+ shipping_categories = apply_search_to(
110
+ Spree::ShippingCategory.order(id: :desc),
111
+ param: :q,
112
+ )
113
+
114
+ set_page_and_extract_portion_from(shipping_categories)
38
115
  end
39
116
  end
40
117
  end
@@ -28,11 +28,6 @@ module SolidusAdmin
28
28
 
29
29
  private
30
30
 
31
- def load_shipping_method
32
- @shipping_method = Spree::ShippingMethod.find_by!(number: params[:id])
33
- authorize! action_name, @shipping_method
34
- end
35
-
36
31
  def shipping_method_params
37
32
  params.require(:shipping_method).permit(:shipping_method_id, permitted_shipping_method_attributes)
38
33
  end
@@ -26,14 +26,14 @@ module SolidusAdmin
26
26
 
27
27
  def update
28
28
  quantity_adjustment = params[:quantity_adjustment].to_i
29
- @stock_item.assign_attributes(stock_item_params.except(:page, :q))
29
+ @stock_item.assign_attributes(stock_item_params)
30
30
  @stock_item.stock_movements.build(quantity: quantity_adjustment, originator: current_solidus_admin_user)
31
31
 
32
32
  if @stock_item.save
33
- redirect_to solidus_admin.stock_items_path(
34
- page: stock_item_params[:page].to_i.presence,
35
- q: stock_item_params[:q].presence&.then { |q| JSON.parse(q) }
36
- ), status: :see_other
33
+ respond_to do |format|
34
+ format.html { redirect_to solidus_admin.stock_items_path, status: :see_other }
35
+ format.turbo_stream { render turbo_stream: '<turbo-stream action="refresh" />' }
36
+ end
37
37
  else
38
38
  respond_to do |format|
39
39
  format.html { render component('stock_items/edit').new(stock_item: @stock_item, page: @page), status: :unprocessable_entity }
@@ -61,7 +61,7 @@ module SolidusAdmin
61
61
  end
62
62
 
63
63
  def stock_item_params
64
- params.require(:stock_item).permit(:backorderable, :page, :q)
64
+ params.require(:stock_item).permit(:backorderable)
65
65
  end
66
66
  end
67
67
  end
@@ -28,11 +28,6 @@ module SolidusAdmin
28
28
 
29
29
  private
30
30
 
31
- def load_stock_location
32
- @stock_location = Spree::StockLocation.find_by!(number: params[:id])
33
- authorize! action_name, @stock_location
34
- end
35
-
36
31
  def stock_location_params
37
32
  params.require(:stock_location).permit(:stock_location_id, permitted_stock_location_attributes)
38
33
  end
@@ -4,19 +4,86 @@ module SolidusAdmin
4
4
  class StoreCreditReasonsController < SolidusAdmin::BaseController
5
5
  include SolidusAdmin::ControllerHelpers::Search
6
6
 
7
- def index
8
- store_credit_reasons = apply_search_to(
9
- Spree::StoreCreditReason.unscoped.order(id: :desc),
10
- param: :q,
11
- )
7
+ before_action :set_store_credit_reason, only: %i[edit update]
12
8
 
13
- set_page_and_extract_portion_from(store_credit_reasons)
9
+ def index
10
+ set_index_page
14
11
 
15
12
  respond_to do |format|
16
13
  format.html { render component('store_credit_reasons/index').new(page: @page) }
17
14
  end
18
15
  end
19
16
 
17
+ def new
18
+ @store_credit_reason = Spree::StoreCreditReason.new
19
+
20
+ set_index_page
21
+
22
+ respond_to do |format|
23
+ format.html { render component('store_credit_reasons/new').new(page: @page, store_credit_reason: @store_credit_reason) }
24
+ end
25
+ end
26
+
27
+ def create
28
+ @store_credit_reason = Spree::StoreCreditReason.new(store_credit_reason_params)
29
+
30
+ if @store_credit_reason.save
31
+ respond_to do |format|
32
+ flash[:notice] = t('.success')
33
+
34
+ format.html do
35
+ redirect_to solidus_admin.store_credit_reasons_path, status: :see_other
36
+ end
37
+
38
+ format.turbo_stream do
39
+ render turbo_stream: '<turbo-stream action="refresh" />'
40
+ end
41
+ end
42
+ else
43
+ set_index_page
44
+
45
+ respond_to do |format|
46
+ format.html do
47
+ page_component = component('store_credit_reasons/new').new(page: @page, store_credit_reason: @store_credit_reason)
48
+ render page_component, status: :unprocessable_entity
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ def edit
55
+ set_index_page
56
+
57
+ respond_to do |format|
58
+ format.html { render component('store_credit_reasons/edit').new(page: @page, store_credit_reason: @store_credit_reason) }
59
+ end
60
+ end
61
+
62
+ def update
63
+ if @store_credit_reason.update(store_credit_reason_params)
64
+ respond_to do |format|
65
+ flash[:notice] = t('.success')
66
+
67
+ format.html do
68
+ redirect_to solidus_admin.store_credit_reasons_path, status: :see_other
69
+ end
70
+
71
+ format.turbo_stream do
72
+ render turbo_stream: '<turbo-stream action="refresh" />'
73
+ end
74
+ end
75
+ else
76
+ set_index_page
77
+
78
+ respond_to do |format|
79
+ format.html do
80
+ page_component = component('store_credit_reasons/edit').new(page: @page, store_credit_reason: @store_credit_reason)
81
+ render page_component, status: :unprocessable_entity
82
+ end
83
+ end
84
+ end
85
+ end
86
+
20
87
  def destroy
21
88
  @store_credit_reason = Spree::StoreCreditReason.find_by!(id: params[:id])
22
89
 
@@ -28,13 +95,21 @@ module SolidusAdmin
28
95
 
29
96
  private
30
97
 
31
- def load_store_credit_reason
32
- @store_credit_reason = Spree::StoreCreditReason.find_by!(id: params[:id])
33
- authorize! action_name, @store_credit_reason
98
+ def set_store_credit_reason
99
+ @store_credit_reason = Spree::StoreCreditReason.find(params[:id])
34
100
  end
35
101
 
36
102
  def store_credit_reason_params
37
- params.require(:store_credit_reason).permit(:store_credit_reason_id, permitted_store_credit_reason_attributes)
103
+ params.require(:store_credit_reason).permit(:name, :active)
104
+ end
105
+
106
+ def set_index_page
107
+ store_credit_reasons = apply_search_to(
108
+ Spree::StoreCreditReason.unscoped.order(id: :desc),
109
+ param: :q,
110
+ )
111
+
112
+ set_page_and_extract_portion_from(store_credit_reasons)
38
113
  end
39
114
  end
40
115
  end
@@ -28,11 +28,6 @@ module SolidusAdmin
28
28
 
29
29
  private
30
30
 
31
- def load_store
32
- @store = Spree::Store.find_by!(number: params[:id])
33
- authorize! action_name, @store
34
- end
35
-
36
31
  def store_params
37
32
  params.require(:store).permit(:store_id, permitted_store_attributes)
38
33
  end
@@ -4,13 +4,84 @@ module SolidusAdmin
4
4
  class TaxCategoriesController < SolidusAdmin::BaseController
5
5
  include SolidusAdmin::ControllerHelpers::Search
6
6
 
7
- def index
8
- tax_categories = apply_search_to(
9
- Spree::TaxCategory.order(created_at: :desc, id: :desc),
10
- param: :q,
11
- )
7
+ before_action :set_tax_category, only: %i[edit update]
12
8
 
13
- set_page_and_extract_portion_from(tax_categories)
9
+ def new
10
+ @tax_category = Spree::TaxCategory.new
11
+
12
+ set_index_page
13
+
14
+ respond_to do |format|
15
+ format.html { render component('tax_categories/new').new(page: @page, tax_category: @tax_category) }
16
+ end
17
+ end
18
+
19
+ def edit
20
+ @tax_category = Spree::TaxCategory.find(params[:id])
21
+
22
+ set_index_page
23
+
24
+ respond_to do |format|
25
+ format.html { render component('tax_categories/edit').new(page: @page, tax_category: @tax_category) }
26
+ end
27
+ end
28
+
29
+ def create
30
+ @tax_category = Spree::TaxCategory.new(tax_category_params)
31
+
32
+ if @tax_category.save
33
+ respond_to do |format|
34
+ flash[:notice] = t('.success')
35
+
36
+ format.html do
37
+ redirect_to solidus_admin.tax_categories_path, status: :see_other
38
+ end
39
+
40
+ format.turbo_stream do
41
+ # we need to explicitly write the refresh tag for now.
42
+ # See https://github.com/hotwired/turbo-rails/issues/579
43
+ render turbo_stream: '<turbo-stream action="refresh" />'
44
+ end
45
+ end
46
+ else
47
+ set_index_page
48
+
49
+ respond_to do |format|
50
+ format.html do
51
+ page_component = component('tax_categories/new').new(page: @page, tax_category: @tax_category)
52
+ render page_component, status: :unprocessable_entity
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ def update
59
+ if @tax_category.update(tax_category_params)
60
+ respond_to do |format|
61
+ flash[:notice] = t('.success')
62
+
63
+ format.html do
64
+ redirect_to solidus_admin.tax_categories_path, status: :see_other
65
+ end
66
+
67
+ format.turbo_stream do
68
+ render turbo_stream: '<turbo-stream action="refresh" />'
69
+ end
70
+ end
71
+ else
72
+ set_index_page
73
+
74
+ respond_to do |format|
75
+ format.html do
76
+ page_component = component('tax_categories/edit').new(page: @page, tax_category: @tax_category)
77
+ render page_component, status: :unprocessable_entity
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ def index
84
+ set_index_page
14
85
 
15
86
  respond_to do |format|
16
87
  format.html { render component('tax_categories/index').new(page: @page) }
@@ -28,13 +99,21 @@ module SolidusAdmin
28
99
 
29
100
  private
30
101
 
31
- def load_tax_category
32
- @tax_category = Spree::TaxCategory.find_by!(number: params[:id])
33
- authorize! action_name, @tax_category
102
+ def set_tax_category
103
+ @tax_category = Spree::TaxCategory.find(params[:id])
34
104
  end
35
105
 
36
106
  def tax_category_params
37
- params.require(:tax_category).permit(:tax_category_id, permitted_tax_category_attributes)
107
+ params.require(:tax_category).permit(:name, :description, :is_default, :tax_code)
108
+ end
109
+
110
+ def set_index_page
111
+ tax_categories = apply_search_to(
112
+ Spree::TaxCategory.order(created_at: :desc, id: :desc),
113
+ param: :q,
114
+ )
115
+
116
+ set_page_and_extract_portion_from(tax_categories)
38
117
  end
39
118
  end
40
119
  end
@@ -28,11 +28,6 @@ module SolidusAdmin
28
28
 
29
29
  private
30
30
 
31
- def load_tax_rate
32
- @tax_rate = Spree::TaxRate.find_by!(number: params[:id])
33
- authorize! action_name, @tax_rate
34
- end
35
-
36
31
  def tax_rate_params
37
32
  params.require(:tax_rate).permit(:tax_rate_id, permitted_tax_rate_attributes)
38
33
  end
@@ -3,12 +3,15 @@
3
3
  module SolidusAdmin
4
4
  class UsersController < SolidusAdmin::BaseController
5
5
  include SolidusAdmin::ControllerHelpers::Search
6
+ include Spree::Core::ControllerHelpers::StrongParameters
6
7
 
7
- search_scope(:customers, default: true) { _1.left_outer_joins(:role_users).where(role_users: { id: nil }) }
8
+ before_action :set_user, only: [:edit, :addresses, :update_addresses, :orders, :items]
9
+
10
+ search_scope(:all, default: true)
11
+ search_scope(:customers) { _1.left_outer_joins(:role_users).where(role_users: { id: nil }) }
8
12
  search_scope(:admin) { _1.joins(:role_users).distinct }
9
13
  search_scope(:with_orders) { _1.joins(:orders).distinct }
10
14
  search_scope(:without_orders) { _1.left_outer_joins(:orders).where(orders: { id: nil }) }
11
- search_scope(:all)
12
15
 
13
16
  def index
14
17
  users = apply_search_to(
@@ -23,6 +26,52 @@ module SolidusAdmin
23
26
  end
24
27
  end
25
28
 
29
+ def addresses
30
+ respond_to do |format|
31
+ format.turbo_stream { render turbo_stream: '<turbo-stream action="refresh" />' }
32
+ format.html { render component('users/addresses').new(user: @user) }
33
+ end
34
+ end
35
+
36
+ def update_addresses
37
+ set_address_from_params
38
+
39
+ if @address.valid? && @user.update(user_params)
40
+ flash[:success] = t(".#{@type}.success")
41
+
42
+ respond_to do |format|
43
+ format.turbo_stream { render turbo_stream: '<turbo-stream action="refresh" />' }
44
+ format.html { render component('users/addresses').new(user: @user) }
45
+ end
46
+ else
47
+ respond_to do |format|
48
+ format.html { render component('users/addresses').new(user: @user, address: @address, type: @type), status: :unprocessable_entity }
49
+ end
50
+ end
51
+ end
52
+
53
+ def orders
54
+ set_orders
55
+
56
+ respond_to do |format|
57
+ format.html { render component('users/orders').new(user: @user, orders: @orders) }
58
+ end
59
+ end
60
+
61
+ def items
62
+ set_items
63
+
64
+ respond_to do |format|
65
+ format.html { render component('users/items').new(user: @user, items: @items) }
66
+ end
67
+ end
68
+
69
+ def edit
70
+ respond_to do |format|
71
+ format.html { render component('users/edit').new(user: @user) }
72
+ end
73
+ end
74
+
26
75
  def destroy
27
76
  @users = Spree.user_class.where(id: params[:id])
28
77
 
@@ -34,13 +83,43 @@ module SolidusAdmin
34
83
 
35
84
  private
36
85
 
37
- def load_user
38
- @user = Spree.user_class.find_by!(number: params[:id])
39
- authorize! action_name, @user
86
+ def set_user
87
+ @user = Spree.user_class.find(params[:id])
40
88
  end
41
89
 
42
90
  def user_params
43
- params.require(:user).permit(:user_id, permitted_user_attributes)
91
+ params.require(:user).permit(
92
+ :user_id,
93
+ permitted_user_attributes,
94
+ bill_address_attributes: permitted_address_attributes,
95
+ ship_address_attributes: permitted_address_attributes
96
+ )
97
+ end
98
+
99
+ # @note This method is used to generate validation errors on the address.
100
+ # Since the update is being performed via the @user, and not directly on
101
+ # the @address, we sadly don't seem to get these errors automatically.
102
+ def set_address_from_params
103
+ if user_params.key?(:bill_address_attributes)
104
+ @address = Spree::Address.new(user_params[:bill_address_attributes])
105
+ @type = "bill"
106
+ elsif user_params.key?(:ship_address_attributes)
107
+ @address = Spree::Address.new(user_params[:ship_address_attributes])
108
+ @type = "ship"
109
+ end
110
+ end
111
+
112
+ def set_orders
113
+ params[:q] ||= {}
114
+ @search = Spree::Order.reverse_chronological.ransack(params[:q].merge(user_id_eq: @user.id))
115
+ @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
116
+ end
117
+
118
+ def set_items
119
+ params[:q] ||= {}
120
+ @search = Spree::Order.reverse_chronological.includes(line_items: { variant: [:product, { option_values: :option_type }] }).ransack(params[:q].merge(user_id_eq: @user.id))
121
+ @orders = @search.result.page(params[:page]).per(Spree::Config[:admin_products_per_page])
122
+ @items = @orders&.map(&:line_items)&.flatten
44
123
  end
45
124
 
46
125
  def authorization_subject
@@ -28,11 +28,6 @@ module SolidusAdmin
28
28
 
29
29
  private
30
30
 
31
- def load_zone
32
- @zone = Spree::Zone.find_by!(number: params[:id])
33
- authorize! action_name, @zone
34
- end
35
-
36
31
  def zone_params
37
32
  params.require(:zone).permit(:zone_id, permitted_zone_attributes)
38
33
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ module LastLoginHelper
5
+ def last_login(user)
6
+ return t('solidus_admin.users.last_login.never') if user.try(:last_sign_in_at).blank?
7
+
8
+ t(
9
+ 'solidus_admin.users.last_login.login_time_ago',
10
+ # @note The second `.try` is here for the specs and for setups that use a
11
+ # custom User class which may not have this attribute.
12
+ last_login_time: time_ago_in_words(user.try(:last_sign_in_at))
13
+ ).capitalize
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SolidusAdmin
4
+ module PermissionSetsHelper
5
+ # @param permission_sets [Array<Spree::PermissionSet>] an array of
6
+ # PermissionSet objects to be organized into categories based on their
7
+ # names.
8
+ # @param view_label [String] A string of your choice associated with "View"
9
+ # or "Display" level permissions. Used when rendering the checkbox.
10
+ # @param edit_label [String] A string of your choice associated with "Edit"
11
+ # or "Management" level permissions. Used when rendering the checkbox.
12
+ def organize_permissions(permission_sets:, view_label:, edit_label:)
13
+ return {} if permission_sets.blank?
14
+
15
+ permission_sets.each_with_object({}) do |permission, grouped_permissions|
16
+ group_key = permission.category.to_sym
17
+
18
+ case permission.privilege
19
+ when "display"
20
+ grouped_permissions[group_key] ||= []
21
+ grouped_permissions[group_key] << { label: view_label, id: permission.id }
22
+ when "management"
23
+ grouped_permissions[group_key] ||= []
24
+ grouped_permissions[group_key] << { label: edit_label, id: permission.id }
25
+ else
26
+ grouped_permissions[:other] ||= []
27
+ grouped_permissions[:other] << { label: permission.name, id: permission.id }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -11,6 +11,7 @@
11
11
  <%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_light_theme]), media: '(prefers-color-scheme: light)', "data-turbo-track": "reload" %>
12
12
  <%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_dark_theme]), media: '(prefers-color-scheme: dark)', "data-turbo-track": "reload" %>
13
13
  <%= javascript_importmap_tags "solidus_admin/application", shim: false, importmap: SolidusAdmin.importmap %>
14
+ <meta name="turbo-refresh-scroll", content="preserve">
14
15
  </head>
15
16
 
16
17
  <body class="bg-gray-15 font-sans">
@@ -29,7 +30,7 @@
29
30
 
30
31
  <div class="fixed inset-x-0 bottom-3 flex items-center justify-center flex-col gap-3 pointer-events-none" role="alert">
31
32
  <% flash.each do |key, message| %>
32
- <%= render component("ui/toast").new(text: message, scheme: key == :error ? :error : :default) %>
33
+ <%= render component("ui/toast").new(text: message, scheme: key.to_sym == :error ? :error : :default) %>
33
34
  <% end %>
34
35
  </div>
35
36
  </body>
@@ -1,6 +1,8 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
+ <%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_light_theme]), media: '(prefers-color-scheme: light)', "data-turbo-track": "reload" %>
5
+ <%= stylesheet_link_tag SolidusAdmin::Config.theme_path(session[:admin_dark_theme]), media: '(prefers-color-scheme: dark)', "data-turbo-track": "reload" %>
4
6
  <%= javascript_importmap_tags "solidus_admin/application", shim: false, importmap: SolidusAdmin.importmap %>
5
7
  </head>
6
8
  <body class="p-3">
@@ -10,7 +10,7 @@ if Rails.env.development? || Rails.env.test?
10
10
  clear = "\e[0m"
11
11
 
12
12
  ActiveSupport::Notifications.subscribe("render.view_component") do |*args|
13
- next unless args.last[:name].starts_with?("SolidusAdmin::")
13
+ next unless args.last[:name]&.starts_with?("SolidusAdmin::")
14
14
 
15
15
  event = ActiveSupport::Notifications::Event.new(*args)
16
16
  SolidusAdmin::BaseComponent.logger.debug \
@@ -3,4 +3,8 @@ en:
3
3
  adjustment_reasons:
4
4
  title: "Adjustment Reasons"
5
5
  destroy:
6
- success: "Adjustment Reasons were successfully removed."
6
+ success: "Adjustment reasons were successfully removed."
7
+ create:
8
+ success: "Adjustment reason was successfully created."
9
+ update:
10
+ success: "Adjustment reason was successfully updated."
@@ -0,0 +1,10 @@
1
+ en:
2
+ solidus_admin:
3
+ adjustments:
4
+ title: "Adjustments"
5
+ lock:
6
+ success: "Locked successfully"
7
+ unlock:
8
+ success: "Unlocked successfully"
9
+ destroy:
10
+ success: "Deleted successfully"