solidus_admin 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +60 -6
  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 +19 -2
  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 +0 -25
  15. data/app/components/solidus_admin/option_types/index/component.rb +1 -1
  16. data/app/components/solidus_admin/orders/index/component.rb +8 -8
  17. data/app/components/solidus_admin/orders/index/component.yml +1 -0
  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 +1 -1
  34. data/app/components/solidus_admin/products/index/component.rb +8 -5
  35. data/app/components/solidus_admin/products/show/component.html.erb +14 -3
  36. data/app/components/solidus_admin/products/status/component.rb +4 -1
  37. data/app/components/solidus_admin/products/status/component.yml +1 -0
  38. data/app/components/solidus_admin/properties/index/component.rb +1 -1
  39. data/app/components/solidus_admin/refund_reasons/edit/component.html.erb +27 -0
  40. data/app/components/solidus_admin/refund_reasons/edit/component.rb +12 -0
  41. data/app/components/solidus_admin/refund_reasons/edit/component.yml +8 -0
  42. data/app/components/solidus_admin/refund_reasons/index/component.rb +11 -4
  43. data/app/components/solidus_admin/refund_reasons/new/component.html.erb +27 -0
  44. data/app/components/solidus_admin/refund_reasons/new/component.rb +12 -0
  45. data/app/components/solidus_admin/refund_reasons/new/component.yml +6 -0
  46. data/app/components/solidus_admin/return_reasons/edit/component.html.erb +26 -0
  47. data/app/components/solidus_admin/return_reasons/edit/component.rb +12 -0
  48. data/app/components/solidus_admin/return_reasons/edit/component.yml +8 -0
  49. data/app/components/solidus_admin/return_reasons/index/component.rb +20 -2
  50. data/app/components/solidus_admin/return_reasons/new/component.html.erb +27 -0
  51. data/app/components/solidus_admin/return_reasons/new/component.rb +12 -0
  52. data/app/components/solidus_admin/return_reasons/new/component.yml +8 -0
  53. data/app/components/solidus_admin/roles/edit/component.html.erb +33 -0
  54. data/app/components/solidus_admin/roles/edit/component.rb +20 -0
  55. data/app/components/solidus_admin/roles/edit/component.yml +19 -0
  56. data/app/components/solidus_admin/roles/index/component.rb +70 -0
  57. data/app/components/solidus_admin/roles/index/component.yml +6 -0
  58. data/app/components/solidus_admin/roles/new/component.html.erb +33 -0
  59. data/app/components/solidus_admin/roles/new/component.rb +20 -0
  60. data/app/components/solidus_admin/roles/new/component.yml +19 -0
  61. data/app/components/solidus_admin/shipping_categories/edit/component.html.erb +16 -0
  62. data/app/components/solidus_admin/shipping_categories/edit/component.rb +12 -0
  63. data/app/components/solidus_admin/shipping_categories/edit/component.yml +6 -0
  64. data/app/components/solidus_admin/shipping_categories/index/component.rb +20 -3
  65. data/app/components/solidus_admin/shipping_categories/new/component.html.erb +17 -0
  66. data/app/components/solidus_admin/shipping_categories/new/component.rb +12 -0
  67. data/app/components/solidus_admin/shipping_categories/new/component.yml +6 -0
  68. data/app/components/solidus_admin/shipping_methods/index/component.rb +2 -2
  69. data/app/components/solidus_admin/stock_items/edit/component.html.erb +66 -72
  70. data/app/components/solidus_admin/stock_items/edit/component.rb +0 -5
  71. data/app/components/solidus_admin/stock_items/index/component.rb +5 -6
  72. data/app/components/solidus_admin/stock_locations/index/component.rb +1 -1
  73. data/app/components/solidus_admin/store_credit_reasons/edit/component.html.erb +26 -0
  74. data/app/components/solidus_admin/store_credit_reasons/edit/component.rb +12 -0
  75. data/app/components/solidus_admin/store_credit_reasons/edit/component.yml +8 -0
  76. data/app/components/solidus_admin/store_credit_reasons/index/component.rb +11 -4
  77. data/app/components/solidus_admin/store_credit_reasons/new/component.html.erb +27 -0
  78. data/app/components/solidus_admin/store_credit_reasons/new/component.rb +12 -0
  79. data/app/components/solidus_admin/store_credit_reasons/new/component.yml +8 -0
  80. data/app/components/solidus_admin/stores/index/component.rb +1 -1
  81. data/app/components/solidus_admin/tax_categories/edit/component.html.erb +28 -0
  82. data/app/components/solidus_admin/tax_categories/edit/component.rb +12 -0
  83. data/app/components/solidus_admin/tax_categories/edit/component.yml +8 -0
  84. data/app/components/solidus_admin/tax_categories/index/component.rb +11 -4
  85. data/app/components/solidus_admin/tax_categories/new/component.html.erb +28 -0
  86. data/app/components/solidus_admin/tax_categories/new/component.rb +12 -0
  87. data/app/components/solidus_admin/tax_categories/new/component.yml +8 -0
  88. data/app/components/solidus_admin/tax_rates/index/component.rb +3 -3
  89. data/app/components/solidus_admin/taxonomies/index/component.rb +1 -1
  90. data/app/components/solidus_admin/ui/button/component.rb +1 -1
  91. data/app/components/solidus_admin/ui/checkbox_row/component.html.erb +29 -0
  92. data/app/components/solidus_admin/ui/checkbox_row/component.rb +11 -0
  93. data/app/components/solidus_admin/ui/forms/address/component.html.erb +27 -9
  94. data/app/components/solidus_admin/ui/forms/address/component.js +38 -13
  95. data/app/components/solidus_admin/ui/forms/search/component.html.erb +2 -3
  96. data/app/components/solidus_admin/ui/forms/search/component.js +3 -3
  97. data/app/components/solidus_admin/ui/modal/component.html.erb +7 -7
  98. data/app/components/solidus_admin/ui/modal/component.js +7 -0
  99. data/app/components/solidus_admin/ui/modal/component.rb +1 -1
  100. data/app/components/solidus_admin/ui/pages/index/component.html.erb +17 -3
  101. data/app/components/solidus_admin/ui/pages/index/component.rb +29 -43
  102. data/app/components/solidus_admin/ui/panel/component.html.erb +5 -16
  103. data/app/components/solidus_admin/ui/panel/component.rb +11 -7
  104. data/app/components/solidus_admin/ui/table/component.js +31 -2
  105. data/app/components/solidus_admin/ui/table/component.rb +23 -7
  106. data/app/components/solidus_admin/ui/table/component.yml +1 -0
  107. data/app/components/solidus_admin/ui/thumbnail/component.rb +1 -1
  108. data/app/components/solidus_admin/ui/thumbnail_with_caption/component.html.erb +17 -0
  109. data/app/components/solidus_admin/ui/thumbnail_with_caption/component.rb +15 -0
  110. data/app/components/solidus_admin/users/addresses/component.html.erb +46 -0
  111. data/app/components/solidus_admin/users/addresses/component.rb +61 -0
  112. data/app/components/solidus_admin/users/addresses/component.yml +14 -0
  113. data/app/components/solidus_admin/users/edit/api_access/component.html.erb +49 -0
  114. data/app/components/solidus_admin/users/edit/api_access/component.js +9 -0
  115. data/app/components/solidus_admin/users/edit/api_access/component.rb +7 -0
  116. data/app/components/solidus_admin/users/edit/api_access/component.yml +10 -0
  117. data/app/components/solidus_admin/users/edit/component.html.erb +52 -0
  118. data/app/components/solidus_admin/users/edit/component.rb +51 -0
  119. data/app/components/solidus_admin/users/edit/component.yml +12 -0
  120. data/app/components/solidus_admin/users/index/component.rb +10 -8
  121. data/app/components/solidus_admin/users/items/component.html.erb +41 -0
  122. data/app/components/solidus_admin/users/items/component.rb +170 -0
  123. data/app/components/solidus_admin/users/items/component.yml +16 -0
  124. data/app/components/solidus_admin/users/orders/component.html.erb +42 -0
  125. data/app/components/solidus_admin/users/orders/component.rb +131 -0
  126. data/app/components/solidus_admin/users/orders/component.yml +12 -0
  127. data/app/components/solidus_admin/users/stats/component.html.erb +11 -0
  128. data/app/components/solidus_admin/users/stats/component.rb +9 -0
  129. data/app/components/solidus_admin/users/stats/component.yml +2 -0
  130. data/app/components/solidus_admin/users_and_roles/component.rb +24 -0
  131. data/app/components/solidus_admin/users_and_roles/component.yml +2 -0
  132. data/app/components/solidus_admin/zones/index/component.rb +1 -1
  133. data/app/controllers/solidus_admin/addresses_controller.rb +6 -1
  134. data/app/controllers/solidus_admin/adjustment_reasons_controller.rb +85 -10
  135. data/app/controllers/solidus_admin/adjustments_controller.rb +57 -0
  136. data/app/controllers/solidus_admin/customers_controller.rb +5 -1
  137. data/app/controllers/solidus_admin/orders_controller.rb +5 -1
  138. data/app/controllers/solidus_admin/products_controller.rb +11 -0
  139. data/app/controllers/solidus_admin/refund_reasons_controller.rb +85 -10
  140. data/app/controllers/solidus_admin/reimbursement_types_controller.rb +0 -5
  141. data/app/controllers/solidus_admin/return_reasons_controller.rb +85 -10
  142. data/app/controllers/solidus_admin/roles_controller.rb +118 -0
  143. data/app/controllers/solidus_admin/shipping_categories_controller.rb +87 -10
  144. data/app/controllers/solidus_admin/shipping_methods_controller.rb +0 -5
  145. data/app/controllers/solidus_admin/stock_items_controller.rb +6 -6
  146. data/app/controllers/solidus_admin/stock_locations_controller.rb +0 -5
  147. data/app/controllers/solidus_admin/store_credit_reasons_controller.rb +85 -10
  148. data/app/controllers/solidus_admin/stores_controller.rb +0 -5
  149. data/app/controllers/solidus_admin/tax_categories_controller.rb +89 -10
  150. data/app/controllers/solidus_admin/tax_rates_controller.rb +0 -5
  151. data/app/controllers/solidus_admin/users_controller.rb +85 -6
  152. data/app/controllers/solidus_admin/zones_controller.rb +0 -5
  153. data/app/helpers/solidus_admin/last_login_helper.rb +16 -0
  154. data/app/helpers/solidus_admin/permission_sets_helper.rb +32 -0
  155. data/app/views/layouts/solidus_admin/application.html.erb +2 -1
  156. data/config/locales/adjustment_reasons.en.yml +5 -1
  157. data/config/locales/adjustments.en.yml +10 -0
  158. data/config/locales/refund_reasons.en.yml +10 -0
  159. data/config/locales/return_reasons.en.yml +5 -1
  160. data/config/locales/roles.en.yml +10 -0
  161. data/config/locales/shipping_categories.en.yml +4 -0
  162. data/config/locales/store_credit_reasons.en.yml +5 -1
  163. data/config/locales/tax_categories.en.yml +4 -0
  164. data/config/locales/users.en.yml +10 -0
  165. data/config/routes.rb +24 -7
  166. data/docs/components.md +109 -0
  167. data/docs/{customizing_view_components.md → customizing_components.md} +2 -7
  168. data/docs/index_pages.md +146 -0
  169. data/docs/{customizing_menu_items.md → menu_items.md} +1 -1
  170. data/docs/stimulusjs.md +85 -0
  171. data/docs/{customizing_tailwindcss.md → tailwindcss.md} +27 -8
  172. data/lib/solidus_admin/component_registry.rb +40 -0
  173. data/lib/solidus_admin/configuration.rb +2 -26
  174. data/lib/solidus_admin/install_tailwindcss.rb +3 -1
  175. data/lib/solidus_admin/testing_support/admin_assets.rb +10 -0
  176. data/lib/solidus_admin/testing_support/component_helpers.rb +27 -0
  177. data/lib/solidus_admin/testing_support/dummy_app/rake_tasks.rb +60 -0
  178. data/lib/solidus_admin/testing_support/feature_helpers.rb +34 -0
  179. data/lib/solidus_admin/version.rb +1 -1
  180. data/solidus_admin.gemspec +7 -3
  181. metadata +108 -19
  182. data/app/components/solidus_admin/promotion_categories/index/component.rb +0 -56
  183. data/app/components/solidus_admin/promotions/index/component.rb +0 -104
  184. data/app/components/solidus_admin/promotions/index/component.yml +0 -10
  185. data/app/controllers/solidus_admin/promotion_categories_controller.rb +0 -29
  186. data/app/controllers/solidus_admin/promotions_controller.rb +0 -46
  187. data/config/locales/promotion_categories.en.yml +0 -6
  188. data/config/locales/promotions.en.yml +0 -6
  189. data/config/locales/refund_reasons_.en.yml +0 -6
