solidus_admin 0.2.0 → 0.3.1

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 (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 +198 -163
  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 +4 -2
  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,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class SolidusAdmin::AdjustmentReasons::Edit::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}_edit_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: "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 %>