solidus_admin 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,8 @@
1
+ # Add your component translations here.
2
+ # Use the translation in the example in your template with `t(".hello")`.
3
+ en:
4
+ title: "Edit Adjustment Reason"
5
+ cancel: "Cancel"
6
+ submit: "Update Adjustment Reason"
7
+ hints:
8
+ active: "When checked, this adjustment reason will be available for selection when adding adjustments to orders."
@@ -1,28 +1,43 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::BaseComponent
4
- include SolidusAdmin::Layout::PageHelpers
3
+ class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::RefundsAndReturns::Component
4
+ def model_class
5
+ Spree::AdjustmentReason
6
+ end
7
+
8
+ def search_url
9
+ solidus_admin.adjustment_reasons_path
10
+ end
5
11
 
6
- def initialize(page:)
7
- @page = page
12
+ def search_key
13
+ :name_or_code_cont
8
14
  end
9
15
 
10
- def title
11
- Spree::AdjustmentReason.model_name.human.pluralize
16
+ def page_actions
17
+ render component("ui/button").new(
18
+ tag: :a,
19
+ text: t('.add'),
20
+ href: solidus_admin.new_adjustment_reason_path, data: { turbo_frame: :new_adjustment_reason_modal },
21
+ icon: "add-line",
22
+ class: "align-self-end w-full",
23
+ )
12
24
  end
13
25
 
14
- def prev_page_path
15
- solidus_admin.url_for(**request.params, page: @page.number - 1, only_path: true) unless @page.first?
26
+ def turbo_frames
27
+ %w[
28
+ new_adjustment_reason_modal
29
+ edit_adjustment_reason_modal
30
+ ]
16
31
  end
17
32
 
18
- def next_page_path
19
- solidus_admin.url_for(**request.params, page: @page.next_param, only_path: true) unless @page.last?
33
+ def row_url(adjustment_reason)
34
+ spree.edit_admin_adjustment_reason_path(adjustment_reason, _turbo_frame: :edit_adjustment_reason_modal)
20
35
  end
21
36
 
22
37
  def batch_actions