@@ -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."
@@ -13,14 +13,31 @@ class SolidusAdmin::AdjustmentReasons::Index::Component < SolidusAdmin::RefundsA
13
13
  :name_or_code_cont
14
14
  end
15
15
 
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
+ )
24
+ end
25
+
26
+ def turbo_frames
27
+ %w[
28
+ new_adjustment_reason_modal
29
+ edit_adjustment_reason_modal
30
+ ]
31
+ end
32
+
16
33
  def row_url(adjustment_reason)
17
- spree.edit_admin_adjustment_reason_path(adjustment_reason)
34
+ spree.edit_admin_adjustment_reason_path(adjustment_reason, _turbo_frame: :edit_adjustment_reason_modal)
18
35
  end
19
36
 
20
37
  def batch_actions
21
38
  [
22
39
  {
23
- display_name: t('.batch_actions.delete'),
40
+ label: t('.batch_actions.delete'),
24
41
  action: solidus_admin.adjustment_reasons_path,
25
42
  method: :delete,
26
43
  icon: 'delete-bin-7-line',
@@ -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."
@@ -13,31 +13,6 @@ module SolidusAdmin
13
13
  render component("ui/icon").new(name: name, **attrs)
14
14
  end
15
15
 
16
- module InheritableTranslations
17
- def build_i18n_backend
18
- return if compiled?
19
-
20
- # We need to load the translations files from the ancestors so a component
21
- # can inherit translations from its parent and is able to overwrite them.
22
- translation_files = ancestors.reverse_each.with_object([]) do |ancestor, files|
23
- if ancestor.is_a?(Class) && ancestor < ViewComponent::Base
24
- files.concat(ancestor.sidecar_files(%w[yml yaml].freeze))
25
- end
26
- end
27
-
28
- # In development it will become nil if the translations file is removed
29
- self.i18n_backend = if translation_files.any?
30
- ViewComponent::Translatable::I18nBackend.new(
31
- i18n_scope: i18n_scope,
32
- load_paths: translation_files
33
- )
34
- end
35
- end
36
- end
37
-
38
- # Can be removed once https://github.com/ViewComponent/view_component/pull/1934 is released
39
- extend InheritableTranslations unless Gem::Version.new(ViewComponent::VERSION::STRING) >= Gem::Version.new("3.9")
40
-
41
16
  def missing_translation(key, options)
42
17
  keys = I18n.normalize_keys(options[:locale] || I18n.locale, key, options[:scope])
43
18
 
@@ -36,7 +36,7 @@ class SolidusAdmin::OptionTypes::Index::Component < SolidusAdmin::UI::Pages::Ind
36
36
  def batch_actions
37
37
  [
38
38
  {
39
- display_name: t('.batch_actions.delete'),
39
+ label: t('.batch_actions.delete'),
40
40
  action: solidus_admin.option_types_path,
41
41
  method: :delete,
42
42
  icon: 'delete-bin-7-line',
@@ -43,7 +43,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::UI::Pages::Index::C
43
43
  def filters
44
44
  [
45
45
  {
46
- presentation: t('.filters.status'),
46
+ label: t('.filters.status'),
47
47
  combinator: 'or',
48
48
  attribute: "state",
49
49
  predicate: "eq",
@@ -55,7 +55,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::UI::Pages::Index::C
55
55
  end
56
56
  },
57
57
  {
58
- presentation: t('.filters.shipment_state'),
58
+ label: t('.filters.shipment_state'),
59
59
  combinator: 'or',
60
60
  attribute: "shipment_state",
61
61
  predicate: "eq",
@@ -67,7 +67,7 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::UI::Pages::Index::C
67
67
  end
68
68
  },
69
69
  {
70
- presentation: t('.filters.payment_state'),
70
+ label: t('.filters.payment_state'),
71
71
  combinator: 'or',
72
72
  attribute: "payment_state",
73
73
  predicate: "eq",
@@ -79,12 +79,12 @@ class SolidusAdmin::Orders::Index::Component < SolidusAdmin::UI::Pages::Index::C
79
79
  end
80
80
  },
81
81
  {
82
- presentation: t('.filters.promotions'),
82
+ label: t('.filters.store'),
83
83
  combinator: 'or',
84
- attribute: "promotions_id",
85
- predicate: "in",
86
- options: Spree::Promotion.all.pluck(:name, :id),
87
- },
84
+ attribute: "store_id",
85
+ predicate: "eq",
86
+ options: Spree::Store.all.pluck(:name, :id)
87
+ }
88
88
  ]
89
89
  end
90
90
 
@@ -5,6 +5,7 @@ en:
5
5
  other: '%{count} Items'
6
6
  filters:
7
7
  status: Status
8
+ store: Store
8
9
  shipment_state: Shipment State
9
10
  payment_state: Payment State
10
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
@@ -0,0 +1,21 @@
1
+ en:
2
+ title: "Order %{number} / Adjustments"
3
+ save: "Save"
4
+ discard: "Discard"
5
+ none: "—"
6
+
7
+ actions:
8
+ title: "Actions"
9
+ delete: "Delete"
10
+ lock: "Lock"
11
+ unlock: "Unlock"
12
+ edit: "Edit"
13
+
14
+ state:
15
+ locked: "Locked"
16
+ unlocked: "Unlocked"
17
+ confirm: "Are you sure?"
18
+
19
+ totals:
20
+ adjustable: "Totals (by Adjustable)"
21
+ source: "Totals (by Source)"
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Source::Component < SolidusAdmin::BaseComponent
4
+ attr_reader :adjustment, :source, :model_name
5
+
6
+ def initialize(adjustment)
7
+ @adjustment = adjustment
8
+ @source = adjustment.source
9
+ @model_name = source&.model_name&.human
10
+ end
11
+
12
+ def call
13
+ render component("ui/thumbnail_with_caption").new(icon: icon, caption: caption, detail: detail)
14
+ end
15
+
16
+ def caption
17
+ adjustment.label
18
+ end
19
+
20
+ def detail
21
+ end
22
+
23
+ def icon
24
+ "question-line"
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Source::SpreeTaxRate::Component < SolidusAdmin::Orders::Show::Adjustments::Index::Source::Component
4
+ def icon
5
+ "percent-line"
6
+ end
7
+
8
+ def detail
9
+ link_to("#{model_name}: #{zone_name}", spree.edit_admin_tax_rate_path(adjustment.source_id), class: "body-link")
10
+ end
11
+
12
+ private
13
+
14
+ def zone_name
15
+ source.zone&.name || t("spree.all_zones")
16
+ end
17
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::Orders::Show::Adjustments::Index::Source::SpreeUnitCancel::Component < SolidusAdmin::Orders::Show::Adjustments::Index::Source::Component
4
+ def icon
5
+ "close-circle-line"
6
+ end
7
+ end
@@ -16,9 +16,9 @@
16
16
 
17
17
  <%= page_with_sidebar_aside do %>
18
18
  <%= render component('ui/panel').new do |panel| %>
19
- <% panel.with_menu t(".edit_email"), solidus_admin.order_customer_path(@order) %>
20
- <% panel.with_menu t(".edit_shipping"), solidus_admin.edit_order_ship_address_path(@order) %>
21
- <% panel.with_menu t(".edit_billing"), solidus_admin.edit_order_bill_address_path(@order) %>
19
+ <% panel.with_menu t(".edit_email"), solidus_admin.order_customer_path(@order), data: { turbo_frame: :edit_order_email_modal } %>
20
+ <% panel.with_menu t(".edit_shipping"), solidus_admin.edit_order_ship_address_path(@order), data: { turbo_frame: :edit_order_ship_address_modal } %>
21
+ <% panel.with_menu t(".edit_billing"), solidus_admin.edit_order_bill_address_path(@order), data: { turbo_frame: :edit_order_bill_address_modal } %>
22
22
  <% panel.with_menu t(".remove_customer"), solidus_admin.order_customer_path(@order), method: :delete, class: "text-red-500" if @order.user %>
23
23
 
24
24
  <% panel.with_section(class: 'flex flex-col gap-6') do %>
@@ -73,4 +73,8 @@
73
73
 
74
74
  <% end %>
75
75
  <% end %>
76
+
77
+ <% turbo_frames.each do |frame| %>
78
+ <%= turbo_frame_tag frame %>
79
+ <% end %>
76
80
  <% end %>
@@ -29,6 +29,14 @@ class SolidusAdmin::Orders::Show::Component < SolidusAdmin::BaseComponent
29
29
  ], " ")
30
30
  end
31
31
 
32
+ def turbo_frames
33
+ %w[
34
+ edit_order_email_modal
35
+ edit_order_bill_address_modal
36
+ edit_order_ship_address_modal
37
+ ]
38
+ end
39
+
32
40
  def customer_name(user)
33
41
  (
34
42
  user.default_user_bill_address ||