23
38
  [
24
39
  {
25
- display_name: t('.batch_actions.delete'),
40
+ label: t('.batch_actions.delete'),
26
41
  action: solidus_admin.adjustment_reasons_path,
27
42
  method: :delete,
28
43
  icon: 'delete-bin-7-line',
@@ -30,14 +45,6 @@ class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::BaseComp
30
45
  ]
31
46
  end
32
47
 
33
- def scopes
34
- []
35
- end
36
-
37
- def filters
38
- []
39
- end
40
-
41
48
  def columns
42
49
  [
43
50
  :name,
@@ -0,0 +1,28 @@
1
+ <%= turbo_frame_tag :new_adjustment_reason_modal do %>
2
+ <%= render component("ui/modal").new(title: t(".title")) do |modal| %>
3
+ <%= form_for @adjustment_reason, url: solidus_admin.adjustment_reasons_path, html: { id: form_id } do |f| %>
4
+ <div class="flex flex-col gap-6 pb-4">
5
+ <%= render component("ui/forms/field").text_field(f, :name, class: "required") %>
6
+ <%= render component("ui/forms/field").text_field(f, :code, class: "required") %>
7
+ <label class="flex gap-2 items-center">
8
+ <%= hidden_field_tag "#{f.object_name}[active]", "0" %>
9
+ <%= render component("ui/forms/checkbox").new(
10
+ name: "#{f.object_name}[active]",
11
+ value: "1",
12
+ checked: f.object.active
13
+ ) %>
14
+ <span class="font-semibold text-xs ml-2"><%= Spree::AdjustmentReason.human_attribute_name :active %></span>
15
+ <%= render component("ui/toggletip").new(text: t(".hints.active")) %>
16
+ </label>
17
+ </div>
18
+ <% modal.with_actions do %>
19
+ <form method="dialog">
20
+ <%= render component("ui/button").new(scheme: :secondary, text: t('.cancel')) %>
21
+ </form>
22
+ <%= render component("ui/button").new(form: form_id, type: :submit, text: t('.submit')) %>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
26
+ <% end %>
27
+
28
+ <%= render component("adjustment_reasons/index").new(page: @page) %>
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::AdjustmentReasons::New::Component < SolidusAdmin::BaseComponent
4
+ def initialize(page:, adjustment_reason:)
5
+ @page = page
6
+ @adjustment_reason = adjustment_reason
7
+ end
8
+
9
+ def form_id
10
+ dom_id(@adjustment_reason, "#{stimulus_id}_new_adjustment_reason_form")
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ # Add your component translations here.
2
+ # Use the translation in the example in your template with `t(".hello")`.
3
+ en:
4
+ title: "New Adjustment Reason"
5
+ cancel: "Cancel"
6
+ submit: "Add Adjustment Reason"
7
+ hints:
8
+ active: "When checked, this adjustment reason will be available for selection when adding adjustments to orders."
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "view_component/version"
4
+ require "view_component/translatable"
5
+
3
6
  module SolidusAdmin
4
7
  # BaseComponent is the base class for all components in Solidus Admin.
5
8
  class BaseComponent < ViewComponent::Base
@@ -15,7 +18,7 @@ module SolidusAdmin
15
18
 
16
19
  logger.debug " [#{self.class}] Missing translation: #{keys.join('.')}"
17
20
 
18
- if options[:locale] != :en
21
+ if (options[:locale] || I18n.default_locale) != :en
19
22
  t(key, **options, locale: :en)
20
23
  else
21
24
  "translation missing: #{keys.join('.')}"
@@ -1,14 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::BaseComponent
4
- include SolidusAdmin::Layout::PageHelpers
3
+ class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::UI::Pages::Index::Component
4
+ def model_class
5
+ Spree::OptionType
6
+ end
7
+
8
+ def row_url(option_type)
9
+ spree.edit_admin_option_type_path(option_type)
10
+ end
5
11
 
6
- def initialize(page:)
7
- @page = page
12
+ def sortable_options
13
+ {
14
+ url: ->(option_type) { solidus_admin.move_option_type_path(option_type) },
15
+ param: 'position',
16
+ }
8
17
  end
9
18
 
10
- def title
11
- Spree::OptionType.model_name.human.pluralize
19
+ def page_actions
20
+ render component("ui/button").new(
21
+ tag: :a,
22
+ text: t('.add'),
23
+ href: spree.new_admin_option_type_path,
24
+ icon: "add-line",
25
+ )
12
26
  end
13
27
 
14
28
  def prev_page_path
@@ -22,7 +36,7 @@ class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::BaseComponent
22
36
  def batch_actions
23
37
  [
24
38
  {
25
- display_name: t('.batch_actions.delete'),
39
+ label: t('.batch_actions.delete'),
26
40
  action: solidus_admin.option_types_path,
27
41
  method: :delete,
28
42
  icon: 'delete-bin-7-line',
@@ -1,28 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class SolidusAdmin::Orders::Index::Component < SolidusAdmin::BaseComponent
4
- include SolidusAdmin::Layout::PageHelpers
5
-
6
- def initialize(page:)
7
- @page = page
3
+ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::UI::Pages::Index::Component
4
+ def model_class
5
+ Spree::Order
8
6
  end
9
7
 
10
- class_attribute :row_fade, default: ->(order) { order.paid? && order.shipped? }
8
+ def search_key
9
+ :number_or_shipments_number_or_bill_address_name_or_email_cont
10
+ end
11
11
 
12
- def title
13
- Spree::Order.model_name.human.pluralize
12
+ def search_url
13
+ solidus_admin.orders_path(scope: params[:scope])
14
14
  end
15
15
 
16
- def prev_page_path
17
- solidus_admin.url_for(**request.params, page: @page.number - 1, only_path: true) unless @page.first?
16
+ def row_url(order)
17
+ spree.edit_admin_order_path(order)
18
18
  end
19
19
 
20
- def next_page_path
21
- solidus_admin.url_for(**request.params, page: @page.next_param, only_path: true) unless @page.last?
20
+ def row_fade(order)
21
+ order.paid? && order.shipped?
22
22
  end
23
23
 
24
- def batch_actions
25
- []
24
+ def page_actions
25
+ render component("ui/button").new(
26
+ tag: :a,
27
+ text: t('.add'),
28
+ href: spree.new_admin_order_path,
29
+ icon: "add-line",
30
+ )
26
31
  end
27
32
 
28
33
  def scopes
@@ -38,7 +43,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::BaseComponent
38
43
  def filters
39
44
  [
40
45
  {
41
- presentation: t('.filters.status'),
46
+ label: t('.filters.status'),
42
47
  combinator: 'or',
43
48
  attribute: "state",
44
49
  predicate: "eq",
@@ -50,7 +55,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::BaseComponent
50
55
  end
51
56
  },
52
57
  {
53
- presentation: t('.filters.shipment_state'),
58
+ label: t('.filters.shipment_state'),
54
59
  combinator: 'or',
55
60
  attribute: "shipment_state",
56
61
  predicate: "eq",
@@ -62,7 +67,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::BaseComponent
62
67
  end
63
68
  },
64
69
  {
65
- presentation: t('.filters.payment_state'),
70
+ label: t('.filters.payment_state'),
66
71
  combinator: 'or',
67
72
  attribute: "payment_state",
68
73
  predicate: "eq",
@@ -74,12 +79,12 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::BaseComponent
74
79
  end
75
80
  },
76
81
  {
77
- presentation: t('.filters.promotions'),
82
+ label: t('.filters.store'),
78
83
  combinator: 'or',
79
- attribute: "promotions_id",
80
- predicate: "in",
81
- options: Spree::Promotion.all.pluck(:name, :id),
82
- },
84
+ attribute: "store_id",
85
+ predicate: "eq",
86
+ options: Spree::Store.all.pluck(:name, :id)
87
+ }
83
88
  ]
84
89
  end
85
90
 
@@ -100,7 +105,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::BaseComponent
100
105
  {
101
106
  header: :order,
102
107
  data: ->(order) do
103
- if !row_fade.call(order)
108
+ if !row_fade(order)
104
109
  content_tag :div, order.number, class: 'font-semibold'
105
110
  else
106
111
  content_tag :div, order.number
@@ -1,11 +1,11 @@
1
1
  en:
2
- create_order: 'Create Order'
3
2
  columns:
4
3
  items:
5
4
  one: 1 Item
6
5
  other: '%{count} Items'
7
6
  filters:
8
7
  status: Status
8
+ store: Store
9
9
  shipment_state: Shipment State
10
10
  payment_state: Payment State
11
11
  promotions: Promotions
@@ -1,67 +1,69 @@
1
1
  <div class="<%= stimulus_id %>" data-controller="<%= stimulus_id %>">
2
- <%= render component("orders/show").new(order: @order) %>
3
-
4
- <%= render component("ui/modal").new(title: t(".title.#{@type}"), close_path: solidus_admin.order_path(@order)) do |modal| %>
5
- <%= form_for @order, url: solidus_admin.send("order_#{@type}_address_path", @order), html: { id: form_id } do |form| %>
6
- <div class="w-full flex flex-col mb-4">
7
- <div class="flex justify-between items-center mb-4 relative">
8
- <h2 class="text-sm font-semibold">
9
- <%= t(".subtitle.#{@type}") %>
10
- </h2>
2
+ <%= turbo_frame_tag "edit_order_#{params[:type]}_address_modal" do %>
3
+ <%= render component("ui/modal").new(title: t(".title.#{@type}")) do |modal| %>
4
+ <%= form_for @order, url: solidus_admin.send("order_#{@type}_address_path", @order), html: { id: form_id } do |form| %>
5
+ <div class="w-full flex flex-col mb-4">
6
+ <div class="flex justify-between items-center mb-4 relative">
7
+ <h2 class="text-sm font-semibold">
8
+ <%= t(".subtitle.#{@type}") %>
9
+ </h2>
11
10
 
12
- <% if @addresses.present? %>
13
- <%= render component('ui/dropdown').new(
14
- text: t(".select_address"),
15
- "data-#{stimulus_id}-target": "addresses",
16
- class: "max-h-[26rem] overflow-y-auto"
17
- ) do %>
18
- <% @addresses.each do |address| %>
19
- <%= tag.a(
20
- format_address(address),
21
- href: solidus_admin.send("order_#{@type}_address_path", @order, address_id: address.id),
22
- 'data-turbo-frame': address_frame_id,
23
- 'data-action': "#{component('ui/dropdown').stimulus_id}#close",
24
- ) %>
11
+ <% if @addresses.present? %>
12
+ <%= render component('ui/dropdown').new(
13
+ text: t(".select_address"),
14
+ "data-#{stimulus_id}-target": "addresses",
15
+ class: "max-h-[26rem] overflow-y-auto"
16
+ ) do %>
17
+ <% @addresses.each do |address| %>
18
+ <%= tag.a(
19
+ format_address(address),
20
+ href: solidus_admin.send("order_#{@type}_address_path", @order, address_id: address.id),
21
+ 'data-turbo-frame': address_frame_id,
22
+ 'data-action': "#{component('ui/dropdown').stimulus_id}#close",
23
+ ) %>
24
+ <% end %>
25
25
  <% end %>
26
26
  <% end %>
27
- <% end %>
28
- </div>
27
+ </div>
29
28
 
30
- <div class="w-full flex gap-4">
31
- <%= turbo_frame_tag address_frame_id do %>
32
- <%= render component('ui/forms/address').new(address: @address, name: "order[#{@type}_address_attributes]") %>
33
- <% end %>
34
- </div>
29
+ <div class="w-full flex gap-4">
30
+ <%= turbo_frame_tag address_frame_id do %>
31
+ <%= render component('ui/forms/address').new(address: @address, name: "order[#{@type}_address_attributes]") %>
32
+ <% end %>
33
+ </div>
35
34
 
36
- <label class="flex gap-2 items-center">
37
- <%= form.hidden_field use_attribute, value: '0', id: false %>
35
+ <label class="flex gap-2 items-center">
36
+ <%= form.hidden_field use_attribute, value: '0', id: false %>
38
37
 
39
- <%= render component("ui/forms/checkbox").new(
40
- name: "#{form.object_name}[#{use_attribute}]",
41
- checked: @address == (@type == 'ship' ? @order.bill_address : @order.ship_address),
42
- value: '1'
43
- ) %>
38
+ <%= render component("ui/forms/checkbox").new(
39
+ name: "#{form.object_name}[#{use_attribute}]",
40
+ checked: @address == (@type == 'ship' ? @order.bill_address : @order.ship_address),
41
+ value: '1'
42
+ ) %>
44
43
 
45
- <span class="font-normal text-xs">
46
- <%= t(".use_this_address.#{@type}") %>
47
- </span>
48
- </label>
49
- </div>
50
- <% end %>
44
+ <span class="font-normal text-xs">
45
+ <%= t(".use_this_address.#{@type}") %>
46
+ </span>
47
+ </label>
48
+ </div>
49
+ <% end %>
51
50
 
52
- <% modal.with_actions do %>
53
- <%= render component("ui/button").new(
54
- tag: :a,
55
- scheme: :secondary,
56
- text: t(".cancel"),
57
- href: solidus_admin.order_path(@order)
58
- ) %>
51
+ <% modal.with_actions do %>
52
+ <form method="dialog">
53
+ <%= render component("ui/button").new(
54
+ scheme: :secondary,
55
+ text: t(".cancel"),
56
+ ) %>
57
+ </form>
59
58
 
60
- <%= render component("ui/button").new(
61
- tag: :button,
62
- text: t(".save"),
63
- form: form_id
64
- ) %>
59
+ <%= render component("ui/button").new(
60
+ tag: :button,
61
+ text: t(".save"),
62
+ form: form_id
63
+ ) %>
64
+ <% end %>
65
65
  <% end %>
66
66
  <% end %>
67
+
68
+ <%= render component("orders/show").new(order: @order) %>
67
69
  </div>
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::Component < SolidusAdmin::BaseComponent
4
+ attr_reader :adjustment, :adjustable, :model_name
5
+
6
+ def initialize(adjustment)
7
+ @adjustment = adjustment
8
+ @adjustable = adjustment.adjustable
9
+ @model_name = adjustable&.model_name&.human
10
+ end
11
+
12
+ def call
13
+ render component("ui/thumbnail_with_caption").new(caption: caption, detail: detail) do
14
+ thumbnail
15
+ end
16
+ end
17
+
18
+ def thumbnail
19
+ render(component("ui/thumbnail").for(adjustment.adjustable, class: "basis-10"))
20
+ end
21
+
22
+ def caption
23
+ end
24
+
25
+ def detail
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::SpreeLineItem::Component < SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::Component
4
+ delegate :variant, to: :adjustable
5
+
6
+ def caption
7
+ options_text = variant.options_text.presence
8
+ options_text || variant.sku
9
+ end
10
+
11
+ def detail
12
+ link_to(variant.product.name, solidus_admin.product_path(variant.product), class: "body-link")
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::SpreeOrder::Component < SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::Component
4
+ def caption
5
+ "#{Spree::Order.model_name.human} ##{adjustable.number}"
6
+ end
7
+
8
+ def detail
9
+ adjustable.display_total
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::SpreeShipment::Component < SolidusAdmin::Orders::Show::Adjustments::Index::Adjustable::Component
4
+ def caption
5
+ "#{t('spree.shipment')} ##{adjustable.number}"
6
+ end
7
+
8
+ def detail
9
+ link_to(
10
+ adjustable.shipping_method.name,
11
+ spree.edit_admin_shipping_method_path(adjustable.shipping_method),
12
+ class: "body-link"
13
+ )
14
+ end
15
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Component < SolidusAdmin::UI::Pages::Index::Component
4
+ def model_class
5
+ Spree::Adjustment
6
+ end
7
+
8
+ def back_url
9
+ solidus_admin.order_path(@order)
10
+ end
11
+
12
+ def title
13
+ t(".title", number: @order.number)
14
+ end
15
+
16
+ NBSP = "&nbsp;".html_safe
17
+
18
+ def initialize(order:, adjustments:)
19
+ @order = order
20
+ @adjustments = adjustments
21
+ @page = GearedPagination::Recordset.new(adjustments, per_page: adjustments.size).page(1)
22
+ end
23
+
24
+ def batch_actions
25
+ [
26
+ {
27
+ label: t(".actions.lock"),
28
+ action: solidus_admin.lock_order_adjustments_path(@order),
29
+ method: :put,
30
+ icon: "lock-line"
31
+ },
32
+ {
33
+ label: t(".actions.unlock"),
34
+ action: solidus_admin.unlock_order_adjustments_path(@order),
35
+ method: :put,
36
+ icon: "lock-unlock-line"
37
+ },
38
+ {
39
+ label: t(".actions.delete"),
40
+ action: spree.admin_order_adjustment_path(@order, '[]'),
41
+ method: :delete,
42
+ icon: "delete-bin-7-line"
43
+ },
44
+ ]
45
+ end
46
+
47
+ def search_key
48
+ :label_cont
49
+ end
50
+
51
+ def search_url
52
+ solidus_admin.order_adjustments_path(@order)
53
+ end
54
+
55
+ def columns
56
+ [
57
+ {
58
+ header: :state,
59
+ wrap: true,
60
+ col: { class: 'w-[calc(5rem+2rem+2.5rem+1px)]' },
61
+ data: ->(adjustment) {
62
+ if adjustment.finalized?
63
+ icon = 'lock-fill'
64
+ title = t(".state.locked")
65
+ else
66
+ icon = 'lock-unlock-line'
67
+ title = t(".state.unlocked")
68
+ end
69
+ icon_tag(icon, class: "w-5 h-5 align-middle") + tag.span(title)
70
+ }
71
+ },
72
+ {
73
+ header: :adjustable,
74
+ col: { class: 'w-56' },
75
+ data: ->(adjustment) {
76
+ render_thumbnail_with_caption(adjustment, :adjustable)
77
+ }
78
+ },
79
+ {
80
+ header: :source,
81
+ col: { class: "w-56" },
82
+ data: ->(adjustment) {
83
+ render_thumbnail_with_caption(adjustment, :source)
84
+ }
85
+ },
86
+ {
87
+ header: :amount,
88
+ col: { class: 'w-24' },
89
+ data: ->(adjustment) { tag.span adjustment.display_amount.to_html, class: "grow text-right whitespace-nowrap" }
90
+ },
91
+ {
92
+ header: tag.span(t(".actions.title"), class: 'sr-only'),
93
+ col: { class: 'w-24' },
94
+ wrap: false,
95
+ data: ->(adjustment) do
96
+ actions = []
97
+
98
+ unless adjustment.source
99
+ actions << link_to(
100
+ t(".actions.edit"),
101
+ spree.edit_admin_order_adjustment_path(@order, adjustment),
102
+ class: 'body-link',
103
+ )
104
+ end
105
+
106
+ if adjustment.finalized?
107
+ actions << link_to(
108
+ t(".actions.unlock"),
109
+ solidus_admin.unlock_order_adjustments_path(@order, id: adjustment),
110
+ "data-turbo-method": :put,
111
+ "data-turbo-confirm": t('.confirm'),
112
+ class: 'body-link',
113
+ )
114
+ else
115
+ actions << link_to(
116
+ t(".actions.lock"),
117
+ solidus_admin.lock_order_adjustments_path(@order, id: adjustment),
118
+ "data-turbo-method": :put,
119
+ "data-turbo-confirm": t('.confirm'),
120
+ class: 'body-link',
121
+ )
122
+ actions << link_to(
123
+ t(".actions.delete"),
124
+ spree.admin_order_adjustment_path(@order, adjustment),
125
+ "data-turbo-method": :delete,
126
+ "data-turbo-confirm": t('.confirm'),
127
+ class: 'body-link !text-red-500',
128
+ )
129
+ end
130
+
131
+ render component('ui/dropdown').new(
132
+ direction: :right,
133
+ class: 'relative w-fit m-auto',
134
+ ).with_content(safe_join(actions))
135
+ end
136
+ },
137
+ ]
138
+ end
139
+
140
+ private
141
+
142
+ def render_thumbnail_with_caption(adjustment, role)
143
+ component_name = adjustment.send(role).class.base_class.name.delete("::").underscore if adjustment.send(role)
144
+ component_key = ["orders/show/adjustments/index/#{role}", component_name].compact.join("/")
145
+ render component(component_key).new(adjustment)
146
+ end
147
+ end